Пример #1
0
def sign_transaction_dict(eth_key, transaction_dict, mode='ECDSA'):
    # generate RLP-serializable transaction, with defaults filled
    unsigned_transaction = serializable_unsigned_transaction_from_dict(transaction_dict)

    if mode == 'ECDSA':
        transaction_hash = unsigned_transaction.hash()
    elif mode == 'SM':
        transaction_hash = HexBytes(sm3.sm3_hash(func.bytes_to_list(rlp.encode(unsigned_transaction))))

    # detect chain
    if isinstance(unsigned_transaction, UnsignedTransaction):
        chain_id = None
    else:
        chain_id = unsigned_transaction.v

    # sign with private key
    if mode == 'SM':
        SMC = sm2.CryptSM2(hex(eth_key),1)
        rand = func.random_hex(SMC.para_len)
        (r, s, v1) = SMC.sign(transaction_hash, rand)
        v = to_eth_v(v1, chain_id)
    else:
        (v, r, s) = sign_transaction_hash(eth_key, transaction_hash, chain_id)

    # serialize transaction with rlp
    encoded_transaction = encode_transaction(unsigned_transaction, vrs=(v, r, s))

    return (v, r, s, encoded_transaction)
Пример #2
0
def sign_message_hash(key, msg_hash, mode='ECDSA'):
    if mode == 'ECDSA':
        signature = key.sign_msg_hash(msg_hash)
        (v_raw, r, s) = signature.vrs
    elif mode == 'SM':
        privatekey = key.to_bytes()
        SMC = sm2.CryptSM2(privatekey.hex(), 1)
        rand = func.random_hex(SMC.para_len)
        (r, s, v_raw) = SMC.sign(msg_hash, rand)

    v = to_eth_v(v_raw)
    eth_signature_bytes = to_bytes32(r) + to_bytes32(s) + to_bytes(v)
    return (v, r, s, eth_signature_bytes)
Пример #3
0
def test_sm3():
    private_key = "3945208F7B2144B13F36E38AC6D39F95889393692860B51A42FB81EF4DF7C5B8"
    public_key = "09F9DF311E5421A150DD7D161E4BC5C672179FAD1833FC076BB08FF356F35020" \
                 "CCEA490CE26775A52DC6EA718CC1AA600AED05FBF35E084A6632F6072DA9AD13"
    random_hex_str = "59276E27D506861A16680F3AD9C02DCCEF3CC1FA3CDBE4CE6D54B80DEAC1BC21"

    sm2_crypt = sm2.CryptSM2(public_key=public_key, private_key=private_key)
    data = b"message digest"

    print("-----------------test SM2withSM3 sign and verify---------------")
    sign = sm2_crypt.sign_with_sm3(data, random_hex_str)
    print('sign: %s' % sign)
    verify = sm2_crypt.verify_with_sm3(sign, data)
    print('verify: %s' % verify)
    assert verify
Пример #4
0
    def __init__(self,
                 private_key_bytes: bytes, mode='ECDSA',
                 backend: 'Union[BaseECCBackend, Type[BaseECCBackend], str, None]' = None,
                 ) -> None:
        validate_private_key_bytes(private_key_bytes)

        self._raw_key = private_key_bytes
        if mode=='ECDSA':
            self.public_key = self.backend.private_key_to_public_key(self)
        elif mode=='SM':
            keys = sm2.CryptSM2(1, 1)
            prikey=private_key_bytes.hex()
            publickey=keys.privatekey_to_publickey(prikey.replace('0x',''))
            self.public_key = PublicKey(publickey,'SM')

        super().__init__(backend=backend)
Пример #5
0
def test_sm2():
    private_key = '00B9AB0B828FF68872F21A837FC303668428DEA11DCD1B24429D0C99E24EED83D5'
    public_key = 'B9C9A6E04E9C91F7BA880429273747D7EF5DDEB0BB2FF6317EB00BEF331A83081A6994B8993F3F5D6EADDDB81872266C87C018FB4162F5AF347B483E24620207'

    sm2_crypt = sm2.CryptSM2(public_key=public_key, private_key=private_key)
    data = b"111"
    enc_data = sm2_crypt.encrypt(data)
    # print("enc_data:%s" % enc_data)
    # print("enc_data_base64:%s" % base64.b64encode(bytes.fromhex(enc_data)))
    dec_data = sm2_crypt.decrypt(enc_data)
    print(b"dec_data:%s" % dec_data)
    assert data == dec_data

    print("-----------------test sign and verify---------------")
    random_hex_str = func.random_hex(sm2_crypt.para_len)
    sign = sm2_crypt.sign(data, random_hex_str)
    print(sign)
    verify = sm2_crypt.verify(sign, data)
    print('verify:%s' % verify)
    assert verify
Пример #6
0
 def sm_verify(self, signature, data: bytes, publickey: str):
     '''
     to verify the sign in 'SM' mode,if the signature is the right sign return True,
     else return False.
     '''
     if 'r' in signature and 's' in signature:
         r = signature['r']
         s = signature['s']
     elif len(signature) == 32:
         signature = HexBytes(signature)
         r = signature[0:32]
         s = signature[33:64]
     else:
         raise ValueError("cann't find (r,s) in signature")
     data = HexBytes(data)
     SMC = sm2.CryptSM2(1, publickey)
     sign = (r, s)
     flag = SMC.verify(sign, data)
     if flag == 0:
         return False
     else:
         return True
Пример #7
0
 def sm_private_to_publickey(self, privatekey: str):
     keys = sm2.CryptSM2(1, 1)
     publickey = keys.privatekey_to_publickey(privatekey)
     return publickey