# -*- 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)