# Botan

# Python Binding

Note

The Python binding should be considered alpha software, and the interfaces may change in the future.

Botan includes a binding for Python, implemented using Boost.Python.

    #!/usr/bin/python

    import botan

    def make_into_c_array(ber):
        output = 'static unsigned char key_data[%d] = {\n\t' % (len(ber))

        for (idx,c) in zip(range(len(ber)), ber):
            if idx != 0 and idx % 8 == 0:
                output += "\n\t"
            output += "0x%s, " % (c.encode('hex'))

        output += "\n};\n"

        return output

    rng = botan.RandomNumberGenerator()

    rsa_priv = botan.RSA_PrivateKey(768, rng)

    print rsa_priv.to_string()
    print int(rsa_priv.get_N())
    print int(rsa_priv.get_E())

    rsa_pub = botan.RSA_PublicKey(rsa_priv)

    print make_into_c_array(rsa_pub.to_ber())
    #print make_into_c_array(rsa_priv.to_ber())

    key = rng.gen_random(20)

    ciphertext = rsa_pub.encrypt(key, 'EME1(SHA-1)', rng)

    print ciphertext.encode('hex')

    plaintext = rsa_priv.decrypt(ciphertext, 'EME1(SHA-1)')

    print plaintext == key

    signature = rsa_priv.sign(key, 'EMSA4(SHA-256)', rng)

    print rsa_pub.verify(key, signature,  'EMSA4(SHA-256)')

    # Corrupt the signature, make sure it doesn't verify
    signature = signature.replace(signature[0], '0')

    print rsa_pub.verify(key, signature,  'EMSA4(SHA-256)')