рд▓рд┐рдирдХреНрд╕ рдореЗрдВ рд╕рдВрдХреНрд░рдордг рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ, C # рдореЗрдВ рдореЛрдиреЛ рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рд╣рдорд╛рд░реЗ рдПрдХ рд╕рд░реНрд╡рд░ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдкреЛрд░реНрдЯ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рдЧрдпрд╛ред рд╕рд┐рд╕реНрдЯрдо рдЙрдиреНрдирдд рдбрд┐рдЬрд┐рдЯрд▓ рд╣рд╕реНрддрд╛рдХреНрд╖рд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рд╕рд╛рдордирд╛ рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдореЛрдиреЛ рдореЗрдВ рдХреНрд░рд┐рдкреНрдЯреЛрдкреНрд░реЛ рд╕реЗ GOST рдкреНрд░рдорд╛рдгрдкрддреНрд░реЛрдВ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд░рд╣рд╛ рдерд╛ред рдХреНрд░рд┐рдкреНрдЯреЛрдкреНрд░реЛ рдиреЗ рд╣реА рд▓рд┐рдирдХреНрд╕ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП рд╕реАрдПрд╕рдкреА рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдкрд╣рд▓реЗ рдкреНрд░рдпрд╛рд╕ рд╕реЗ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдореВрд▓ рдореЛрдиреЛ рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлреА рдХрдХреНрд╖рд╛рдПрдВ (рдЖрдзрд╛рд░ рдореЗрдВ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд╕рдорд╛рди рд╣реИред рдиреЗрдЯ - рдПрдХреНрд╕ 509рд╕реНрдЯреЛрд░, рдПрдХреНрд╕ 509 рд╕рд░реНрдЯрд┐рдлрд┐рдХреЗрдЯ 2, рдЖрджрд┐) рди рдХреЗрд╡рд▓ рдЕрддрд┐рдерд┐ рдХреБрдВрдЬреА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рд╡реЗ рднреАред рдЙрдиреНрд╣реЗрдВ рдЕрдкрдиреА рддрд┐рдЬреЛрд░рд┐рдпреЛрдВ рдореЗрдВ рди рджреЗрдЦреЗрдВред рдЗрд╕рдХреЗ рдХрд╛рд░рдг, рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлреА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХреЛ рд╕реАрдзреЗ рдХреНрд░рд┐рдкреНрдЯреЛрдкреНрд░реЛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдерд╛ред
рдкреНрд░рдорд╛рдгрдкрддреНрд░ рд╕реНрдерд╛рдкрдирд╛
рдХреЛрдб рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдпрд╣ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рдкреНрд░рдорд╛рдгрдкрддреНрд░ рд╕реНрдерд╛рдкрдирд╛CryptoPro CSP рдШрдЯрдХ рд╕рдВрд╕реНрдХрд░рдг 3.9 Centos 7 рдкрд░ / рдСрдкреНрдЯ / cprocsp рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдореЛрдиреЛ рдФрд░ рдХреНрд░рд┐рдкреНрдЯреЛрдкреНрд░реЛ рдпреВрдЯрд┐рд▓рд┐рдЯреАрдЬ рдХреЗ рдмреАрдЪ рдПрдХ рд╣реА рдирд╛рдо (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рд░реНрдЯрд┐рдлрд╛рдпрд░) рдХреЗ рд╕рд╛рде рд╕рдВрдШрд░реНрд╖ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдкрде рдХреЛ рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдореЗрдВ рдирд╣реАрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рд╕рднреА рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ рдХреЛ рдкреВрд░реНрдг рдкрде рдореЗрдВ рдмреБрд▓рд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдкрд╛рдардХреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ:
/opt/cprocsp/bin/amd64/csptest -enum -info -type PP_ENUMREADERS | iconv -f cp1251
рдпрджрд┐ рд╕реВрдЪреА рдореЗрдВ рдбрд┐рд╕реНрдХ (HDIMAGE) рдкрд░ рдлрд╝реЛрд▓реНрдбрд░ рд╕реЗ рдХреЛрдИ рдкрд╛рдардХ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЗрд╕реЗ рдбрд╛рд▓реЗрдВ:
/opt/cprocsp/sbin/amd64/cpconfig -hardware reader -add HDIMAGE store
рдлрд┐рд░ рдЖрдк рдЪрд╛рдмрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдирдпрд╛ рдХрдВрдЯреЗрдирд░ рдмрдирд╛рдХрд░ '\\ред \ HDIMAGE \ {рдХрдВрдЯреЗрдирд░ рдирд╛рдо}' рдлреЙрд░реНрдо рдХреЗ рдХрдВрдЯреЗрдирд░ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ:
/opt/cprocsp/bin/amd64/csptest -keyset -provtype 75 -newkeyset -cont '\\.\HDIMAGE\test'
рдпрд╛ / var / opt / cprocsp / keys / root / {container name} .000 рдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рдХрд░, рдЬрд┐рд╕рдореЗрдВ CryptoPro рдХрдВрдЯреЗрдирд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдорд╛рдирдХ рд╕реЗрдЯ (* .key, * .mask, рдЖрджрд┐) рд╣реИред
рдЙрд╕рдХреЗ рдмрд╛рдж, рдкреНрд░рдорд╛рдг рдкрддреНрд░ рд╕реНрдЯреЛрд░ рдореЗрдВ рдХрдВрдЯреЗрдирд░ рд╕реЗ рдкреНрд░рдорд╛рдг рдкрддреНрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
/opt/cprocsp/bin/amd64/certmgr -inst mMy -cont '\\.\HDIMAGE\{ }'
рд╕реНрдерд╛рдкрд┐рдд рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдХреЛ рдирд┐рдореНрди рдЖрджреЗрд╢ рдХреЗ рд╕рд╛рде рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
/opt/cprocsp/bin/amd64/certmgr -list mMy
рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
/opt/cprocsp/bin/amd64/cryptcp тАУ sign -norev -thumbprint {} {} { }
/opt/cprocsp/bin/amd64/cryptcp тАУ verify -norev { }
рдпрджрд┐ рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдХреЗ рд╕рд╛рде рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИ, рддреЛ рдЖрдк рдХреЛрдб рдореЗрдВ рдХрдиреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред
рдХреЛрдб рдореЗрдВ рдХрдиреЗрдХреНрд╢рди
рд▓рд┐рдирдХреНрд╕ рдореЗрдВ рдкреЛрд░реНрдЯ рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рд╕рд┐рд╕реНрдЯрдо рдХреЛ рд╡рд┐рдВрдбреЛрдЬ рдХреЗ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрдирд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдмрд╛рд╣реНрдп рд░реВрдк рд╕реЗ, рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлреА рдХреЗ рд╕рд╛рде рдлреЙрд░реНрдо "рдмрд╛рдЗрдЯ" рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХреЛрдВ рд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рдерд╛ "рдмрд╛рдЗрдЯ [] рдмрд╛рдЗрдЯ [_arData, X509Certificate2 _pCert)", рдЬреЛ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд▓рд┐рдирдХреНрд╕ рдкрд░ рдФрд░ рд╕рд╛рде рд╣реА рд╡рд┐рдВрдбреЛрдЬ рдкрд░ред
рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлреА рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рддрд░реАрдХреЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд╕рдлрд▓ рд░рд╣рд╛, рдХреНрдпреЛрдВрдХрд┐ рдХреНрд░рд┐рдкреНрдЯреЛрдХрд░рдВрд╕реА рдиреЗ рд▓рд╛рдЗрдмреНрд░реЗрд░реА "libcapi20.so" рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдорд╛рдирдХ рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╡рд┐рдВрдбреЛрдЬ - "crypt32.dll" рдФрд░ "advap332.dll" рдХреА рдирдХрд▓ рдХрд░рддрд╛ рд╣реИред рд╢рд╛рдпрдж, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлреА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рддрд░реАрдХреЗ рд╡рд╣рд╛рдВ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ, рдФрд░ рд▓рдЧрднрдЧ рд╕рднреА рдХрд╛рдо рд╣реИрдВред
рдЗрд╕рд▓рд┐рдП, рд╣рдо рджреЛ рд╕реНрдерд┐рд░ рдХрдХреНрд╖рд╛рдПрдВ "WCryptoAPI" рдФрд░ "LCryptoAPI" рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдирд┐рдореНрди рддрд░реАрдХреЛрдВ рдХреЗ рдЖрд╡рд╢реНрдпрдХ рд╕реЗрдЯ рдХреЛ рдЖрдпрд╛рдд рдХрд░реЗрдЧрд╛:
[DllImport(LIBCAPI20, SetLastError = true)] internal static extern bool CertCloseStore(IntPtr _hCertStore, uint _iFlags);
рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХрдиреЗрдХреНрд╢рди рд╕рд┐рдВрдЯреИрдХреНрд╕ рдпрд╛ рддреЛ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛ рдкрд┐рдирд╡реЙрдХ рд╡реЗрдмрд╕рд╛рдЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛ .Net рд╕реНрд░реЛрддреЛрдВ ( CAPISafe рд╡рд░реНрдЧ) рд╕реЗ рдХреЙрдкреА рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдПрдХ рд╣реА рдореЙрдбреНрдпреВрд▓ рд╕реЗ, рдЖрдк рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлреА рд╕реЗ рдЬреБрдбрд╝реЗ рд╕реНрдерд┐рд░рд╛рдВрдХ рдФрд░ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдЙрдкрд╕реНрдерд┐рддрд┐ рдмрд╛рд╣рд░реА рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рдЬреАрд╡рди рдХреЛ рд╣рдореЗрд╢рд╛ рдЖрд╕рд╛рди рдмрдирд╛рддреА рд╣реИред
рдФрд░ рдлрд┐рд░ рд╣рдо рд╕реНрдЯреЗрдЯрд┐рдХ рдХреНрд▓рд╛рд╕ "UCryptoAPI" рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬреЛ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рджреЛ рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреА рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛:
internal static bool CertCloseStore(IntPtr _hCertStore, uint _iFlags) { if (fIsLinux) return LCryptoAPI.CertCloseStore(_hCertStore, _iFlags); else return WCryptoAPI.CertCloseStore(_hCertStore, _iFlags); } public static bool fIsLinux { get { int iPlatform = (int) Environment.OSVersion.Platform; return (iPlatform == 4) || (iPlatform == 6) || (iPlatform == 128); } }
рдЗрд╕ рдкреНрд░рдХрд╛рд░, UCryptoAPI рд╡рд░реНрдЧ рдХреЗ рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рджреЛрдиреЛрдВ рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд▓рдЧрднрдЧ рд╕рдорд╛рди рдХреЛрдб рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдЦреЛрдЬ
рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлреА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдЖрдорддреМрд░ рдкрд░ рдПрдХ рд╕рд░реНрдЯрд┐рдлрд┐рдХреЗрдЯ рдЦреЛрдЬ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП crypt32.dll рдореЗрдВ рджреЛ рд╕рд░реНрдЯрд┐рдлрд┐рдХреЗрд╢рди рд╕реНрдЯреЛрд░ рд╣реИрдВ (рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рд╕реНрдЯреЛрд░ рдЦреЛрд▓рддрд╛ рд╣реИ) рдФрд░ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╕рд░реНрдЯрд┐рдлрд┐рдХреЗрд╢рди рд╕рд┐рд╕реНрдЯрдо (рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдЦреЛрд▓рддрд╛ рд╣реИ)ред рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд┐ рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рдорд╛рдг рдкрддреНрд░ рддрдХ рд╕реАрдорд┐рдд рдирд╣реАрдВ рд╣реИ, рд╣рдо рдкрд╣рд▓реЗ рдПрдХ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ:
рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдЦреЛрдЬ public static int FindCertificateCP(string _pFindValue, out X509Certificate2 _pCert, ref string _sError, StoreLocation _pLocation = StoreLocation.CurrentUser, StoreName _pName = StoreName.My, X509FindType _pFindType = X509FindType.FindByThumbprint, bool _fVerify = false) { _pCert = null; IntPtr hCert = IntPtr.Zero; GCHandle hInternal = new GCHandle(); GCHandle hFull = new GCHandle(); IntPtr hSysStore = IntPtr.Zero; try {
рдЦреЛрдЬ рдХрдИ рдЪрд░рдгреЛрдВ рдореЗрдВ рд╣реЛрддреА рд╣реИ:
- рднрдВрдбрд╛рд░рдг рдЦреЛрд▓рдиреЗ;
- рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдЧрдарди рдЬрд┐рд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рд╣рдо рдЦреЛрдЬ рд░рд╣реЗ рд╣реИрдВ;
- рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдЦреЛрдЬ;
- рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рд╕рддреНрдпрд╛рдкрди (рдПрдХ рдЕрд▓рдЧ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рд╡рд░реНрдгрд┐рдд);
- рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЛ рдмрдВрдж рдХрд░рдирд╛ рдФрд░ рдмрд┐рдВрджреБ 2 рд╕реЗ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдЬрд╛рд░реА рдХрд░рдирд╛ (рдЪреВрдВрдХрд┐ рд╣рд░ рдЬрдЧрд╣ рдЕрдкреНрд░рдмрдВрдзрд┐рддред рдиреЗрдЯ рдореЗрдореЛрд░реА рдХреЗ рд╕рд╛рде рдХрд╛рдо рд╣реЛрддрд╛ рд╣реИ, рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЗрд╕реЗ рд╕рд╛рдл рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛);
рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдХреА рдЦреЛрдЬ рдХрд░рддреЗ рд╕рдордп рдХреБрдЫ рд╕реВрдХреНрд╖реНрдо рдмрд┐рдВрджреБ рд╣реЛрддреЗ рд╣реИрдВред
рд▓рд┐рдирдХреНрд╕ рдкрд░ CryptoPro ANSI рддрд╛рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдФрд░ UTF8 рдХреЗ рд╕рд╛рде рд╡рд┐рдВрдбреЛрдЬ рдкрд░, рдЗрд╕рд▓рд┐рдП:
- рдЬрдм рд▓рд┐рдирдХреНрд╕ рдореЗрдВ рд╕реНрдЯреЛрд░реЗрдЬ рдЦреЛрд▓рдиреЗ рдХреА рд╡рд┐рдзрд┐ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдорд╛рд░реНрд╢рд▓рд┐рдВрдЧ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ [рдореЗрдВ, рдорд╛рд░реНрд╢рд▓ рдХреЛрдб (UnmanagedType.LPStr)] рднрдВрдбрд╛рд░рдг рдХреЛрдб рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд▓рд┐рдП;
- рдЦреЛрдЬ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдкрд╛рд╕ рдХрд░рдирд╛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд┐рд╖рдп рдХреЗ рдирд╛рдо рд╕реЗ) рдЗрд╕реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рд╡рд╛рд▓реЗ рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рд╕реЗрдЯ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП;
- рд╕рднреА рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлрд╝рд┐рдХ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЗ рд▓рд┐рдП рдЬрд┐рдирдХреЗ рдкрд╛рд╕ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рдкреНрд░рдХрд╛рд░ рд╕реЗ рднрд┐рдиреНрдирддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Windows рдореЗрдВ CERT_FIND_SUBJECT_STR_A рдФрд░ CERT_FIND_SUBJECT_STR_W), рдЖрдкрдХреЛ * WW рдХрд╛ рдЪрдпрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рд▓рд┐рдирдХреНрд╕ рдореЗрдВ * _A;
MapX509StoreFlags рд╡рд┐рдзрд┐ рдХреЛ Microsoft рд╕реНрд░реЛрддреЛрдВ рд╕реЗ рд╕реАрдзреЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рдмрд┐рдирд╛ рд▓рд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣ рдХреЗрд╡рд▓ .Net рдЭрдВрдбреЗ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рдЕрдВрддрд┐рдо рдореБрдЦреМрдЯрд╛ рдмрдирд╛рддрд╛ рд╣реИред
рд╡рд╣ рдорд╛рди рдЬрд┐рд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдЦреЛрдЬ рд╣реЛрддреА рд╣реИ, рдЦреЛрдЬ рдХреЗ рдкреНрд░рдХрд╛рд░ ( рд╕рд░реНрдЯрд┐рдлрд┐рдХреЗрдЯ рдХреЗ рд▓рд┐рдП MSDN рдХреЗ рд╕рд╛рде рдЬрд╛рдВрдЪ) рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рд╛рд░реВрдк (рдирд╛рдо рд╡рд┐рд╖рдп, рдЬрд╛рд░реАрдХрд░реНрддрд╛, рдЖрджрд┐) рдФрд░ рдмрд╛рдЗрдирд░реА (рдлрд┐рдВрдЧрд░рдкреНрд░рд┐рдВрдЯ, рд╕реАрд░рд┐рдпрд▓ рдирдВрдмрд░) рдХреЗ рд▓рд┐рдП рджреЛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рджрд┐рдЦрд╛рддрд╛ рд╣реИред
Windows рдФрд░ Linux рдкрд░ IntPtr рд╕реЗ рдПрдХ рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдмрдирд╛рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдмрд╣реБрдд рдЕрд▓рдЧ рд╣реИред Windows рдПрдХ рд╕рд░рд▓ рддрд░реАрдХреЗ рд╕реЗ рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдмрдирд╛рдПрдЧрд╛:
new X509Certificate2(hCert);
рд▓рд┐рдирдХреНрд╕ рдкрд░, рдЖрдкрдХреЛ рджреЛ рдЪрд░рдгреЛрдВ рдореЗрдВ рдПрдХ рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛:
X509Certificate2(new X509Certificate(hCert));
рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рд╣рдореЗрдВ рдХрд╛рдо рдХреЗ рд▓рд┐рдП hCert рддрдХ рдкрд╣реБрдВрдЪ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕реЗ рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд╡рд┐рдВрдбреЛрдЬ рдкрд░, рдмрд╛рдж рдореЗрдВ рдЗрд╕реЗ рд╣реИрдВрдбрд▓ рдкреНрд░реЙрдкрд░реНрдЯреА рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд▓рд┐рдирдХреНрд╕ CERT_CONTEXT рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ hCert рд▓рд┐рдВрдХ рдХреЛ x509_st (OpenSSL) рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдВрдХ рдореЗрдВ рдЕрдиреБрд╕рд░рдг рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рд╣реИрдВрдбрд▓ рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдпрд╣ X509Certificate2 (ISDP_X509Cert рдЙрджрд╛рд╣рд░рдг рдореЗрдВ) рд╕реЗ рдПрдХ рдЗрдирд╣реЗрд░реАрдЯрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ, рдЬреЛ рдПрдХ рдЕрд▓рдЧ рдХреНрд╖реЗрддреНрд░ рдкрд░ рджреЛрдиреЛрдВ рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдореЗрдВ hCert рд╕реНрдЯреЛрд░ рдХрд░реЗрдЧрд╛ред
рдпрд╣ рдордд рднреВрд▓реЛ рдХрд┐ рдпрд╣ рдЕрдкреНрд░рдмрдВрдзрд┐рдд рд╕реНрдореГрддрд┐ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдХрд╛ рдПрдХ рд▓рд┐рдВрдХ рд╣реИ рдФрд░ рдЗрд╕реЗ рдХрд╛рдо рдХреЗ рдЕрдВрдд рдХреЗ рдмрд╛рдж рдореБрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдХреНрдпреЛрдВрдХрд┐ .Net рдореЗрдВ 4.5 X509Certificate2 рдбрд┐рд╕реНрдкреЛрдЬреЗрдмрд▓ рдирд╣реАрдВ рд╣реИ - рд╕рд░реНрдЯрд┐рдлрд┐рдХреЗрдЯреНрд░реА рд╕рд░реНрдЯрд┐рдлрд┐рдХреЗрдЯ рдХреЙрдиреНрдЯреЗрдХреНрд╕реНрдЯ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдлрд╛рдИ рдХреЛ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд╛ рдЧрдарди
GOST рдкреНрд░рдорд╛рдгрдкрддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп, рдПрдХ рд╣рд╕реНрддрд╛рдХреНрд╖рд░рдХрд░реНрддрд╛ рдХреЗ рд╕рд╛рде рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ рдХрд┐рдП рдЧрдП рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд▓рдЧрднрдЧ рд╣рдореЗрд╢рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдХрд╛рдлреА рд╕рд░рд▓ рдХреЛрдб рдмреНрд▓реЙрдХ рдЖрд╡рд╢реНрдпрдХ рд╣реИ:
рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд╛ рдЧрдарди public static int SignDataCP(byte[] _arData, X509Certificate2 _pCert, out byte[] _arRes, ref string _sError) { _arRes = new byte[0];
рд╡рд┐рдзрд┐ рдХреЗ рдХрд╛рдо рдХреЗ рджреМрд░рд╛рди, рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдмрдирддреА рд╣реИ рдФрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд░рдиреЗ рдХреА рд╡рд┐рдзрд┐ рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдкреИрд░рд╛рдореАрдЯрд░ рд╕рдВрд░рдЪрдирд╛ рдЖрдкрдХреЛ рдПрдХ рдкреВрд░реНрдг рд╢реНрд░реГрдВрдЦрд▓рд╛ (cMsgCert рдФрд░ rgpMsgCert рдлрд╝реАрд▓реНрдб, рдкрд╣рд▓рд╛ рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдХреА рд╕рдВрдЦреНрдпрд╛, рдЗрди рдкреНрд░рдорд╛рдгрдкрддреНрд░реЛрдВ рдХреА рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреА рд▓рд┐рдВрдХ рдХреА рджреВрд╕рд░реА рд╕реВрдЪреА) рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдореЗрдВ рдкреНрд░рдорд╛рдг рдкрддреНрд░ рд╕рд╣реЗрдЬрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗ рд╕рдХрддреА рд╣реИред
рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд░рдиреЗ рдХреА рд╡рд┐рдзрд┐ рдПрдХ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╛рде рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдпрд╛ рдЕрдзрд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреА рд╣реИред рдпрд╣, рд╡реИрд╕реЗ, рд╕рдВрдШреАрдп рдХрд╛рдиреВрди 63 рдХрд╛ рдЦрдВрдбрди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдХрдИ рдмрд╛рд░ "рд╕рд╛рдЗрди" рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЦреБрд╢ рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИред
рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреА рдореБрдЦреНрдп рд╡рд┐рд╖рдорддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рджреЛ-рдХреЙрд▓ рдореЛрдб рдореЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИ рдЬреЛ рд╕реНрдореГрддрд┐ рдХреЗ рдмрдбрд╝реЗ рдмреНрд▓реЙрдХреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ (рдкрд╣рд▓реЗ рдЕрд╢рдХреНрдд - рдЖрд╡рд╢реНрдпрдХ рдмрдлрд░ рд▓рдВрдмрд╛рдИ рджреЗрддрд╛ рд╣реИ, рджреВрд╕рд░рд╛ рдмрдлрд░ рдХреЛ рднрд░рддрд╛ рд╣реИ)ред рдЗрд╕рд▓рд┐рдП, рдПрдХ рдмрдбрд╝рд╛ рдмрдлрд░ рдмрдирд╛рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рдЗрд╕рдХреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд▓рдВрдмрд╛рдИ рддрдХ рдЫреЛрдЯрд╛ рдХрд░ рджреЗрдВред
рдПрдХрдорд╛рддреНрд░ рдЧрдВрднреАрд░ рд╕рдорд╕реНрдпрд╛ рд╣реИрд╢ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо (рдбрд╛рдЗрдЬреЗрд╕реНрдЯ) рдХреЗ рдУрдЖрдИрдбреА рдХреА рдЦреЛрдЬ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд░рддреЗ рд╕рдордп рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рд╕реНрдкрд╖реНрдЯ рд░реВрдк рдореЗрдВ рдпрд╣ рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдореЗрдВ рдирд╣реАрдВ рд╣реИ (рдХреЗрд╡рд▓ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд╛ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╣реИ)ред рдФрд░ рдЕрдЧрд░ рд╡рд┐рдВрдбреЛрдЬ рдкрд░ рдЖрдк рдЗрд╕реЗ рдПрдХ рдЦрд╛рд▓реА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рдпрд╣ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЙрдард╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рд▓рд┐рдирдХреНрд╕ рдкрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд░рдиреЗ рд╕реЗ рдЗрдВрдХрд╛рд░ рдХрд░ рджреЗрдЧрд╛ рдпрджрд┐ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╕рдорд╛рди рдирд╣реАрдВ рд╣реИред
рд▓реЗрдХрд┐рди рдПрдХ рдЪрд╛рд▓ рд╣реИ - рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо (рд╕рдВрд░рдЪрдирд╛ CRYPT_OID_INFO) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдореЗрдВ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ OID pszOID рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИ, рдФрд░ рд╣реИрд╢ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ Algid рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИред рдФрд░ Algid рдХреЛ OID рдореЗрдВ рдмрджрд▓рдирд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рддрдХрдиреАрдХреА рдорд╛рдорд▓рд╛ рд╣реИ:
рд╣реИрд╢ рдПрд▓реНрдЧреЛрд░рд┐рдердо рдХрд╛ рдУрдЖрдИрдбреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ internal static int GetHashAlgoritmOID(IntPtr _hCertHandle, out string _sOID, ref string _sError) { _sOID = ""; IntPtr hHashAlgInfo = IntPtr.Zero; IntPtr hData = IntPtr.Zero; try { CERT_CONTEXT pContext = (CERT_CONTEXT)Marshal.PtrToStructure(_hCertHandle, typeof(CERT_CONTEXT)); CERT_INFO pCertInfo = (CERT_INFO)Marshal.PtrToStructure(pContext.pCertInfo, typeof(CERT_INFO));
рдХреЛрдб рдХреЛ рдзреНрдпрд╛рди рд╕реЗ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рдЖрд╢реНрдЪрд░реНрдпрдЪрдХрд┐рдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рд╕рд░рд▓ рддрд░реАрдХреЗ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (CertOIDToAlgId) рдФрд░ рдЗрд╕рдореЗрдВ рдореМрдЬреВрдж OID рдЬрдЯрд┐рд▓ рд╣реИ (CryptFindOIDInfo)ред рдпрд╣ рдЬрдЯрд┐рд▓ рдпрд╛ рджреЛрдиреЛрдВ рд╕рд░рд▓ рддрд░реАрдХреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдорд╛рдиреНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрд░реНрдХрд╕рдВрдЧрдд рд╣реЛрдЧрд╛, рдФрд░ рд▓рд┐рдирдХреНрд╕ рдореЗрдВ рджреЛрдиреЛрдВ рд╡рд┐рдХрд▓реНрдк рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╡рд┐рдВрдбреЛрдЬ рдкрд░, рдПрдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдФрд░ рдХреЗрд╡рд▓ рдПрдХ рдУрдЖрдИрдбреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдореБрд╢реНрдХрд┐рд▓ рд╡рд┐рдХрд▓реНрдк рдЕрд╕реНрдерд┐рд░ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдЕрдЬреАрдм рд╕рдВрдХрд░ рдПрдХ рд╕реНрдерд┐рд░ рд╕рдорд╛рдзрд╛рди рд╣реЛрдЧрд╛ред
рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд╛ рд╕рддреНрдпрд╛рдкрди
рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд╛ рд╕рддреНрдпрд╛рдкрди рджреЛ рдЪрд░рдгреЛрдВ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ, рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╕реНрд╡рдпрдВ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЬрд┐рд╕ рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдХреЗ рд╕рд╛рде рдпрд╣ рд╕реГрдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд╡рд╣ рд╣реИ (рд╢реНрд░реГрдВрдЦрд▓рд╛, рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреА рддрд╛рд░реАрдЦ рдЖрджрд┐)ред
рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд░рддреЗ рд╕рдордп, рд╕рд╛рде рд╣реА, рдЖрдкрдХреЛ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдбреЗрдЯрд╛ рдХреЗ рд╕реЗрдЯ, рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдФрд░ рд╕реНрд╡рдпрдВ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд╛ рд╕рддреНрдпрд╛рдкрди internal static CRYPT_VERIFY_MESSAGE_PARA GetStdSignVerifyPar() { CRYPT_VERIFY_MESSAGE_PARA pVerifyParams = new CRYPT_VERIFY_MESSAGE_PARA(); pVerifyParams.cbSize = (int)Marshal.SizeOf(pVerifyParams); pVerifyParams.dwMsgEncodingType = UCConsts.PKCS_7_OR_X509_ASN_ENCODING; pVerifyParams.hCryptProv = 0; pVerifyParams.pfnGetSignerCertificate = IntPtr.Zero; pVerifyParams.pvGetArg = IntPtr.Zero; return pVerifyParams; } public static int CheckSignCP(byte[] _arData, byte[] _pSign, out X509Certificate2 _pCert, ref string _sError, bool _fVerifyOnlySign = true, X509RevocationMode _pRevMode = X509RevocationMode.Online, X509RevocationFlag _pRevFlag = X509RevocationFlag.ExcludeRoot){ _pCert = null; IntPtr pHData = Marshal.AllocHGlobal(_arData.Length); GCHandle pCertContext = GCHandle.Alloc(IntPtr.Zero, GCHandleType.Pinned); try { Marshal.Copy(_arData, 0, pHData, _arData.Length); CRYPT_VERIFY_MESSAGE_PARA pVerParam = UCUtils.GetStdSignVerifyPar();
рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдмрдирд╛рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдПрдХ рдЕрд▓рдЧ рд╡рд┐рдзрд┐ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (GetStdSignVerifyPar)ред рдЙрд╕рдХреЗ рдмрд╛рдж, рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╕реНрд╡рдпрдВ рдЬрд╛рдВрдЪреЗ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдкрд╣рд▓реЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░рдХрд░реНрддрд╛ рдХреЛ рдирд┐рдХрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЕрдЪреНрдЫреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕рднреА рдХреЛ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдХрдИ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдпреБрдХреНрдд рдПрдХ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдЕрднреА рднреА рд╡рд┐рджреЗрд╢реА рд╣реИ)ред
рд╣рд╕реНрддрд╛рдХреНрд╖рд░рдХрд░реНрддрд╛ рдХрд╛ рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдЗрд╕реЗ рдЕрдкрдиреА рдХрдХреНрд╖рд╛ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЗрд╕реЗ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░реЗрдВрдЧреЗ (рдпрджрд┐ рд╡рд┐рдзрд┐ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ)ред рд╕рддреНрдпрд╛рдкрди рдХреЗ рд▓рд┐рдП, рдкрд╣рд▓реЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░рдХрд░реНрддрд╛ рдХреА рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рддрд┐рдерд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╕реЗ рдЬрд╛рдирдХрд╛рд░реА рдирд┐рдХрд╛рд▓рдиреЗ рдкрд░ рдЕрдиреБрднрд╛рдЧ, рдФрд░ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рд╕рддреНрдпрд╛рдкрди рдкрд░ рдЕрдиреБрднрд╛рдЧ рджреЗрдЦреЗрдВ)ред
рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдЬрд╛рдирдХрд╛рд░реА рдирд┐рдХрд╛рд▓реЗрдВ
рдЕрдХреНрд╕рд░, рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлрд┐рдХ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рдПрдХ рдореБрджреНрд░рд┐рдд рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдЕрд▓рдЧ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдПрдХ рд╡рд░реНрдЧ рдмрдирд╛рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд░реВрдк рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрдЧреА рдФрд░ рдЗрд╕рдХреА рд╕рд╣рд╛рдпрддрд╛ рд╕реЗ, рдПрдХ рдореБрджреНрд░рд┐рдд рдкреНрд░рд╕реНрддреБрддрд┐ рдкреНрд░рджрд╛рди рдХрд░реЗрдВред .Net рдореЗрдВ рдРрд╕реА рдПрдХ рдХрдХреНрд╖рд╛ рд╣реИ - рд╕рд╛рдЗрдирдбреЗрдХрдореНрд╕, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХреНрд░рд┐рдЯреЗрд░реЛ рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рд╕рд╛рде рдореЛрдиреЛ рдореЗрдВ рдЗрд╕рдХрд╛ рдПрдирд╛рд▓реЙрдЧ рдкрд╣рд▓реЗ рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рд╕реЗ рдЗрдирдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рджреВрд╕рд░реЗ рдореЗрдВ рдЗрд╕рдореЗрдВ рдореБрд╣рд░рдмрдВрдж рд╕рдВрд╢реЛрдзрдХ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рддреАрд╕рд░реЗ рдореЗрдВ рдЗрд╕рдХреЗ рд▓рдЧрднрдЧ рд╕рднреА рдЧреБрдг рд▓рд┐рдЦрдиреЗ-рд╕рдВрд░рдХреНрд╖рд┐рдд рд╣реЛрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рдПрдирд╛рд▓реЙрдЧ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ред
рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдореЗрдВ рджреЛ рдореБрдЦреНрдп рддрддреНрд╡ рд╣реЛрддреЗ рд╣реИрдВ - рдкреНрд░рдорд╛рдгрдкрддреНрд░реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдФрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░рдХрд░реНрддрд╛рдУрдВ рдХреА рдПрдХ рд╕реВрдЪреАред рдкреНрд░рдорд╛рдгрдкрддреНрд░реЛрдВ рдХреА рд╕реВрдЪреА рдЦрд╛рд▓реА рд╣реЛ рд╕рдХрддреА рд╣реИ, рдпрд╛ рдЗрд╕рдореЗрдВ рд╕рддреНрдпрд╛рдкрди рдХреЗ рд▓рд┐рдП рд╕рднреА рдкреНрд░рдорд╛рдгрдкрддреНрд░ рд╢рд╛рдорд┐рд▓ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдкреВрд░реА рд╢реНрд░реГрдВрдЦрд▓рд╛рдПрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рд╣рд╕реНрддрд╛рдХреНрд╖рд░рдХрд░реНрддрд╛рдУрдВ рдХреА рд╕реВрдЪреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╣рд╕реНрддрд╛рдХреНрд╖рд░реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддреА рд╣реИред рдЙрдирдХреЗ рдмреАрдЪ рд╕рдВрдЪрд╛рд░ рдХреНрд░рдо рд╕рдВрдЦреНрдпрд╛ рдФрд░ рдкреНрд░рдХрд╛рд╢рдХ (рдЬрд╛рд░реАрдХрд░реНрддрд╛) рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ, рдПрдХ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдореЗрдВ рдПрдХ рд╣реА рд╕реАрд░рд┐рдпрд▓ рдирдВрдмрд░ рдХреЗ рд╕рд╛рде рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд╢рдХреЛрдВ рд╕реЗ рджреЛ рдкреНрд░рдорд╛рдг рдкрддреНрд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдпрд╣ рдХреЗрд╡рд▓ рд╕реАрд░рд┐рдпрд▓ рдирдВрдмрд░ рджреНрд╡рд╛рд░рд╛ рдЙрдкреЗрдХреНрд╖рд┐рдд рдФрд░ рдЦреЛрдЬрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдкрдврд╝рдирд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдЬрд╛рдирдХрд╛рд░реА рдирд┐рдХрд╛рд▓реЗрдВ public int Decode(byte[] _arSign, ref string _sError) { IntPtr hMsg = IntPtr.Zero;
рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЛ рдХрдИ рдЪрд░рдгреЛрдВ рдореЗрдВ рдкрд╛рд░реНрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдкрд╣рд▓реЗ рд╕рдВрджреЗрд╢ рд╕рдВрд░рдЪрдирд╛ (CryptMsgOpenToDecode) рдмрдирддреА рд╣реИ, рдлрд┐рд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдбреЗрдЯрд╛ (CryptMsgUpdate) рдЙрд╕рдореЗрдВ рджрд░реНрдЬ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╣реИ рдФрд░ рдкрд╣рд▓реЗ рдкреНрд░рдорд╛рдгрдкрддреНрд░реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ, рдФрд░ рдлрд┐рд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░рдХрд░реНрддрд╛рдУрдВ рдХреА рдПрдХ рд╕реВрдЪреАред рдкреНрд░рдорд╛рдгрдкрддреНрд░реЛрдВ рдХреА рд╕реВрдЪреА рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХреА рдЬрд╛рддреА рд╣реИ:
рдкреНрд░рдорд╛рдг рдкрддреНрд░реЛрдВ рдХреА рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ internal static X509Certificate2Collection GetSignCertificates(IntPtr _hMsg) { X509Certificate2Collection certificates = new X509Certificate2Collection(); uint iCnt = GetCryptMsgParam<uint>(_hMsg, UCConsts.CMSG_CERT_COUNT_PARAM); for (int i = 0; i < iCnt; i++) { IntPtr hInfo = IntPtr.Zero; IntPtr hCert = IntPtr.Zero; try { uint iLen = 0; if (!GetCryptMsgParam(_hMsg, UCConsts.CMSG_CERT_PARAM, out hInfo, out iLen)) continue; hCert = UCryptoAPI.CertCreateCertificateContext(UCConsts.PKCS_7_OR_X509_ASN_ENCODING, hInfo, iLen); if (hCert != IntPtr.Zero) { certificates.Add(new ISDP_X509Cert(hCert)); hCert = IntPtr.Zero; } } finally { if (hInfo != IntPtr.Zero) Marshal.FreeHGlobal(hInfo); if (hInfo != IntPtr.Zero) Marshal.FreeHGlobal(hCert); } } return certificates; }
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдХреА рд╕рдВрдЦреНрдпрд╛ CMSG_CERT_COUNT_PARAM рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ, рдФрд░ рдлрд┐рд░ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХреА рдЬрд╛рддреА рд╣реИред рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдХреЗ рд╕рдВрджрд░реНрдн рдХреЛ рдмрдирд╛рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдФрд░ рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╣реА рдирд┐рд░реНрдорд╛рдг рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИред
рд╣рд╕реНрддрд╛рдХреНрд╖рд░рдХрд░реНрддрд╛ рдбреЗрдЯрд╛ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЕрдзрд┐рдХ рдХрдард┐рди рд╣реИред рдЙрдирдореЗрдВ рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдХрд╛ рд╕рдВрдХреЗрдд рдФрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╢рд╛рдорд┐рд▓ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд░рдиреЗ рдХреА рддрд╛рд░реАрдЦ)ред рдбреЗрдЯрд╛ рдирд┐рд╖реНрдХрд░реНрд╖рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
рд╣рд╕реНрддрд╛рдХреНрд╖рд░рдХрд░реНрддрд╛ рдЬрд╛рдирдХрд╛рд░реА рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ public int Decode(IntPtr _hMsg, int _iIndex, ISDPSignedCms _pSignedCms, ref string _sError) {
, CMSG_SIGNER_INFO. . , .
, тАФ ( , ).
internal static CryptographicAttributeObjectCollection ReadCryptoAttrsCollection(CRYPT_ATTRIBUTES _pAttrs) { CryptographicAttributeObjectCollection pRes = new CryptographicAttributeObjectCollection(); for (int i = 0; i < _pAttrs.cAttr; i++) { IntPtr hAttr = new IntPtr((long)_pAttrs.rgAttr + (i * Marshal.SizeOf(typeof(CRYPT_ATTRIBUTE)))); CRYPT_ATTRIBUTE pAttr = (CRYPT_ATTRIBUTE) Marshal.PtrToStructure(hAttr, typeof(CRYPT_ATTRIBUTE)); CryptographicAttributeObject pAttrInfo = new CryptographicAttributeObject(new Oid(pAttr.pszObjId), GetAsnEncodedDataCollection(pAttr)); pRes.Add(pAttrInfo); } return pRes; }
Oid тАУ ( ASN.1). :
internal static Pkcs9AttributeObject Pkcs9AttributeFromOID(string _sName) { switch (_sName) { case UCConsts.S_SIGN_DATE_OID : return new Pkcs9SigningTime();
Pkcs9AttributeObject. , mono . Mono .
тАФ тАФ SignedCms, .
, , . (, , ).
public static int EncryptDataCP(byte[] _arInput, X509Certificate2 _pCert, out byte[] _arRes, ref string _sError) { _arRes = new byte[0]; try {
тАФ , . , , .
, , .
. , ( ). :
internal static int GetEncodeAlgoritmOID(IntPtr _hCertHandle, out string _sOID, ref string _sError) { bool fNeedRelease = false; _sOID = ""; uint iKeySpec = 0; IntPtr hCrypto = IntPtr.Zero; try {
. ( , , , .), . (UCConsts.CRYPT_ENCRYPT_ALG_OID_GROUP_ID). тАФ .
( ).
, , . . тАФ , :
public static int DecryptDataCP(byte[] _arInput, out X509Certificate2 _pCert, out byte[] _arRes, ref string _sError) { _arRes = new byte[0]; _pCert = null; IntPtr hSysStore = UCryptoAPI.CertOpenSystemStore(IntPtr.Zero, UCConsts.AR_CRYPTO_STORE_NAME[(int)StoreName.My]); GCHandle GC = GCHandle.Alloc(hSysStore, GCHandleType.Pinned); IntPtr hOutCertL = IntPtr.Zero; IntPtr hOutCert = IntPtr.Zero; try {
, . , ( Linux ).
, , , , . , . :
- ( , , . .);
- тАФ ;
- тАФ ;
- , , (CRL);
, .
рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реНрдкрд╖реНрдЯ рд╣реИ, рд╡реИрдзрддрд╛ рдХреЗ рд▓рд┐рдП рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдХрдард┐рди рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдЖрдЗрдЯрдо рдХреЛ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░реЗ рддрд░реАрдХреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо X509Certificate2.Verify () рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП .Net рд╕реНрд░реЛрддреЛрдВ рдХреА рдУрд░ рд░реБрдЦ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддреЗ рд╣реИрдВред
рд╕рддреНрдпрд╛рдкрди рдореЗрдВ рджреЛ рдЪрд░рдг рд╣реЛрддреЗ рд╣реИрдВ:- рдореВрд▓ рдХреЗ рдареАрдХ рдиреАрдЪреЗ рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдмрдирд╛рдПрдВ;
- рдЗрд╕рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ (рдирд┐рд░рд╕реНрддреАрдХрд░рдг, рд╕рдордп рдЖрджрд┐ рдХреЗ рд▓рд┐рдП);
рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рддреНрдпрд╛рдкрди рдХреЛ рд╡рд░реНрддрдорд╛рди рддрд┐рдерд┐ рдкрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдФрд░ рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреА рддрд╛рд░реАрдЦ рдкрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рд╕рддреНрдпрд╛рдкрди рдХреЗ рд╕рдордпред рд╕рддреНрдпрд╛рдкрди рд╡рд┐рдзрд┐ рд╕реНрд╡рдпрдВ рдЫреЛрдЯреА рд╣реИ:
рдкреНрд░рдорд╛рдгрдкрддреНрд░ рд╕рддреНрдпрд╛рдкрди internal static int VerifyCertificate (IntPtr _hCert, X509RevocationMode _iRevMode, X509RevocationFlag _iRevFlag, DateTime _rOnDate, TimeSpan _iCTLTimeout, IntPtr _hPolicy, ref string _sError) { if (_hCert == IntPtr.Zero) { _sError = UCConsts.S_CRYPTO_CERT_CHECK_ERR; return UConsts.E_NO_CERTIFICATE; } CERT_CHAIN_POLICY_PARA pPolicyParam = new CERT_CHAIN_POLICY_PARA(Marshal.SizeOf(typeof(CERT_CHAIN_POLICY_PARA))); CERT_CHAIN_POLICY_STATUS pPolicyStatus = new CERT_CHAIN_POLICY_STATUS(Marshal.SizeOf(typeof(CERT_CHAIN_POLICY_STATUS)));
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, BuildChain рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИ, рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рдЪреЗрдХ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╢реНрд░реГрдВрдЦрд▓рд╛ рдирд┐рд░реНрдорд╛рдг рдХреЗ рджреМрд░рд╛рди, рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рд╕рдВрд░рдЪрдирд╛, рд╕рддреНрдпрд╛рдкрди рдХреА рддрд╛рд░реАрдЦ рдФрд░ рдЪреЗрдХ рдЭрдВрдбреЗ рдмрдирддреЗ рд╣реИрдВ:
internal static int BuildChain (IntPtr _hChainEngine, IntPtr _hCert, X509RevocationMode _iRevMode, X509RevocationFlag _iRevFlag, DateTime _rOnDate, TimeSpan _rCTLTimeOut, ref IntPtr _hChain, ref string _sError) {
, Microsoft. hCertPolicy hAppPolicy OID-, , . , , .
(, ).
MapRevocationFlags тАФ .Net тАФ uint .
рдирд┐рд╖реНрдХрд░реНрд╖
:
- 10 ;
- ;
- byte[] {1, 2, 3, 4, 5};
- ;
- ;
- byte[] {1, 2, 3, 4, 5};
- ;
Windows Linux 1-, 10- 50- , Linux . Linux - - ( , ), ┬л┬╗ . (deadlock-) ( ┬лAccess Violation┬╗).
UCryptoAPI . fpCPSection object :
private static object fpCPSection = new object(); internal static bool CryptMsgClose(IntPtr _hCryptMsg) { lock (pCPSection) { if (fIsLinux) return LCryptoAPI.CryptMsgClose(_hCryptMsg); else return WCryptoAPI.CryptMsgClose(_hCryptMsg); } } public static object pCPSection { get { return fpCPSection;} }
, Linux- .
mono Issuer Subject . , , mono X500DistinguishedName . , mono ( ), (impl.issuerName impl.subjectName). (Reflection) X500DistinguishedName, CERT_CONTEXT .
рд╕рдВрджрд░реНрдн
- CAPILite
- c #
- .Net:
- CAPIBase
- X509Certificate2
- SignedCMS
- SignerInfo
- mono:
- X509Certificate2
- X509CertificateImplBtls