/* * Mentalis.org Security Library * * Copyright © 2002-2005, The KPD-Team * All rights reserved. * http://www.mentalis.org/ * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Neither the name of the KPD-Team, nor the names of its contributors * may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. */ using System; using System.Runtime.InteropServices; namespace Org.Mentalis.Security { /// /// The DataBlob structure contains an array of bytes. /// [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)] internal struct DataBlob { //CRYPT_DATA_BLOB, CRYPTOAPI_BLOB public int cbData; public IntPtr pbData; } /// /// The CertificateInfo structure contains a certificate's information. /// [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)] internal struct CertificateInfo { //CERT_INFO public int dwVersion; public int SerialNumbercbData; public IntPtr SerialNumberpbData; // BYTE* public IntPtr SignatureAlgorithmpszObjId; // LPSTR public int SignatureAlgorithmParameterscbData; public IntPtr SignatureAlgorithmParameterspbData; // BYTE* public int IssuercbData; public IntPtr IssuerpbData; // BYTE* public long NotBefore; // FILETIME public long NotAfter; // FILETIME public int SubjectcbData; public IntPtr SubjectpbData; // BYTE* public IntPtr SubjectPublicKeyInfoAlgorithmpszObjId; // LPSTR public int SubjectPublicKeyInfoAlgorithmParameterscbData; public IntPtr SubjectPublicKeyInfoAlgorithmParameterspbData; // BYTE* public int SubjectPublicKeyInfoPublicKeycbData; public IntPtr SubjectPublicKeyInfoPublicKeypbData; // BYTE* public int SubjectPublicKeyInfoPublicKeycUnusedBits; public int IssuerUniqueIdcbData; public IntPtr IssuerUniqueIdpbData; // BYTE* public int IssuerUniqueIdcUnusedBits; public int SubjectUniqueIdcbData; public IntPtr SubjectUniqueIdpbData; // BYTE* public int SubjectUniqueIdcUnusedBits; public int cExtension; public IntPtr rgExtension; // /PCERT_EXTENSION/ } /// /// The CERT_PUBLIC_KEY_INFO structure contains a public key and its algorithm. /// [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)] internal struct CERT_PUBLIC_KEY_INFO { public CERT_PUBLIC_KEY_INFO(CertificateInfo info) { pszObjId = info.SubjectPublicKeyInfoAlgorithmpszObjId; agcbData = info.SubjectPublicKeyInfoAlgorithmParameterscbData; agpbData = info.SubjectPublicKeyInfoAlgorithmParameterspbData; pkcbData = info.SubjectPublicKeyInfoPublicKeycbData; pkpbData = info.SubjectPublicKeyInfoPublicKeypbData; pkcUnusedBits = info.SubjectPublicKeyInfoPublicKeycUnusedBits; } public IntPtr pszObjId; public int agcbData; public IntPtr agpbData; public int pkcbData; public IntPtr pkpbData; public int pkcUnusedBits; } /// /// The CertificateContext structure contains both the encoded and decoded representations of a certificate. /// [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)] internal struct CertificateContext { //CERT_CONTEXT public int dwCertEncodingType; public IntPtr pbCertEncoded; // BYTE* public int cbCertEncoded; public IntPtr pCertInfo; // PCERT_INFO public IntPtr hCertStore; // HCERTSTORE } /// /// The TrustListUsage structure contains an array of Object Identifiers (OIDs) for Certificate Trust List (CTL) extensions. CTL_USAGE structures are used in functions that search for CTLs for specific uses. /// [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)] internal struct TrustListUsage { //CTL_USAGE public int cUsageIdentifier; public IntPtr rgpszUsageIdentifier; } /// /// The CertificateExtension structure contains the extension information for a certificate, Certificate Revocation List (CRL) or Certificate Trust List (CTL). /// [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)] internal struct CertificateExtension { //CERT_EXTENSION public IntPtr pszObjId; //LPSTR public int fCritical; public int cbData; public IntPtr pbData; } /// /// The CertificateNameValue structure contains a relative distinguished name (RDN) attribute value. It is like the CERT_RDN_ATTR structure, except that it does not include the object identifier member that is a member of CERT_RDN_ATTR. As in CERT_RDN_ATTR, the interpretation of the Value member depends on dwValueType. /// [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)] internal struct CertificateNameValue { //CERT_NAME_VALUE public int dwValueType; public int cbData; public IntPtr pbData; } /// /// The CertificateNameInfo structure contains subject or issuer names. The information is represented as an array of CERT_RDN structures. /// [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)] internal struct CertificateNameInfo { //CERT_NAME_INFO public int cRDN; public IntPtr rgRDN; //PCERT_RDN } /// /// The RelativeDistinguishedName structure contains a relative distinguished name (RDN) consisting of an array of CERT_RDN_ATTR structures. /// [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)] internal struct RelativeDistinguishedName { //CERT_RDN public int cRDNAttr; public IntPtr rgRDNAttr; } /// /// The RdnAttribute structure contains a single attribute of a relative distinguished name (RDN). A whole RDN is expressed in a CERT_RDN structure that contains an array of CERT_RDN_ATTR structures. /// [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)] internal struct RdnAttribute { //CERT_RDN_ATTR public IntPtr pszObjId; //LPSTR public int dwValueType; public int cbData; public IntPtr pbData; } /// /// The ChainParameters structure establishing the searching and matching criteria to be used in building a certificate chain. /// [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)] internal struct ChainParameters { //CERT_CHAIN_PARA public int cbSize; public int RequestedUsagedwType; public int RequestedUsagecUsageIdentifier; public IntPtr RequestedUsagergpszUsageIdentifier; //public int RequestedIssuancePolicydwType; //public int RequestedIssuancePolicycUsageIdentifier; //public IntPtr RequestedIssuancergpszPolicyIdentifier; //public int dwUrlRetrievalTimeout; //public int fCheckRevocationFreshnessTime; //public int dwRevocationFreshnessTime; } /// /// The ChainPolicyStatus structure holds certificate chain status information returned by CertVerifyCertificateChainPolicy from the verification of certificate chains. /// [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)] internal struct ChainPolicyStatus { //CERT_CHAIN_POLICY_STATUS public int cbSize; public int dwError; public int lChainIndex; public int lElementIndex; public IntPtr pvExtraPolicyStatus; } /// /// The ChainPolicyParameters structure contains information used in CertVerifyCertificateChainPolicy to establish policy criteria for the verification of certificate chains. /// [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)] internal struct ChainPolicyParameters { //CERT_CHAIN_POLICY_PARA public int cbSize; // sizeof(CERT_CHAIN_POLICY_PARA); public int dwFlags; public IntPtr pvExtraPolicyPara; } /// /// The SslPolicyParameters structure contains extra policy options. /// [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)] internal struct SslPolicyParameters { //HTTPSPolicyCallbackData or SSL_EXTRA_CERT_CHAIN_POLICY_PARA public int cbSize; // sizeof(HTTPSPolicyCallbackData); public int dwAuthType; public int fdwChecks; public IntPtr pwszServerName; // pointer to a Unicode string // used to check against CN=xxxx } /// /// The CRYPT_KEY_PROV_INFO structure contains fields that are passed as the arguments to CryptAcquireContext to acquire a handle to a particular key container within a particular cryptographic service provider (CSP), or to create or destroy a key container. /// [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Unicode)] struct CRYPT_KEY_PROV_INFO { [MarshalAs(UnmanagedType.LPWStr)] public string pwszContainerName; [MarshalAs(UnmanagedType.LPWStr)] public string pwszProvName; public int dwProvType; public int dwFlags; public int cProvParam; public IntPtr rgProvParam; public int dwKeySpec; } /// /// Union of the PUBLICKEYSTRUC [=BLOBHEADER] and RSAPUBKEY structures /// [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Unicode)] struct PUBLIC_KEY_BLOB { public byte bType; public byte bVersion; public short reserved; public int aiKeyAlg; public int magic; public int bitlen; public int pubexp; } [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)] struct PROV_ENUMALGS_EX { public int aiAlgid; public int dwDefaultLen; public int dwMinLen; public int dwMaxLen; public int dwProtocols; public int dwNameLen; [MarshalAs(UnmanagedType.ByValTStr, SizeConst=20)] public string szName; public int dwLongNameLen; [MarshalAs(UnmanagedType.ByValTStr, SizeConst=40)] public string szLongName; } [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)] struct CERT_EXTENSION { public IntPtr pszObjId; public int fCritical; public int ValuecbData; public IntPtr ValuepbData; } }