So far I've implemented Dust and obfs3 and I'm putting the finishing touches on obfs2. I've also rewritten the pluggable transport API and rewritten the transport plugins to use this new API.

The API now provides 4 events: start, encodedReceived, decodedReceived, and end. The plugins implement callbacks for these events as well as an __init__(self, decodedSocket, encodedSocket) method that provides virtual sockets to the plugins. The virtual sockets have read and write methods. Control is transferred to the plugin when one of the event callbacks is called, in at which time the plugin can read and write data to the socket buffers. When the callback returns, control is transferred back to the framework, which takes care of reading and writing between the buffers and the actual sockets.

The next step is testing of all of the plugins and documenting the plugin API. In particular I expect that the python obfs2 implementation will not work with the C obfs2 implementation due to undocumented assumptions in the protocol implementation, so these will need to be worked out.

Code: http://github.com/blanu/pyptlib and http://github.com/blanu/py-obfsproxy
Blog: http://stepthreeprivacy.org/