
2018 рдХреА рджреВрд╕рд░реА рдЫрдорд╛рд╣реА рдХрд░реАрдм рдЖ рд░рд╣реА рд╣реИ рдФрд░ рдЬрд▓реНрдж рд╣реА рд░реВрд╕реА рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлреА рдкрд░ рдЖрдзрд╛рд░рд┐рдд
рдкреАрдХреЗрдЖрдИ рдореЗрдВ
"2000 рд╡рд╛рдВ рд╡рд░реНрд╖" рдЖрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╣реИ рдХрд┐
31 рджрд┐рд╕рдВрдмрд░, 2018 рдХреЗ рдмрд╛рдж рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП GOST R 34.10-2001 рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдпреЛрдЬрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИ!
рдЖрдЬ GOST R 34.10-2001 рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рд╕рд╛рде рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИред
рдЗрд╕реА рд╕рдордп, рдУрдкрдирдПрд╕рдПрд╕рдПрд▓ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдмрд╣реБрдд рд╕рд╛рд░реА рд╕реЗрд╡рд╛рдПрдВ рдпрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ GOST R 34.10.1001 рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд╛ рд╕рдорд░реНрдерди рдХрд┐рдпрд╛ред
рд▓реЗрдХрд┐рди рдЖрдЬ рдХреЗ рдУрдкрди рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдорд╛рдирдХ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ GOST R 34.11-2012 рдФрд░ GOST R 34.10-2012 рджреЛрдиреЛрдВ рдХрд╛ рдХреЛрдИ рд╕рдорд░реНрдерди рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕рдВрд╕реНрдХрд░рдг 1.1 рдореЗрдВ, GOST рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлреА рд╕рдорд░реНрдерди рдорд╛рдирдХ рд╡рд┐рддрд░рдг рд╕реЗ
рдмрд╛рд╣рд░ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ ("GOST рдЗрдВрдЬрди рдкреБрд░рд╛рдирд╛ рдерд╛ рдФрд░ рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред")ред
рдпрд╣ рд╕рдм рд╣рдореЗрдВ рдкреНрд░рдорд╛рдгрдкрддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде рдЗрд▓реЗрдХреНрдЯреНрд░реЙрдирд┐рдХ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ ("рд╕реАрдПрдордПрд╕ рдкреНрд░рд╛рд░реВрдк рд╕рдВрджреЗрд╢") рдФрд░ рдирдП рд░реВрд╕реА рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлреА рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЕрдиреНрдп PKI рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд╡реИрдХрд▓реНрдкрд┐рдХ рддрд░реАрдХреЛрдВ рдХреА рддрд▓рд╛рд╢ рдХрд░рддрд╛ рд╣реИред
рдРрд╕рд╛ рдПрдХ рд╕рдВрднрд╡ рддрд░реАрдХрд╛
рдЬреАрд╕реАрдХреНрд░рд┐рдкреНрдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред рдпрд╣ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдирдП рдПрд▓реНрдЧреЛрд░рд┐рджрдо GOST R 34.11-2012 (рд╣реИрд╢рд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рджрдо) рдФрд░ GOST R 34.10-2012 (рд╕рд┐рдЧреНрдиреЗрдЪрд░ рдПрд▓реНрдЧреЛрд░рд┐рдердо) рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреА рд╣реИред
рдкреНрд░рдореБрдЦ рдЬреЛрдбрд╝реА рдкреАрдврд╝реА
рдЗрд╕рд▓рд┐рдП, рд╣рдо рдирд┐рдЬреА рдФрд░ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреБрдВрдЬреА рджреЛрдиреЛрдВ рдХреЛ рдорд┐рд▓рд╛рдХрд░ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЬреЛрдбрд╝реА рдмрдирд╛рддреЗ рд╣реИрдВред рд╡рд░реНрддрдорд╛рди рдореЗрдВ, рд░реВрд╕реА рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлреА рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рдУрдб-рдПрд╕ рдХреЗ рд╕рд╛рде рддреАрди рдкреНрд░рдХрд╛рд░ рдХреА рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреБрдВрдЬреА рд╣реИрдВ
- 256 рдмрд┐рдЯреНрд╕ рдХреА рдПрдХ рдкреНрд░рдореБрдЦ рд▓рдВрдмрд╛рдИ рдХреЗ рд╕рд╛рде GOST R 34.10-2001, oid 1.2.643.2.2.19 (0x2a, 0x85, 0x03, 0x02, 0x02, 0x13);
- GOST R 34.10-2012 рдореЗрдВ 256 рдмрд┐рдЯреНрд╕ (рдЗрд╕рдХреЗ рдмрд╛рдж GOST R 34.10-12-256) рдХреА рдкреНрд░рдореБрдЦ рд▓рдВрдмрд╛рдИ рдХреЗ рд╕рд╛рде, 1.2.1643.7.1.1.1.1 (0x2a, 0x85, 0x03, 0x07, 0x01, 0x01, 0x01, 0x01);
- GOST R 34.10-2012 512 рдмрд┐рдЯреНрд╕ рдХреА рдкреНрд░рдореБрдЦ рд▓рдВрдмрд╛рдИ рдХреЗ рд╕рд╛рде (рдмрд╛рдж рдореЗрдВ GOST R 34.10-12-512), oid 1.2.643.7.1.1.2.2 (0x2a, 0x85, 0x03, 0x07, 0x01, 0x01, 0x01, 0x02)ред
рдФрд░ рддреБрд░рдВрдд рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЧрдгрд┐рдд, рдкреАрдврд╝реА рдХреЗ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдФрд░ рдЙрдирдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, GOST R 34.10-2001 рдФрд░ GOST R 34.10-12-256 рдХреА рдЪрд╛рдмрд┐рдпрд╛рдБ рдмрд┐рд▓реНрдХреБрд▓ рд╕рдорд╛рди рд╣реИрдВ! рд╕рд╛рде рд╣реА рдЙрдирдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЗрд▓реЗрдХреНрдЯреНрд░реЙрдирд┐рдХ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рдЧрдарди рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рдПрд▓реНрдЧреЛрд░рд┐рджрдоред рдкреНрд░рд╢реНрди рдореЗрдВ рдЗрдирдореЗрдВ рд╕реЗ рдХреМрди рд╕реА рдХреБрдВрдЬреА рдХрд╛ рдЕрдиреБрдорд╛рди рдХреЗрд╡рд▓ рдХреБрдВрдЬреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╕реЗ рд▓рдЧрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдореЗрдВред рддреЛ рдЗрд╕рдиреЗ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдУрдб рдХреНрдпреЛрдВ рд▓рд┐рдП? рдХреЗрд╡рд▓ рдЗрд╕ рддрдереНрдп рдкрд░ рдЬреЛрд░ рджреЗрдВ рдХрд┐ GOST R 34.10-2001 рдХреБрдВрдЬреА рдХреЗ рд╕рд╛рде рдЗрд▓реЗрдХреНрдЯреНрд░реЙрдирд┐рдХ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдмрдирд╛рддреЗ рд╕рдордп, GOST R 34.10-94 рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдкреНрд░рд╛рдкреНрдд рд╣реИрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ GOST R 34.10-12-256 рдХреБрдВрдЬреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, GOST R 34.10- рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред 212 рдмрд┐рдЯреНрд╕ рдХреА рд▓рдВрдмрд╛рдИ рдХреЗ рд╕рд╛рде 212ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕ рдкрд░ рдЬреЛрд░ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕реА рдУрдЖрдИрдбреАрдПрд╕ рд╣реИрдВ:
- 1.2.643.2.2.3 (0x2a, 0x85, 0x03, 0x02, 0x02, 0x03) - рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо GOST R 34.10-2001 рдХреЗ рд╕рд╛рде 256 рдкреНрд░рдореБрдЦ рд╣реИрд╢рд┐рдВрдЧ GOST 34.11-94 рдХреЗ рд╕рд╛рде;
- 1.2.643.7.1.1.3.2 (0x2a, 0x85, 0x03, 0x07, 0x01, 0x01, 0x03, 0x02) - рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо GOST R 34.102 рдХреЗ рд╕рд╛рде рдореБрдЦреНрдп 256 рд╣реИрд╢рд┐рдВрдЧ GOST R 34.11-2012 рдХреЗ рд╕рд╛рде;
- 1.2.643.7.1.1.3.3 (0x2a, 0x85, 0x03, 0x07, 0x01, 0x01, 0x03, 0x03) - рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо GOST R 34.102 рд╣реИрд╢рдЯ GOST R 34.11-2012 рдХреЗ рд╕рд╛рде рдХреБрдВрдЬреА 512 рдХреЗ рд╕рд╛рдеред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдУрдб-рдПрд╕ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдЫрдВрдЯрдиреА рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╣реИ, рд╡рд╣ рд╣реИред
GOST рдкрд░рд┐рд╡рд╛рд░ рдХреА рдХреБрдВрдЬреА рдЕрдгреНрдбрд╛рдХрд╛рд░ рдШрдЯрддрд╛ рдкрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкрд░рд┐рд╡рд╛рд░ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред рдПрдХ рдкреНрд░рдореБрдЦ рдЬреЛрдбрд╝реА рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рдЕрдгреНрдбрд╛рдХрд╛рд░ рд╡рдХреНрд░ рдкрд░ рдПрдХ рдЖрдзрд╛рд░ рдмрд┐рдВрджреБ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдорд╛рдирдХреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рддрдХрдиреАрдХреА рд╕рдорд┐рддрд┐ "рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлрд┐рдХ рд╕реВрдЪрдирд╛ рд╕реБрд░рдХреНрд╖рд╛" (
рдЯреАрд╕реА 26 ) рдХреБрдВрдЬреА GOST R 34.10-2012-512 рдХреЗ рд▓рд┐рдП рджреЛ рдЖрдзрд╛рд░ рдмрд┐рдВрджреБрдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЧрдИ рд╣реИ:
- GOST2012-tc26-A (libgcrypt рд╢рдмреНрджрд╛рд╡рд▓реА рдореЗрдВ рдЙрдкрдирд╛рдо) 1.2.643.7.1.1.2.1.1 (0x2a, 0x85, 0x03, 0x07, 0x01, 0x02, 0x01, 0x02, 0x01) рдХреЗ рд╕рд╛рде;
- GOST2012-tc26-B рдХреЗ рд╕рд╛рде oid 1.2.643.7.1.2.2.2.2 (0x2a, 0x85, 0x03, 0x07, 0x01, 0x02, 0x01, 0x02, 0x02);
256 рдмрд┐рдЯреНрд╕ рдХреА рд▓рдВрдмрд╛рдИ рдХреЗ рд╕рд╛рде GOST R 34.10 рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП, рддреАрди рдЖрдзрд╛рд░ рдмрд┐рдВрджреБрдУрдВ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИ:
- GOST2001-CryptoPro-A рдУрдб рдУрдо рдХреЗ рд╕рд╛рде 1.2.643.2.2.35.1 (0x2a, 0x85, 0x03, 0x02, 0x02, 0x23, 0x01);
- GOST2001-CryptoPro-B рдУрдб 1.2.643.2.2.35.2 (0x2a, 0x85, 0x03, 0x02, 0x02, 0x23, 0x02) рдХреЗ рд╕рд╛рде;
- GOST2001-CryptoPro-C рдУрдб 1.2.643.2.2.35.3 (0x2a, 0x85, 0x03, 0x02, 0x02, 0x23, 0x03) рдХреЗ рд╕рд╛рдеред
GOST R 34.10 рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП 256 рдмрд┐рдЯреНрд╕ рдХреА рд▓рдВрдмрд╛рдИ рдХреЗ рд╕рд╛рде, рджреЛ рдФрд░ рдУрдЖрдИрдбреА рдХреЛ рдЖрдзрд╛рд░ рдмрд┐рдВрджреБрдУрдВ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
- GOST2001-CryptoPro-XchA рдХреЗ рд╕рд╛рде oid 1.2.643.2.2.36.0 (0x2a, 0x85, 0x03, 0x02, 0x02, 0x24, 0x00);
- GOST2001-CryptoPro-XchB рдХреЗ рд╕рд╛рде oid 1.2.643.2.2.36.1 (0x2a, 0x85, 0x03, 0x02, 0x02, 0x24, 0x01)ред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпреЗ oids рдХреНрд░рдорд╢рдГ 1.2.643.2.2.35.1 рдФрд░ GOST2001-CryptoPro-C рдХреЗ рд╕рд╛рде OID 1.2.643.2.2.35.3 рдХреЗ рд╕рд╛рде GOST2001-CryptoPro-A рдХреЗ рдЖрдзрд╛рд░ рдмрд┐рдВрджреБрдУрдВ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддреЗ рд╣реИрдВред
рдФрд░ рдЗрди рдУрдб-рдПрд╕ рдХреЗ рд╕рд╛рде рдмреЗрд╕ рдкреЙрдЗрдВрдЯ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╕рдордп рдЗрд╕реЗ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдПрдХ рдкреНрд░рдореБрдЦ рдЬреЛрдбрд╝реА рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдлреЙрд░реНрдо рдХреЗ gcry_pk_genkey рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
gcry_error_t gcry_pk_genkey (gcry sexp t *key_pair, gcry sexp t key_spec ).
рдЖрдВрддрд░рд┐рдХ
рдПрд╕-рдПрдХреНрд╕рдкреНрд░реЗрд╢рди (рд╕реЗрдХреНрд╕рдк) рдХреЗ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдореБрдЦреНрдп рдЬреЛрдбрд╝реА рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреИрд░рд╛рдореАрдЯрд░реНрд╕ рдЪрд░ рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗрдЯ рдХрд┐рдП рдЬрд╛рдиреЗ рдЪрд╛рд╣рд┐рдПред GOST рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЬреЛрдбрд╝реА рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреИрд░рд╛рдореАрдЯрд░ рдирд┐рдореНрди S- рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВ:
(genkey ( (curve _))),
ecc рдЕрдгреНрдбрд╛рдХрд╛рд░ рд╡рдХреНрд░реЛрдВ рдкрд░ рдкреНрд░рдореБрдЦ рдЬреЛрдбрд╝реА рдХреА рдкреАрдврд╝реА рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЖрдзрд╛рд░ рдмрд┐рдВрджреБ рдХреЛ TK-26 рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрд╢рдВрд╕рд┐рдд рд╡рд┐рд╢рд┐рд╖реНрдЯ рдмрд┐рдВрджреБ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЖрдзрд╛рд░ рдмрд┐рдВрджреБ рд╣реИ рдЬреЛ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреМрди рд╕реА рдХреБрдВрдЬреА рдЬреЛрдбрд╝реА рдЙрддреНрдкрдиреНрди рд╣реЛрдЧреАред рдпрджрд┐ рдЖрдк рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, GOST2012-tc26-A рдпрд╛ GOST2012-tc26-B, рддреЛ 512 рдмрд┐рдЯреНрд╕ рдХреА рдХреБрдВрдЬреА рд▓рдВрдмрд╛рдИ рдХреЗ рд╕рд╛рде GOST R 34.10-2012 рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдПрдХ рдкреНрд░рдореБрдЦ рдЬреЛрдбрд╝реА рдЙрддреНрдкрдиреНрди рд╣реЛрдЧреАред рдЖрдзрд╛рд░ рдмрд┐рдВрджреБ рдХреЗ рдЙрдкрдирд╛рдо рдХреЗ рдмрдЬрд╛рдп, рдЖрдк рд╕реАрдзреЗ рдУрдЖрдИрдбреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
(genkey ( (curve ┬л1.2.643.2.2.35.3┬╗)))
рдмрд╛рдж рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рдореБрдЦ рдЬреЛрдбрд╝реА 256 рдмрд┐рдЯреНрд╕ рдХреА рдкреНрд░рдореБрдЦ рд▓рдВрдмрд╛рдИ рдФрд░ GOST2001-CryptoPro-C рдЖрдзрд╛рд░ рдмрд┐рдВрджреБ рдХреЗ рд╕рд╛рде GOST R 34.10 рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИред
рдиреАрдЪреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг C рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╣реИ рдЬреЛ рдкреНрд░рдореБрдЦ рдкреАрдврд╝реА рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ
GenKey.c #include <stdio.h> #include <stdlib.h> #include <stdarg.h> #include <gcrypt.h> /* S-*/ static void show_sexp (const char *prefix, gcry_sexp_t a) { char *buf; size_t size; if (prefix) fputs (prefix, stderr); size = gcry_sexp_sprint (a, GCRYSEXP_FMT_ADVANCED, NULL, 0); buf = gcry_xmalloc (size); gcry_sexp_sprint (a, GCRYSEXP_FMT_ADVANCED, buf, size); fprintf (stderr, "%.*s", (int)size, buf); gcry_free (buf); } int main(int argc, char* argv[]) { gpg_error_t err; gcry_sexp_t key_spec, key_pair, pub_key, sec_key; /* */ char *curve_gost[] = {"GOST2001-CryptoPro-A", "GOST2001-CryptoPro-B", "GOST2001-CryptoPro-C", "GOST2012-tc26-A", "GOST2012-tc26-B", NULL}; /* */ err = gcry_sexp_build (&key_spec, NULL, "(genkey (ecc (curve %s)))", curve_gost[1]); if (err) { fprintf(stderr, "creating S-expression failed: %s\n", gcry_strerror (err)); exit (1); } err = gcry_pk_genkey (&key_pair, key_spec); if (err){ fprintf(stderr, "creating %s key failed: %s\n", argv[1], gcry_strerror (err)); exit(1); } /* S- */ show_sexp ("ECC GOST key pair:\n", key_pair); /* */ pub_key = gcry_sexp_find_token (key_pair, "public-key", 0); if (! pub_key) { fprintf(stderr, "public part missing in key\n"); exit(1); } /* S- */ show_sexp ("ECC GOST public key:\n", pub_key); /* */ sec_key = gcry_sexp_find_token (key_pair, "private-key", 0); if (! sec_key){ fprintf(stderr, "private part missing in key\n"); exit(1); } /* S- */ show_sexp ("ECC GOST private key:\n", sec_key); /* , */ gcry_sexp_release (key_pair); /* , */ gcry_sexp_release (key_spec); }
рдЙрджрд╛рд╣рд░рдг рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХрдорд╛рдВрдб рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
$cc тАУo GenKey GenKey.c тАУlgcrypt $
GenKey рдореЙрдбреНрдпреВрд▓ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ
рдХреБрдВрдЬреА рдЬреЛрдбрд╝реА ECC GOST key pair: (key-data (public-key (ecc (curve GOST2001-CryptoPro-B) (q
рдЕрдм, рд╣рд╛рде рдореЗрдВ рдирд┐рдЬреА рдХреБрдВрдЬреА рд╣реЛрдиреЗ рдкрд░, рдЖрдк рдПрдХ рдЗрд▓реЗрдХреНрдЯреНрд░реЙрдирд┐рдХ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдбреЙрдХреНрдпреВрдореЗрдВрдЯ рд╣рд╛рд╢рд┐рдВрдЧ
рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЗ рдЗрд▓реЗрдХреНрдЯреНрд░реЙрдирд┐рдХ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ (ES) рдХрд╛ рдирд┐рд░реНрдорд╛рдг рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд╕реЗ рд╣реИрд╢ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдкрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рдЪрдпрди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
- 1.2.643.2.2.3 (0x2a, 0x85, 0x03, 0x02, 0x02, 0x03) - рд╕рд┐рдЧреНрдиреЗрдЪрд░ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо GOST R 34.10-2001 рдХреЗ рд╕рд╛рде рдореБрдЦреНрдп 256 рдХреЗ рд╕рд╛рде GOST R 34.11-94 рд╣реИрд╢ рд▓рдВрдмрд╛рдИ 256 рдмрд┐рдЯ рдХреЗ рд╕рд╛рде;
- 1.2.643.7.1.1.3.2 (0x2a, 0x85, 0x03, 0x07, 0x01, 0x01, 0x03, 0x02) - рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо GOST R 34.102 рдХреЗ рд╕рд╛рде 256 рдХреА рдХреБрдВрдЬреА рдХреЗ рд╕рд╛рде GOST R 34.11-2012 рдХреЗ рдЕрдиреБрд╕рд╛рд░ 256 рд▓рдВрдмрд╛рдИ рдХреА рд╣реИрд╢ рд▓рдВрдмрд╛рдИ рдХреЗ рд╕рд╛рде;
- 1.2.643.7.1.1.3.3 (0x2a, 0x85, 0x03, 0x07, 0x01, 0x01, 0x03, 0x03) - рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо GOST R 34.102 рдХреЗ рд╕рд╛рде 512 рдХреА рдХреБрдВрдЬреА рдХреЗ рд╕рд╛рде GOST R 34.11-2012 рдХреЗ рдЕрдиреБрд╕рд╛рд░ 512 рд▓рдВрдмрд╛рдИ рдХреА 512 рд╣реИред
рдпреЗ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рди рдХреЗрд╡рд▓ рдЙрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдирд┐рдЬреА рдХреБрдВрдЬреА рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд▓реЗрдХреНрдЯреНрд░реЙрдирд┐рдХ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдмрд▓реНрдХрд┐ рд╣реИрд╢ рдлрд╝рдВрдХреНрд╢рди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рднреАред GCrypt рдкреБрд╕реНрддрдХрд╛рд▓рдп рддреАрдиреЛрдВ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рддрд╛ рд╣реИред рд╣реИрд╢ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо GOST R 34.11-94 (рдкреИрд░рд╛рдореАрдЯрд░ рдУрдЖрдИрдбреА 1.2.643.2.2.30.1 рдХреЗ рд╕рд╛рде - 0x2a, 0x85, 0x03, 0x02, 0x02, 0x1e, 0x01) рдЙрдкрдирд╛рдо GOSTR3411_CP рдХреЗ рддрд╣рдд рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, GOST R 34.11-2012 рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд▓рдВрдмрд╛рдИ рдХреЗ рд╕рд╛рде 256 рдмрд┐рдЯреНрд╕ (oid 1.2.43.7.1.1.2.2 - 0x2a, 0x85, 0x03, 0x07, 0x01, 0x01, 0x02, 0x02) рдЙрдкрдирд╛рдо рдХреЗ рддрд╣рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ редIBIBOG256 рдФрд░ GOST R 34.11-2012 рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо 512 рдмрд┐рдЯреНрд╕ рдХреА рд▓рдВрдмрд╛рдИ (oid 1.2.43.7) .1.1.2.3 - 0x2a, 0x85, 0x03, 0x07, 0x01, 0x01, 0x02, 0x03) рдХреЛ STRIBOG512 рдЙрдкрдирд╛рдо рдХреЗ рддрд╣рдд рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдиреАрдЪреЗ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд╕реЗ рд╣реИрд╢ рдорд╛рди рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдореЙрдбреНрдпреВрд▓ рдХрд╛ рд╕реА рдХреЛрдб рд╣реИ
digest_gcrypt.c: #include <stdio.h> #include <stdlib.h> #include <stdarg.h> #include <gcrypt.h> int main(int argc, char* argv[]) { gpg_error_t err; int algo = GCRY_MD_NONE; int i; unsigned char *h; size_t size; gcry_md_hd_t hd; FILE *fp; unsigned char buf[1024]; char *dgst_gost[] = {"GOSTR3411_CP", "STRIBOG256", "STRIBOG512", NULL}; i = 0; /* -*/ if (argc == 3) algo = gcry_md_map_name (argv[1]); if (algo == GCRY_MD_NONE) { fprintf(stderr, "Usage: digest_gcrypt <nick_name_digest> <file_for_digest>\n"); fprintf(stderr, "<nick_name_digest>="); while (dgst_gost[i] != NULL){ if (i > 0 ) fprintf(stderr, " | ", dgst_gost[i]); fprintf(stderr, "%s", dgst_gost[i]); i++; } fprintf(stderr, "\n"); exit (1); } /* */ err = gcry_md_open(&hd, algo, 0); if (err) { fprintf (stderr, "LibGCrypt error %s\n", gcry_strerror (err)); exit (1); } /* */ if (!strcmp (argv[2], "-")) fp = stdin; else fp = fopen (argv[2], "r"); if (fp == NULL) { fprintf(stderr, "Cannot fopen file=%s\n", argv[2]); exit(1); } /* */ while (!feof (fp)) { size = fread (buf, 1, sizeof(buf), fp); gcry_md_write (hd, buf, size); } /* */ h = gcry_md_read(hd, 0); /* */ printf(" %s = %d ( )\n", argv[1], gcry_md_get_algo_dlen (algo)); printf(" %s:\n", argv[2]); for (i = 0; i < gcry_md_get_algo_dlen (algo); i++) printf("%02x", h[i]); printf("\n"); fflush(stdout); /* */ gcry_md_reset(hd); gcry_md_close(hd); }
рд╣рдо рдЗрд╕ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╣реИрд╢ рдЧрдгрдирд╛ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ:
$cc -o digest_file digest_file.c -lgcrypt $./digest_file Usage: digest_gcrypt <nick_name_digest> <file_for_digest> <nick_name_digest>=GOSTR3411_CP | STRIBOG256 | STRIBOG512 $./digest_file STRIBOG256 digest_file.c STRIBOG256 = 32 ( ) digest_file.c: f6818dfb26073747266dc721c332d703eb21f2b17e3433c809e0e23b68443d4a $
рдЗрд▓реЗрдХреНрдЯреНрд░реЙрдирд┐рдХ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдФрд░ рдЙрд╕рдХреЗ рд╕рддреНрдпрд╛рдкрди рдХрд╛ рдЧрдарди
рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреА рдирд┐рдЬреА рдХреБрдВрдЬреА рдФрд░ рд╣реИрд╢ рд╣реИ, рд╣рдо рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЗ рдЗрд▓реЗрдХреНрдЯреНрд░реЙрдирд┐рдХ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рднреА рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
gcry_error_t gcry_pk_sign (gcry sexp t *r_sig, gcry sexp t data, gcry sexp t skey ),
r_sig -sexp-variable рдЬрд┐рд╕рдореЗрдВ рдЗрд▓реЗрдХреНрдЯреНрд░реЙрдирд┐рдХ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╕рд╣реЗрдЬреЗ рдЬрд╛рдПрдВрдЧреЗ,
рд╕реНрдХреА - рдПрдХ рдирд┐рдЬреА рдХреБрдВрдЬреА (рдКрдкрд░ рджреЗрдЦреЗрдВ) рдХреЗ рд╕рд╛рде рдПрдХ рд╕реЗрдХреНрд╕ рдЪрд░, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ,
data - sexp-variable, рдЬреЛ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рдкреНрд░рдХрд╛рд░ (рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЧреЙрд╕реНрдЯ) рдФрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЗ рд╣реИрд╢ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред
рдпрд╣ рдпрд╛рдж рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ GOST R 34.10 рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП gcry_pk_sign рдЗрдирдкреБрдЯ рдХреЛ рдЖрдкреВрд░реНрддрд┐ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИрд╢ рдорд╛рди рдмрдбрд╝реЗ-рдПрдВрдбрд┐рдпрди рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрд░реНрдерд╛рддреНред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрд▓реНрдЯрд╛ рд╣реЛ рдЧрдпрд╛ (рдЬреИрд╕рд╛ рдХрд┐ рдПрдХ рджреЛрд╕реНрдд рдиреЗ рдХрд╣рд╛: "рдереЛрдбрд╝рд╛-рдПрдВрдбрд┐рдпрди рдХреНрд░рдо рдореЗрдВ рдбрд╛рдЗ рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рдЗрд▓рд╛рдЬ рдХреА рд░реВрд╕реА рдкрд░рдВрдкрд░рд╛")ред рдЗрд╕реЗ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП, рдбрд╛рдЯрд╛рдк рд╕реЗрдХреНрд╕ рдЪрд░ рдХреА рддреИрдпрд╛рд░реА рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ:
... gcry_sexp_t data; unsigned char c; int len_xy; gcry_mpi_t x; тАж printf("%s\n", *((unsigned char *) &arch) == 0 ? " big-endian" : " little-endian"); len_xy = *((unsigned char *) &arch) == 0 ? 0:gcry_md_get_algo_dlen (algo); for (i = 0; i < (len_xy/2); i++) { c = *(h + i); *(h + i) = *(h + len_xy - i - 1); *(h + len_xy - i - 1) = c; } fprintf(stderr, " =%d\n", gcry_md_get_algo_dlen (algo)); for (i = 0; i < gcry_md_get_algo_dlen (algo); i++) printf("%02X", h[i]); fflush(stdout); x = gcry_mpi_set_opaque_copy(NULL, h, gcry_md_get_algo_dlen (algo) * 8); err = gcry_sexp_build (&data, NULL, "(data (flags gost) (value %m))", x); show_sexp ("data :\n", data);
рд╕рдм рдХреБрдЫ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдФрд░ рдЗрд╕реЗ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИ <рд╕реНрд░реЛрдд: lang = "cpp"> ...
gcry_sexp_t sig_r, sig_s;
...
/ * рд╣реИрд╢ рдкрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд░реЗрдВ * /
рдЗрд░ = gcry_pk_sign (рдФрд░ sig, data, sec_key);
рдЕрдЧрд░ (рдЧрд▓рддреА рд╕реЗ) {
fprintf (stderr, "рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд░рдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓:% s \ n", gcry_strerror (рдЗрд░реЗрдЯ);
рдирд┐рдХрд╛рд╕ (1);
}
/ * рд╣рдо рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдкреНрд░рд┐рдВрдЯ рдХрд░рддреЗ рд╣реИрдВ * /
show_sexp ("ECC GOST SIG: \ n", sig);
/ * рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рдШрдЯрдХреЛрдВ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ рдФрд░ рдкреНрд░рд┐рдВрдЯ рдХрд░реЗрдВ r рдФрд░ s * /
sig_r = gcry_sexp_find_token (sig, "r", 0);
рдЕрдЧрд░ (sig_r) {
fprintf (stderr, "r рднрд╛рдЧ sig \ n рдореЗрдВ рдЧрд╛рдпрдм");
рдирд┐рдХрд╛рд╕ (1);
}
show_sexp ("ECC GOST Sig R-part: \ n", sig_r);
sig_s = gcry_sexp_find_token (sig, "s", 0);
рдЕрдЧрд░ (sig_s) {
fprintf (stderr, "sig \ n" рдореЗрдВ рд▓рд╛рдкрддрд╛ рднрд╛рдЧ);
рдирд┐рдХрд╛рд╕ (1);
}
show_sexp ("ECC GOST Sig S-part: \ n", sig_s);
... рдЖрдк рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
тАж err = gcry_pk_verify (sig, data, pub_key); if (err) { putchar ('\n'); show_sexp ("seckey:\n", sec_key); show_sexp ("data:\n", data); show_sexp ("sig:\n", sig); fprintf(stderr, "verify failed: %s\n", gcry_strerror (err)); exit(1); } тАж
рдкреНрд░рдорд╛рдгрдкрддреНрд░реЛрдВ рдореЗрдВ GOST R 34.10 рдХреЗ рдЗрд▓реЗрдХреНрдЯреНрд░реЙрдирд┐рдХ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд╛ рд╕рддреНрдпрд╛рдкрди
рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреБрдВрдЬреА рдЕрд╡рд╕рдВрд░рдЪрдирд╛ (PKI) рдХреА рдореБрдЦреНрдп рд╡рд╕реНрддреБрдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ X509 рдкреНрд░рдорд╛рдгрдкрддреНрд░ рд╣реИрдВред рдкреНрд░рдорд╛рдгрдкрддреНрд░реЛрдВ рдХреА рд╕рдВрд░рдЪрдирд╛ рдФрд░ рд╕рдВрд░рдЪрдирд╛ рдкрд░ TC-26 рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢реЗрдВ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рд╣реИрдВ тАЬGOST R 34.10 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рддрдХрдиреАрдХреА рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛, рдкреНрд░рдорд╛рдгрд┐рдХ рдкреНрд░реЛрдлрд╛рдЗрд▓ рдореЗрдВ GOST R 34.11 ALGORITHMS рдФрд░ X 9 рд╕рдорд┐рддрд┐ рдХреА рдкреНрд░рдореБрдЦ рд╕реВрдЪрдирд╛рдУрдВ рдХреЗ CRL (OPRL INFRASTRUCTURE) рдХреЗ рдкреНрд░рдорд╛рдг рдкрддреНрд░ред рд╕реВрдЪрдирд╛ рдХрд╛ рд╕рдВрд░рдХреНрд╖рдг "(04.24.2014 рдХреЗ рдорд┐рдирдЯ рд╕рдВрдЦреНрдпрд╛ 13)ред" рдпрд╣ рдЗрди рд╕рд┐рдлрд╛рд░рд┐рд╢реЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╣реИ рдХрд┐ рд╕рднреА рд╕реАрдП рд░реВрд╕ рдХреЗ рд╕рдВрдЪрд╛рд░ рдордВрддреНрд░рд╛рд▓рдп рдореЗрдВ рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдЬрд╛рд░реА рдХрд░рддреЗ рд╣реИрдВред
рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдореЗрдВ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рддреНрдпрд╛рдкрд┐рдд рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдХреЗ рд╣реИрд╢, рдЙрд╕рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдФрд░ рд░реВрдЯ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдХреА рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреБрдВрдЬреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ (рдКрдкрд░ рджреЗрдЦреЗрдВ)ред рдмрд╕ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕реНрд╡-рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╕рднреА рдбреЗрдЯрд╛ рдПрдХ рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИред
PKI / PKI рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ (рдкреНрд░рдорд╛рдгрдкрддреНрд░, CMS, рдЕрдиреБрд░реЛрдз) рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП

рдЖрджрд┐), рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдХреЗрдПрд╕рдмреАрдП рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдлрд┐рд▓рд╣рд╛рд▓ рдЯреАрдХреЗ -26 рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рдорд░реНрдерди рдХрд╛
рдЕрдиреБрднрд╡ рд╣реИ ред рдореВрд▓рддрдГ, рдХреБрдЫ рднреА ts-26 рдХреА ksba рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдирд╣реАрдВ рд░реЛрдХрддрд╛ рд╣реИред
рдЗрд╕ рдЪрд░рдг рдореЗрдВ, GCrypt рдкрд░реАрдХреНрд╖рдг рдЪрд░рдг, рд░реВрд╕реА рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлреА рдХреЗ рд╕рд╛рде PKI / PKI рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ (рдкреНрд░рдорд╛рдг рдкрддреНрд░, рдЖрджрд┐) рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдХреНрд░рд┐рдкреНрдЯрд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдЬреИрд╕реЗ
рдкрд╛рдпрдерди , рдЯреАрд╕реАрдПрд▓ рдЖрджрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рд╕реНрдХреНрд░рд┐рдкреНрдЯрд┐рдВрдЧ рднрд╛рд╖рд╛
Tcl рдХреЛ рдЪреБрдирд╛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕ рдкрд░ рдПрдХ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦрдирд╛ рдЖрд╕рд╛рди рдФрд░ рд╕рд░рд▓ рд╣реИ, рдЬрд┐рд╕реЗ рддрдм рд╕реА рднрд╛рд╖рд╛ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред Tcl рдореЗрдВ PKI рдкреИрдХреЗрдЬ рд╢рд╛рдорд┐рд▓ рд╣реИ рдЬрд┐рд╕рдореЗрдВ PKI рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдБ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рд╕рд░реНрдЯрд┐рдлрд┐рдХреЗрдЯреНрд╕ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ :: pki: X509 :: parse_certред Parse_cert рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, parse_gost_cert рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╡рд┐рдХрд╕рд┐рдд рдХреА рдЧрдИ рдереА, рдЬреЛ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИ
parse_cert_gost_oid.tcl proc parse_cert_gost {cert} { # parray ::pki::oids #puts "parse_cert_gost=$cert" set cert_seq "" if { [string range $cert 0 9 ] == "-----BEGIN" } { array set parsed_cert [::pki::_parse_pem $cert "-----BEGIN CERTIFICATE-----" "-----END CERTIFICATE-----"] set cert_seq $parsed_cert(data) } else { #FORMAT DER set cert_seq $cert } set finger [::sha1::sha1 $cert_seq] set ret(fingerprint) $finger binary scan $cert_seq H* certdb set ret(certdb) $certdb #puts "CERTDB=$certdb" array set ret [list] # Decode X.509 certificate, which is an ASN.1 sequence ::asn::asnGetSequence cert_seq wholething ::asn::asnGetSequence wholething cert set ret(cert) $cert set ret(cert) [::asn::asnSequence $ret(cert)] if {0} { set ff [open "/tmp/tbs.der" w] fconfigure $ff -translation binary puts -nonewline $ff $ret(cert) close $ff } binary scan $ret(cert) H* ret(cert) ::asn::asnPeekByte cert peek_tag if {$peek_tag != 0x02} { # Version number is optional, if missing assumed to be value of 0 ::asn::asnGetContext cert - asn_version ::asn::asnGetInteger asn_version ret(version) incr ret(version) } else { set ret(version) 1 } ::asn::asnGetBigInteger cert ret(serial_number) ::asn::asnGetSequence cert data_signature_algo_seq ::asn::asnGetObjectIdentifier data_signature_algo_seq ret(data_signature_algo) ::asn::asnGetSequence cert issuer ::asn::asnGetSequence cert validity ::asn::asnGetUTCTime validity ret(notBefore) ::asn::asnGetUTCTime validity ret(notAfter) ::asn::asnGetSequence cert subject ::asn::asnGetSequence cert pubkeyinfo binary scan $pubkeyinfo H* pubkeyinfoG set ret(pubkeyinfo) $pubkeyinfoG ::asn::asnGetSequence pubkeyinfo pubkey_algoid binary scan $pubkey_algoid H* pubkey_algoidG set ret(pubkey_algoid) $pubkey_algoidG ::asn::asnGetObjectIdentifier pubkey_algoid ret(pubkey_algo) ::asn::asnGetBitString pubkeyinfo pubkey set extensions_list [list] while {$cert != ""} { ::asn::asnPeekByte cert peek_tag switch -- [format {0x%02x} $peek_tag] { "0xa1" { ::asn::asnGetContext cert - issuerUniqID } "0xa2" { ::asn::asnGetContext cert - subjectUniqID } "0xa3" { ::asn::asnGetContext cert - extensions_ctx ::asn::asnGetSequence extensions_ctx extensions while {$extensions != ""} { ::asn::asnGetSequence extensions extension ::asn::asnGetObjectIdentifier extension ext_oid ::asn::asnPeekByte extension peek_tag if {$peek_tag == 0x1} { ::asn::asnGetBoolean extension ext_critical } else { set ext_critical false } ::asn::asnGetOctetString extension ext_value_seq set ext_oid [::pki::_oid_number_to_name $ext_oid] set ext_value [list $ext_critical] switch -- $ext_oid { id-ce-basicConstraints { ::asn::asnGetSequence ext_value_seq ext_value_bin if {$ext_value_bin != ""} { ::asn::asnGetBoolean ext_value_bin allowCA } else { set allowCA "false" } if {$ext_value_bin != ""} { ::asn::asnGetInteger ext_value_bin caDepth } else { set caDepth -1 } lappend ext_value $allowCA $caDepth } default { binary scan $ext_value_seq H* ext_value_seq_hex lappend ext_value $ext_value_seq_hex } } lappend extensions_list $ext_oid $ext_value } } } } set ret(extensions) $extensions_list ::asn::asnGetSequence wholething signature_algo_seq ::asn::asnGetObjectIdentifier signature_algo_seq ret(signature_algo) ::asn::asnGetBitString wholething ret(signature) # Convert values from ASN.1 decoder to usable values if needed set ret(notBefore) [::pki::x509::_utctime_to_native $ret(notBefore)] set ret(notAfter) [::pki::x509::_utctime_to_native $ret(notAfter)] set ret(serial_number) [::math::bignum::tostr $ret(serial_number)] set ret(data_signature_algo) [::pki::_oid_number_to_name $ret(data_signature_algo)] set ret(signature_algo) [::pki::_oid_number_to_name $ret(signature_algo)] set ret(pubkey_algo) [::pki::_oid_number_to_name $ret(pubkey_algo)] set ret(issuer) [::pki::x509::_dn_to_string $issuer] set ret(subject) [::pki::x509::_dn_to_string $subject] set ret(signature) [binary format B* $ret(signature)] binary scan $ret(signature) H* ret(signature) # Handle RSA public keys by extracting N and E #puts "PUBKEY_ALGO=$ret(pubkey_algo)" switch -- $ret(pubkey_algo) { "rsaEncryption" { set pubkey [binary format B* $pubkey] binary scan $pubkey H* ret(pubkey) ::asn::asnGetSequence pubkey pubkey_parts ::asn::asnGetBigInteger pubkey_parts ret(n) ::asn::asnGetBigInteger pubkey_parts ret(e) set ret(n) [::math::bignum::tostr $ret(n)] set ret(e) [::math::bignum::tostr $ret(e)] set ret(l) [expr {int([::pki::_bits $ret(n)] / 8.0000 + 0.5) * 8}] set ret(type) rsa } "GostR2012_256" - "GostR2012_512" - "GostR2001" - "1.2.643.2.2.19" - "1.2.643.7.1.1.1.1" - "1.2.643.7.1.1.1.2" { # gost2001, gost2012-256,gost2012-512 set pubkey [binary format B* $pubkey] #puts "LL=[string length $pubkey]" if {[string length $pubkey] < 100} { set pubk [string range $pubkey 2 end] } else { set pubk [string range $pubkey 3 end] } set pubkey_revert [string reverse $pubk] binary scan $pubkey_revert H* ret(pubkey_rev) binary scan $pubkey H* ret(pubkey) set ret(type) gost ::asn::asnGetSequence pubkey_algoid pubalgost #OID - ::asn::asnGetObjectIdentifier pubalgost ret(paramkey) set ret(paramkey) [::pki::_oid_number_to_name $ret(paramkey)] #OID - ::asn::asnGetObjectIdentifier pubalgost ret(hashkey) set ret(hashkey) [::pki::_oid_number_to_name $ret(hashkey)] #puts "ret(paramkey)=$ret(paramkey)\n" #puts "ret(hashkey)=$ret(hashkey)\n" } } return [array get ret] } proc set_nick_for_oid {} { # set ::pki::oids(1.2.643.2.2.19) "gost2001pubKey" # set ::pki::oids(1.2.643.2.2.3) "gost2001withGOST3411_94" set ::pki::oids(1.2.643.100.1) "OGRN" set ::pki::oids(1.2.643.100.5) "OGRNIP" set ::pki::oids(1.2.643.3.131.1.1) "INN" set ::pki::oids(1.2.643.100.3) "SNILS" # set ::pki::oids(1.2.643.2.2.3) " 34.10-2001-256" set ::pki::oids(1.2.643.7.1.1.3.2) " 34.10-2012-256" set ::pki::oids(1.2.643.7.1.1.3.3) " 34.10-2012-512" # set ::pki::oids(1.2.643.2.2.3) "gost" # set ::pki::oids(1.2.643.7.1.1.3.2) "gost" # set ::pki::oids(1.2.643.7.1.1.3.3) "gost" # # set ::pki::oids(1.2.643.2.2.19) " 34.10-2001" # set ::pki::oids(1.2.643.7.1.1.1.1) " 34.10-2012 256 " # set ::pki::oids(1.2.643.7.1.1.1.2) " 34.10-2012 512 " set ::pki::oids(1.2.643.2.2.19) "GostR2001" set ::pki::oids(1.2.643.7.1.1.1.1) "GostR2012_256" set ::pki::oids(1.2.643.7.1.1.1.2) "GostR2012_512" #Oid- 34.10-2001 34.10-2012-256 set ::pki::oids(1.2.643.2.2.35.0) "GOST2001-test" set ::pki::oids(1.2.643.2.2.35.1) "GOST2001-CryptoPro-A" set ::pki::oids(1.2.643.2.2.35.2) "GOST2001-CryptoPro-B" set ::pki::oids(1.2.643.2.2.35.3) "GOST2001-CryptoPro-C" # { "GOST2001-CryptoPro-A", set ::pki::oids("GOST2001-CryptoPro-XchA" }, # { "GOST2001-CryptoPro-C", set ::pki::oids("GOST2001-CryptoPro-XchB" }, set ::pki::oids(1.2.643.2.2.36.0) "GOST2001-CryptoPro-A" set ::pki::oids(1.2.643.2.2.36.1) "GOST2001-CryptoPro-C" #Oid- 34.10-2012-512 set ::pki::oids(1.2.643.7.1.2.1.2.1) "GOST2012-tc26-A" set ::pki::oids(1.2.643.7.1.2.1.2.2) "GOST2012-tc26-B" #Nick set ::pki::oids(1.2.643.7.1.1.2.2) "STRIBOG256" set ::pki::oids(1.2.643.7.1.1.2.3) "STRIBOG512" set ::pki::oids(1.2.643.2.2.30.1) "GOSTR3411_CP" }
Parse_gost_cert рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд░реВрд╕реА рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлреА рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ GCrypt рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП рд░реВрд╕реА рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлреА рдХреЗ oid-am рдХреЛ рдЙрдкрдирд╛рдо-Mov рджреЗрдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИ:
proc set_nick_for_oid {} { set ::pki::oids(1.2.643.100.1) "OGRN" set ::pki::oids(1.2.643.100.5) "OGRNIP" set ::pki::oids(1.2.643.3.131.1.1) "INN" set ::pki::oids(1.2.643.100.3) "SNILS" # set ::pki::oids(1.2.643.2.2.3) " 34.10-2001-256" set ::pki::oids(1.2.643.7.1.1.3.2) " 34.10-2012-256" set ::pki::oids(1.2.643.7.1.1.3.3) " 34.10-2012-512" # set ::pki::oids(1.2.643.2.2.19) "GostR2001" set ::pki::oids(1.2.643.7.1.1.1.1) "GostR2012_256" set ::pki::oids(1.2.643.7.1.1.1.2) "GostR2012_512" #Oid- 34.10-2001 34.10-2012-256 set ::pki::oids(1.2.643.2.2.35.0) "GOST2001-test" set ::pki::oids(1.2.643.2.2.35.1) "GOST2001-CryptoPro-A" set ::pki::oids(1.2.643.2.2.35.2) "GOST2001-CryptoPro-B" set ::pki::oids(1.2.643.2.2.35.3) "GOST2001-CryptoPro-C" set ::pki::oids(1.2.643.2.2.36.0) "GOST2001-CryptoPro-A" set ::pki::oids(1.2.643.2.2.36.1) "GOST2001-CryptoPro-C" #Oid- 34.10-2012-512 set ::pki::oids(1.2.643.7.1.2.1.2.1) "GOST2012-tc26-A" set ::pki::oids(1.2.643.7.1.2.1.2.2) "GOST2012-tc26-B" #Nick set ::pki::oids(1.2.643.7.1.1.2.2) "STRIBOG256" set ::pki::oids(1.2.643.7.1.1.2.3) "STRIBOG512" set ::pki::oids(1.2.643.2.2.30.1) "GOSTR3411_CP" }
Parse_gost_cert рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЖрдкрдХреЛ
TBS рдкреНрд░рдорд╛рдгрдкрддреНрд░ , рдкреНрд░рдорд╛рдгрдкрддреНрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░, рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд╛ рдкреНрд░рдХрд╛рд░, рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреБрдВрдЬреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред рдпрджрд┐ рд╣рдо рд╕реНрд╡-рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рдпрджрд┐ рд╣рдо рдХрд┐рд╕реА рдЕрдиреНрдп рдкреНрд░рдорд╛рдгрдкрддреНрд░ (рдЬрд╛рд░реАрдХрд░реНрддрд╛ рдФрд░ рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдХреЗ рд╡рд┐рд╖рдп рд╕реЗ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддреЗ) рджреНрд╡рд╛рд░рд╛ рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд (рдЬрд╛рд░реА) рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд╛ рд╕рддреНрдпрд╛рдкрди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ:
- рд╕рддреНрдпрд╛рдкрд┐рдд рдкреНрд░рдорд╛рдг рдкрддреНрд░ рд╕реЗ рд╣рдо рдЙрд╕рдХрд╛ рдЯреАрдмреАрдПрд╕ рдкреНрд░рдорд╛рдг рдкрддреНрд░, рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд╛ рдкреНрд░рдХрд╛рд░ рдФрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╕реНрд╡рдпрдВ рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВ;
- рд╣рдо рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдХреЛ рдореВрд▓ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рд╕реЗ рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВред
рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдкрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рд╕рддреНрдпрд╛рдкрди рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдбреЗрдЯрд╛ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдореЗрдВ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЬрд┐рдореНрдореЗрджрд╛рд░ рдЯреАрдХреЗ -26 рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢реЛрдВ рдХрд╛ рд╕рдЦреНрддреА рд╕реЗ рдкрд╛рд▓рди рд╣реИред рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреБрдВрдЬреА рдорд╛рди рдХреЗ рд▓рд┐рдП, рд╡реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдзреНрд╡рдирд┐ рдХрд░рддреЗ рд╣реИрдВ:
GostR3410-2012-256-PublicKey рдХрд╛ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреБрдВрдЬреА рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ GOST R 34.10-2001 [IETF RFC 4491] рдХреЗ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдкреНрд░рдореБрдЦ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЗ рд╕рдорд╛рди рд╣реИ, рдФрд░ MUST рдореЗрдВ 64 рдУрдХрдЯреЗрдЯ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдЬрд╣рд╛рдВ рдкрд╣рд▓реЗ 32 рдСрдХреНрдЯреЗрдЯ рдореЗрдВ рдЫреЛрдЯреЗ-рдПрдВрдбрд┐рдпрди рджреГрд╢реНрдп рдореЗрдВ x рд╕рдордиреНрд╡рдп рд╣реЛрддрд╛ рд╣реИ рдФрд░ рджреВрд╕рд░реЗ 32 рдСрдХреНрдЯреЗрдЯ рдореЗрдВ рд╕рдордиреНрд╡рдп рд╣реЛрддрд╛ рд╣реИред рдЫреЛрдЯреЗ рдПрдВрдбрд┐рдпрди рджреГрд╢реНрдп рдореЗрдВ yред
GostR3410-2012-5-512-PublicKey рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреБрдВрдЬреА рджреГрд╢реНрдп рд╣реЛрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ
128 рдСрдХреНрдЯреЗрдЯ, рдЬрд╣рд╛рдВ рдкрд╣рд▓реЗ 64 рдУрдХрдЯреЗрдЯреНрд╕ рдореЗрдВ рдЫреЛрдЯреЗ-рдПрдВрдбрд┐рдпрди рджреГрд╢реНрдп рдореЗрдВ x рд╕рдордиреНрд╡рдп рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░реЗ 64 рдУрдХрдЯреЗрдЯреНрд╕ рдореЗрдВ рдЫреЛрдЯреЗ-рдПрдВрдбрд┐рдпрди рджреГрд╢реНрдп рдореЗрдВ y рд╕рдордиреНрд╡рдп рд╣реЛрддрд╛ рд╣реИред
рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдЕрдкрд▓реЛрдб рдХрд░рддреЗ рд╕рдордп, рдЖрдкрдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:
рдПрдХ 256-рдмрд┐рдЯ рд╣реИрд╢ рдХреЛрдб рд▓рдВрдмрд╛рдИ рдХреЗ рд╕рд╛рде GOST R 34.10-2012 рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рджреЛ 256-рдмрд┐рдЯ рд╕рдВрдЦреНрдпрд╛, рдЖрд░ рдФрд░ рдПрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдбрд┐рдЬрд┐рдЯрд▓ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рдУрдХрдЯреЗрдЯ рд╕реНрдЯреНрд░рд┐рдВрдЧ (OCTET STRING) рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ GOST R 34.10-2001 [IETF RFC 4491] рдХреЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЗ рд╕рдорд╛рди рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ 64 рдУрдХрдЯреЗрдЯ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ; рдкрд╣рд▓реЗ 32 рдУрдХрдЯреЗрдЯ рдореЗрдВ рдмрдбрд╝реЗ-рдПрдВрдбрд┐рдпрди рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдореЗрдВ рдирдВрдмрд░ s рд╣реЛрддрд╛ рд╣реИ (рдЙрдЪреНрдЪрддрдо рдСрдХреНрдЯреЗрдЯ рдХреЛ рдкрд╣рд▓реЗ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ), рдФрд░ рджреВрд╕рд░реЗ 32 рдСрдХреНрдЯреЗрдЯ рдореЗрдВ рдмрд┐рдЧ-рдПрдВрдбрд┐рдпрди рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдореЗрдВ рдирдВрдмрд░ r рд╣реЛрддрд╛ рд╣реИред
GOST R 34.10-2012 рд╕рд┐рдЧреНрдиреЗрдЪрд░ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо 512 рд╣реИрд╢ рдХреЛрдб рд▓рдВрдмрд╛рдИ рдХреЗ рд╕рд╛рде рджреЛ 512-рдмрд┐рдЯ рд╕рдВрдЦреНрдпрд╛, r рдФрд░ s рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреБрдВрдЬреА рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдбрд┐рдЬрд┐рдЯрд▓ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рдУрдХрдЯреЗрдЯ рд╕реНрдЯреНрд░рд┐рдВрдЧ (OCTET STRING) рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ 128 рдУрдХрдЯреЗрдЯ рдХреЗ рд╣реЛрддреЗ рд╣реИрдВ; рдкрд╣рд▓реЗ 64 рдУрдХрдЯреЗрдЯреНрд╕ рдореЗрдВ рдмрд┐рдЧ-рдПрдВрдбрд┐рдпрди рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдореЗрдВ рдирдВрдмрд░ s рд╣реЛрддрд╛ рд╣реИ (рдЙрдЪреНрдЪрддрдо рдСрдХреНрдЯреЗрдЯ рдХреЛ рдкрд╣рд▓реЗ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ), рдФрд░ рджреВрд╕рд░реЗ 64 рдСрдХреНрдЯреЗрдЯ рдореЗрдВ рдмрд┐рдЧ-рдПрдВрдбрд┐рдпрди рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдореЗрдВ рдирдВрдмрд░ r рд╣реЛрддрд╛ рд╣реИред
рдЗрди рд╕рд┐рдлрд╛рд░рд┐рд╢реЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, Tcl рдореЙрдбреНрдпреВрд▓
parse_certs_for_verify_load.tcl рдкреНрд░рдорд╛рдгрдкрддреНрд░ рд╕рддреНрдпрд╛рдкрди рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдбреЗрдЯрд╛ рддреИрдпрд╛рд░ рдХрд░рддрд╛ рд╣реИ
рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ: #!/usr/bin/tclsh # PKI package require pki # - source parse_cert_gost_oid.tcl if {$argc != 2} { puts "Usage: parse_certs_for_verify_load.tcl < > < >" exit 1 } # if {[file exists "[lindex $argv 0]"] == 0 } { puts "Usage: parse_certs_for_verify_load.tcl < > < >" puts " [lindex $argv 0]" exit 1 } # if {[file exists "[lindex $argv 1]"] == 0 } { puts "Usage: parse_certs_for_verify_load.tcl < > < >" puts " [lindex $argv 1]" exit 1 } # nick- - oid- set_nick_for_oid set file [lindex $argv 0] set f [open $file r] set cert [read $f] close $f #READ DER-format if { [string range $cert 0 9 ] != "-----BEGIN" } { set fd [open $file] chan configure $fd -translation binary set cert [read $fd] close $fd } array set cert_user [parse_cert_gost $cert] # -26 set len_sign [expr [string length $cert_user(signature)] /2] set sign_r [string range $cert_user(signature) $len_sign end] set sign_s [string range $cert_user(signature) 0 [expr $len_sign - 1]] #puts " : $file" set file [lindex $argv 1] set f [open $file r] set cert [read $f] close $f #READ DER if { [string range $cert 0 9 ] != "-----BEGIN" } { set fd [open $file] chan configure $fd -translation binary set cert [read $fd] close $fd } # array set cert_ca [parse_cert_gost $cert] # -26 set len_key [expr [string length $cert_ca(pubkey_rev)]/2] set key_pub_left [string range $cert_ca(pubkey_rev) $len_key end] set key_pub_right [string range $cert_ca(pubkey_rev) 0 [expr $len_key - 1]] puts "/* C-: */" #TBS- puts "char tbc\[\] = \"[string toupper $cert_user(cert)]\";" # - puts "char hash_type\[\] = \"$cert_ca(hashkey)\";" # puts "unsigned char pub_key_ca\[\] = \"(public-key \"" puts "\"(ecc \"" puts "\" (curve $cert_ca(paramkey))\"" puts "\" (q #04[string toupper $key_pub_left$key_pub_right]#)\"" puts "\")\"" puts "\")\";" # puts "unsigned char sig_cert\[\] = \"(sig-val\"" puts "\"($cert_ca(type) \"" puts "\" (r #[string toupper $sign_r]#)\"" puts "\" (s #[string toupper $sign_s]#)\"" puts "\")\"" puts "\")\";" puts "/* TEST_from_TCL.h*/" puts "/* TEST_from_Tcl.c: cc -o TEST_from_Tcl TEST_from_Tcl.c -lgcrypt TEST_from_Tcl*/"
рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рджреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рдорд╛рдг рдкрддреНрд░ рд▓реЗрддреЗ рд╣реИрдВ:рдкреНрд░рдорд╛рдгрдкрддреНрд░ \ "UTs 1 GUTs.pem \" рд╣реИ-----BEGIN CERTIFICATE-----
MIIGrDCCBlugAwIBAgILAOvBBVQAAAAAAFkwCAYGKoUDAgIDMIIBSjEeMBwGCSqG
SIb3DQEJARYPZGl0QG1pbnN2eWF6LnJ1MQswCQYDVQQGEwJSVTEcMBoGA1UECAwT
Nzcg0LMuINCc0L7RgdC60LLQsDEVMBMGA1UEBwwM0JzQvtGB0LrQstCwMT8wPQYD
VQQJDDYxMjUzNzUg0LMuINCc0L7RgdC60LLQsCwg0YPQuy4g0KLQstC10YDRgdC6
0LDRjywg0LQuIDcxLDAqBgNVBAoMI9Cc0LjQvdC60L7QvNGB0LLRj9C30Ywg0KDQ
vtGB0YHQuNC4MRgwFgYFKoUDZAESDTEwNDc3MDIwMjY3MDExGjAYBggqhQMDgQMB
ARIMMDA3NzEwNDc0Mzc1MUEwPwYDVQQDDDjQk9C+0LvQvtCy0L3QvtC5INGD0LTQ
vtGB0YLQvtCy0LXRgNGP0Y7RidC40Lkg0YbQtdC90YLRgDAeFw0xNjAzMTYxMjAy
NTFaFw0yNzA3MTIxMjAyNTFaMIIBITEaMBgGCCqFAwOBAwEBEgwwMDc3MTA0NzQz
NzUxGDAWBgUqhQNkARINMTA0NzcwMjAyNjcwMTEeMBwGCSqGSIb3DQEJARYPZGl0
QG1pbnN2eWF6LnJ1MTwwOgYDVQQJDDMxMjUzNzUg0LMuINCc0L7RgdC60LLQsCDR
g9C7LiDQotCy0LXRgNGB0LrQsNGPINC0LjcxLDAqBgNVBAoMI9Cc0LjQvdC60L7Q
vNGB0LLRj9C30Ywg0KDQvtGB0YHQuNC4MRUwEwYDVQQHDAzQnNC+0YHQutCy0LAx
HDAaBgNVBAgMEzc3INCzLiDQnNC+0YHQutCy0LAxCzAJBgNVBAYTAlJVMRswGQYD
VQQDDBLQo9CmIDEg0JjQoSDQk9Cj0KYwYzAcBgYqhQMCAhMwEgYHKoUDAgIjAQYH
KoUDAgIeAQNDAARAx70Y7WYQ4ODtdiSSx3MJnr1GQBEIExiPO/LWj1TRKES1OcDI
YgtdOBGVYSvbsStl10jkAOG0OpnGsd2by4m+LaOCA0MwggM/MA8GA1UdEwEB/wQF
MAMBAf8wHQYDVR0OBBYEFBGIaV7vyOlz23pXNbzSAfMF/qfRMAsGA1UdDwQEAwIB
hjCCAYsGA1UdIwSCAYIwggF+gBSLmDuJGFHo75wCeLjqyNQgslXJXaGCAVKkggFO
MIIBSjEeMBwGCSqGSIb3DQEJARYPZGl0QG1pbnN2eWF6LnJ1MQswCQYDVQQGEwJS
VTEcMBoGA1UECAwTNzcg0LMuINCc0L7RgdC60LLQsDEVMBMGA1UEBwwM0JzQvtGB
0LrQstCwMT8wPQYDVQQJDDYxMjUzNzUg0LMuINCc0L7RgdC60LLQsCwg0YPQuy4g
0KLQstC10YDRgdC60LDRjywg0LQuIDcxLDAqBgNVBAoMI9Cc0LjQvdC60L7QvNGB
0LLRj9C30Ywg0KDQvtGB0YHQuNC4MRgwFgYFKoUDZAESDTEwNDc3MDIwMjY3MDEx
GjAYBggqhQMDgQMBARIMMDA3NzEwNDc0Mzc1MUEwPwYDVQQDDDjQk9C+0LvQvtCy
0L3QvtC5INGD0LTQvtGB0YLQvtCy0LXRgNGP0Y7RidC40Lkg0YbQtdC90YLRgIIQ
NGgeQMtB7zOpoLfIdpKaKTBZBgNVHR8EUjBQMCagJKAihiBodHRwOi8vcm9zdGVs
ZWNvbS5ydS9jZHAvZ3VjLmNybDAmoCSgIoYgaHR0cDovL3JlZXN0ci1wa2kucnUv
Y2RwL2d1Yy5jcmwwJgYFKoUDZG8EHQwb0JrRgNC40L/RgtC+LdCf0YDQviBDU1Ag
My42MCUGA1UdIAQeMBwwCAYGKoUDZHEBMAgGBiqFA2RxAjAGBgRVHSAAMIHGBgUq
hQNkcASBvDCBuQwj0J/QkNCa0JwgwqvQmtGA0LjQv9GC0L7Qn9GA0L4gSFNNwrsM
INCf0JDQmiDCq9CT0L7Qu9C+0LLQvdC+0Lkg0KPQpsK7DDbQl9Cw0LrQu9GO0YfQ
tdC90LjQtSDihJYgMTQ5LzMvMi8yLTk5OSDQvtGCIDA1LjA3LjIwMTIMONCX0LDQ
utC70Y7Rh9C10L3QuNC1IOKEliAxNDkvNy8xLzQvMi02MDMg0L7RgiAwNi4wNy4y
MDEyMAgGBiqFAwICAwNBAKVYokUvb7XAMPJF38ZPKO2BFBldmGEfqsfmsiO35Y52
kTkx512H3YLqWMrOLjIfVMJhc+DTCNeXWY6bhK4/DRU=
-----END CERTIFICATE-----
рдФрд░ рдЗрд╕рдХрд╛ рдореВрд▓ рдкреНрд░рдорд╛рдгрдкрддреНрд░ \ "SEC Minkomsvyaz.pem \":-----BEGIN CERTIFICATE-----
MIIFGTCCBMigAwIBAgIQNGgeQMtB7zOpoLfIdpKaKTAIBgYqhQMCAgMwggFKMR4w
HAYJKoZIhvcNAQkBFg9kaXRAbWluc3Z5YXoucnUxCzAJBgNVBAYTAlJVMRwwGgYD
VQQIDBM3NyDQsy4g0JzQvtGB0LrQstCwMRUwEwYDVQQHDAzQnNC+0YHQutCy0LAx
PzA9BgNVBAkMNjEyNTM3NSDQsy4g0JzQvtGB0LrQstCwLCDRg9C7LiDQotCy0LXR
gNGB0LrQsNGPLCDQtC4gNzEsMCoGA1UECgwj0JzQuNC90LrQvtC80YHQstGP0LfR
jCDQoNC+0YHRgdC40LgxGDAWBgUqhQNkARINMTA0NzcwMjAyNjcwMTEaMBgGCCqF
AwOBAwEBEgwwMDc3MTA0NzQzNzUxQTA/BgNVBAMMONCT0L7Qu9C+0LLQvdC+0Lkg
0YPQtNC+0YHRgtC+0LLQtdGA0Y/RjtGJ0LjQuSDRhtC10L3RgtGAMB4XDTEyMDcy
MDEyMzExNFoXDTI3MDcxNzEyMzExNFowggFKMR4wHAYJKoZIhvcNAQkBFg9kaXRA
bWluc3Z5YXoucnUxCzAJBgNVBAYTAlJVMRwwGgYDVQQIDBM3NyDQsy4g0JzQvtGB
0LrQstCwMRUwEwYDVQQHDAzQnNC+0YHQutCy0LAxPzA9BgNVBAkMNjEyNTM3NSDQ
sy4g0JzQvtGB0LrQstCwLCDRg9C7LiDQotCy0LXRgNGB0LrQsNGPLCDQtC4gNzEs
MCoGA1UECgwj0JzQuNC90LrQvtC80YHQstGP0LfRjCDQoNC+0YHRgdC40LgxGDAW
BgUqhQNkARINMTA0NzcwMjAyNjcwMTEaMBgGCCqFAwOBAwEBEgwwMDc3MTA0NzQz
NzUxQTA/BgNVBAMMONCT0L7Qu9C+0LLQvdC+0Lkg0YPQtNC+0YHRgtC+0LLQtdGA
0Y/RjtGJ0LjQuSDRhtC10L3RgtGAMGMwHAYGKoUDAgITMBIGByqFAwICIwEGByqF
AwICHgEDQwAEQI+lv3kQI8jWka1kMVdbvpvFioP0Pyn3Knmp+2XD6KgPWnXEIlSR
X8g/IYracDr51YsNc2KE3C7mkH6hA3M3ofujggGCMIIBfjCBxgYFKoUDZHAEgbww
gbkMI9Cf0JDQmtCcIMKr0JrRgNC40L/RgtC+0J/RgNC+IEhTTcK7DCDQn9CQ0Jog
wqvQk9C+0LvQvtCy0L3QvtC5INCj0KbCuww20JfQsNC60LvRjtGH0LXQvdC40LUg
4oSWIDE0OS8zLzIvMi05OTkg0L7RgiAwNS4wNy4yMDEyDDjQl9Cw0LrQu9GO0YfQ
tdC90LjQtSDihJYgMTQ5LzcvMS80LzItNjAzINC+0YIgMDYuMDcuMjAxMjAuBgUq
hQNkbwQlDCPQn9CQ0JrQnCDCq9Ca0YDQuNC/0YLQvtCf0YDQviBIU03CuzBDBgNV
HSAEPDA6MAgGBiqFA2RxATAIBgYqhQNkcQIwCAYGKoUDZHEDMAgGBiqFA2RxBDAI
BgYqhQNkcQUwBgYEVR0gADAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
/zAdBgNVHQ4EFgQUi5g7iRhR6O+cAni46sjUILJVyV0wCAYGKoUDAgIDA0EA23Re
ec/Y27rpMi+iFbgWCazGY3skBTq5ZGsQKOUxCe4mO7UBDACiWqdA0nvqiQMXeHgq
o//fO9pxuIHtymwyMg==
-----END CERTIFICATE-----
рд╣рдо рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдХреА рдЬрд╛рдБрдЪ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдбреЗрдЯрд╛ "UTs 1 IS GUTs.pem" рддреИрдпрд╛рд░ рдХрд░реЗрдВрдЧреЗ: $ ./parse_certs_for_verify_load.tcl " 1 .pem" " .pem" > TEST_from_TCL.h $echo " TEST_from_TCL.h" $cat TEST_from_TCL.h /* C-: */ char tbc[] = "3082065B . . . "; char hash_type[] = "GOSTR3411_CP"; unsigned char pub_key_ca[] = "(public-key " "(ecc " " (curve GOST2001-CryptoPro-A)" " (q #040FA8E8C365FBA9792AF7293FF4838AC59BBE5B573164AD91D6C8231079BFA58FFBA1377303A17E90E62EDC8462730D8BD5F93A70DA8A213FC85F915422C4755A#)" ")" ")"; unsigned char sig_cert[] = "(sig-val" "(gost " " (r #913931E75D87DD82EA58CACE2E321F54C26173E0D308D797598E9B84AE3F0D15#)" " (s #A558A2452F6FB5C030F245DFC64F28ED8114195D98611FAAC7E6B223B7E58E76#)" ")" ")"; /* TEST_from_TCL.h*/ /* TEST_from_Tcl.c: cc -o TEST_from_Tcl TEST_from_Tcl.c -lgcrypt TEST_from_Tcl*/ $
рдкреНрд░рдорд╛рдгрдкрддреНрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд╛ рд╕рддреНрдпрд╛рдкрди рдореЙрдбреНрдпреВрд▓ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:TEST_from_TCL.c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdarg.h> #include <gcrypt.h> #include "TEST_from_TCL.h" #define digitp(p) (*(p) >= '0' && *(p) <= '9') #define hexdigitp(a) (digitp (a) \ || (*(a) >= 'A' && *(a) <= 'F') \ || (*(a) >= 'a' && *(a) <= 'f')) #define xtoi_1(p) (*(p) <= '9'? (*(p)- '0'): \ *(p) <= 'F'? (*(p)-'A'+10):(*(p)-'a'+10)) #define xtoi_2(p) ((xtoi_1(p) * 16) + xtoi_1((p)+1)) #define xmalloc(a) gcry_xmalloc ((a)) static void show_sexp (const char *prefix, gcry_sexp_t a) { char *buf; size_t size; if (prefix) fputs (prefix, stderr); size = gcry_sexp_sprint (a, GCRYSEXP_FMT_ADVANCED, NULL, 0); buf = gcry_xmalloc (size); gcry_sexp_sprint (a, GCRYSEXP_FMT_ADVANCED, buf, size); fprintf (stderr, "%.*s", (int)size, buf); gcry_free (buf); } /* Convert STRING consisting of hex characters into its binary representation and return it as an allocated buffer. The valid length of the buffer is returned at R_LENGTH. The string is delimited by end of string. The function returns NULL on error. */ static void * hex2buffer (const char *string, size_t *r_length) { const char *s; unsigned char *buffer; size_t length; buffer = xmalloc (strlen(string)/2+1); length = 0; for (s=string; *s; s +=2 ) { if (!hexdigitp (s) || !hexdigitp (s+1)) return NULL; /* Invalid hex digits. */ ((unsigned char*)buffer)[length++] = xtoi_2 (s); } *r_length = length; return buffer; } int main(int argc, char* argv[]) { gpg_error_t err; int algo; gcry_md_hd_t hd; unsigned char *tbs_ptr; size_t len_tbs; int i; unsigned char *h; gcry_sexp_t pub_key; gcry_sexp_t data; gcry_sexp_t sig; gcry_mpi_t x; int len_xy; unsigned char c; /* little-endian big-endian*/ unsigned short arch = 1; /* 0x0001 */ tbs_ptr = hex2buffer(tbc, &len_tbs); if (tbs_ptr == NULL) { fprintf (stderr, "Bad tbs\n"); exit(1); } algo = gcry_md_map_name (hash_type); if (algo == GCRY_MD_NONE) { fprintf (stderr, "Unknown algorithm '%s'\n", hash_type); exit (1); } err = gcry_md_open(&hd, algo, 0); if (err) { fprintf (stderr, "LibGCrypt error %s/%s\n", gcry_strsource (err), gcry_strerror (err)); exit (1); } gcry_md_write (hd, tbs_ptr, len_tbs); h = gcry_md_read(hd, 0); // len_xy = gcry_md_get_algo_dlen (algo); /* */ printf("%s\n", *((unsigned char *) &arch) == 0 ? " big-endian" : " little-endian"); len_xy = *((unsigned char *) &arch) == 0 ? 0:gcry_md_get_algo_dlen (algo); for (i = 0; i < (len_xy/2); i++) { c = *(h + i); *(h + i) = *(h + len_xy - i - 1); *(h + len_xy - i - 1) = c; } fprintf(stderr, " =%d\n", gcry_md_get_algo_dlen (algo)); for (i = 0; i < gcry_md_get_algo_dlen (algo); i++) printf("%02X", h[i]); // printf("\n %s\n", tbc); fflush(stdout); /* */ x = gcry_mpi_set_opaque_copy(NULL, h, gcry_md_get_algo_dlen (algo) * 8); /* */ gcry_md_reset(hd); gcry_md_close(hd); /* */ err = gcry_sexp_build (&data, NULL, "(data (flags gost) (value %m))", x); show_sexp ("ECC GOST data cert:\n", data); fprintf (stderr, "\nStep 1\n"); /* */ err = gcry_sexp_sscan (&pub_key, NULL, pub_key_ca, strlen (pub_key_ca)); if (err){ fprintf(stderr, "TEST_SEXP: er gcry_sexp_sscan for pub_key_ca\n"); exit(1); } show_sexp ("ECC GOST public key:\n", pub_key); fprintf (stderr, "Step 2\n"); /* */ err = gcry_sexp_sscan (&sig, NULL, sig_cert, strlen (sig_cert)); if (err){ fprintf(stderr, "TEST_SEXP: er gcry_sexp_sscan for sig_cert\n"); exit(1); } show_sexp ("ECC GOST sig cert:\n", sig); fprintf (stderr, "Step 3\n"); /* */ err = gcry_pk_verify (sig, data, pub_key); if (err) { fprintf (stderr, "TEST_SEXP: verify cert failed\n"); exit (1); } fprintf (stderr, "TEST_SEXP: verify cert OK!!\n"); }
рд╣рдо TEST_from_TCL рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди рдХрд░рддреЗ рд╣реИрдВ: $cc тАУo TEST_from_TCL TEST_from_TCL.c тАУlgcrypt $./TEST_from_TCL little-endian =32 D485903E7E8D60820118329060C558B9C733D53CA608C0C79363ECE7B4C1F799ECC GOST data cert: (data (flags gost) (value
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдкреНрд░рдорд╛рдгрдкрддреНрд░ "UTs 1 IS GUTs.pem" рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд╛ рд╕рддреНрдпрд╛рдкрди рд╕рдлрд▓ рд░рд╣рд╛ред рдпрд╣ рдореВрд▓ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдХреЛ "GUT Minkomsvyaz.pem" рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИред рдпрд╣ рд╕рд░рд▓ рд╣реИ, рдмрд╕ рдХрдорд╛рдВрдб рдЪрд▓рд╛рдПрдВ: $ parse_certs_for_verify_load.tcl " .pem" " .pem" > TEST_from_TCL.h $ ..
рдпрджрд┐ рдХреЛрдИ рдЕрдиреНрдп GOST рдХреБрдВрдЬреА (GOST R 34.10-2012-256 рдпрд╛ GOST R 34.10-2012-512) рдХреЗ рд╕рд╛рде рдкреНрд░рдорд╛рдгрдкрддреНрд░реЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рддреЛ рд╡рд╣ CAFL63 CA рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдХреЛрдИ рднреА рдкреНрд░рдорд╛рдг рдкрддреНрд░ рддреИрдпрд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ:
рдЗрд╕рд▓рд┐рдП, рдХрд┐рдП рдЧрдП рд╢реЛрдзреЛрдВ рд╕реЗ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ GCrypt рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рд░реВрд╕реА рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлреА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рдереЗред рддрддреНрдХрд╛рд▓ рд╕рдВрднрд╛рд╡рдирд╛ рдХреЗрдПрд╕рдмреАрдП рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рдЕрдВрддрд┐рдо рд░реВрдк рджреЗрдиреЗ рдФрд░ рд░реВрд╕реА рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлреА рдХреЗ рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде рдЯреАрдИрд╕реА рд╕реНрдХреНрд░рд┐рдкреНрдЯрд┐рдВрдЧ рднрд╛рд╖рд╛ (рдпрд╛ рд╢рд╛рдпрдж рдкрд╛рдпрдерди) рдХреЗ рдкрдХреНрдХреА рдкреИрдХреЗрдЬ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдореЗрдВ рджреЗрдЦреА рдЬрд╛рддреА рд╣реИредрдЬреЛ рд▓реЛрдЧ рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдХреЗ рд▓рд┐рдП GCrypt рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдореИрдВ рдпрд╣рд╛рдВ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ ред