Skip to content
GitLab
Projects Groups Topics Snippets
  • /
  • Help
    • Help
    • Support
    • Community forum
    • Submit feedback
    • Contribute to GitLab
  • Sign in
  • Trac Trac
  • Project information
    • Project information
    • Activity
    • Labels
    • Members
  • Issues 246
    • Issues 246
    • List
    • Boards
    • Service Desk
    • Milestones
  • Monitor
    • Monitor
    • Metrics
    • Incidents
  • Analytics
    • Analytics
    • Value stream
  • Wiki
    • Wiki
  • Activity
  • Create a new issue
  • Issue Boards
Collapse sidebar
  • Legacy
  • TracTrac
  • Issues
  • #1967
Closed (moved) (moved)
Open
Issue created Sep 22, 2010 by Trac@tracbot

The ancient architecture of Tor!!

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!!!!!

Trac:
Username: bee

To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information
Assignee
Assign to
Time tracking