[tor-bugs] #1967 [Tor Client]: The ancient architecture of Tor!!

Tor Bug Tracker & Wiki torproject-admin at torproject.org
Wed Sep 22 13:27:39 UTC 2010


#1967: The ancient architecture of Tor!!
-----------------+----------------------------------------------------------
 Reporter:  bee  |        Type:  enhancement
   Status:  new  |    Priority:  normal     
Milestone:       |   Component:  Tor Client 
  Version:       |    Keywords:             
   Parent:       |  
-----------------+----------------------------------------------------------
 Hi!!!!!!!!!!

 Phobos (andrew, i mean the blogger at Tor!!!) told me Nick Mathewson is
 the chief architect of Tor!!!!!!
 So i began to ask myself!!! what is the architecture of Tor?!!!!!!
 Well, what's the architecture of a software in general actually!!!!!! I
 recall i read something about it, while reading the instructions to write
 RPMs for red hat!!!!!
 So, when you're making a package, you've to split it in three packages!!!
 One package is for the "library", also known as "the shared object"!! The
 second one is for the "headers" for developing C software using that
 library! and the last one is the package within the main executable,
 usually a command line tool!!!!
 For example, you've a package with the library of "cURL" (it's a package
 with .so files), another one with the headers (they're files .h, it's
 named after cURL-devel) and the last one is "cURL" itself, with the
 command line tool!!!!!!!!!!!!!!
 Well, TOR is not respecting this architecture!!!!
 I think it would be better to have tor made in this way!!:
 * a libtor.so file!!
 * tor.h, the header for C
 * tor, the command line tool (a command line wrapper for the functions in
 libtor.so!!!)

 This new architecture is going to improve the whole tor-project a
 lot!!!!!!!!!!!!!
 Because you could have software, made to work only with Tor!!! YEAH!!, say
 "tor-ready"!!!!!!!!!!

 You could have a Chat system or P2P software built on "libtor"!!! And they
 could control everything of Tor, automatically and autonomously!!!!!!!
 They won't need to fork a new process and start the "tor" executable!!!
 And they won't need to open a local socks-server and a control port!!!!
 Because those software can be able to load the tor's library and they can
 directly call the functions they need!!!!!!!!!!!!!!!

 The current command line interface for Tor has to load "libtor" too, parse
 the command line and call the right functions!!!!!
 A software like VIDALIA, could do the same!!!! It could control tor
 loading the "libtor", without needing to fork its process and start the
 executable "tor"(like "tor.exe") and talk to it via sockets!!!!!!! (also,
 i don't understand why you use real TCP sockets instead of PIPEs or UNIX
 sockets to control Tor from VIDALIA in very local sessions!!)

 So, i began to look something in the source code of Tor!! and i think that
 creating a library could be very easy!!!!!!!
 At first i built tor!!! and this is the line MAKE uses to create the
 executable:
 {{{
 gcc  -g -O2 -Wall -g -O2 -fno-strict-aliasing -L/tmp/libevent/lib
  -Wl,-R/tmp/libevent/lib  -o tor buffers.o circuitbuild.o
  circuitlist.o circuituse.o command.o config.o connection.o
  connection_edge.o connection_or.o control.o cpuworker.o
  directory.o dirserv.o dirvote.o dns.o dnsserv.o geoip.o
  hibernate.o main.o  networkstatus.o onion.o policies.o reasons.o
  relay.o rendcommon.o rendclient.o rendmid.o rendservice.o
  rephist.o router.o routerlist.o routerparse.o eventdns.o
  tor_main.o ../common/libor.a ../common/libor-crypto.a
 -lz -levent -lssl -lcrypto   -lpthread -ldl
 }}}
 At first i think there is a minor flaw!!! "-g -O2 -Wall -g -O2" has "-g
 -O2" repeated two times, and this is purposeless!!!!!!!!but it's not a
 real bug!!!!
 Well, anyhow, i noticed that there are two files with names very easy to
 understand: tor_main.o and main.o!!!!
 So, i found the real "main()" in tor_main.o!!!!!!!! I think that if you
 remove it, it's enough to have a working shared object!!!!!!!!!

 I then managed to create this command line!!!!!
 {{{
 $ gcc -shared -Wall -g -O2 -fno-strict-aliasing -L/tmp/libevent/lib
  -Wl,-R/tmp/libevent/lib  -o libtor.so buffers.o circuitbuild.o
  circuitlist.o circuituse.o command.o config.o connection.o
  connection_edge.o connection_or.o control.o cpuworker.o
  directory.o dirserv.o dirvote.o dns.o dnsserv.o geoip.o
  hibernate.o main.o  networkstatus.o onion.o policies.o
  reasons.o relay.o rendcommon.o rendclient.o rendmid.o
  rendservice.o rephist.o router.o routerlist.o routerparse.o
  eventdns.o ../common/libor.a ../common/libor-crypto.a
 -lz -levent -lssl -lcrypto   -lpthread -ldl
 }}}
 You've to move in "./src/or" to use it!!!!!!!!! I removed a "-g -O2" and
 also the "tor_main.o" file from the linker!!!("linker" is the name of the
 step you use to create an executable using the object files!!!!!!!!!!)
 I also added the "-shared" switch because i want a shared library!! and i
 changed the output file name to "-o libtor.so"!!!!!!!!!!
 That command worked with no errors!!!!!!!!!!! but i don't know if it works
 for real!!!!!!!!!!!
 If i type "$ objdump -t libtor.so" i can read the names of exported
 functions!!!!!! This is a small piece of the objdumps list!!!!
 {{{
 000b6f90 g     F .text  00000259              tor_init
 00000000       F *UND*  00000000              munmap@@GLIBC_2.0
 0010c210 g     F .text  000000a0              crypto_dh_generate_public
 0007ced0 g     F .text  000002ad
 connection_get_by_type_state_rendquery
 000d9640 g     F .text  00000021
 is_legal_nickname_or_hexdigest
 00105de0 g     F .text  000000a5              smartlist_free
 0005f3d0 g     F .text  00000136              write_to_buf_zlib
 000665a0 g     F .text  000000a1              any_bridge_descriptors_known
 000d8740 g     F .text  0000041a              rep_hist_load_state
 0007b0d0 g     F .text  0000003f              connection_is_listener
 00000000       F *UND*  00000000              EVP_PKEY_assign
 0010d540 g     F .text  0000009e
 crypto_cipher_decrypt_init_cipher
 }}}
 I believe "tor_init" being the real function to call, to initialize the
 library!!!!!!!!!!!!!

 Well, this super analysis i made!!!!! could be useful for you!!!!!!!!!!!!
 It's because i think that you've to create the tor library as i
 suggested!! and then allow people to build software around it!!!!!!! The
 command line tool of Tor will be just a software, one of the many!! using
 the shared library!!!!
 Also vidalia could be made to work without executing
 "tor"/"tor.exe"!!!!!!!!!
 Perhaps, you could also build a whole web browser made to work with
 Tor!!!!!!!!!!!!! and a system to exchange files, emails, chat, and
 whatever absolutely autonomous!!! based only on libtor.so and working
 without requiring to start another process and connect to it!!!!!
 Yeah!!!, this is the right architecture for software!!!!!!! The KERNEL and
 the interfaces (GUI, graphical interfaces; or CLI, command line
 interfaces) should be split!!!!!!!!!!!
 If you write a software in C, or C++!!!, to download files from the NET,
 you can call the functions exported by libCURL!!!! You don't have to call
 the command line tool "cURL"!!!!!!!! YEAH!! i think the same has to be
 possible with Tor!!!!!!!!!!!!!!!!!!!!!

 bye!!!!!!!!!!!!!
 ~bee!!!!!

-- 
Ticket URL: <https://trac.torproject.org/projects/tor/ticket/1967>
Tor Bug Tracker & Wiki <https://trac.torproject.org/>
The Tor Project: anonymity online


More information about the tor-bugs mailing list