CryptoPro рдХреЛ рдореЛрдиреЛ рд╕реЗ рдЬреЛрдбрд╝рдирд╛

рд▓рд┐рдирдХреНрд╕ рдореЗрдВ рд╕рдВрдХреНрд░рдордг рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ, 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" рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬреЛ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рджреЛ рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреА рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛:


 /**<summary> </summary> * <param name="_iFlags"> (  0)</param> * <param name="_hCertStore">   </param> * <returns>   </returns> * **/ internal static bool CertCloseStore(IntPtr _hCertStore, uint _iFlags) { if (fIsLinux) return LCryptoAPI.CertCloseStore(_hCertStore, _iFlags); else return WCryptoAPI.CertCloseStore(_hCertStore, _iFlags); } /**<summary>  </summary>**/ public static bool fIsLinux { get { int iPlatform = (int) Environment.OSVersion.Platform; return (iPlatform == 4) || (iPlatform == 6) || (iPlatform == 128); } } 

рдЗрд╕ рдкреНрд░рдХрд╛рд░, UCryptoAPI рд╡рд░реНрдЧ рдХреЗ рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рджреЛрдиреЛрдВ рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд▓рдЧрднрдЧ рд╕рдорд╛рди рдХреЛрдб рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдЦреЛрдЬ


рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлреА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдЖрдорддреМрд░ рдкрд░ рдПрдХ рд╕рд░реНрдЯрд┐рдлрд┐рдХреЗрдЯ рдЦреЛрдЬ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП crypt32.dll рдореЗрдВ рджреЛ рд╕рд░реНрдЯрд┐рдлрд┐рдХреЗрд╢рди рд╕реНрдЯреЛрд░ рд╣реИрдВ (рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рд╕реНрдЯреЛрд░ рдЦреЛрд▓рддрд╛ рд╣реИ) рдФрд░ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╕рд░реНрдЯрд┐рдлрд┐рдХреЗрд╢рди рд╕рд┐рд╕реНрдЯрдо (рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдЦреЛрд▓рддрд╛ рд╣реИ)ред рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд┐ рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рдорд╛рдг рдкрддреНрд░ рддрдХ рд╕реАрдорд┐рдд рдирд╣реАрдВ рд╣реИ, рд╣рдо рдкрд╣рд▓реЗ рдПрдХ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ:


рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдЦреЛрдЬ
 /**<summary>  (   )</summary> * <param name="_pFindType"> </param> * <param name="_pFindValue"> </param> * <param name="_pLocation"> </param> * <param name="_pName"> </param> * <param name="_pCert"> </param> * <param name="_sError">   </param> * <param name="_fVerify"> </param> * <returns>  ,  UConsts.S_OK   </returns> * **/ 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 { // 0)   hSysStore = UCryptoAPI.CertOpenStore(UCConsts.AR_CERT_STORE_PROV_SYSTEM[fIsLinux.ToByte()], UCConsts.PKCS_7_OR_X509_ASN_ENCODING, IntPtr.Zero, UCUtils.MapX509StoreFlags(_pLocation, OpenFlags.ReadOnly), UCConsts.AR_CRYPTO_STORE_NAME[(int)_pName]); if (hSysStore == IntPtr.Zero) { _sError = UCConsts.S_ERR_STORE_OPEN.Frm(Marshal.GetLastWin32Error()); return UConsts.E_CRYPTO_ERR; } // 1)     if ((_pFindType == X509FindType.FindByThumbprint) || (_pFindType == X509FindType.FindBySerialNumber)) { byte[] arData = _pFindValue.FromHex(); CRYPTOAPI_BLOB cryptBlob; cryptBlob.cbData = arData.Length; hInternal = GCHandle.Alloc(arData, GCHandleType.Pinned); cryptBlob.pbData = hInternal.AddrOfPinnedObject(); hFull = GCHandle.Alloc(cryptBlob, GCHandleType.Pinned); } else { byte[] arData; if(fIsLinux) arData = Encoding.UTF8.GetBytes(_pFindValue); else arData = Encoding.Unicode.GetBytes(_pFindValue); hFull = GCHandle.Alloc(arData, GCHandleType.Pinned); } // 2)  IntPtr hPrev = IntPtr.Zero; do { hCert = UCryptoAPI.CertFindCertificateInStore(hSysStore, UCConsts.PKCS_7_OR_X509_ASN_ENCODING, 0, UCConsts.AR_CRYPT_FIND_TYPE[(int)_pFindType, fIsLinux.ToByte()], hFull.AddrOfPinnedObject(), hPrev); // 2.1)   if(hPrev != IntPtr.Zero) UCryptoAPI.CertFreeCertificateContext(hPrev); // 2.2)    if(hCert == IntPtr.Zero) return UConsts.E_NO_CERTIFICATE; // 2.3)    X509Certificate2 pCert = new ISDP_X509Cert(hCert); if (!_fVerify || pCert.ISDPVerify()) { hCert = IntPtr.Zero; _pCert = pCert; return UConsts.S_OK; } hPrev = hCert; //    hCert = IntPtr.Zero; } while(hCert != IntPtr.Zero); return UConsts.E_NO_CERTIFICATE; } catch (Exception E) { _sError = UCConsts.S_FIND_CERT_GEN_ERR.Frm(E.Message); return UConsts.E_GEN_EXCEPTION; } finally { //      if(hInternal.IsAllocated) hInternal.Free(); if(hFull.IsAllocated) hFull.Free(); if (hCert != IntPtr.Zero) UCryptoAPI.CertFreeCertificateContext(hCert); UCryptoAPI.CertCloseStore(hSysStore, 0); } } 


рдЦреЛрдЬ рдХрдИ рдЪрд░рдгреЛрдВ рдореЗрдВ рд╣реЛрддреА рд╣реИ:
  1. рднрдВрдбрд╛рд░рдг рдЦреЛрд▓рдиреЗ;
  2. рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдЧрдарди рдЬрд┐рд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рд╣рдо рдЦреЛрдЬ рд░рд╣реЗ рд╣реИрдВ;
  3. рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдЦреЛрдЬ;
  4. рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рд╕рддреНрдпрд╛рдкрди (рдПрдХ рдЕрд▓рдЧ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рд╡рд░реНрдгрд┐рдд);
  5. рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЛ рдмрдВрдж рдХрд░рдирд╛ рдФрд░ рдмрд┐рдВрджреБ 2 рд╕реЗ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдЬрд╛рд░реА рдХрд░рдирд╛ (рдЪреВрдВрдХрд┐ рд╣рд░ рдЬрдЧрд╣ рдЕрдкреНрд░рдмрдВрдзрд┐рддред рдиреЗрдЯ рдореЗрдореЛрд░реА рдХреЗ рд╕рд╛рде рдХрд╛рдо рд╣реЛрддрд╛ рд╣реИ, рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЗрд╕реЗ рд╕рд╛рдл рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛);

рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдХреА рдЦреЛрдЬ рдХрд░рддреЗ рд╕рдордп рдХреБрдЫ рд╕реВрдХреНрд╖реНрдо рдмрд┐рдВрджреБ рд╣реЛрддреЗ рд╣реИрдВред


рд▓рд┐рдирдХреНрд╕ рдкрд░ CryptoPro ANSI рддрд╛рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдФрд░ UTF8 рдХреЗ рд╕рд╛рде рд╡рд┐рдВрдбреЛрдЬ рдкрд░, рдЗрд╕рд▓рд┐рдП:


  1. рдЬрдм рд▓рд┐рдирдХреНрд╕ рдореЗрдВ рд╕реНрдЯреЛрд░реЗрдЬ рдЦреЛрд▓рдиреЗ рдХреА рд╡рд┐рдзрд┐ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдорд╛рд░реНрд╢рд▓рд┐рдВрдЧ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ [рдореЗрдВ, рдорд╛рд░реНрд╢рд▓ рдХреЛрдб (UnmanagedType.LPStr)] рднрдВрдбрд╛рд░рдг рдХреЛрдб рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд▓рд┐рдП;
  2. рдЦреЛрдЬ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдкрд╛рд╕ рдХрд░рдирд╛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд┐рд╖рдп рдХреЗ рдирд╛рдо рд╕реЗ) рдЗрд╕реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рд╡рд╛рд▓реЗ рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рд╕реЗрдЯ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП;
  3. рд╕рднреА рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлрд╝рд┐рдХ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЗ рд▓рд┐рдП рдЬрд┐рдирдХреЗ рдкрд╛рд╕ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рдкреНрд░рдХрд╛рд░ рд╕реЗ рднрд┐рдиреНрдирддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 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 рдкреНрд░рдорд╛рдгрдкрддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп, рдПрдХ рд╣рд╕реНрддрд╛рдХреНрд╖рд░рдХрд░реНрддрд╛ рдХреЗ рд╕рд╛рде рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ рдХрд┐рдП рдЧрдП рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд▓рдЧрднрдЧ рд╣рдореЗрд╢рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдХрд╛рдлреА рд╕рд░рд▓ рдХреЛрдб рдмреНрд▓реЙрдХ рдЖрд╡рд╢реНрдпрдХ рд╣реИ:


рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд╛ рдЧрдарди
 /**<summary>  </summary> * <param name="_arData">  </param> * <param name="_pCert"></param> * <param name="_sError">   </param> * <param name="_arRes"> </param> * <returns>  ,  UConsts.S_OK   </returns> * **/ public static int SignDataCP(byte[] _arData, X509Certificate2 _pCert, out byte[] _arRes, ref string _sError) { _arRes = new byte[0]; // 0)   CRYPT_SIGN_MESSAGE_PARA pParams = new CRYPT_SIGN_MESSAGE_PARA(); pParams.cbSize = Marshal.SizeOf(typeof(CRYPT_SIGN_MESSAGE_PARA)); pParams.dwMsgEncodingType = (int)(UCConsts.PKCS_7_OR_X509_ASN_ENCODING); pParams.pSigningCert = _pCert.getRealHandle(); pParams.cMsgCert = 1; pParams.HashAlgorithm.pszObjId = _pCert.getHashAlgirtmOid(); IntPtr pGlobData = Marshal.AllocHGlobal(_arData.Length); GCHandle pGC = GCHandle.Alloc(_pCert.getRealHandle(), GCHandleType.Pinned); try { pParams.rgpMsgCert = pGC.AddrOfPinnedObject(); Marshal.Copy(_arData, 0, pGlobData, _arData.Length); uint iLen = 50000; byte[] arRes = new byte[iLen]; // 1)   if (!UCryptoAPI.CryptSignMessage(ref pParams, true, 1, new IntPtr[1] { pGlobData }, new uint[1] { (uint)_arData.Length }, arRes, ref iLen)) { _sError = UCConsts.S_MAKE_SIGN_ERR.Frm(Marshal.GetLastWin32Error()); return UConsts.E_CRYPTO_ERR; } Array.Resize(ref arRes, (int)iLen); _arRes = arRes; return UConsts.S_OK;; } catch (Exception E) { _sError = UCConsts.S_MAKE_SIGN_ERR.Frm(E.Message); return UConsts.E_GEN_EXCEPTION; } finally { pGC.Free(); Marshal.FreeHGlobal(pGlobData); } } 

рд╡рд┐рдзрд┐ рдХреЗ рдХрд╛рдо рдХреЗ рджреМрд░рд╛рди, рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдмрдирддреА рд╣реИ рдФрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд░рдиреЗ рдХреА рд╡рд┐рдзрд┐ рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдкреИрд░рд╛рдореАрдЯрд░ рд╕рдВрд░рдЪрдирд╛ рдЖрдкрдХреЛ рдПрдХ рдкреВрд░реНрдг рд╢реНрд░реГрдВрдЦрд▓рд╛ (cMsgCert рдФрд░ rgpMsgCert рдлрд╝реАрд▓реНрдб, рдкрд╣рд▓рд╛ рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдХреА рд╕рдВрдЦреНрдпрд╛, рдЗрди рдкреНрд░рдорд╛рдгрдкрддреНрд░реЛрдВ рдХреА рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреА рд▓рд┐рдВрдХ рдХреА рджреВрд╕рд░реА рд╕реВрдЪреА) рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдореЗрдВ рдкреНрд░рдорд╛рдг рдкрддреНрд░ рд╕рд╣реЗрдЬрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗ рд╕рдХрддреА рд╣реИред


рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд░рдиреЗ рдХреА рд╡рд┐рдзрд┐ рдПрдХ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╛рде рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдпрд╛ рдЕрдзрд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреА рд╣реИред рдпрд╣, рд╡реИрд╕реЗ, рд╕рдВрдШреАрдп рдХрд╛рдиреВрди 63 рдХрд╛ рдЦрдВрдбрди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдХрдИ рдмрд╛рд░ "рд╕рд╛рдЗрди" рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЦреБрд╢ рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИред


рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреА рдореБрдЦреНрдп рд╡рд┐рд╖рдорддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рджреЛ-рдХреЙрд▓ рдореЛрдб рдореЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИ рдЬреЛ рд╕реНрдореГрддрд┐ рдХреЗ рдмрдбрд╝реЗ рдмреНрд▓реЙрдХреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ (рдкрд╣рд▓реЗ рдЕрд╢рдХреНрдд - рдЖрд╡рд╢реНрдпрдХ рдмрдлрд░ рд▓рдВрдмрд╛рдИ рджреЗрддрд╛ рд╣реИ, рджреВрд╕рд░рд╛ рдмрдлрд░ рдХреЛ рднрд░рддрд╛ рд╣реИ)ред рдЗрд╕рд▓рд┐рдП, рдПрдХ рдмрдбрд╝рд╛ рдмрдлрд░ рдмрдирд╛рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рдЗрд╕рдХреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд▓рдВрдмрд╛рдИ рддрдХ рдЫреЛрдЯрд╛ рдХрд░ рджреЗрдВред


рдПрдХрдорд╛рддреНрд░ рдЧрдВрднреАрд░ рд╕рдорд╕реНрдпрд╛ рд╣реИрд╢ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо (рдбрд╛рдЗрдЬреЗрд╕реНрдЯ) рдХреЗ рдУрдЖрдИрдбреА рдХреА рдЦреЛрдЬ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд░рддреЗ рд╕рдордп рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рд╕реНрдкрд╖реНрдЯ рд░реВрдк рдореЗрдВ рдпрд╣ рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдореЗрдВ рдирд╣реАрдВ рд╣реИ (рдХреЗрд╡рд▓ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд╛ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╣реИ)ред рдФрд░ рдЕрдЧрд░ рд╡рд┐рдВрдбреЛрдЬ рдкрд░ рдЖрдк рдЗрд╕реЗ рдПрдХ рдЦрд╛рд▓реА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рдпрд╣ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЙрдард╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рд▓рд┐рдирдХреНрд╕ рдкрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд░рдиреЗ рд╕реЗ рдЗрдВрдХрд╛рд░ рдХрд░ рджреЗрдЧрд╛ рдпрджрд┐ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╕рдорд╛рди рдирд╣реАрдВ рд╣реИред


рд▓реЗрдХрд┐рди рдПрдХ рдЪрд╛рд▓ рд╣реИ - рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо (рд╕рдВрд░рдЪрдирд╛ CRYPT_OID_INFO) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдореЗрдВ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ OID pszOID рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИ, рдФрд░ рд╣реИрд╢ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ Algid рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИред рдФрд░ Algid рдХреЛ OID рдореЗрдВ рдмрджрд▓рдирд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рддрдХрдиреАрдХреА рдорд╛рдорд▓рд╛ рд╣реИ:


рд╣реИрд╢ рдПрд▓реНрдЧреЛрд░рд┐рдердо рдХрд╛ рдУрдЖрдИрдбреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛
 /**<summary> OID   </summary> * <param name="_hCertHandle"> </param> * <param name="_sOID">  OID</param> * <param name="_sError">   </param> * <returns>  ,  UConsts.S_OK   </returns> * **/ 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)); //  AlgID //  UCryptoAPI.CertAlgIdToOID  Windows   ,   byte[] arData = BitConverter.GetBytes(UCryptoAPI.CertOIDToAlgId(pCertInfo.SignatureAlgorithm.pszObjId)); hData = Marshal.AllocHGlobal(arData.Length); Marshal.Copy(arData, 0, hData, arData.Length); //  OID hHashAlgInfo = UCryptoAPI.CryptFindOIDInfo(UCConsts.CRYPT_OID_INFO_ALGID_KEY, hData, UCConsts.CRYPT_HASH_ALG_OID_GROUP_ID); if (hHashAlgInfo == IntPtr.Zero) { _sError = UCConsts.S_NO_HASH_ALG_ERR.Frm( Marshal.GetLastWin32Error()); return UConsts.E_GEN_EXCEPTION; } CRYPT_OID_INFO pHashAlgInfo = (CRYPT_OID_INFO)Marshal.PtrToStructure(hHashAlgInfo, typeof(CRYPT_OID_INFO)); _sOID = pHashAlgInfo.pszOID; return UConsts.S_OK; } catch (Exception E) { _sError = UCConsts.S_DETERM_HASH_ALG_ERR.Frm(E.Message); return UConsts.E_GEN_EXCEPTION; } finally { Marshal.FreeHGlobal(hData); } } 

рдХреЛрдб рдХреЛ рдзреНрдпрд╛рди рд╕реЗ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рдЖрд╢реНрдЪрд░реНрдпрдЪрдХрд┐рдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рд╕рд░рд▓ рддрд░реАрдХреЗ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (CertOIDToAlgId) рдФрд░ рдЗрд╕рдореЗрдВ рдореМрдЬреВрдж OID рдЬрдЯрд┐рд▓ рд╣реИ (CryptFindOIDInfo)ред рдпрд╣ рдЬрдЯрд┐рд▓ рдпрд╛ рджреЛрдиреЛрдВ рд╕рд░рд▓ рддрд░реАрдХреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдорд╛рдиреНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрд░реНрдХрд╕рдВрдЧрдд рд╣реЛрдЧрд╛, рдФрд░ рд▓рд┐рдирдХреНрд╕ рдореЗрдВ рджреЛрдиреЛрдВ рд╡рд┐рдХрд▓реНрдк рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╡рд┐рдВрдбреЛрдЬ рдкрд░, рдПрдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдФрд░ рдХреЗрд╡рд▓ рдПрдХ рдУрдЖрдИрдбреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдореБрд╢реНрдХрд┐рд▓ рд╡рд┐рдХрд▓реНрдк рдЕрд╕реНрдерд┐рд░ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдЕрдЬреАрдм рд╕рдВрдХрд░ рдПрдХ рд╕реНрдерд┐рд░ рд╕рдорд╛рдзрд╛рди рд╣реЛрдЧрд╛ред


рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд╛ рд╕рддреНрдпрд╛рдкрди


рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд╛ рд╕рддреНрдпрд╛рдкрди рджреЛ рдЪрд░рдгреЛрдВ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ, рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╕реНрд╡рдпрдВ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЬрд┐рд╕ рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдХреЗ рд╕рд╛рде рдпрд╣ рд╕реГрдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд╡рд╣ рд╣реИ (рд╢реНрд░реГрдВрдЦрд▓рд╛, рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреА рддрд╛рд░реАрдЦ рдЖрджрд┐)ред
рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд░рддреЗ рд╕рдордп, рд╕рд╛рде рд╣реА, рдЖрдкрдХреЛ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдбреЗрдЯрд╛ рдХреЗ рд╕реЗрдЯ, рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдФрд░ рд╕реНрд╡рдпрдВ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:


рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд╛ рд╕рддреНрдпрд╛рдкрди
 /**<summary>      </summary> * <returns></returns> * **/ 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; } /**<summary> </summary> * <param name="_arData">,   </param> * <param name="_pSign"></param> * <param name="_pCert"></param> * <param name="_sError">   </param> * <param name="_fVerifyOnlySign">  </param> * <param name="_pRevMode">  </param> * <param name="_pRevFlag">  </param> * <returns>  ,  UConsts.S_OK   </returns> * <remarks>   </remarks> * **/ 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(); // 0)   bool fRes = UCryptoAPI.CryptVerifyDetachedMessageSignature( ref pVerParam, //   0, //   _pSign, //  _pSign.Length, //   1, // -    new IntPtr[1] { pHData }, //   new int[1] { _arData.Length }, //    pCertContext.AddrOfPinnedObject());//    if (!fRes) { _sError = UCConsts.S_SIGN_CHECK_ERR.Frm(Marshal.GetLastWin32Error().ToString("X")); return UConsts.E_CRYPTO_ERR; } // 1)   _pCert = new ISDP_X509Cert((IntPtr)pCertContext.Target); if (_pCert == null) { _sError = UCConsts.S_SIGN_CHECK_CERT_ERR; return UConsts.E_CRYPTO_ERR; } // 2)   if (!_fVerifyOnlySign) { List<DateTime> pDates; // 2.1)    int iRes = GetSignDateTimeCP(_pSign, out pDates, ref _sError); // 2.2)    iRes = _pCert.ISDPVerify(ref _sError, pDates[0], _pRevMode, _pRevFlag); if (iRes != UConsts.S_OK) return iRes; } return UConsts.S_OK; } catch (Exception E) { _sError = UCConsts.S_SIGN_CHECK_ERR.Frm(E.Message); return UConsts.E_GEN_EXCEPTION;; } finally { Marshal.FreeHGlobal(pHData); if ((_pCert == null) && pCertContext.IsAllocated && ((IntPtr)pCertContext.Target != IntPtr.Zero)) UCryptoAPI.CertFreeCertificateContext((IntPtr)pCertContext.Target); pCertContext.Free(); } } 

рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдмрдирд╛рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдПрдХ рдЕрд▓рдЧ рд╡рд┐рдзрд┐ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (GetStdSignVerifyPar)ред рдЙрд╕рдХреЗ рдмрд╛рдж, рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╕реНрд╡рдпрдВ рдЬрд╛рдВрдЪреЗ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдкрд╣рд▓реЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░рдХрд░реНрддрд╛ рдХреЛ рдирд┐рдХрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЕрдЪреНрдЫреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕рднреА рдХреЛ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдХрдИ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдпреБрдХреНрдд рдПрдХ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдЕрднреА рднреА рд╡рд┐рджреЗрд╢реА рд╣реИ)ред


рд╣рд╕реНрддрд╛рдХреНрд╖рд░рдХрд░реНрддрд╛ рдХрд╛ рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдЗрд╕реЗ рдЕрдкрдиреА рдХрдХреНрд╖рд╛ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЗрд╕реЗ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░реЗрдВрдЧреЗ (рдпрджрд┐ рд╡рд┐рдзрд┐ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ)ред рд╕рддреНрдпрд╛рдкрди рдХреЗ рд▓рд┐рдП, рдкрд╣рд▓реЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░рдХрд░реНрддрд╛ рдХреА рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рддрд┐рдерд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╕реЗ рдЬрд╛рдирдХрд╛рд░реА рдирд┐рдХрд╛рд▓рдиреЗ рдкрд░ рдЕрдиреБрднрд╛рдЧ, рдФрд░ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рд╕рддреНрдпрд╛рдкрди рдкрд░ рдЕрдиреБрднрд╛рдЧ рджреЗрдЦреЗрдВ)ред


рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдЬрд╛рдирдХрд╛рд░реА рдирд┐рдХрд╛рд▓реЗрдВ


рдЕрдХреНрд╕рд░, рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлрд┐рдХ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рдПрдХ рдореБрджреНрд░рд┐рдд рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдЕрд▓рдЧ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдПрдХ рд╡рд░реНрдЧ рдмрдирд╛рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд░реВрдк рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрдЧреА рдФрд░ рдЗрд╕рдХреА рд╕рд╣рд╛рдпрддрд╛ рд╕реЗ, рдПрдХ рдореБрджреНрд░рд┐рдд рдкреНрд░рд╕реНрддреБрддрд┐ рдкреНрд░рджрд╛рди рдХрд░реЗрдВред .Net рдореЗрдВ рдРрд╕реА рдПрдХ рдХрдХреНрд╖рд╛ рд╣реИ - рд╕рд╛рдЗрдирдбреЗрдХрдореНрд╕, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХреНрд░рд┐рдЯреЗрд░реЛ рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рд╕рд╛рде рдореЛрдиреЛ рдореЗрдВ рдЗрд╕рдХрд╛ рдПрдирд╛рд▓реЙрдЧ рдкрд╣рд▓реЗ рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рд╕реЗ рдЗрдирдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рджреВрд╕рд░реЗ рдореЗрдВ рдЗрд╕рдореЗрдВ рдореБрд╣рд░рдмрдВрдж рд╕рдВрд╢реЛрдзрдХ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рддреАрд╕рд░реЗ рдореЗрдВ рдЗрд╕рдХреЗ рд▓рдЧрднрдЧ рд╕рднреА рдЧреБрдг рд▓рд┐рдЦрдиреЗ-рд╕рдВрд░рдХреНрд╖рд┐рдд рд╣реЛрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рдПрдирд╛рд▓реЙрдЧ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ред


рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдореЗрдВ рджреЛ рдореБрдЦреНрдп рддрддреНрд╡ рд╣реЛрддреЗ рд╣реИрдВ - рдкреНрд░рдорд╛рдгрдкрддреНрд░реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдФрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░рдХрд░реНрддрд╛рдУрдВ рдХреА рдПрдХ рд╕реВрдЪреАред рдкреНрд░рдорд╛рдгрдкрддреНрд░реЛрдВ рдХреА рд╕реВрдЪреА рдЦрд╛рд▓реА рд╣реЛ рд╕рдХрддреА рд╣реИ, рдпрд╛ рдЗрд╕рдореЗрдВ рд╕рддреНрдпрд╛рдкрди рдХреЗ рд▓рд┐рдП рд╕рднреА рдкреНрд░рдорд╛рдгрдкрддреНрд░ рд╢рд╛рдорд┐рд▓ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдкреВрд░реА рд╢реНрд░реГрдВрдЦрд▓рд╛рдПрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рд╣рд╕реНрддрд╛рдХреНрд╖рд░рдХрд░реНрддрд╛рдУрдВ рдХреА рд╕реВрдЪреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╣рд╕реНрддрд╛рдХреНрд╖рд░реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддреА рд╣реИред рдЙрдирдХреЗ рдмреАрдЪ рд╕рдВрдЪрд╛рд░ рдХреНрд░рдо рд╕рдВрдЦреНрдпрд╛ рдФрд░ рдкреНрд░рдХрд╛рд╢рдХ (рдЬрд╛рд░реАрдХрд░реНрддрд╛) рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ, рдПрдХ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдореЗрдВ рдПрдХ рд╣реА рд╕реАрд░рд┐рдпрд▓ рдирдВрдмрд░ рдХреЗ рд╕рд╛рде рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд╢рдХреЛрдВ рд╕реЗ рджреЛ рдкреНрд░рдорд╛рдг рдкрддреНрд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдпрд╣ рдХреЗрд╡рд▓ рд╕реАрд░рд┐рдпрд▓ рдирдВрдмрд░ рджреНрд╡рд╛рд░рд╛ рдЙрдкреЗрдХреНрд╖рд┐рдд рдФрд░ рдЦреЛрдЬрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдкрдврд╝рдирд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:


рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдЬрд╛рдирдХрд╛рд░реА рдирд┐рдХрд╛рд▓реЗрдВ
 /**<summary></summary> * <param name="_arSign"></param> * <param name="_sError">   </param> * <returns>  ,  UConsts.S_OK   </returns> * **/ public int Decode(byte[] _arSign, ref string _sError) { IntPtr hMsg = IntPtr.Zero; // 0)   try { hMsg = UCryptoAPI.CryptMsgOpenToDecode(UCConsts.PKCS_7_OR_X509_ASN_ENCODING, UCConsts.CMSG_DETACHED_FLAG, 0, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero); if (hMsg == IntPtr.Zero) { _sError = UCConsts.S_CRYP_MSG_FORM_ERR.Frm(Marshal.GetLastWin32Error()); return UConsts.E_CRYPTO_ERR; } // 1)   if (!UCryptoAPI.CryptMsgUpdate(hMsg, _arSign, (uint)_arSign.Length, true)) { _sError = UCConsts.S_CRYP_MSG_SIGN_COPY_ERR.Frm(Marshal.GetLastWin32Error()); return UConsts.E_CRYPTO_ERR; } // 2)   (PKCS7 SignedData) uint iMessType = UCUtils.GetCryptMsgParam<uint>(hMsg, UCConsts.CMSG_TYPE_PARAM); if (UCConsts.CMSG_SIGNED != iMessType) { _sError = UCConsts.S_CRYP_MSG_SIGN_TYPE_ERR.Frm(iMessType, UCConsts.CMSG_SIGNED); return UConsts.E_CRYPTO_ERR; } // 3)    fpCertificates = UCUtils.GetSignCertificates(hMsg); // 4)   uint iSignerCount = UCUtils.GetCryptMsgParam<uint>(hMsg, UCConsts.CMSG_SIGNER_COUNT_PARAM); for (int i = 0; i < iSignerCount; i++) { ISDPSignerInfo pInfo = new ISDPSignerInfo(); fpSignerInfos.Add(pInfo); int iRes = pInfo.Decode(hMsg, i, this, ref _sError); if (iRes != UConsts.S_OK) return iRes; } return UConsts.S_OK; } catch (Exception E) { _sError = UCConsts.S_SIGN_INFO_GEN_ERR.Frm(E.Message); return UConsts.E_GEN_EXCEPTION; } finally { if(hMsg != IntPtr.Zero) UCryptoAPI.CryptMsgClose(hMsg); } } 

рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЛ рдХрдИ рдЪрд░рдгреЛрдВ рдореЗрдВ рдкрд╛рд░реНрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдкрд╣рд▓реЗ рд╕рдВрджреЗрд╢ рд╕рдВрд░рдЪрдирд╛ (CryptMsgOpenToDecode) рдмрдирддреА рд╣реИ, рдлрд┐рд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдбреЗрдЯрд╛ (CryptMsgUpdate) рдЙрд╕рдореЗрдВ рджрд░реНрдЬ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╣реИ рдФрд░ рдкрд╣рд▓реЗ рдкреНрд░рдорд╛рдгрдкрддреНрд░реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ, рдФрд░ рдлрд┐рд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░рдХрд░реНрддрд╛рдУрдВ рдХреА рдПрдХ рд╕реВрдЪреАред рдкреНрд░рдорд╛рдгрдкрддреНрд░реЛрдВ рдХреА рд╕реВрдЪреА рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХреА рдЬрд╛рддреА рд╣реИ:


рдкреНрд░рдорд╛рдг рдкрддреНрд░реЛрдВ рдХреА рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛
 /**<summary>     </summary> * <param name="_hMsg">Handle </param> * <returns> </returns> * **/ 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 рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ, рдФрд░ рдлрд┐рд░ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХреА рдЬрд╛рддреА рд╣реИред рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдХреЗ рд╕рдВрджрд░реНрдн рдХреЛ рдмрдирд╛рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдФрд░ рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╣реА рдирд┐рд░реНрдорд╛рдг рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИред


рд╣рд╕реНрддрд╛рдХреНрд╖рд░рдХрд░реНрддрд╛ рдбреЗрдЯрд╛ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЕрдзрд┐рдХ рдХрдард┐рди рд╣реИред рдЙрдирдореЗрдВ рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдХрд╛ рд╕рдВрдХреЗрдд рдФрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╢рд╛рдорд┐рд▓ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд░рдиреЗ рдХреА рддрд╛рд░реАрдЦ)ред рдбреЗрдЯрд╛ рдирд┐рд╖реНрдХрд░реНрд╖рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:


рд╣рд╕реНрддрд╛рдХреНрд╖рд░рдХрд░реНрддрд╛ рдЬрд╛рдирдХрд╛рд░реА рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛
 /**<summary>   </summary> * <param name="_hMsg">Handler </param> * <param name="_iIndex"> </param> * <param name="_pSignedCms"> </param> * <param name="_sError">   </param> * <returns>  ,  UConsts.S_OK   </returns> * **/ public int Decode(IntPtr _hMsg, int _iIndex, ISDPSignedCms _pSignedCms, ref string _sError) { // 1)   uint iLen = 0; // 2)  IntPtr hInfo = IntPtr.Zero; try { if (!UCryptoAPI.CryptMsgGetParam(_hMsg, UCConsts.CMSG_SIGNER_INFO_PARAM, (uint)_iIndex, IntPtr.Zero, ref iLen)) { _sError = UCConsts.S_ERR_SIGNER_INFO_LEN.Frm(_iIndex, Marshal.GetLastWin32Error()); return UConsts.E_CRYPTO_ERR; } hInfo = Marshal.AllocHGlobal((int)iLen); if (!UCryptoAPI.CryptMsgGetParam(_hMsg, UCConsts.CMSG_SIGNER_INFO_PARAM, (uint)_iIndex, hInfo, ref iLen)) { _sError = UCConsts.S_ERR_SIGNER_INFO.Frm(_iIndex, Marshal.GetLastWin32Error()); return UConsts.E_CRYPTO_ERR; } CMSG_SIGNER_INFO pSignerInfo = (CMSG_SIGNER_INFO) Marshal.PtrToStructure(hInfo, typeof(CMSG_SIGNER_INFO)); // 2.1)   byte[] arSerial = new byte[pSignerInfo.SerialNumber.cbData]; Marshal.Copy(pSignerInfo.SerialNumber.pbData, arSerial, 0, arSerial.Length); X509Certificate2Collection pLocCerts = _pSignedCms.pCertificates.Find(X509FindType.FindBySerialNumber, arSerial.Reverse().ToArray().ToHex(), false); if (pLocCerts.Count != 1) { _sError = UCConsts.S_ERR_SIGNER_INFO_CERT.Frm(_iIndex); return UConsts.E_NO_CERTIFICATE; } fpCertificate = pLocCerts[0]; fpSignedAttributes = UCUtils.ReadCryptoAttrsCollection(pSignerInfo.AuthAttrs); return UConsts.S_OK; } catch (Exception E) { _sError = UCConsts.S_ERR_SIGNER_INFO_READ.Frm(_iIndex, E.Message); return UConsts.E_GEN_EXCEPTION; } finally { if(hInfo != IntPtr.Zero) Marshal.FreeHGlobal(hInfo); } } 

, CMSG_SIGNER_INFO. . , .


, тАФ ( , ).


 /**<summary>   </summary> * <param name="_pAttrs"> </param> * <returns> </returns> * **/ 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). :


 /**<summary>      </summary> * <param name="_sName"></param> * <returns> </returns> * **/ internal static Pkcs9AttributeObject Pkcs9AttributeFromOID(string _sName) { switch (_sName) { case UCConsts.S_SIGN_DATE_OID : return new Pkcs9SigningTime(); // case UConsts.S_CONTENT_TYPE_OID : return new Pkcs9ContentType(); ->>  Mono  // case UConsts.S_MESS_DIGEST_OID : return new Pkcs9MessageDigest(); default: return new Pkcs9AttributeObject(); } } /**<summary>  ASN</summary> * <param name="_pAttr"></param> * <returns></returns> * **/ internal static AsnEncodedDataCollection GetAsnEncodedDataCollection (CRYPT_ATTRIBUTE _pAttr) { AsnEncodedDataCollection pRes = new AsnEncodedDataCollection(); Oid pOid = new Oid(_pAttr.pszObjId); string sOid = pOid.Value; for (uint i = 0; i < _pAttr.cValue; i++) { checked { IntPtr pAttributeBlob = new IntPtr((long)_pAttr.rgValue + (i * Marshal.SizeOf(typeof(CRYPTOAPI_BLOB)))); Pkcs9AttributeObject attribute = new Pkcs9AttributeObject(pOid, BlobToByteArray(pAttributeBlob)); Pkcs9AttributeObject customAttribute = Pkcs9AttributeFromOID(sOid); if (customAttribute != null) { customAttribute.CopyFrom(attribute); attribute = customAttribute; } pRes.Add(attribute); } } return pRes; } 

Pkcs9AttributeObject. , mono . Mono .


тАФ тАФ SignedCms, .



, , . (, , ).


 /**<summary> </summary> * <param name="_arInput">  </param> * <param name="_pCert"></param> * <param name="_arRes"></param> * <param name="_sError">   </param> * <returns>   ,  UConsts.S_OK   </returns> * **/ public static int EncryptDataCP(byte[] _arInput, X509Certificate2 _pCert, out byte[] _arRes, ref string _sError) { _arRes = new byte[0]; try { // 0)   CRYPT_ENCRYPT_MESSAGE_PARA pParams = new CRYPT_ENCRYPT_MESSAGE_PARA(); pParams.dwMsgEncodingType = UCConsts.PKCS_7_OR_X509_ASN_ENCODING; pParams.ContentEncryptionAlgorithm.pszObjId = _pCert.getEncodeAlgirtmOid(); pParams.cbSize = Marshal.SizeOf(pParams); // 1)   int iLen = 0; if (!UCryptoAPI.CryptEncryptMessage(ref pParams, 1, new IntPtr[] { _pCert.getRealHandle() }, _arInput, _arInput.Length, null, ref iLen)) { _sError = UCConsts.S_CRYPT_ENCODE_LEN_ERR.Frm(Marshal.GetLastWin32Error()); return UConsts.E_CRYPTO_ERR; } // 2)     _arRes = new byte[iLen]; if (!UCryptoAPI.CryptEncryptMessage(ref pParams, 1, new IntPtr[] {_pCert.getRealHandle() }, _arInput, _arInput.Length, _arRes, ref iLen)) { _sError = UCConsts.S_CRYPT_ENCODE_ERR.Frm(Marshal.GetLastWin32Error()); return UConsts.E_CRYPTO_ERR; } return UConsts.S_OK; } catch (Exception E) { _sError = UCConsts.S_CRYPT_ENCODE_ERR.Frm(E.Message); return UConsts.E_GEN_EXCEPTION; } } 

тАФ , . , , .


, , .


. , ( ). :


 /**<summary> OID   </summary> * <param name="_hCertHandle"> </param> * <param name="_sOID">  OID</param> * <param name="_sError">   </param> * <returns>  ,  UConsts.S_OK   </returns> * **/ internal static int GetEncodeAlgoritmOID(IntPtr _hCertHandle, out string _sOID, ref string _sError) { bool fNeedRelease = false; _sOID = ""; uint iKeySpec = 0; IntPtr hCrypto = IntPtr.Zero; try { // 0)    if (!UCryptoAPI.CryptAcquireCertificatePrivateKey(_hCertHandle, 0, IntPtr.Zero, ref hCrypto, ref iKeySpec, ref fNeedRelease)) { _sError = UCConsts.S_CRYPTO_PROV_INIT_ERR.Frm(Marshal.GetLastWin32Error()); return UConsts.E_CRYPTO_ERR; } uint iLen = 1000; byte[] arData = new byte[1000]; uint iFlag = 1; //  // 1)      while (UCryptoAPI.CryptGetProvParam(hCrypto, UCConsts.PP_ENUMALGS, arData, ref iLen, iFlag)){ iFlag = 2; //  PROV_ENUMALGS pInfo = ConvertBytesToStruct<PROV_ENUMALGS>(arData); // 2)   OID     byte[] arDataAlg = BitConverter.GetBytes(pInfo.aiAlgid); IntPtr hDataAlg = Marshal.AllocHGlobal(arDataAlg.Length); try { Marshal.Copy(arDataAlg, 0, hDataAlg, arDataAlg.Length); IntPtr hHashAlgInfo2 = UCryptoAPI.CryptFindOIDInfo(UCConsts.CRYPT_OID_INFO_ALGID_KEY, hDataAlg, UCConsts.CRYPT_ENCRYPT_ALG_OID_GROUP_ID); // 2.1)  -  if (hHashAlgInfo2 != IntPtr.Zero) { CRYPT_OID_INFO pHashAlgInfo2 = (CRYPT_OID_INFO)Marshal.PtrToStructure(hHashAlgInfo2, typeof(CRYPT_OID_INFO)); _sOID = pHashAlgInfo2.pszOID ; return UConsts.S_OK; } } finally { Marshal.FreeHGlobal(hDataAlg); } } // 3)   -  _sError = UCConsts.S_NO_ENCODE_ALG_ERR; return UConsts.E_CRYPTO_ERR; } catch (Exception E) { _sError = UCConsts.S_DETERM_ENCODE_ALG_ERR.Frm(E.Message); return UConsts.E_GEN_EXCEPTION; }finally { if((hCrypto != IntPtr.Zero) && fNeedRelease) UCryptoAPI.CryptReleaseContext(hCrypto, 0); } } 

. ( , , , .), . (UCConsts.CRYPT_ENCRYPT_ALG_OID_GROUP_ID). тАФ .


( ).



, , . . тАФ , :


 /**<summary> </summary> * <param name="_arInput">  </param> * <param name="_arRes"></param> * <param name="_sError">   </param> * <param name="_pCert"></param> * <returns>  ,  UCOnsts.S_OK   </returns> * **/ 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 { // 0)   CRYPT_DECRYPT_MESSAGE_PARA pParams = new CRYPT_DECRYPT_MESSAGE_PARA(); pParams.dwMsgAndCertEncodingType = UCConsts.PKCS_7_OR_X509_ASN_ENCODING; pParams.cCertStore = 1; pParams.rghCertStore = GC.AddrOfPinnedObject(); pParams.cbSize = Marshal.SizeOf(pParams); int iLen = 0; // 1)     if (!UCryptoAPI.CryptDecryptMessage(ref pParams, _arInput, _arInput.Length, null, ref iLen, ref hOutCertL)) { _sError = UCConsts.S_DECRYPT_LEN_ERR.Frm(Marshal.GetLastWin32Error()); return UConsts.E_CRYPTO_ERR; } // 2)    _arRes = new byte[iLen]; if (!UCryptoAPI.CryptDecryptMessage(ref pParams, _arInput, _arInput.Length, _arRes, ref iLen, ref hOutCert)) { _sError = UCConsts.S_DECRYPT_ERR.Frm(Marshal.GetLastWin32Error()); return UConsts.E_CRYPTO_ERR; } // 3)     if (hOutCert != IntPtr.Zero) _pCert = new ISDP_X509Cert(hOutCert); if(_pCert != null) hOutCert = IntPtr.Zero; //    return UConsts.S_OK; } catch (Exception E) { _sError = UCConsts.S_DECRYPT_ERR.Frm(E.Message); return UConsts.E_GEN_EXCEPTION; } finally { if (hOutCertL != IntPtr.Zero) UCryptoAPI.CertFreeCertificateContext(hOutCertL); if (hOutCert != IntPtr.Zero) UCryptoAPI.CertFreeCertificateContext(hOutCert); GC.Free(); UCryptoAPI.CertCloseStore(hSysStore, 0); } } 

, . , ( Linux ).



, , , , . , . :


  1. ( , , . .);
  2. тАФ ;
  3. тАФ ;
  4. , , (CRL);

, .


рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реНрдкрд╖реНрдЯ рд╣реИ, рд╡реИрдзрддрд╛ рдХреЗ рд▓рд┐рдП рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдХрдард┐рди рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдЖрдЗрдЯрдо рдХреЛ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░реЗ рддрд░реАрдХреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо X509Certificate2.Verify () рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП .Net рд╕реНрд░реЛрддреЛрдВ рдХреА рдУрд░ рд░реБрдЦ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддреЗ рд╣реИрдВред


рд╕рддреНрдпрд╛рдкрди рдореЗрдВ рджреЛ рдЪрд░рдг рд╣реЛрддреЗ рд╣реИрдВ:
  1. рдореВрд▓ рдХреЗ рдареАрдХ рдиреАрдЪреЗ рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдмрдирд╛рдПрдВ;
  2. рдЗрд╕рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ (рдирд┐рд░рд╕реНрддреАрдХрд░рдг, рд╕рдордп рдЖрджрд┐ рдХреЗ рд▓рд┐рдП);

рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рддреНрдпрд╛рдкрди рдХреЛ рд╡рд░реНрддрдорд╛рди рддрд┐рдерд┐ рдкрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдФрд░ рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреА рддрд╛рд░реАрдЦ рдкрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рд╕рддреНрдпрд╛рдкрди рдХреЗ рд╕рдордпред рд╕рддреНрдпрд╛рдкрди рд╡рд┐рдзрд┐ рд╕реНрд╡рдпрдВ рдЫреЛрдЯреА рд╣реИ:


рдкреНрд░рдорд╛рдгрдкрддреНрд░ рд╕рддреНрдпрд╛рдкрди
 /**<summary> </summary> * <param name="_iRevFlag"> </param> * <param name="_iRevMode"> </param> * <param name="_hPolicy">   </param> * <param name="_hCert"> </param> * <param name="_iCTLTimeout">   </param> * <param name="_rOnDate"> </param> * <param name="_sError">   </param> * <returns>  ,  UConsts.S_OK   </returns> * **/ 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))); // 1)   IntPtr hChain = IntPtr.Zero; try { int iRes = BuildChain(new IntPtr(UCConsts.HCCE_CURRENT_USER), _hCert, __iRevMode, _iRevFlag, _rOnDate, _iCTLTimeout, ref hChain, ref _sError); if (iRes != UConsts.S_OK) return iRes; // 2)   if (UCryptoAPI.CertVerifyCertificateChainPolicy(_hPolicy, hChain, ref pPolicyParam, ref pPolicyStatus)) { if (pPolicyStatus.dwError != 0) { _sError = UCConsts.S_CRYPTO_CHAIN_CHECK_ERR.Frm(pPolicyStatus.dwError); return UConsts.E_CRYPTO_ERR; } } else{ _sError = UCConsts.S_CRYPTO_CHAIN_CHECK_ERR.Frm(Marshal.GetLastWin32Error()); return UConsts.E_CRYPTO_ERR; } return UConsts.S_OK; } catch (Exception E) { _sError = UCConsts.S_CRYPTO_CERT_VERIFY_GEN_ERR.Frm(E.Message); return UConsts.E_GEN_EXCEPTION; } finally { if(hChain != IntPtr.Zero) UCryptoAPI.CertFreeCertificateChain(hChain); } } 

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, BuildChain рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИ, рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рдЪреЗрдХ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╢реНрд░реГрдВрдЦрд▓рд╛ рдирд┐рд░реНрдорд╛рдг рдХреЗ рджреМрд░рд╛рди, рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рд╕рдВрд░рдЪрдирд╛, рд╕рддреНрдпрд╛рдкрди рдХреА рддрд╛рд░реАрдЦ рдФрд░ рдЪреЗрдХ рдЭрдВрдбреЗ рдмрдирддреЗ рд╣реИрдВ:


 /**<summary>    </summary> * <param name="_hChain">  </param> * <param name="_iRevFlag"> </param> * <param name="_iRevMode"> </param> * <param name="_hChainEngine"> </param> * <param name="_hCert"> </param> * <param name="_rCTLTimeOut">   </param> * <param name="_rOnDate"> </param> * <param name="_sError">   </param> * <returns>  ,  UConsts.S_OK   </returns> * **/ internal static int BuildChain (IntPtr _hChainEngine, IntPtr _hCert, X509RevocationMode _iRevMode, X509RevocationFlag _iRevFlag, DateTime _rOnDate, TimeSpan _rCTLTimeOut, ref IntPtr _hChain, ref string _sError) { // 0)    if (_hCert == IntPtr.Zero) { _sError = UCConsts.S_CRYPTO_CERT_CHAIN_ERR; return UConsts.E_NO_CERTIFICATE; } // 1)  CERT_CHAIN_PARA pChainParams = new CERT_CHAIN_PARA(); pChainParams.cbSize = (uint) Marshal.SizeOf(pChainParams); IntPtr hAppPolicy = IntPtr.Zero; IntPtr hCertPolicy = IntPtr.Zero; try { // 2)    pChainParams.dwUrlRetrievalTimeout = (uint)Math.Floor(_rCTLTimeOut.TotalMilliseconds); // 3)   FILETIME pVerifyTime = new FILETIME(_rOnDate.ToFileTime()); // 4)   uint _iFlags = MapRevocationFlags(_iRevMode, _iRevFlag); // 5)   if (!UCryptoAPI.CertGetCertificateChain(_hChainEngine, _hCert, ref pVerifyTime, IntPtr.Zero, ref pChainParams, _iFlags, IntPtr.Zero, ref _hChain)) { _sError = UCConsts.S_CRYPTO_CHAIN_BUILD_ERR.Frm(Marshal.GetLastWin32Error()); return UConsts.E_CRYPTO_ERR; } } catch(Exception E) { _sError = UCConsts.S_CRYPTO_CHAIN_GEN_ERR.Frm(E.Message); return UConsts.E_GEN_EXCEPTION; } finally { Marshal.FreeHGlobal(hAppPolicy); Marshal.FreeHGlobal(hCertPolicy); } return UConsts.S_OK; } 

, Microsoft. hCertPolicy hAppPolicy OID-, , . , , .


(, ).


MapRevocationFlags тАФ .Net тАФ uint .


рдирд┐рд╖реНрдХрд░реНрд╖


:


  1. 10 ;
  2. ;
  3. byte[] {1, 2, 3, 4, 5};
  4. ;
  5. ;
  6. byte[] {1, 2, 3, 4, 5};
  7. ;

Windows Linux 1-, 10- 50- , Linux . Linux - - ( , ), ┬л┬╗ . (deadlock-) ( ┬лAccess Violation┬╗).


UCryptoAPI . fpCPSection object :


 private static object fpCPSection = new object(); /**<summary> </summary> * <param name="_hCryptMsg">  </param> * **/ internal static bool CryptMsgClose(IntPtr _hCryptMsg) { lock (pCPSection) { if (fIsLinux) return LCryptoAPI.CryptMsgClose(_hCryptMsg); else return WCryptoAPI.CryptMsgClose(_hCryptMsg); } } /**<summary>     </summary>**/ public static object pCPSection { get { return fpCPSection;} } 

, Linux- .


mono Issuer Subject . , , mono X500DistinguishedName . , mono ( ), (impl.issuerName impl.subjectName). (Reflection) X500DistinguishedName, CERT_CONTEXT .


рд╕рдВрджрд░реНрдн


  1. CAPILite
  2. c #
  3. .Net:
    1. CAPIBase
    2. X509Certificate2
    3. SignedCMS
    4. SignerInfo

  4. mono:
    1. X509Certificate2
    2. X509CertificateImplBtls

Source: https://habr.com/ru/post/hi423163/


All Articles