diff --git a/src/trezor/crypto/der.py b/src/trezor/crypto/der.py new file mode 100644 index 0000000000..b5eef5246d --- /dev/null +++ b/src/trezor/crypto/der.py @@ -0,0 +1,21 @@ +def convert_length(l: int): + if l < 0x80: + return bytes([l]) + elif l <= 0xFF: + return bytes([0x81, l]) + elif l <= 0xFFFF: + return bytes([0x82, l & 0xFF, l >> 8]) + else: + raise ValueError + +def convert_int(i: bytes): + i = i.lstrip(b'\x00') + if i[0] >= 0x80: + i = b'\x00' + i + return b'\x02' + convert_length(len(i)) + i + +def convert_seq(seq: tuple): + res = b'' + for i in seq: + res += convert_int(i) + return b'\x30' + convert_length(len(res)) + res diff --git a/tests/test_trezor.crypto.der.py b/tests/test_trezor.crypto.der.py new file mode 100644 index 0000000000..6bf9d1088e --- /dev/null +++ b/tests/test_trezor.crypto.der.py @@ -0,0 +1,53 @@ +from common import * + +from trezor.crypto import der + +class TestCryptoDer(unittest.TestCase): + + vectors_sig = [ + ("9a0b7be0d4ed3146ee262b42202841834698bb3ee39c24e7437df208b8b70771", + "2b79ab1e7736219387dffe8d615bbdba87e11477104b867ef47afed1a5ede781", + "30450221009a0b7be0d4ed3146ee262b42202841834698bb3ee39c24e7437df208b8b7077102202b79ab1e7736219387dffe8d615bbdba87e11477104b867ef47afed1a5ede781"), + + ("6666666666666666666666666666666666666666666666666666666666666666", + "7777777777777777777777777777777777777777777777777777777777777777", + "30440220666666666666666666666666666666666666666666666666666666666666666602207777777777777777777777777777777777777777777777777777777777777777"), + + ("6666666666666666666666666666666666666666666666666666666666666666", + "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "304502206666666666666666666666666666666666666666666666666666666666666666022100eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"), + + ("eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "7777777777777777777777777777777777777777777777777777777777777777", + "3045022100eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee02207777777777777777777777777777777777777777777777777777777777777777"), + + ("eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "3046022100eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee022100ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"), + + ("0000000000000000000000000000000000000000000000000000000000000066", + "0000000000000000000000000000000000000000000000000000000000000077", + "3006020166020177"), + + ("0000000000000000000000000000000000000000000000000000000000000066", + "00000000000000000000000000000000000000000000000000000000000000ee", + "3007020166020200ee"), + + ("00000000000000000000000000000000000000000000000000000000000000ee", + "0000000000000000000000000000000000000000000000000000000000000077", + "3007020200ee020177"), + + ("00000000000000000000000000000000000000000000000000000000000000ee", + "00000000000000000000000000000000000000000000000000000000000000ff", + "3008020200ee020200ff"), + ] + + def test_encode_sig_der(self): + + for r, s, d in self.vectors_sig: + r, s, d = unhexlify(r), unhexlify(s), unhexlify(d) + d2 = der.convert_seq((r,s)) + self.assertEqual(d, d2) + +if __name__ == '__main__': + unittest.main()