2 # PyGOST -- Pure Python GOST cryptographic functions library
3 # Copyright (C) 2015-2018 Sergey Matveev <stargrave@stargrave.org>
5 # This program is free software: you can redistribute it and/or modify
6 # it under the terms of the GNU General Public License as published by
7 # the Free Software Foundation, either version 3 of the License, or
8 # (at your option) any later version.
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # GNU General Public License for more details.
15 # You should have received a copy of the GNU General Public License
16 # along with this program. If not, see <http://www.gnu.org/licenses/>.
18 from base64 import b64decode
19 from unittest import skipIf
20 from unittest import TestCase
22 from pygost.gost3410 import CURVE_PARAMS
23 from pygost.gost3410 import GOST3410Curve
24 from pygost.gost3410 import prv_unmarshal
25 from pygost.gost3410 import pub_unmarshal
26 from pygost.gost3410 import public_key
27 from pygost.gost3410 import verify
28 from pygost.gost34112012256 import GOST34112012256
29 from pygost.gost34112012512 import GOST34112012512
30 from pygost.utils import hexdec
33 from pyderasn import OctetString
35 from pygost.asn1schemas.oids import id_tc26_gost3410_2012_256
36 from pygost.asn1schemas.oids import id_tc26_gost3410_2012_512
37 from pygost.asn1schemas.x509 import Certificate
39 pyderasn_exists = False
41 pyderasn_exists = True
44 @skipIf(not pyderasn_exists, "PyDERASN dependency is required")
45 class TestCertificate(TestCase):
46 """Certificate test vectors from "Использования алгоритмов ГОСТ Р
47 34.10, ГОСТ Р 34.11 в профиле сертификата и списке отзыва
48 сертификатов (CRL) инфраструктуры открытых ключей X.509"
52 def process_cert(self, curve_name, mode, hasher, prv_key_raw, cert_raw):
53 cert, tail = Certificate().decode(cert_raw, ctx={
58 "subjectPublicKeyInfo",
64 ("..", "subjectPublicKey"),
66 id_tc26_gost3410_2012_256: OctetString(),
67 id_tc26_gost3410_2012_512: OctetString(),
74 self.assertSequenceEqual(tail, b"")
75 curve = GOST3410Curve(*CURVE_PARAMS[curve_name])
76 prv_key = prv_unmarshal(prv_key_raw)
77 spk = cert["tbsCertificate"]["subjectPublicKeyInfo"]["subjectPublicKey"]
78 self.assertIsNotNone(spk.defined)
79 _, pub_key_raw = spk.defined
80 pub_key = pub_unmarshal(bytes(pub_key_raw), mode=mode)
81 self.assertSequenceEqual(pub_key, public_key(curve, prv_key))
82 self.assertTrue(verify(
85 hasher(cert["tbsCertificate"].encode()).digest()[::-1],
86 bytes(cert["signatureValue"]),
91 cert_raw = b64decode("""
92 MIICYjCCAg+gAwIBAgIBATAKBggqhQMHAQEDAjBWMSkwJwYJKoZIhvcNAQkBFhpH
93 b3N0UjM0MTAtMjAxMkBleGFtcGxlLmNvbTEpMCcGA1UEAxMgR29zdFIzNDEwLTIw
94 MTIgKDI1NiBiaXQpIGV4YW1wbGUwHhcNMTMxMTA1MTQwMjM3WhcNMzAxMTAxMTQw
95 MjM3WjBWMSkwJwYJKoZIhvcNAQkBFhpHb3N0UjM0MTAtMjAxMkBleGFtcGxlLmNv
96 bTEpMCcGA1UEAxMgR29zdFIzNDEwLTIwMTIgKDI1NiBiaXQpIGV4YW1wbGUwZjAf
97 BggqhQMHAQEBATATBgcqhQMCAiQABggqhQMHAQECAgNDAARAut/Qw1MUq9KPqkdH
98 C2xAF3K7TugHfo9n525D2s5mFZdD5pwf90/i4vF0mFmr9nfRwMYP4o0Pg1mOn5Rl
99 aXNYraOBwDCBvTAdBgNVHQ4EFgQU1fIeN1HaPbw+XWUzbkJ+kHJUT0AwCwYDVR0P
100 BAQDAgHGMA8GA1UdEwQIMAYBAf8CAQEwfgYDVR0BBHcwdYAU1fIeN1HaPbw+XWUz
101 bkJ+kHJUT0ChWqRYMFYxKTAnBgkqhkiG9w0BCQEWGkdvc3RSMzQxMC0yMDEyQGV4
102 YW1wbGUuY29tMSkwJwYDVQQDEyBHb3N0UjM0MTAtMjAxMiAoMjU2IGJpdCkgZXhh
103 bXBsZYIBATAKBggqhQMHAQEDAgNBAF5bm4BbARR6hJLEoWJkOsYV3Hd7kXQQjz3C
104 dqQfmHrz6TI6Xojdh/t8ckODv/587NS5/6KsM77vc6Wh90NAT2s=
106 prv_key_raw = hexdec("BFCF1D623E5CDD3032A7C6EABB4A923C46E43D640FFEAAF2C3ED39A8FA399924")[::-1]
108 "GostR3410_2001_CryptoPro_XchA_ParamSet",
116 cert_raw = b64decode("""
117 MIIC6DCCAlSgAwIBAgIBATAKBggqhQMHAQEDAzBWMSkwJwYJKoZIhvcNAQkBFhpH
118 b3N0UjM0MTAtMjAxMkBleGFtcGxlLmNvbTEpMCcGA1UEAxMgR29zdFIzNDEwLTIw
119 MTIgKDUxMiBiaXQpIGV4YW1wbGUwHhcNMTMxMDA0MDczNjA0WhcNMzAxMDAxMDcz
120 NjA0WjBWMSkwJwYJKoZIhvcNAQkBFhpHb3N0UjM0MTAtMjAxMkBleGFtcGxlLmNv
121 bTEpMCcGA1UEAxMgR29zdFIzNDEwLTIwMTIgKDUxMiBiaXQpIGV4YW1wbGUwgaow
122 IQYIKoUDBwEBAQIwFQYJKoUDBwECAQICBggqhQMHAQECAwOBhAAEgYATGQ9VCiM5
123 FRGCQ8MEz2F1dANqhaEuywa8CbxOnTvaGJpFQVXQwkwvLFAKh7hk542vOEtxpKtT
124 CXfGf84nRhMH/Q9bZeAc2eO/yhxrsQhTBufa1Fuou2oe/jUOaG6RAtUUvRzhNTpp
125 RGGl1+EIY2vzzUua9j9Ol/gAoy/LNKQIfqOBwDCBvTAdBgNVHQ4EFgQUPcbTRXJZ
126 nHtjj+eBP7b5lcTMekIwCwYDVR0PBAQDAgHGMA8GA1UdEwQIMAYBAf8CAQEwfgYD
127 VR0BBHcwdYAUPcbTRXJZnHtjj+eBP7b5lcTMekKhWqRYMFYxKTAnBgkqhkiG9w0B
128 CQEWGkdvc3RSMzQxMC0yMDEyQGV4YW1wbGUuY29tMSkwJwYDVQQDEyBHb3N0UjM0
129 MTAtMjAxMiAoNTEyIGJpdCkgZXhhbXBsZYIBATAKBggqhQMHAQEDAwOBgQBObS7o
130 ppPTXzHyVR1DtPa8b57nudJzI4czhsfeX5HDntOq45t9B/qSs8dC6eGxbhHZ9zCO
131 SFtxWYdmg0au8XI9Xb8vTC1qdwWID7FFjMWDNQZb6lYh/J+8F2xKylvB5nIlRZqO
132 o3eUNFkNyHJwQCk2WoOlO16zwGk2tdKH4KmD5w==
134 prv_key_raw = hexdec("3FC01CDCD4EC5F972EB482774C41E66DB7F380528DFE9E67992BA05AEE462435757530E641077CE587B976C8EEB48C48FD33FD175F0C7DE6A44E014E6BCB074B")[::-1]
136 "GostR3410_2012_TC26_ParamSetB",