# -*- Mode: Python -*-

import ctypes
import ctypes.util

ssl  = ctypes.cdll.LoadLibrary (ctypes.util.find_library ('ssl'))

def check_result (val, func, args):
    if val == 0:
        raise ValueError
    else:
        return ctypes.c_void_p (val)


ssl.EC_KEY_new_by_curve_name.restype = ctypes.c_void_p
ssl.EC_KEY_new_by_curve_name.errcheck = check_result

k = ssl.EC_KEY_new_by_curve_name (714) # NID_secp256k1
print ssl.EC_KEY_generate_key (k)
size = ssl.i2d_ECPrivateKey (k, 0)
mb_pri = ctypes.create_string_buffer (size)
ssl.i2d_ECPrivateKey (k, ctypes.byref (ctypes.pointer (mb_pri)))

size = ssl.i2o_ECPublicKey (k, 0)
mb_pub = ctypes.create_string_buffer (size)
ssl.i2o_ECPublicKey (k, ctypes.byref (ctypes.pointer (mb_pub)))

print 'private', repr (mb_pri.raw)
print 'public', repr (mb_pub.raw)

from hashlib import sha256

hash = sha256 ('howdy there pardner').digest()

sig_size = ssl.ECDSA_size (k)
mb_sig = ctypes.create_string_buffer (sig_size)

sig_size0 = ctypes.POINTER (ctypes.c_int)()

print ssl.ECDSA_sign   (0, hash, len (hash), mb_sig, ctypes.byref (sig_size0), k)
print ssl.ECDSA_verify (0, hash, len (hash), mb_sig, sig_size, k)

print 'sig', repr (mb_sig.raw)

from pyasn1.codec.der import decoder

print '---------- private key ------------'
print decoder.decode (mb_pri.raw)
print '----------- signature -------------'
print decoder.decode (mb_sig.raw)

