Skip to content
Snippets Groups Projects
  • Simon Tatham's avatar
    5b14abc3
    New test system for mp_int and cryptography. · 5b14abc3
    Simon Tatham authored
    I've written a new standalone test program which incorporates all of
    PuTTY's crypto code, including the mp_int and low-level elliptic curve
    layers but also going all the way up to the implementations of the
    MAC, hash, cipher, public key and kex abstractions.
    
    The test program itself, 'testcrypt', speaks a simple line-oriented
    protocol on standard I/O in which you write the name of a function
    call followed by some inputs, and it gives you back a list of outputs
    preceded by a line telling you how many there are. Dynamically
    allocated objects are assigned string ids in the protocol, and there's
    a 'free' function that tells testcrypt when it can dispose of one.
    
    It's possible to speak that protocol by hand, but cumbersome. I've
    also provided a Python module that wraps it, by running testcrypt as a
    persistent subprocess and gatewaying all the function calls into
    things that look reasonably natural to call from Python. The Python
    module and testcrypt.c both read a carefully formatted header file
    testcrypt.h which contains the name and signature of every exported
    function, so it costs minimal effort to expose a given function
    through this test API. In a few cases it's necessary to write a
    wrapper in testcrypt.c that makes the function look more friendly, but
    mostly you don't even need that. (Though that is one of the
    motivations between a lot of API cleanups I've done recently!)
    
    I considered doing Python integration in the more obvious way, by
    linking parts of the PuTTY code directly into a native-code .so Python
    module. I decided against it because this way is more flexible: I can
    run the testcrypt program on its own, or compile it in a way that
    Python wouldn't play nicely with (I bet compiling just that .so with
    Leak Sanitiser wouldn't do what you wanted when Python loaded it!), or
    attach a debugger to it. I can even recompile testcrypt for a
    different CPU architecture (32- vs 64-bit, or even running it on a
    different machine over ssh or under emulation) and still layer the
    nice API on top of that via the local Python interpreter. All I need
    is a bidirectional data channel.
    5b14abc3
    History
    New test system for mp_int and cryptography.
    Simon Tatham authored
    I've written a new standalone test program which incorporates all of
    PuTTY's crypto code, including the mp_int and low-level elliptic curve
    layers but also going all the way up to the implementations of the
    MAC, hash, cipher, public key and kex abstractions.
    
    The test program itself, 'testcrypt', speaks a simple line-oriented
    protocol on standard I/O in which you write the name of a function
    call followed by some inputs, and it gives you back a list of outputs
    preceded by a line telling you how many there are. Dynamically
    allocated objects are assigned string ids in the protocol, and there's
    a 'free' function that tells testcrypt when it can dispose of one.
    
    It's possible to speak that protocol by hand, but cumbersome. I've
    also provided a Python module that wraps it, by running testcrypt as a
    persistent subprocess and gatewaying all the function calls into
    things that look reasonably natural to call from Python. The Python
    module and testcrypt.c both read a carefully formatted header file
    testcrypt.h which contains the name and signature of every exported
    function, so it costs minimal effort to expose a given function
    through this test API. In a few cases it's necessary to write a
    wrapper in testcrypt.c that makes the function look more friendly, but
    mostly you don't even need that. (Though that is one of the
    motivations between a lot of API cleanups I've done recently!)
    
    I considered doing Python integration in the more obvious way, by
    linking parts of the PuTTY code directly into a native-code .so Python
    module. I decided against it because this way is more flexible: I can
    run the testcrypt program on its own, or compile it in a way that
    Python wouldn't play nicely with (I bet compiling just that .so with
    Leak Sanitiser wouldn't do what you wanted when Python loaded it!), or
    attach a debugger to it. I can even recompile testcrypt for a
    different CPU architecture (32- vs 64-bit, or even running it on a
    different machine over ssh or under emulation) and still layer the
    nice API on top of that via the local Python interpreter. All I need
    is a bidirectional data channel.
defs.h 3.77 KiB