def test_vector(self): curve = GOST3410Curve(*CURVE_PARAMS["GostR3410_2012_TC26_ParamSetA"]) ukm = ukm_unmarshal(hexdec("1d80603c8544c727")) prvA = prv_unmarshal(hexdec("c990ecd972fce84ec4db022778f50fcac726f46708384b8d458304962d7147f8c2db41cef22c90b102f2968404f9b9be6d47c79692d81826b32b8daca43cb667")) pubA = pub_unmarshal(hexdec("aab0eda4abff21208d18799fb9a8556654ba783070eba10cb9abb253ec56dcf5d3ccba6192e464e6e5bcb6dea137792f2431f6c897eb1b3c0cc14327b1adc0a7914613a3074e363aedb204d38d3563971bd8758e878c9db11403721b48002d38461f92472d40ea92f9958c0ffa4c93756401b97f89fdbe0b5e46e4a4631cdb5a"), mode=2012) prvB = prv_unmarshal(hexdec("48c859f7b6f11585887cc05ec6ef1390cfea739b1a18c0d4662293ef63b79e3b8014070b44918590b4b996acfea4edfbbbcccc8c06edd8bf5bda92a51392d0db")) pubB = pub_unmarshal(hexdec("192fe183b9713a077253c72c8735de2ea42a3dbc66ea317838b65fa32523cd5efca974eda7c863f4954d1147f1f2b25c395fce1c129175e876d132e94ed5a65104883b414c9b592ec4dc84826f07d0b6d9006dda176ce48c391e3f97d102e03bb598bf132a228a45f7201aba08fc524a2d77e43a362ab022ad4028f75bde3b79"), mode=2012) vko = hexdec("79f002a96940ce7bde3259a52e015297adaad84597a0d205b50e3e1719f97bfa7ee1d2661fa9979a5aa235b558a7e6d9f88f982dd63fc35a8ec0dd5e242d3bdf") self.assertEqual(kek_34102012512(curve, prvA, pubB, ukm), vko) self.assertEqual(kek_34102012512(curve, prvB, pubA, ukm), vko)
def keker(curve, prv, pub, ukm): return kek_34102012256( curve, prv_unmarshal(prv), pub_unmarshal(pub, mode=2012), ukm_unmarshal(ukm), )
def export_public_key(key, curve_type="id-tc26-gost-3410-2012-256-paramSetA"): curve = gost3410.CURVES[curve_type] if isinstance(key, tuple): return PublicKey(curve_type=curve_type, pub_key=key) else: key = gost3410.pub_unmarshal(key) return PublicKey(curve_type=curve_type, pub_key=key)
def test_vector(self): curve = CURVES["id-tc26-gost-3410-12-512-paramSetA"] ukm = ukm_unmarshal(hexdec("1d80603c8544c727")) prvA = prv_unmarshal( hexdec( "c990ecd972fce84ec4db022778f50fcac726f46708384b8d458304962d7147f8c2db41cef22c90b102f2968404f9b9be6d47c79692d81826b32b8daca43cb667" )) pubA = pub_unmarshal(hexdec( "aab0eda4abff21208d18799fb9a8556654ba783070eba10cb9abb253ec56dcf5d3ccba6192e464e6e5bcb6dea137792f2431f6c897eb1b3c0cc14327b1adc0a7914613a3074e363aedb204d38d3563971bd8758e878c9db11403721b48002d38461f92472d40ea92f9958c0ffa4c93756401b97f89fdbe0b5e46e4a4631cdb5a" ), mode=2012) prvB = prv_unmarshal( hexdec( "48c859f7b6f11585887cc05ec6ef1390cfea739b1a18c0d4662293ef63b79e3b8014070b44918590b4b996acfea4edfbbbcccc8c06edd8bf5bda92a51392d0db" )) pubB = pub_unmarshal(hexdec( "192fe183b9713a077253c72c8735de2ea42a3dbc66ea317838b65fa32523cd5efca974eda7c863f4954d1147f1f2b25c395fce1c129175e876d132e94ed5a65104883b414c9b592ec4dc84826f07d0b6d9006dda176ce48c391e3f97d102e03bb598bf132a228a45f7201aba08fc524a2d77e43a362ab022ad4028f75bde3b79" ), mode=2012) vko = hexdec( "c9a9a77320e2cc559ed72dce6f47e2192ccea95fa648670582c054c0ef36c221") self.assertSequenceEqual(kek_34102012256(curve, prvA, pubB, ukm), vko) self.assertSequenceEqual(kek_34102012256(curve, prvB, pubA, ukm), vko)
def __init__(self, curve_type=None, pub_key=None, priv_key=None, cert=None): curve = gost3410.CURVES[curve_type] if pub_key == None: self.key = gost3410.public_key(curve, priv_key) else: if type(pub_key) == tuple: self.key = pub_key else: # type = bytes/bytearray self.key = gost3410.pub_unmarshal(pub_key) self.curve = curve self.curve_type = curve_type self.certificate = cert
def process_cert(self, curve_name, mode, hasher, prv_key_raw, cert_raw): cert, tail = Certificate().decode(cert_raw) self.assertSequenceEqual(tail, b"") curve = GOST3410Curve(*CURVE_PARAMS[curve_name]) prv_key = prv_unmarshal(prv_key_raw) pub_key_raw, tail = OctetString().decode( bytes(cert["tbsCertificate"]["subjectPublicKeyInfo"] ["subjectPublicKey"])) pub_key = pub_unmarshal(bytes(pub_key_raw), mode=mode) self.assertSequenceEqual(tail, b"") self.assertSequenceEqual(pub_key, public_key(curve, prv_key)) self.assertTrue( verify( curve, pub_key, hasher(cert["tbsCertificate"].encode()).digest()[::-1], bytes(cert["signatureValue"]), mode=mode, ))
def process_cert(self, curve_name, mode, hasher, prv_key_raw, cert_raw): cert, tail = Certificate().decode( cert_raw, ctx={ "defines_by_path": (( ( "tbsCertificate", "subjectPublicKeyInfo", "algorithm", "algorithm", ), (( ("..", "subjectPublicKey"), { id_tc26_gost3410_2012_256: OctetString(), id_tc26_gost3410_2012_512: OctetString(), }, ), ), ), ), }) self.assertSequenceEqual(tail, b"") curve = CURVES[curve_name] prv_key = prv_unmarshal(prv_key_raw) spk = cert["tbsCertificate"]["subjectPublicKeyInfo"][ "subjectPublicKey"] self.assertIsNotNone(spk.defined) _, pub_key_raw = spk.defined pub_key = pub_unmarshal(bytes(pub_key_raw), mode=mode) self.assertSequenceEqual(pub_key, public_key(curve, prv_key)) self.assertTrue( verify( curve, pub_key, hasher(cert["tbsCertificate"].encode()).digest()[::-1], bytes(cert["signatureValue"]), mode=mode, ))
def _parse_public_key(cls, cert: str) -> Tuple[int, int]: tbs_cert = cls._parse_asn_tbs_cert(cert) info = cls._get_asn_subject_pub_info(tbs_cert) private_key = cls._parse_asn_public_key(info) return gost3410.pub_unmarshal(bytes(private_key))