Я потратить некоторое время, чтобы получить i2d_ECPrivateKey экспорт / i2o_ECPublicKey работает (см
https://github.com/joric/pywallet)
Соответствующий код (он использует только ctypes):
# Если бы импортировать i2d_ECPrivateKey / i2o_ECPublicKey из динамической LIBS.
# Похоже модули / M2Crypto / pyOpenSSL PyCrypto не поддерживают их.
DLLs = список ()
если «выиграть» в sys.platform:
для г в ( 'libeay32.dll', 'libssl32.dll', 'ssleay32.dll'):
пытаться:
dlls.append (cdll.LoadLibrary (д))
Кроме:
проходить
еще:
dlls.append (cdll.LoadLibrary ( 'libssl.so'))
класс BIGNUM_Struct (структура):
_fields_ = [("d", C_void_p), ("Вверх", C_int), ("Dmax", C_int), ("нег", C_int), ("флаги", C_int)]
класс BN_CTX_Struct (структура):
_fields_ = [("_", C_byte)]
BIGNUM = POINTER (BIGNUM_Struct)
BN_CTX = POINTER (BN_CTX_Struct)
Защиту load_func (имя, арг, возвращается = c_int):
д = sys.modules [__name__] .__ dict__
Не F = None
для библиотеки DLL в DLLs:
пытаться:
е = GetAttr (DLL, имя)
f.argtypes = арг
f.restype = возвращает
д [имя] = F
вернуть
Кроме:
проходить
поднять ImportError ( «Невозможно загрузить требуемые функции из SSL библиотеки DLL»)
load_func ( 'BN_new', [], BIGNUM)
load_func ( 'BN_CTX_new', [], BN_CTX)
load_func (,, None 'BN_CTX_free' [BN_CTX])
load_func ( 'BN_num_bits', [BIGNUM], c_int)
load_func ( 'BN_bn2bin', [BIGNUM, c_char_p])
load_func ( 'BN_bin2bn', [c_char_p, c_int, BIGNUM], BIGNUM)
load_func ( 'EC_KEY_new_by_curve_name', [c_int], c_void_p)
load_func ( 'EC_KEY_get0_group', [c_void_p], c_void_p)
load_func ( 'EC_KEY_get0_private_key', [c_void_p], BIGNUM)
load_func ( 'EC_POINT_new', [c_void_p], c_void_p)
load_func ( 'EC_POINT_free', [c_void_p])
load_func ( 'EC_POINT_mul', [c_void_p, c_void_p, BIGNUM, c_void_p, BIGNUM, BN_CTX], c_int)
load_func ( 'EC_KEY_set_private_key', [c_void_p, BIGNUM], c_void_p)
load_func ( 'EC_KEY_set_public_key', [c_void_p, c_void_p], c_void_p)
load_func ( 'i2d_ECPrivateKey', [c_void_p, POINTER (УКАЗАТЕЛЬ (c_char))], c_int)
load_func ( 'i2o_ECPublicKey', [c_void_p, POINTER (УКАЗАТЕЛЬ (c_char))], c_int)
Защиту BN_num_bytes (а):
возвращающие ((BN_num_bits (а) +7) / 8)
NID_secp256k1 = 714
PKey = 0
Защиту EC_KEY_regenerate_key (ЭКЕЙ, priv_key):
группа = EC_KEY_get0_group (ЭКЕЙ)
CTX = BN_CTX_new ()
pub_key = EC_POINT_new (группа)
EC_POINT_mul (группа, pub_key, priv_key, Ничего, Ничего, CTX)
EC_KEY_set_private_key (ЭКЕЙ, priv_key)
EC_KEY_set_public_key (ЭКЕЙ, pub_key)
EC_POINT_free (pub_key)
BN_CTX_free (CTX)
Защиту GetSecret (PKey):
млрд = EC_KEY_get0_private_key (PKey)
nРазмер: = BN_num_bytes (млрд)
б = create_string_buffer (nРазмер:)
BN_bn2bin (млрд, б)
вернуться b.raw
Защиту GetPrivKey (PKey):
nРазмер: = i2d_ECPrivateKey (PKey, отсутствует)
р = create_string_buffer (nРазмер:)
i2d_ECPrivateKey (PKey, ByRef (литой (р, УКАЗАТЕЛЬ (c_char))))
возвращение p.raw
Защиту GetPubKey (PKey):
nРазмер: = i2o_ECPublicKey (PKey, отсутствует)
р = create_string_buffer (nРазмер:)
i2o_ECPublicKey (PKey, ByRef (литой (р, УКАЗАТЕЛЬ (c_char))))
возвращение p.raw
Защиту Hash (данные):
s1 = hashlib.sha256 ()
s1.update (данные)
h1 = s1.digest ()
с2 = hashlib.sha256 ()
s2.update (h1)
h2 = s2.digest ()
возвращение h2
Защиту EncodeBase58Check (vchIn):
хэш = Хеш (vchIn)
вернуть b58encode (vchIn + хэш [0: 4])
Защиту DecodeBase58Check (ПСЗ):
vchRet = b58decode (ПСЗ, отсутствует)
ключ = vchRet [0: -4]
CSUM = vchRet [-4:]
хэш = Hash (ключ)
cs32 = хеш [0: 4]
если cs32 = CSUM:
возвращения None
еще:
клавиша возврата
Защиту SecretToASecret (privkey):
vchSecret = privkey [9: 9 + 32]
# Добавить 1-байтовый номер версии
vchIn = "\ x80" + vchSecret
вернуться EncodeBase58Check (vchIn)
Защиту ASecretToSecret (ключ):
VCH = DecodeBase58Check (ключ)
если VCH:
возвращение VCH [1:]
еще:
вернуться Ложные
Защиту importprivkey (дБ, ключ):
vchSecret = ASecretToSecret (ключ)
если не vchSecret:
вернуться Ложные
PKey = EC_KEY_new_by_curve_name (NID_secp256k1)
Bn = BN_bin2bn (vchSecret, 32, BN_new ())
EC_KEY_regenerate_key (PKey, млрд)
секрет = GetSecret (PKey)
private_key = GetPrivKey (PKey)
public_key = GetPubKey (PKey)
адр = public_key_to_bc_address (public_key)
Распечатать "Адрес:% s" % адр
Распечатать "Privkey:% s" % SecretToASecret (private_key)
update_wallet (дб, 'ключ', { 'public_key': public_key 'private_key': private_key})
update_wallet (дб, 'имя', { 'хэш': адр, 'Имя': ''})
возвращающие