рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ, рдореЛрдиреЛ рдХреЗ рд╕рд╛рде рдХреНрд░рд┐рдкреНрдЯреЛрдкреНрд░реЛ рдХреЗ GOST рдкреНрд░рдорд╛рдгрдкрддреНрд░реЛрдВ рдХреЛ рдПрдХреАрдХреГрдд рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЙрд╕реА рдореЗрдВ, рд╣рдо рдЖрд░рдПрд╕рдП рдкреНрд░рдорд╛рдгрдкрддреНрд░реЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред
рд╣рдордиреЗ рд▓рд┐рдирдХреНрд╕ рдореЗрдВ C # рдореЗрдВ рд▓рд┐рдЦреЗ рдЕрдкрдиреЗ рд╕рд░реНрд╡рд░ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдкреЛрд░реНрдЯ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрд╛ рдФрд░ рдХрддрд╛рд░ RSA- рд╕рдВрдмрдВрдзрд┐рдд рд╣рд┐рд╕реНрд╕реЗ рддрдХ рдкрд╣реБрдВрдЪ рдЧрдИред рдпрджрд┐ рдкрд┐рдЫрд▓реА рдмрд╛рд░ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдореЗрдВ рдХрдард┐рдирд╛рдЗрдпреЛрдВ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рджреЛ рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдХреА рдмрд╛рддрдЪреАрдд рд╕реЗ рд╕рдордЭрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ рдЬреЛ рдореВрд▓ рд░реВрдк рд╕реЗ рдПрдХ-рджреВрд╕рд░реЗ рд╕реЗ рдЬреБрдбрд╝реЗ рдирд╣реАрдВ рдереЗ, рддреЛ рдореЛрдиреЛ рд╕реЗ "рд╕рд╛рдзрд╛рд░рдг" рдЖрд░рдПрд╕рдП рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдХрдиреЗрдХреНрдЯ рдХрд░рддреЗ рд╕рдордп, рдХрд┐рд╕реА рдХреЛ рднреА рдкрдХрдбрд╝рдиреЗ рдХреА рдЙрдореНрдореАрдж рдирд╣реАрдВ рдереАред
рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдФрд░ рдХреБрдВрдЬреА рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рд╕реЗ рд╕рдорд╕реНрдпрд╛рдПрдВ рдирд╣реАрдВ рд╣реБрдИрдВ, рдФрд░ рд╕рд┐рд╕реНрдЯрдо рдиреЗ рдЗрд╕реЗ рдорд╛рдирдХ рднрдВрдбрд╛рд░рдг рдореЗрдВ рднреА рджреЗрдЦрд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдкрд╣рд▓реЗ рд╕реЗ рдмрдиреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╕реЗ рдбреЗрдЯрд╛ рдХреЛ рд╕рд╛рдЗрди рдЗрди рдХрд░рдирд╛, рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рдХрд░рдирд╛ рдпрд╛ рдирд┐рдХрд╛рд▓рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рдерд╛ - рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рдореЛрдиреЛ рд╕реНрдерд┐рд░ рд░реВрдк рд╕реЗ рдЧрд┐рд░ рдЧрдпрд╛ред рдореБрдЭреЗ CryptoPro рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕реАрдзреЗ рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рдХрдиреЗрдХреНрдЯ рд╣реЛрдирд╛ рдерд╛ред рд▓рд┐рдирдХреНрд╕ рдореЗрдВ RSA рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрдиреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рдЙрдореНрдореАрджрд╡рд╛рд░ OpenSSL рд╣реИред
рдкреНрд░рдорд╛рдгрдкрддреНрд░ рд╕реНрдерд╛рдкрдирд╛
рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рд╕реЗрдВрдЯреЛрд╕ 7 рдореЗрдВ рдУрдкрдирдПрд╕рдПрд╕рдПрд▓ - 1.0.2k рдХрд╛ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕рдВрд╕реНрдХрд░рдг рд╣реИред рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрдард┐рдирд╛рдЗрдпреЛрдВ рдХрд╛ рдкрд░рд┐рдЪрдп рдирд╣реАрдВ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ рдЗрд╕ рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рдЬреБрдбрд╝рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред OpenSSL рдЖрдкрдХреЛ рд╡рд┐рд╢реЗрд╖ рдлрд╝рд╛рдЗрд▓ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рд╕реНрдЯреЛрд░ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдБрдХрд┐:
- рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╕реНрдЯреЛрд░ рдореЗрдВ рдирд┐рдЬреА рдХреБрдВрдЬреА рдирд╣реАрдВ, рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдФрд░ рд╕реАрдЖрд░рдПрд▓ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдЕрд▓рдЧ рд╕реЗ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛;
- рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рдореЗрдВ рдПрдХ рдбрд┐рд╕реНрдХ рдкрд░ рд╡рд┐рдВрдбреЛрдЬ рдореЗрдВ рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдФрд░ рдирд┐рдЬреА рдХреБрдВрдЬреА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдирд╛ "рдмреЗрд╣рдж рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ" (рдбрд┐рдЬрд┐рдЯрд▓ рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд▓реЛрдЧ рдЖрдорддреМрд░ рдкрд░ рдЗрд╕реЗ рдЕрдзрд┐рдХ рдХреНрд╖рдорддрд╛ рдФрд░ рдХрдо рд╕реЗрдВрд╕рд░рд╢рд┐рдк рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ), рдИрдорд╛рдирджрд╛рд░ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рд▓рд┐рдирдХреНрд╕ рдореЗрдВ рдмрд╣реБрдд рд╕реБрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЖрдо рд╣реИ рдЕрднреНрдпрд╛рд╕;
- рд╡рд┐рдВрдбреЛрдЬ рдФрд░ рд▓рд┐рдирдХреНрд╕ рдкрд░ рдРрд╕реЗ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЗ рд╕реНрдерд╛рди рдХрд╛ рд╕рдордиреНрд╡рдп рдХрд░рдирд╛ рдХрд╛рдлреА рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╣реИ;
- рднрдВрдбрд╛рд░рдг рдХреЗ рдореИрдиреБрдЕрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдХреЗ рд╕реЗрдЯ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА;
- рдореЛрдиреЛ рд╕реНрд╡рдпрдВ рдПрдХ рдУрдкрдирдПрд╕рдПрд╕рдПрд▓ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╕рд╛рде рдбрд┐рд╕реНрдХ рднрдВрдбрд╛рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдкрд╛рд╕ рдореЗрдВ рдЦреБрд▓реЗ рд░реВрдк рдореЗрдВ рдирд┐рдЬреА рдХреБрдВрдЬреА рднреА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ;
рдЗрди рдХрд╛рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП, рд╣рдо рдУрдкрдирдПрд╕рдПрд╕рдПрд▓ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ .Net рдФрд░ рдореЛрдиреЛ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рд╕реНрдЯреЛрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд▓рд┐рдирдХреНрд╕ рдкрд░, рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдФрд░ рдирд┐рдЬреА рдХреБрдВрдЬреА рдХреЛ рдкрд╣рд▓реЗ рдореЛрдиреЛ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдкреНрд░рдорд╛рдгрдкрддреНрд░ рд╕реНрдерд╛рдкрдирд╛рд╣рдо рдЗрд╕рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рд╕рд░реНрдЯрд┐рдлрд┐рдХреЗрдЯ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, pfx рд╕реЗ рдирд┐рдЬреА рдХреБрдВрдЬреА рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:
certmgr -importKey -c -p {password} My {pfx file}
рдлрд┐рд░ рд╣рдо рдЗрд╕ pfx рд╕реЗ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдбрд╛рд▓рддреЗ рд╣реИрдВ, рдирд┐рдЬреА рдХреБрдВрдЬреА рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕рд╕реЗ рдЬреБрдбрд╝ рдЬрд╛рдПрдЧреА:
certmgr -add -c My {cer file}
рдпрджрд┐ рдЖрдк рдорд╢реАрди рдХреЗ рд▓рд┐рдП рд╕реНрдЯреЛрд░реЗрдЬ рдореЗрдВ рдХреБрдВрдЬреА рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ -m рд╡рд┐рдХрд▓реНрдк рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред
рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдХреЛ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
certmgr -list -c -v My
рдЬрд╛рд░реА рдХрд░рдиреЗ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВред рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣рд╛ рд╣реИ, рдФрд░ рдкрд╣рд▓реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХреА рдЧрдИ рдирд┐рдЬреА рдХреБрдВрдЬреА рд╕реЗ рдмрдВрдзрд╛ рд╣реБрдЖ рд╣реИред рдЙрд╕рдХреЗ рдмрд╛рдж, рдЖрдк рдХреЛрдб рдореЗрдВ рдХрдиреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред
рдХреЛрдб рдореЗрдВ рдХрдиреЗрдХреНрд╢рди
рдкрд┐рдЫрд▓реА рдмрд╛рд░ рдХреА рддрд░рд╣, рд╕рд┐рд╕реНрдЯрдо рдХреЛ рд▓рд┐рдирдХреНрд╕ рдореЗрдВ рдкреЛрд░реНрдЯ рдХрд┐рдП рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рд╡рд┐рдВрдбреЛрдЬ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рд▓рд┐рдП, рдмрд╛рд╣реНрдп рд░реВрдк рд╕реЗ, рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлреА рдХреЗ рд╕рд╛рде "рдмрд╛рдЗрдЯ [] рд╕рд╛рдЗрдирдбрд╛рдЯрд╛ (рдмрд╛рдЗрдЯ [] _arData, X509Certificate2 _pCert) рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреЛ рд▓рд┐рдирдХреНрд╕ рдФрд░ рд╡рд┐рдВрдбреЛрдЬ рджреЛрдиреЛрдВ рдореЗрдВ рд╕рдорд╛рди рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ, рдРрд╕реЗ рддрд░реАрдХреЗ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП рдЬреЛ рд╡рд┐рдВрдбреЛрдЬ рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ - рднрд▓реЗ рд╣реА рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдкрд░ рдирд┐рд░реНрднрд░ рд╣реЛ (рд▓рд┐рдирдХреНрд╕ рдкрд░ рдУрдкрдирдПрд╕рдПрд╕рдПрд▓ рдпрд╛ рдХреНрд░рд┐рдкреНрдЯреЛрдкреНрд░реЛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдХреНрд░рд┐рдкреНрдЯреЛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡рд┐рдВрдбреЛрдЬ рдкрд░)ред
рдУрдкрдирдПрд╕рдПрд╕рдПрд▓ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд╕реЗ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рд╡рд┐рдВрдбреЛрдЬ рдкрд░ рдореБрдЦреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдп "libeay32.dll" рд╣реИ, рдФрд░ рд▓рд┐рдирдХреНрд╕ рдкрд░ "libcrypto.so.10" рд╣реИред рдкрд┐рдЫрд▓реА рдмрд╛рд░ рдХреЗ рд╕рд╛рде рд╣реА, рд╣рдо рджреЛ рд╡рд░реНрдЧреЛрдВ WOpenSSLAPI рдФрд░ LOpenSSLAPI рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИ:
[DllImport(CTRYPTLIB, CharSet = CharSet.Auto, SetLastError = true, CallingConvention = CallingConvention.Cdecl)] internal static extern void OPENSSL_init();
CryptoPro рдХреЗ рд╡рд┐рдкрд░реАрдд, рдХреЙрд▓рд┐рдВрдЧ рдХрдиреНрд╡реЗрдВрд╢рди рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ - рдпрд╣рд╛рдВ рдЗрд╕реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕ рдмрд╛рд░ рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ * .h рдУрдкрдирдПрд╕рдПрд╕рдПрд▓ рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
.H рдлрд╝рд╛рдЗрд▓реЛрдВ рд╕реЗ рдбреЗрдЯрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ C # рдореЗрдВ рдХреЙрд▓ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЬреЗрдирд░реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреБрдирд┐рдпрд╛рджреА рдирд┐рдпрдо рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ:
- рд╕рдВрд░рдЪрдирд╛рдУрдВ, рддрд╛рд░реЛрдВ, рдЖрджрд┐ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рднреА рд▓рд┐рдВрдХ - IntPtr, рдЦреБрдж рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рднреАрддрд░ рд▓рд┐рдВрдХ рд╕рд╣рд┐рдд;
- рд▓рд┐рдВрдХ рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХ - IntPtr рд░реЗрдлрд░реА, рдЕрдЧрд░ рдпрд╣ рд╡рд┐рдХрд▓реНрдк рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдмрд╕ IntPtrред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд▓рд┐рдВрдХ рдХреЛ рд╕реНрд╡рдпрдВ рд░рдЦрдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдирд┐рдХрд╛рд▓рдирд╛ рд╣реЛрдЧрд╛;
- рд╕рд░рдгрд┐рдпрд╛рдБ - рдмрд╛рдЗрдЯ [];
- C рдореЗрдВ рд▓рдВрдмрд╛ (OpenSSL) C # рдореЗрдВ рдПрдХ int рд╣реИ (рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ, рдПрдХ рдЫреЛрдЯреА рд╕реА, рддреНрд░реБрдЯрд┐ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд╕реНрд░реЛрдд рдХреА рдЦреЛрдЬ рдореЗрдВ рдШрдВрдЯреЛрдВ рдореЗрдВ рдмрджрд▓ рд╕рдХрддреА рд╣реИ);
рдШреЛрд╖рдгрд╛ рдореЗрдВ, рдЖрджрдд рд╕реЗ рдмрд╛рд╣рд░, рдЖрдк SetLastError = true рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЗрд╕ рдкрд░ рдзреНрдпрд╛рди рдирд╣реАрдВ рджреЗрдЧрд╛ - рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдорд╛рд░реНрд╢рд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реЛрдВрдЧреАред GetLastWin32Error ()ред OpenSSL рдХреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рддрд░реАрдХреЗ рд╣реИрдВред
рдФрд░ рдлрд┐рд░ рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкрд░рд┐рдЪрд┐рдд рд╕реНрдерд┐рд░ рд╡рд░реНрдЧ "UOpenSSLAPI" рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬреЛ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рджреЛ рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреА рд╡рд┐рдзрд┐ рдХреЛ рдмреБрд▓рд╛рдПрдЧрд╛:
private static object fpOSSection = new object(); public static void OPENSSL_init() { lock (pOSSection) { if (fIsLinux) LOpenSSLAPI.OPENSSL_init(); else WOpenSSLAPI.OPENSSL_init(); } } public static object pOSSection { get { return fpOSSection; } } public static bool fIsLinux { get { int iPlatform = (int) Environment.OSVersion.Platform; return (iPlatform == 4) || (iPlatform == 6) || (iPlatform == 128); } }
рддреБрд░рдВрдд, рд╣рдо рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЦрдВрдб рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдкрд░ рдзреНрдпрд╛рди рджреЗрддреЗ рд╣реИрдВред OpenSSL рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ рдПрдХ рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдХрд╛рдо рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди, рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рддреБрд░рдВрдд рд╡рд░реНрдгрди рдореЗрдВ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рд╣реИ:
рд▓реЗрдХрд┐рди рдЖрдк рдЕрднреА рднреА рд╕рдорд╕рд╛рдордпрд┐рдХ рд░реВрдк рд╕реЗ рдХрдИ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдХрдИ рдереНрд░реЗрдб рдореЗрдВ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ
рдФрд░ рджреВрд╕рд░реА рдмрд╛рдд, рдХрдиреЗрдХреНрд╢рди рд╡рд┐рдзрд┐ рд╕рдмрд╕реЗ рддреБрдЪреНрдЫ рдирд╣реАрдВ рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рджреЛ-рдХреЛрд░ рд╡реАрдПрдо (рд╣рд╛рдЗрдкрд░-рдереНрд░реЗрдбрд┐рдВрдЧ рдореЛрдб рдореЗрдВ рдЗрдВрдЯреЗрд▓ Xeon E5649 рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд╕рд╛рде рд╕рд░реНрд╡рд░) рдЬрдм рдЗрд╕ рддрд░рд╣ рдХреЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЦрдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рд▓рдЧрднрдЧ 100 рдкреВрд░реНрдг рдЪрдХреНрд░ (рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рджреЗрдЦреЗрдВ ) рдпрд╛ рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб 600 рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рджреЗрддрд╛ рд╣реИ, рдЬреЛ рдореВрд▓ рд░реВрдк рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ ( рднрд╛рд░реА рднрд╛рд░ рдХреЗ рддрд╣рдд, рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдорд╛рдЗрдХреНрд░реЛрд╕рд╡рд░реНрдХ рдпрд╛ рдиреЛрдбрд▓ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡реИрд╕реЗ рднреА рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛)ред
рдУрдкрдирдПрд╕рдПрд╕рдПрд▓ рдХреЛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдФрд░ рдЙрддрд╛рд░рдирд╛
рдХреНрд░рд┐рдкреНрдЯреЛрдкреНрд░реЛ рдУрдкрдирдПрд╕рдПрд╕рдПрд▓ рдХреЗ рд╡рд┐рдкрд░реАрдд рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдФрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдЖрдкрдХреЛ рдХреБрдЫ рдХрд╛рд░реНрдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ:
public static void InitOpenSSL() { UOpenSSLAPI.OPENSSL_init(); UOpenSSLAPI.ERR_load_crypto_strings(); UOpenSSLAPI.ERR_load_RSA_strings(); UOpenSSLAPI.OPENSSL_add_all_algorithms_conf(); UOpenSSLAPI.OpenSSL_add_all_ciphers(); UOpenSSLAPI.OpenSSL_add_all_digests(); } public static void CleanupOpenSSL() { UOpenSSLAPI.EVP_cleanup(); UOpenSSLAPI.CRYPTO_cleanup_all_ex_data(); UOpenSSLAPI.ERR_free_strings(); }
рддреНрд░реБрдЯрд┐ рд╕реВрдЪрдирд╛
рдУрдкрдирдПрд╕рдПрд╕рдПрд▓ рдЖрдВрддрд░рд┐рдХ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдХреА рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рддрд░реАрдХреЗ рд╣реИрдВред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдХреБрдЫ рд╕рд░рд▓ рддрд░реАрдХреЗ, рдЬреИрд╕реЗ рдХрд┐ ERR_error_string, рдЕрд╕реНрдерд┐рд░ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдХреБрдЫ рдЬрдЯрд┐рд▓ рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
рддреНрд░реБрдЯрд┐ рд╕реВрдЪрдирд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ public static string GetErrStrPart(ulong _iErr, int _iPart) {
рдУрдкрдирдПрд╕рдПрд╕рдПрд▓ рдХреА рдПрдХ рддреНрд░реБрдЯрд┐ рдореЗрдВ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рд╣реБрдЖ, рд╡рд┐рдзрд┐ рдФрд░ рдХрд╛рд░рдгред рдЗрд╕рд▓рд┐рдП, рддреНрд░реБрдЯрд┐ рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЗрди рддреАрдиреЛрдВ рднрд╛рдЧреЛрдВ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдирд┐рдХрд╛рд▓рдирд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдПрдХ рдкрд╛рда рдкрдВрдХреНрддрд┐ рдореЗрдВ рдПрдХ рд╕рд╛рде рд▓рд╛рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдУрдкрдирдПрд╕рдПрд╕рдПрд▓ рдкреНрд░рд▓реЗрдЦрди рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдХреА рд▓рдВрдмрд╛рдИ, 120 рд╡рд░реНрдгреЛрдВ рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЪреВрдВрдХрд┐ рд╣рдо рдкреНрд░рдмрдВрдзрд┐рдд рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рд▓рд┐рдВрдХ рд╕реЗ рд░реЗрдЦрд╛ рдХреЛ рдирд┐рдХрд╛рд▓рдирд╛ рд╣реЛрдЧрд╛:
IntPtr рджреНрд╡рд╛рд░рд╛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ public static string PtrToFirstStr(IntPtr _hPtr, int _iLen = 256) { if(_hPtr == IntPtr.Zero) return ""; try { byte[] arStr = new byte[_iLen]; Marshal.Copy(_hPtr, arStr, 0, arStr.Length); string[] arRes = Encoding.ASCII.GetString(arStr).Split(new char[] { (char)0 }, StringSplitOptions.RemoveEmptyEntries); if (arRes.Length > 0) return arRes[0]; return ""; }catch { return ""; } }
рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдХреА рдЬрд╛рдБрдЪ рдХрд░рддреЗ рд╕рдордп рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╕рд╛рдорд╛рдиреНрдп рд╕реВрдЪреА рдореЗрдВ рдирд╣реАрдВ рдЖрддреА рд╣реИрдВ, рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕рддреНрдпрд╛рдкрди рд╕рдВрджрд░реНрдн рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдПрдХ рдЕрд▓рдЧ рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рдирд┐рдХрд╛рд▓рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:
рдкреНрд░рдорд╛рдгрдкрддреНрд░ рд╕рддреНрдпрд╛рдкрди рддреНрд░реБрдЯрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ public static string GetCertVerifyErr(IntPtr _hStoreCtx) { int iErr = UOpenSSLAPI.X509_STORE_CTX_get_error(_hStoreCtx); return PtrToFirstStr(UOpenSSLAPI.X509_verify_cert_error_string(iErr)); }
рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдЦреЛрдЬ
рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлреА рдПрдХ рд╕рд░реНрдЯрд┐рдлрд┐рдХреЗрдЯ рдЦреЛрдЬ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрддреА рд╣реИред рд╣рдо рдкреВрд░реНрдгрдХрд╛рд▓рд┐рдХ рд╕рдВрдЧреНрд░рд╣рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдирд┐рдпрдорд┐рдд рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЦреЛрдЬ рдХрд░реЗрдВрдЧреЗ:
рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдЦреЛрдЬ internal static int FindCertificateOS(string _pFindValue, out X509Certificate2 _pCert, ref string _sError, StoreLocation _pLocation = StoreLocation.CurrentUser, StoreName _pName = StoreName.My, X509FindType _pFindType = X509FindType.FindByThumbprint, bool _fVerify = false) { lock (UOpenSSLAPI.pOSSection) {
рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдиреБрднрд╛рдЧ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВред рдкреНрд░рдорд╛рдгрдкрддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде рдореЛрдиреЛ рдУрдкрдирдПрд╕рдПрд╕рдПрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпреВрдУрдПрдирдПрд╕рдПрд╕рдПрд▓рдПрдкреАрдЖрдИ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд╣реАрдВред рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдпрд╣рд╛рдВ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдореЗрдореЛрд░реА рд▓реАрдХ рдФрд░ рд▓реЛрдб рдХреЗ рддрд╣рдд рдЕрд╕реНрдерд╛рдпреА рд╕рдордЭ рд╕реЗ рдмрд╛рд╣рд░ рдХреА рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдореБрдЦреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛ рдПрдХ рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рд╣реИред рдХреНрд░рд┐рдкреНрдЯреЛрдкреНрд░реЛ рдХреЗ рд▓рд┐рдП рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣рдореЗрдВ рд╕реНрдЯреЛрд░ рд╕реЗ рд╣реА рдкреНрд░рдорд╛рдг рдкрддреНрд░ (рдПрдХреНрд╕ 509 рд╕рд░реНрдЯрд┐рдлрд┐рдХреЗрдЯ 2) рдорд┐рд▓рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдореЗрдВ рд╣реИрдВрдбрд▓ рдХрд╛ рд▓рд┐рдВрдХ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдУрдкрдирдПрд╕рдПрд╕рдПрд▓ рд╕рдВрд░рдЪрдирд╛ рдПрдХреНрд╕ 509_рд╕реНрдЯ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджреЗрд╢рд┐рдд рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдореЗрдВ EVP_PKEY (OpenSSL рдореЗрдВ рдирд┐рдЬреА рдХреБрдВрдЬреА рд╕рдВрд░рдЪрдирд╛ рд╕реЗ рд▓рд┐рдВрдХ) рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕рдВрдХреЗрддрдХ рдирд╣реАрдВ рд╣реИред
рдирд┐рдЬреА рдХреБрдВрдЬреА рд╕реНрд╡рдпрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдирд┐рдХрд▓рд╛, рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдХреЗ рдЖрдВрддрд░рд┐рдХ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИ - рдирд┐рд╣рд┐рдд / рдЧрд┐рд░рд╛рд╡рдЯ / _cert / _rsa / rsaред рдпрд╣ RSAManaged рд╡рд░реНрдЧ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рдХреЛрдб рдкрд░ рдПрдХ рддреНрд╡рд░рд┐рдд рдирдЬрд╝рд░ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, DecryptValue рд╡рд┐рдзрд┐) рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлреА рдХреЗ рд╕рд╛рде рдореЛрдиреЛ рдХрд┐рддрдирд╛ рдмреБрд░рд╛ рд╣реИред рдУрдкрдирдПрд╕рдПрд╕рдПрд▓ рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлреА рддрдХрдиреАрдХреЛрдВ рдХрд╛ рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдЙрдиреНрд╣реЛрдВрдиреЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдХрдИ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рд▓рд╛рдЧреВ рдХрд┐рдП рд╣реИрдВред рдЗрд╕ рдзрд╛рд░рдгрд╛ рдХреЛ OpenSSL CMS_final, CMS_sign рдпрд╛ CMS_ContentInfo_new рдЬреИрд╕реЗ рдЙрдирдХреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рд░рд┐рдХреНрдд рдЦреЛрдЬ рдкрд░рд┐рдгрд╛рдо рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдФрд░ рдЙрдирдХреЗ рдмрд┐рдирд╛, рдПрдХ рдорд╛рдирдХ рд╕реАрдПрдордПрд╕ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдЧрдарди рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред рдЗрд╕реА рд╕рдордп, рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдУрдкрдирдПрд╕рдПрд╕рдПрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдирд┐рдЬреА рдХреБрдВрдЬреА рдХреЛ рдореЛрдиреЛ рд╕реЗ рдЙрддрд╛рд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдИрд╡реАрдкреА_рдкреАрдХреЗрд╡рд╛рдИ рдореЗрдВ рдкреЗрдо рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓реЛрдб рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕ рд╡рдЬрд╣ рд╕реЗ, рд╣рдореЗрдВ рдлрд┐рд░ рд╕реЗ X509C рд╕рд░реНрдЯрд┐рдлрд┐рдХреЗрдЯ рд╕реЗ рдХреНрд▓рд╛рд╕ рдЗрдирд╣реЗрд░рд┐рдЯ рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ, рдЬреЛ рд╕рднреА рдЕрддрд┐рд░рд┐рдХреНрдд рд▓рд┐рдВрдХ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░реЗрдЧрд╛ред
рдпрд╣рд╛рдВ рдХреЗрд╡рд▓ рдкреНрд░рдпрд╛рд╕ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ CryptoPro рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣реИрдВрдбрд▓ рд╕реЗ рдПрдХ рдирдпрд╛ рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП - рднреА рд╕рдлрд▓рддрд╛ рдирд╣реАрдВ рдорд┐рд▓рддреА рд╣реИ (рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рдореЛрдиреЛ рджреБрд░реНрдШрдЯрдирд╛рдЧреНрд░рд╕реНрдд рд╣реЛ рдЬрд╛рддреА рд╣реИ), рдФрд░ рдкреНрд░рд╛рдкреНрдд рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдореЗрдореЛрд░реА рд▓реАрдХ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдПрдХрдорд╛рддреНрд░ рд╡рд┐рдХрд▓реНрдк рдкреЗрдо рдпреБрдХреНрдд рдмрд╛рдЗрдЯ рд╕рд░рдгреА рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдмрдирд╛рдирд╛ рд╣реИред рдкреАрдИрдПрдо рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
рдПрдХ рдкреАрдИрдПрдо рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ public static int ToCerFile(this X509Certificate2 _pCert, out byte[] _arData, ref string _sError, bool _fBase64 = true) { _arData = new byte[0]; try { byte[] arData = _pCert.Export(X509ContentType.Cert);
рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдПрдХ рдирд┐рдЬреА рдХреБрдВрдЬреА рдХреЗ рдмрд┐рдирд╛ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╣рдо рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рдХрдиреЗрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВ, ENV_PKEY рдХреЗ рд▓рд┐рдВрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдХреНрд╖реЗрддреНрд░ рдмрдирд╛рддреЗ рд╣реИрдВ:
PEM рдирд┐рдЬреА рдХреБрдВрдЬреА рдХреЗ рдЖрдзрд╛рд░ рдкрд░ ENV_PKEY рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ internal static IntPtr GetENV_PKEYOS(byte[] _arData) { IntPtr hBIOPem = IntPtr.Zero; try {
PEM рдореЗрдВ рдирд┐рдЬреА рдХреБрдВрдЬреА рдЕрдкрд▓реЛрдб рдХрд░рдирд╛, рдХрд╛рд░реНрдп PEM рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдпрд╣рд╛рдВ рд╡рд░реНрдгрд┐рдд рд╣реИ ред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдирд┐рдЬреА рдХреБрдВрдЬреА рдХреЛ рдЙрддрд╛рд░рдирд╛ рдПрдХ "рдмреЗрд╣рдж рдЕрд╕реБрд░рдХреНрд╖рд┐рдд" рд╡реНрдпрд╡рд╕рд╛рдп рд╣реИ, рдФрд░ рдЗрд╕реЗ рд╣рд░ рддрд░рд╣ рд╕реЗ рдмрдЪрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдФрд░ рдЪреВрдВрдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЕрдирд▓реЛрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдУрдкрдирдПрд╕рдПрд╕рдПрд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╡рд┐рдВрдбреЛрдЬ рдореЗрдВ рдЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдХреНрд░рд┐рдкреНрдЯреЛрдХрд░рдВрд╕реА рдХреЗ рддрд░реАрдХреЛрдВ рдпрд╛ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗред рдиреЗрдЯ рдХрдХреНрд╖рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рд╣реИред рд▓рд┐рдирдХреНрд╕ рдореЗрдВ, рдЕрднреА рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрд╕ рддрд░рд╣ рдХрд╛рдо рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдпрд╣ рднреА рдпрд╛рдж рд░рдЦрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдЙрддреНрдкрдиреНрди рд▓рд┐рдВрдХ рдПрдХ рдЕрдкреНрд░рдмрдВрдзрд┐рдд рд╕реНрдореГрддрд┐ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдореБрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдХреНрдпреЛрдВрдХрд┐ .Net рдореЗрдВ 4.5 X509Certificate2 рдбрд┐рд╕реНрдкреЛрдЬреЗрдмрд▓ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдЗрд╕реЗ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдореЗрдВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд░рдиреЗ рдХреЗ
рдУрдкрдирдПрд╕рдПрд╕рдПрд▓ рдкрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рд╕рд░рд▓реАрдХреГрдд рд╕реАрдПрдордПрд╕_рд╕рд╛рдЗрди рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдПрдХ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдЪреБрдирдиреЗ рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рд╕рднреА рдкреНрд░рдорд╛рдгрдкрддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рд╣реЛрдЧрд╛ред рдЗрд╕рд▓рд┐рдП рд╕рдорд╛рди рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдкреАрдврд╝реА рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЗ рдХреЛрдб рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ:
рдбреЗрдЯрд╛ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ internal static int SignDataOS(byte[] _arData, X509Certificate2 _pCert, out byte[] _arRes, ref string _sError) { _arRes = new byte[0]; uint iFlags = UCConsts.CMS_DETACHED; IntPtr hData = IntPtr.Zero; IntPtr hBIORes = IntPtr.Zero; IntPtr hCMS = IntPtr.Zero; try {
рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреА рдкреНрд░рдЧрддрд┐ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рдорд╛рдгрдкрддреНрд░ (рдпрджрд┐ рдпрд╣ X509Certificate2 рд╣реИ) рдХреЛ рд╣рдорд╛рд░реЗ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░реЗрдВред рдХреНрдпреЛрдВрдХрд┐ рдЪреВрдБрдХрд┐ рд╣рдо рдПрдХ рдорд╛рдирд╡рд░рд╣рд┐рдд рдореЗрдореЛрд░реА рдХреНрд╖реЗрддреНрд░ рдХреЗ рд▓рд┐рдВрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рдЙрдирдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред .рдиреЗрдЯ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдХреЗ рд▓рд┐рдВрдХ рдХреЗ рджрд╛рдпрд░реЗ рд╕реЗ рдмрд╛рд╣рд░ рд╣реЛрдиреЗ рдХреЗ рдХреБрдЫ рд╕рдордп рдмрд╛рдж, рдпрд╣ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдХреЛ рд▓реЙрдиреНрдЪ рдХрд░реЗрдЧрд╛ред рдФрд░ рдЗрд╕рдореЗрдВ рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝реЗ рд╕рднреА рдЕрдкреНрд░рдмрдВрдзрд┐рдд рдореЗрдореЛрд░реА рдХреЛ рдЦрд╛рд▓реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рддрд░реАрдХреЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдП рд╣реИрдВред рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣рдореЗрдВ рдЗрди рд▓рд┐рдВрдХреНрд╕ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордп рдмрд░реНрдмрд╛рдж рдирд╣реАрдВ рдХрд░рдиреЗ рджреЗрддрд╛ рд╣реИред
рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдХреЗ рд╕рд╛рде рдирд┐рдкрдЯрд╛, рд╣рдо рдбреЗрдЯрд╛ рдФрд░ рдПрдХ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╕рд╛рде рдПрдХ BIO рдмрдирд╛рддреЗ рд╣реИрдВред рдлрд┐рд░ рд╣рдо рд╣рд╕реНрддрд╛рдХреНрд╖рд░рдХрд░реНрддрд╛ рдХрд╛ рдбреЗрдЯрд╛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЛ рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзреНрд╡рдЬ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рдЕрдВрддрд┐рдо рдЧрдарди рдХреЛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдкрд░рд┐рдгрд╛рдо BIO рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдХреЗрд╡рд▓ BIO рд╕реЗ рдмрд╛рдЗрдЯреНрд╕ рдХреА рдПрдХ рд╕рд░рдгреА рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИред BIO рдХреЛ рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рдПрдХ рд╕реЗрдЯ рдореЗрдВ рдмрджрд▓рдирд╛ рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рдЕрдХреНрд╕рд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рд░рдЦрдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рд╣реИ:
рдмрд╛рдЗрдЯ рдореЗрдВ BIO [] рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд internal static int ReadFromBIO_OS(IntPtr _hBIO, out byte[] _arRes, ref string _sError, uint _iLen = 0) { _arRes = new byte[0]; IntPtr hRes = IntPtr.Zero; uint iLen = _iLen; if(iLen == 0) iLen = int.MaxValue; try {
рдЬреИрд╕рд╛ рдХрд┐ CryptoPro рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкреНрд░рдорд╛рдг рдкрддреНрд░ рд╕реЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╣реИрд╢рд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдирд┐рдХрд╛рд▓рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рд▓реЗрдХрд┐рди рдУрдкрдирдПрд╕рдПрд╕рдПрд▓ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЗрд╕реЗ рд╕реАрдзреЗ рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
рд╣реИрд╢ рдЕрд▓реНрдЧреЛрд░рд┐рдердо рд▓рд╛рдирд╛ public static IntPtr GetDigestAlgOS(IntPtr _hCert) { x509_st pCert = (x509_st)Marshal.PtrToStructure(_hCert, typeof(x509_st)); X509_algor_st pAlgInfo = (X509_algor_st)Marshal.PtrToStructure(pCert.sig_alg, typeof(X509_algor_st)); IntPtr hAlgSn = UOpenSSLAPI.OBJ_nid2sn(UOpenSSLAPI.OBJ_obj2nid(pAlgInfo.algorithm)); return UOpenSSLAPI.EVP_get_digestbyname(hAlgSn); }
рд╡рд┐рдзрд┐ рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рдирд┐рдХрд▓рд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЖрдк рдкреНрд░рд▓реЗрдЦрди 1.0.2 рдореЗрдВ EVP_get_digestbynid рд╡рд┐рдзрд┐ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЗрд╕реЗ рдирд┐рд░реНрдпрд╛рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдкрд╣рд▓реЗ рд╣рдо рдПрдирдЖрдИрдбреА рдмрдирд╛рддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдирд╛рдоред рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдирд╛рдо рд╕реЗ, рдЖрдк рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рдирд╛рдо рд╕реЗ рдЦреЛрдЬрдиреЗ рдХреЗ рдирд┐рдпрдорд┐рдд рддрд░реАрдХреЗ рд╕реЗ рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред
рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд╛ рд╕рддреНрдпрд╛рдкрди
рдкреНрд░рд╛рдкреНрдд рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЛ рд╕рддреНрдпрд╛рдкрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред OpenSSL рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреА рдкреБрд╖реНрдЯрд┐ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ:
рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд╛ рд╕рддреНрдпрд╛рдкрди internal static int CheckSignOS(byte[] _arData, byte[] _arSign, out X509Certificate2 _pCert, ref string _sError, bool _fVerifyOnlySign = true, StoreLocation _pLocation = StoreLocation.CurrentUser){ _pCert = null; IntPtr hBIOData = IntPtr.Zero; IntPtr hCMS = IntPtr.Zero; IntPtr hTrStore = IntPtr.Zero; try {
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдбреЗрдЯрд╛ рдХреЛ рдмрд╛рдЗрдЯ рд╕рд░рдгреА рд╕реЗ CMS рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
рд╕реАрдПрдордПрд╕ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдЧрдарди internal static int GetCMSFromBytesOS(byte[] _arData, out IntPtr _hCMS, ref string _sError) { _hCMS = IntPtr.Zero; IntPtr hBIOCMS = IntPtr.Zero; IntPtr hCMS = IntPtr.Zero; try {
, BIO. , , ( ) :
internal static int GetTrustStoreOS(StoreLocation _pLocation, out IntPtr _hStore, ref string _sError) { _hStore = IntPtr.Zero; IntPtr hStore = IntPtr.Zero; try { List<X509Certificate2> pCerts = GetCertList(_pLocation, StoreName.Root, TCryptoPath.cpOpenSSL); pCerts.AddRange(GetCertList(_pLocation, StoreName.AuthRoot, TCryptoPath.cpOpenSSL));
, ( , ). CMS_Verify, .
(, CRL), iFlag .
. , , . .Net тАФ SignedCms, .
( , ) . тАФ , .
internal int DecodeOS(byte[] _arSign, byte[] _arContent, ref string _sError) { IntPtr hBIOData = IntPtr.Zero; IntPtr hCMS = IntPtr.Zero; IntPtr hCerts = IntPtr.Zero; try {
, BIO ( ) CMS, . , тАФ .
(STACK_OF(X509)), sk_pop, . , sk_value.
, CMS_get0_signers CMS_get1_certs. , . , , :
CRYPTO_add(&cch->d.certificate->references, 1, CRYPTO_LOCK_X509)
1.1.0 X509_up_ref, .
:
public int DecodeOS(IntPtr _hSignerInfo, ref string _sError) { try {
, , . ASN.1. asn1_string_st Pkcs9SigningTime.
:
internal static int GetSignerInfoCertOS(IntPtr _hSignerInfo, X509Certificate2Collection _pCerts, out X509Certificate2 _pCert, ref string _sError) { _pCert = null; try {
, . asn1_string_st, hex :
hex ANS.1 internal static int GetBinaryHexFromASNOS(IntPtr _hASN, out string _sHexData, ref string _sError) { _sHexData = ""; try { asn1_string_st pSerial = (asn1_string_st)Marshal.PtrToStructure(_hASN, typeof(asn1_string_st)); byte[] arStr = new byte[pSerial.iLength]; Marshal.Copy(pSerial.hData, arStr, 0, (int)pSerial.iLength); _sHexData = arStr.ToHex().ToUpper(); return UConsts.S_OK; } catch (Exception E) { _sError = UCConsts.S_HEX_ASN_BINARY_ERR.Frm(E.Message); return UConsts.E_GEN_EXCEPTION; } }
, , .
OpenSSL :
internal static int EncryptDataOS(byte[] _arInput, List<X509Certificate2> _pReceipients, out byte[] _arRes, ref string _sError) { _arRes = new byte[0]; uint iFlags = UCConsts.CMS_BINARY; IntPtr hData = IntPtr.Zero; IntPtr hReceipts = IntPtr.Zero; IntPtr hBIORes = IntPtr.Zero; IntPtr hCMS = IntPtr.Zero; try {
BIO тАФ . . , BIO . OpenSSL , , , . EVP_des_ede3_cbc, .
, . . OpenSSL:
public static int GetCertsStackOS(List<X509Certificate2> _pCerts, out IntPtr _hStack, ref string _sError) { _hStack = IntPtr.Zero; IntPtr hStack = IntPtr.Zero; try { hStack = UOpenSSLAPI.sk_new_null(); foreach (X509Certificate2 pCert in _pCerts) {
, . :
- , ;
- ;
- ;
- ;
- BIO ;
internal static int DecryptDataOS(byte[] _arInput, out X509Certificate2 _pCert, out byte[] _arRes, ref string _sError, StoreLocation _pLocation = StoreLocation.CurrentUser ) { _arRes = new byte[0]; _pCert = null; uint iFlag = UCConsts.CMS_BINARY; IntPtr hBIORes = IntPtr.Zero; IntPtr hCMS = IntPtr.Zero; X509Certificate2 pCert; try {
. , CMS_RecipientInfo_set0_pkey, CMS, .
, , . , . :
internal static int GetRecepInfoCertOS(IntPtr _hRecep, StoreLocation _pLocation, out X509Certificate2 _pCert, ref string _sError) { _pCert = null; try {
CMS_RecipientInfo_ktri_get0_signer_id , hSNO . .
C , , . ktri тАФ . OpenSSL : CMS_RecipientInfo_kari_*, CMS_RecipientInfo_kekri_* CMS_RecipientInfo_set0_password pwri.
, . . , . . . OpenSSL . ( ), , .
, , , :
internal static int VerifyCertificateOS(IntPtr _hCert, X509RevocationMode _iRevMode, X509RevocationFlag _iRevFlag, StoreLocation _pLocation, DateTime _rOnDate, ref string _sError) { IntPtr hStore = IntPtr.Zero; IntPtr hStoreCtx = IntPtr.Zero; try {
(X509_STORE_CTX) . :
public static void SetStoreCtxCheckDate(IntPtr _hStoreCtx, DateTime _rDate) { uint iFlags = UCConsts.X509_V_FLAG_USE_CHECK_TIME | UCConsts.X509_V_FLAG_X509_STRICT | UCConsts.X509_V_FLAG_CRL_CHECK_ALL;
, .
рдирд┐рд╖реНрдХрд░реНрд╖
, . X509Certificate2 (mono) . .
, Windows . . Linux , , .
CSP 5.0 , RSA . , , , RSA, , .
рд╕рдВрджрд░реНрдн
- OpenSSL 1.0.2 ManPages ;
- OpenSSL 1 2 ;
- OpenSSL :
- cms_smime.c;
- Wiki OpenSSL ;
- mono:
- RSAManaged ;