Changeset View
Changeset View
Standalone View
Standalone View
test/functional/test_framework/key.py
Show First 20 Lines • Show All 121 Lines • ▼ Show 20 Lines | def set_secretbytes(self, secret): | ||||
ssl.EC_KEY_set_public_key(self.k, pub_key) | ssl.EC_KEY_set_public_key(self.k, pub_key) | ||||
ssl.BN_free(priv_key) | ssl.BN_free(priv_key) | ||||
ssl.EC_POINT_free(pub_key) | ssl.EC_POINT_free(pub_key) | ||||
ssl.BN_CTX_free(ctx) | ssl.BN_CTX_free(ctx) | ||||
return self.k | return self.k | ||||
def set_privkey(self, key): | def set_privkey(self, key): | ||||
self.mb = ctypes.create_string_buffer(key) | self.mb = ctypes.create_string_buffer(key) | ||||
return ssl.d2i_ECPrivateKey(ctypes.byref(self.k), ctypes.byref(ctypes.pointer(self.mb)), len(key)) | return ssl.d2i_ECPrivateKey(ctypes.byref( | ||||
self.k), ctypes.byref(ctypes.pointer(self.mb)), len(key)) | |||||
def set_pubkey(self, key): | def set_pubkey(self, key): | ||||
self.mb = ctypes.create_string_buffer(key) | self.mb = ctypes.create_string_buffer(key) | ||||
return ssl.o2i_ECPublicKey(ctypes.byref(self.k), ctypes.byref(ctypes.pointer(self.mb)), len(key)) | return ssl.o2i_ECPublicKey(ctypes.byref( | ||||
self.k), ctypes.byref(ctypes.pointer(self.mb)), len(key)) | |||||
def get_privkey(self): | def get_privkey(self): | ||||
size = ssl.i2d_ECPrivateKey(self.k, 0) | size = ssl.i2d_ECPrivateKey(self.k, 0) | ||||
mb_pri = ctypes.create_string_buffer(size) | mb_pri = ctypes.create_string_buffer(size) | ||||
ssl.i2d_ECPrivateKey(self.k, ctypes.byref(ctypes.pointer(mb_pri))) | ssl.i2d_ECPrivateKey(self.k, ctypes.byref(ctypes.pointer(mb_pri))) | ||||
return mb_pri.raw | return mb_pri.raw | ||||
def get_pubkey(self): | def get_pubkey(self): | ||||
size = ssl.i2o_ECPublicKey(self.k, 0) | size = ssl.i2o_ECPublicKey(self.k, 0) | ||||
mb = ctypes.create_string_buffer(size) | mb = ctypes.create_string_buffer(size) | ||||
ssl.i2o_ECPublicKey(self.k, ctypes.byref(ctypes.pointer(mb))) | ssl.i2o_ECPublicKey(self.k, ctypes.byref(ctypes.pointer(mb))) | ||||
return mb.raw | return mb.raw | ||||
def get_raw_ecdh_key(self, other_pubkey): | def get_raw_ecdh_key(self, other_pubkey): | ||||
ecdh_keybuffer = ctypes.create_string_buffer(32) | ecdh_keybuffer = ctypes.create_string_buffer(32) | ||||
r = ssl.ECDH_compute_key(ctypes.pointer(ecdh_keybuffer), 32, | r = ssl.ECDH_compute_key(ctypes.pointer(ecdh_keybuffer), 32, | ||||
ssl.EC_KEY_get0_public_key(other_pubkey.k), | ssl.EC_KEY_get0_public_key(other_pubkey.k), | ||||
self.k, 0) | self.k, 0) | ||||
if r != 32: | if r != 32: | ||||
raise Exception('CKey.get_ecdh_key(): ECDH_compute_key() failed') | raise Exception('CKey.get_ecdh_key(): ECDH_compute_key() failed') | ||||
return ecdh_keybuffer.raw | return ecdh_keybuffer.raw | ||||
def get_ecdh_key(self, other_pubkey, kdf=lambda k: hashlib.sha256(k).digest()): | def get_ecdh_key(self, other_pubkey, | ||||
kdf=lambda k: hashlib.sha256(k).digest()): | |||||
# FIXME: be warned it's not clear what the kdf should be as a default | # FIXME: be warned it's not clear what the kdf should be as a default | ||||
r = self.get_raw_ecdh_key(other_pubkey) | r = self.get_raw_ecdh_key(other_pubkey) | ||||
return kdf(r) | return kdf(r) | ||||
def sign(self, hash, low_s=True): | def sign(self, hash, low_s=True): | ||||
# FIXME: need unit tests for below cases | # FIXME: need unit tests for below cases | ||||
if not isinstance(hash, bytes): | if not isinstance(hash, bytes): | ||||
raise TypeError( | raise TypeError( | ||||
Show All 16 Lines | def sign(self, hash, low_s=True): | ||||
s_size = mb_sig.raw[5 + r_size] | s_size = mb_sig.raw[5 + r_size] | ||||
s_value = int.from_bytes( | s_value = int.from_bytes( | ||||
mb_sig.raw[6 + r_size:6 + r_size + s_size], byteorder='big') | mb_sig.raw[6 + r_size:6 + r_size + s_size], byteorder='big') | ||||
if (not low_s) or s_value <= SECP256K1_ORDER_HALF: | if (not low_s) or s_value <= SECP256K1_ORDER_HALF: | ||||
return mb_sig.raw[:sig_size0.value] | return mb_sig.raw[:sig_size0.value] | ||||
else: | else: | ||||
low_s_value = SECP256K1_ORDER - s_value | low_s_value = SECP256K1_ORDER - s_value | ||||
low_s_bytes = (low_s_value).to_bytes(33, byteorder='big') | low_s_bytes = (low_s_value).to_bytes(33, byteorder='big') | ||||
while len(low_s_bytes) > 1 and low_s_bytes[0] == 0 and low_s_bytes[1] < 0x80: | while len( | ||||
low_s_bytes) > 1 and low_s_bytes[0] == 0 and low_s_bytes[1] < 0x80: | |||||
low_s_bytes = low_s_bytes[1:] | low_s_bytes = low_s_bytes[1:] | ||||
new_s_size = len(low_s_bytes) | new_s_size = len(low_s_bytes) | ||||
new_total_size_byte = ( | new_total_size_byte = ( | ||||
total_size + new_s_size - s_size).to_bytes(1, byteorder='big') | total_size + new_s_size - s_size).to_bytes(1, byteorder='big') | ||||
new_s_size_byte = (new_s_size).to_bytes(1, byteorder='big') | new_s_size_byte = (new_s_size).to_bytes(1, byteorder='big') | ||||
return b'\x30' + new_total_size_byte + mb_sig.raw[2:5 + r_size] + new_s_size_byte + low_s_bytes | return b'\x30' + new_total_size_byte + \ | ||||
mb_sig.raw[2:5 + r_size] + new_s_size_byte + low_s_bytes | |||||
def verify(self, hash, sig): | def verify(self, hash, sig): | ||||
"""Verify a DER signature""" | """Verify a DER signature""" | ||||
return ssl.ECDSA_verify(0, hash, len(hash), sig, len(sig), self.k) == 1 | return ssl.ECDSA_verify(0, hash, len(hash), sig, len(sig), self.k) == 1 | ||||
def set_compressed(self, compressed): | def set_compressed(self, compressed): | ||||
if compressed: | if compressed: | ||||
form = self.POINT_CONVERSION_COMPRESSED | form = self.POINT_CONVERSION_COMPRESSED | ||||
Show All 30 Lines | class CPubKey(bytes): | ||||
def verify(self, hash, sig): | def verify(self, hash, sig): | ||||
return self._cec_key.verify(hash, sig) | return self._cec_key.verify(hash, sig) | ||||
def __str__(self): | def __str__(self): | ||||
return repr(self) | return repr(self) | ||||
def __repr__(self): | def __repr__(self): | ||||
return '{}({})'.format(self.__class__.__name__, super(CPubKey, self).__repr__()) | return '{}({})'.format(self.__class__.__name__, | ||||
super(CPubKey, self).__repr__()) |