def sign(self, data): ecdsa_sig = None try: # Hash and apply ECDSA hashBuf = bytesToC(Digest.SHA256(data)) ecdsa_sig = o.ECDSA_do_sign(hashBuf, 32, self.ec_key) # Encode the signature into 64 bytes rBuf = bytesToC(bytearray(32)) sBuf = bytesToC(bytearray(32)) rLen = o.BN_bn2bin(ecdsa_sig.contents.r, rBuf) sLen = o.BN_bn2bin(ecdsa_sig.contents.s, sBuf) rBytes = bytearray(32-rLen) + cToBytes(rBuf)[:rLen] sBytes = bytearray(32-sLen) + cToBytes(sBuf)[:sLen] sigBytes = rBytes + sBytes assert(len(sigBytes) == 64) finally: if ecdsa_sig: o.ECDSA_SIG_free(ecdsa_sig) # Double-check the signature before returning assert(OpenSSL_ECPublicKey(self.rawPublicKey).verify(data, sigBytes)) return sigBytes
def sign(self, data): ecdsa_sig = None try: # Hash and apply ECDSA hashBuf = bytesToC(Digest.SHA256(data)) ecdsa_sig = o.ECDSA_do_sign(hashBuf, 32, self.ec_key) # Encode the signature into 64 bytes rBuf = bytesToC(bytearray(32)) sBuf = bytesToC(bytearray(32)) rLen = o.BN_bn2bin(ecdsa_sig.contents.r, rBuf) sLen = o.BN_bn2bin(ecdsa_sig.contents.s, sBuf) rBytes = bytearray(32 - rLen) + cToBytes(rBuf)[:rLen] sBytes = bytearray(32 - sLen) + cToBytes(sBuf)[:sLen] sigBytes = rBytes + sBytes assert (len(sigBytes) == 64) finally: if ecdsa_sig: o.ECDSA_SIG_free(ecdsa_sig) # Double-check the signature before returning assert (OpenSSL_ECPublicKey(self.rawPublicKey).verify(data, sigBytes)) return sigBytes
def generateECKeyPair(): ec_key, ec_group = None, None try: # Generate the new key ec_key = o.EC_KEY_new_by_curve_name(o.OBJ_txt2nid(b"prime256v1")) o.EC_KEY_generate_key(ec_key) # Extract the key's public and private values as strings # into pubBuf and privBuf pubBuf = bytesToC(bytearray(1+64)) # [0x04] ... privBuf = bytesToC(bytearray(32)) ec_point = o.EC_KEY_get0_public_key(ec_key) ec_group = o.EC_GROUP_new_by_curve_name(o.OBJ_txt2nid(b"prime256v1")) o.EC_POINT_point2oct(ec_group, ec_point, o.POINT_CONVERSION_UNCOMPRESSED, pubBuf, 65, None) bignum = o.EC_KEY_get0_private_key(ec_key) privLen = o.BN_bn2bin(bignum, privBuf) # Convert the public and private keys into fixed-length 64 and 32 byte arrays # Leading zeros are added to priv key, leading byte (0x04) stripped from pub key rawPublicKey = cToBytes(pubBuf)[1:65] rawPrivateKey = bytearray(32-privLen) + (cToBytes(privBuf)[:privLen]) # Test signing and verification with the new key # sign() does a verify() internally pub = OpenSSL_ECPublicKey(rawPublicKey) priv = OpenSSL_ECPrivateKey(rawPrivateKey, rawPublicKey) priv.sign(b"test") return (pub, priv) finally: if ec_key: o.EC_KEY_free(ec_key) if ec_group: o.EC_GROUP_free(ec_group)
def verify(self, data, signature): assert(len(signature) == 64) ecdsa_sig = None try: # Create ECDSA_SIG ecdsa_sig = o.ECDSA_SIG_new() rBuf = bytesToC(signature[ : 32]) sBuf = bytesToC(signature[32 : ]) o.BN_bin2bn(rBuf, 32, ecdsa_sig.contents.r) o.BN_bin2bn(sBuf, 32, ecdsa_sig.contents.s) # Hash and verify ECDSA hashBuf = bytesToC(Digest.SHA256(data)) retval = o.ECDSA_do_verify(hashBuf, 32, ecdsa_sig, self.ec_key) if retval == 1: return True elif retval == 0: return False else: assert(False) finally: if ecdsa_sig: o.ECDSA_SIG_free(ecdsa_sig)
def verify(self, data, signature): assert (len(signature) == 64) ecdsa_sig = None try: # Create ECDSA_SIG ecdsa_sig = o.ECDSA_SIG_new() rBuf = bytesToC(signature[:32]) sBuf = bytesToC(signature[32:]) o.BN_bin2bn(rBuf, 32, ecdsa_sig.contents.r) o.BN_bin2bn(sBuf, 32, ecdsa_sig.contents.s) # Hash and verify ECDSA hashBuf = bytesToC(Digest.SHA256(data)) retval = o.ECDSA_do_verify(hashBuf, 32, ecdsa_sig, self.ec_key) if retval == 1: return True elif retval == 0: return False else: assert (False) finally: if ecdsa_sig: o.ECDSA_SIG_free(ecdsa_sig)
def _constructEcFromRawKey(self, rawPrivateKey): privBignum, ec_key = None, None try: ec_key = o.EC_KEY_new_by_curve_name(o.OBJ_txt2nid(b"prime256v1")) privBuf = bytesToC(rawPrivateKey) privBignum = o.BN_new() o.BN_bin2bn(privBuf, 32, privBignum) o.EC_KEY_set_private_key(ec_key, privBignum) return o.EC_KEY_dup(ec_key) finally: if privBignum: o.BN_free(privBignum) if ec_key: o.EC_KEY_free(ec_key)
def _constructEcFromRawKey(self, rawPublicKey): ec_key, ec_group, ec_point = None, None, None try: ec_key = o.EC_KEY_new_by_curve_name(o.OBJ_txt2nid(b"prime256v1")) ec_group = o.EC_GROUP_new_by_curve_name(o.OBJ_txt2nid(b"prime256v1")) ec_point = o.EC_POINT_new(ec_group) # Add 0x04 byte to signal "uncompressed" public key pubBuf = bytesToC(bytearray([0x04]) + rawPublicKey) o.EC_POINT_oct2point(ec_group, ec_point, pubBuf, 65, None) o.EC_KEY_set_public_key(ec_key, ec_point) return o.EC_KEY_dup(ec_key) finally: if ec_key: o.EC_KEY_free(ec_key) if ec_group: o.EC_GROUP_free(ec_group) if ec_point: o.EC_POINT_free(ec_point)
def _constructEcFromRawKey(self, rawPublicKey): ec_key, ec_group, ec_point = None, None, None try: ec_key = o.EC_KEY_new_by_curve_name(o.OBJ_txt2nid(b"prime256v1")) ec_group = o.EC_GROUP_new_by_curve_name( o.OBJ_txt2nid(b"prime256v1")) ec_point = o.EC_POINT_new(ec_group) # Add 0x04 byte to signal "uncompressed" public key pubBuf = bytesToC(bytearray([0x04]) + rawPublicKey) o.EC_POINT_oct2point(ec_group, ec_point, pubBuf, 65, None) o.EC_KEY_set_public_key(ec_key, ec_point) return o.EC_KEY_dup(ec_key) finally: if ec_key: o.EC_KEY_free(ec_key) if ec_group: o.EC_GROUP_free(ec_group) if ec_point: o.EC_POINT_free(ec_point)