Annotation of sbbs/include/cryptlib/cryptlib.h, revision 1.1

1.1     ! root        1: /****************************************************************************
        !             2: *                                                                                                                                                      *
        !             3: *                                                              cryptlib Interface                                                      *
        !             4: *                                              Copyright Peter Gutmann 1992-2006                                       *
        !             5: *                                                                                                                                                      *
        !             6: ****************************************************************************/
        !             7: 
        !             8: #ifndef _CRYPTLIB_DEFINED
        !             9: 
        !            10: #define _CRYPTLIB_DEFINED
        !            11: 
        !            12: /* The current cryptlib version: 3.3.0.0 */
        !            13: 
        !            14: #define CRYPTLIB_VERSION       3300
        !            15: 
        !            16: /* Fixup for Windows support.  We need to include windows.h for various types
        !            17:    and prototypes needed for DLL's.  In addition wincrypt.h defines some
        !            18:    values with the same names as cryptlib ones, so we need to check for this
        !            19:    and issue a warning not to mix cryptlib with CryptoAPI (that's like taking
        !            20:    a bank vault and making one side out of papier mache).
        !            21: 
        !            22:    A second, less likely condition can occur when wincrypt.h is included
        !            23:    after cryptlib.h, which shouldn't happen if developers follow the
        !            24:    convention of including local headers after system headers, but can occur
        !            25:    if they ignore this convention.  The NOCRYPT doesn't fix this since
        !            26:    wincrypt.h can be pulled in indirectly and unconditionally, for example
        !            27:    via winldap.h -> schnlsp.h -> schannel.h -> wincrypt.h.  To fix this, we
        !            28:    create a redundant define for CRYPT_MODE_ECB which produces a compile
        !            29:    error if wincrypt.h is included after cryptlib.h.  Since thie will
        !            30:    conflict with the enum, we have to place it after the CRYPT_MODE_xxx
        !            31:    enums */
        !            32: 
        !            33: #if ( defined( _WINDOWS ) || defined( WIN32 ) || defined( _WIN32 ) || \
        !            34:          defined( __WIN32__ ) || defined( _WIN32_WCE ) ) && \
        !            35:          !defined( _SCCTK ) && !defined( _CVI_ )
        !            36:   #define WIN32_LEAN_AND_MEAN  /* Skip RPC, OLE, Multimedia, etc */
        !            37:   #define NOCRYPT                              /* Disable include of wincrypt.h */
        !            38:   #include <windows.h>
        !            39: 
        !            40:   /* Catch use of CryptoAPI and cryptlib at the same time */
        !            41:   #if defined( CRYPT_MODE_ECB )
        !            42:        #error "cryptlib.h and wincrypt.h can't both be used at the same time due to conflicting type names"
        !            43:   #endif /* Clash with wincrypt.h defines */
        !            44: #endif /* Windows other than a cross-development environment */
        !            45: 
        !            46: /* Machine-dependant types to allow use in special library types such as
        !            47:    DLL's.  Under Win32 and BeOS we need to use the dllimport and dllexport
        !            48:    directives for the DLL/shared-lib version so we define the type used for
        !            49:    functions depending on whether we're being included via the cryptlib-
        !            50:    internal crypt.h or not */
        !            51: 
        !            52: #if ( defined( WIN32 ) || defined( _WIN32 ) || defined( __WIN32__ ) || \
        !            53:          defined( _WIN32_WCE ) ) && !( defined( STATIC_LIB ) || defined( _SCCTK ) )
        !            54:   #define C_PTR        *                                       /* General pointer */
        !            55:   #if defined( _WIN32_WCE )
        !            56:        /* Rather than relying on _UNICODE being defined (which would cause
        !            57:           problems if cryptlib is built with char * but the calling app is built
        !            58:           with wchar_t *), we always use the default native char type, which is
        !            59:           ASCII (or at least 8-bit) under Win32 and Unicode under WinCE */
        !            60:        #define C_CHR wchar_t
        !            61:   #else
        !            62:        #define C_CHR char
        !            63:   #endif /* WinCE vs. Win32 */
        !            64:   #define C_STR C_CHR *
        !            65:   #if defined( __BORLANDC__ ) && ( __BORLANDC__ < 0x500 )
        !            66:        #ifdef _CRYPT_DEFINED
        !            67:          #define C_RET int     _export _stdcall                /* BC++ DLL export ret.val.*/
        !            68:        #else
        !            69:          #define C_RET int     _import _stdcall                /* BC++ DLL import ret.val.*/
        !            70:        #endif /* CRYPT_DEFINED */
        !            71:   #else
        !            72:        #ifdef _CRYPT_DEFINED
        !            73:          #define C_RET __declspec( dllexport ) int     __stdcall       /* DLL export ret.val.*/
        !            74:        #else
        !            75:          #define C_RET __declspec( dllimport ) int     __stdcall       /* DLL import ret.val.*/
        !            76:        #endif /* CRYPT_DEFINED */
        !            77:   #endif /* BC++ vs.VC++ DLL functions */
        !            78: #elif defined( _WINDOWS ) && !defined( STATIC_LIB )
        !            79:   #define C_PTR        FAR *                           /* DLL pointer */
        !            80:   #define C_CHR char
        !            81:   #define C_STR C_CHR FAR *                    /* DLL string pointer */
        !            82:   #define C_RET        int FAR PASCAL _export  /* DLL return value */
        !            83: #elif defined( __BEOS__ )
        !            84: /* #include <BeBuild.h>                                // _EXPORT/_IMPORT defines */
        !            85:   #define C_PTR *
        !            86:   #define C_CHR char
        !            87:   #define C_STR C_CHR *
        !            88:   #ifdef _STATIC_LINKING
        !            89:        #define C_RET int
        !            90:   #else
        !            91:        #ifdef _CRYPT_DEFINED
        !            92:          #define C_RET __declspec( dllexport ) int     /* Shared lib export ret.val.*/
        !            93:        #else
        !            94:          #define C_RET __declspec( dllimport ) int     /* Shared lib import ret.val.*/
        !            95:        #endif /* CRYPT_DEFINED */
        !            96:   #endif /* Static vs. shared lib */
        !            97: #elif defined( __SYMBIAN__ )
        !            98:   #ifdef _CRYPT_DEFINED
        !            99:        #define C_RET   EXPORT_C                                        /* DLL export ret.val.*/
        !           100:   #else
        !           101:        #define C_RET   IMPORT_C                                        /* DLL import ret.val.*/
        !           102:   #endif /* CRYPT_DEFINED */
        !           103: #else
        !           104:   #define C_PTR        *
        !           105:   #define C_CHR char
        !           106:   #define C_STR C_CHR *
        !           107:   #define C_RET        int
        !           108: #endif /* Windows vs.everything else function types */
        !           109: 
        !           110: /* Symbolic defines to make it clearer how the function parameters behave */
        !           111: 
        !           112: #define C_IN   const                           /* Input-only */
        !           113: #define C_OUT                                          /* Output-only */
        !           114: #define C_INOUT                                                /* Modified in-place */
        !           115: 
        !           116: #ifdef _CRYPTLIB_DEFINED                       /* Disable use in non-C versions of header */
        !           117: 
        !           118: /* Alongside the externally visible types, cryptlib also has various internal
        !           119:    types that are extended forms of the external types that are invisible
        !           120:    to the user (e.g. SignedPublicKeyAndChallenge == certRequest).  These can
        !           121:    only be used internally and are blocked by the security kernel, so they
        !           122:    can never be accessed from outside cryptlib (in fact for good measure
        !           123:    they're blocked before they even get to the kernel by preliminary range
        !           124:    checks in the API wrapper functions).  The only reason they're defined
        !           125:    here is because it's not possible to extend an enum outside the point
        !           126:    where it's originally defined */
        !           127: 
        !           128: #endif /* _CRYPTLIB_DEFINED */
        !           129: 
        !           130: /****************************************************************************
        !           131: *                                                                                                                                                      *
        !           132: *                                                      Algorithm and Object Types                                              *
        !           133: *                                                                                                                                                      *
        !           134: ****************************************************************************/
        !           135: 
        !           136: /* Algorithm and mode types */
        !           137: 
        !           138: typedef enum {                                         /* Algorithms */
        !           139:        /* No encryption */
        !           140:        CRYPT_ALGO_NONE,                                /* No encryption */
        !           141: 
        !           142:        /* Conventional encryption */
        !           143:        CRYPT_ALGO_DES,                                 /* DES */
        !           144:        CRYPT_ALGO_3DES,                                /* Triple DES */
        !           145:        CRYPT_ALGO_IDEA,                                /* IDEA */
        !           146:        CRYPT_ALGO_CAST,                                /* CAST-128 */
        !           147:        CRYPT_ALGO_RC2,                                 /* RC2 */
        !           148:        CRYPT_ALGO_RC4,                                 /* RC4 */
        !           149:        CRYPT_ALGO_RC5,                                 /* RC5 */
        !           150:        CRYPT_ALGO_AES,                                 /* AES */
        !           151:        CRYPT_ALGO_BLOWFISH,                    /* Blowfish */
        !           152:        CRYPT_ALGO_SKIPJACK,                    /* Skipjack */
        !           153: 
        !           154:        /* Public-key encryption */
        !           155:        CRYPT_ALGO_DH = 100,                    /* Diffie-Hellman */
        !           156:        CRYPT_ALGO_RSA,                                 /* RSA */
        !           157:        CRYPT_ALGO_DSA,                                 /* DSA */
        !           158:        CRYPT_ALGO_ELGAMAL,                             /* ElGamal */
        !           159:        CRYPT_ALGO_KEA,                                 /* KEA */
        !           160: 
        !           161:        /* Hash algorithms */
        !           162:        CRYPT_ALGO_MD2 = 200,                   /* MD2 */
        !           163:        CRYPT_ALGO_MD4,                                 /* MD4 */
        !           164:        CRYPT_ALGO_MD5,                                 /* MD5 */
        !           165:        CRYPT_ALGO_SHA,                                 /* SHA/SHA1 */
        !           166:        CRYPT_ALGO_RIPEMD160,                   /* RIPE-MD 160 */
        !           167:        CRYPT_ALGO_SHA2,                                /* SHA2 (SHA-256/384/512)*/
        !           168: 
        !           169:        /* MAC's */
        !           170:        CRYPT_ALGO_HMAC_MD5 = 300,              /* HMAC-MD5 */
        !           171:        CRYPT_ALGO_HMAC_SHA1,                   /* HMAC-SHA */
        !           172:                CRYPT_ALGO_HMAC_SHA = CRYPT_ALGO_HMAC_SHA1,     /* Older form */
        !           173:        CRYPT_ALGO_HMAC_RIPEMD160,              /* HMAC-RIPEMD-160 */
        !           174: 
        !           175:        /* Vendors may want to use their own algorithms that aren't part of the
        !           176:           general cryptlib suite.  The following values are for vendor-defined
        !           177:           algorithms, and can be used just like the named algorithm types (it's
        !           178:           up to the vendor to keep track of what _VENDOR1 actually corresponds
        !           179:           to) */
        !           180: #ifdef USE_VENDOR_ALGOS
        !           181:        CRYPT_ALGO_VENDOR1 = 10000, CRYPT_ALGO_VENDOR2, CRYPT_ALGO_VENDOR3,
        !           182: #endif /* USE_VENDOR_ALGOS */
        !           183: 
        !           184:        CRYPT_ALGO_LAST,                                /* Last possible crypt algo value */
        !           185: 
        !           186:        /* In order that we can scan through a range of algorithms with
        !           187:           cryptQueryCapability(), we define the following boundary points for
        !           188:           each algorithm class */
        !           189:        CRYPT_ALGO_FIRST_CONVENTIONAL = CRYPT_ALGO_DES,
        !           190:        CRYPT_ALGO_LAST_CONVENTIONAL = CRYPT_ALGO_DH - 1,
        !           191:        CRYPT_ALGO_FIRST_PKC = CRYPT_ALGO_DH,
        !           192:        CRYPT_ALGO_LAST_PKC = CRYPT_ALGO_MD2 - 1,
        !           193:        CRYPT_ALGO_FIRST_HASH = CRYPT_ALGO_MD2,
        !           194:        CRYPT_ALGO_LAST_HASH = CRYPT_ALGO_HMAC_MD5 - 1,
        !           195:        CRYPT_ALGO_FIRST_MAC = CRYPT_ALGO_HMAC_MD5,
        !           196:        CRYPT_ALGO_LAST_MAC = CRYPT_ALGO_HMAC_MD5 + 99  /* End of mac algo.range */
        !           197:        } CRYPT_ALGO_TYPE;
        !           198: 
        !           199: typedef enum {                                         /* Block cipher modes */
        !           200:        CRYPT_MODE_NONE,                                /* No encryption mode */
        !           201:        CRYPT_MODE_ECB,                                 /* ECB */
        !           202:        CRYPT_MODE_CBC,                                 /* CBC */
        !           203:        CRYPT_MODE_CFB,                                 /* CFB */
        !           204:        CRYPT_MODE_OFB,                                 /* OFB */
        !           205:        CRYPT_MODE_LAST                                 /* Last possible crypt mode value */
        !           206:        } CRYPT_MODE_TYPE;
        !           207: 
        !           208: #if ( defined( _WINDOWS ) || defined( WIN32 ) || defined( _WIN32 ) || \
        !           209:          defined( __WIN32__ ) ) && !defined( _SCCTK )
        !           210:   /* Force an error if wincrypt.h is included after cryptlib.h, see note at
        !           211:      the start of the file */
        !           212:   #define CRYPT_MODE_ECB       1
        !           213: #endif /* Windows other than a cross-development environment */
        !           214: 
        !           215: /* Keyset subtypes */
        !           216: 
        !           217: typedef enum {                                         /* Keyset types */
        !           218:        CRYPT_KEYSET_NONE,                              /* No keyset type */
        !           219:        CRYPT_KEYSET_FILE,                              /* Generic flat file keyset */
        !           220:        CRYPT_KEYSET_HTTP,                              /* Web page containing cert/CRL */
        !           221:        CRYPT_KEYSET_LDAP,                              /* LDAP directory service */
        !           222:        CRYPT_KEYSET_ODBC,                              /* Generic ODBC interface */
        !           223:        CRYPT_KEYSET_DATABASE,                  /* Generic RDBMS interface */
        !           224:        CRYPT_KEYSET_PLUGIN,                    /* Generic database plugin */
        !           225:        CRYPT_KEYSET_ODBC_STORE,                /* ODBC certificate store */
        !           226:        CRYPT_KEYSET_DATABASE_STORE,    /* Database certificate store */
        !           227:        CRYPT_KEYSET_PLUGIN_STORE,              /* Database plugin certificate store */
        !           228:        CRYPT_KEYSET_LAST                               /* Last possible keyset type */
        !           229: 
        !           230: #ifdef _CRYPT_DEFINED
        !           231:        /* Useful defines used internally for range checking */
        !           232:        , CRYPT_FIRST_RDBMS = CRYPT_KEYSET_ODBC,
        !           233:        CRYPT_LAST_RDBMS = CRYPT_KEYSET_PLUGIN_STORE
        !           234: #endif /* _CRYPT_DEFINED */
        !           235:        } CRYPT_KEYSET_TYPE;
        !           236: 
        !           237: /* Device subtypes */
        !           238: 
        !           239: typedef enum {                                         /* Crypto device types */
        !           240:        CRYPT_DEVICE_NONE,                              /* No crypto device */
        !           241:        CRYPT_DEVICE_FORTEZZA,                  /* Fortezza card */
        !           242:        CRYPT_DEVICE_PKCS11,                    /* PKCS #11 crypto token */
        !           243:        CRYPT_DEVICE_CRYPTOAPI,                 /* Microsoft CryptoAPI */
        !           244:        CRYPT_DEVICE_LAST                               /* Last possible crypto device type */
        !           245:        } CRYPT_DEVICE_TYPE;
        !           246: 
        !           247: /* Certificate subtypes */
        !           248: 
        !           249: typedef enum {                                         /* Certificate object types */
        !           250:        CRYPT_CERTTYPE_NONE,                    /* No certificate type */
        !           251:        CRYPT_CERTTYPE_CERTIFICATE,             /* Certificate */
        !           252:        CRYPT_CERTTYPE_ATTRIBUTE_CERT,  /* Attribute certificate */
        !           253:        CRYPT_CERTTYPE_CERTCHAIN,               /* PKCS #7 certificate chain */
        !           254:        CRYPT_CERTTYPE_CERTREQUEST,             /* PKCS #10 certification request */
        !           255:        CRYPT_CERTTYPE_REQUEST_CERT,    /* CRMF certification request */
        !           256:        CRYPT_CERTTYPE_REQUEST_REVOCATION,      /* CRMF revocation request */
        !           257:        CRYPT_CERTTYPE_CRL,                             /* CRL */
        !           258:        CRYPT_CERTTYPE_CMS_ATTRIBUTES,  /* CMS attributes */
        !           259:        CRYPT_CERTTYPE_RTCS_REQUEST,    /* RTCS request */
        !           260:        CRYPT_CERTTYPE_RTCS_RESPONSE,   /* RTCS response */
        !           261:        CRYPT_CERTTYPE_OCSP_REQUEST,    /* OCSP request */
        !           262:        CRYPT_CERTTYPE_OCSP_RESPONSE,   /* OCSP response */
        !           263:        CRYPT_CERTTYPE_PKIUSER,                 /* PKI user information */
        !           264: #ifdef _CRYPT_DEFINED
        !           265:        /* Alongside the usual types we can also wind up with various
        !           266:           certificate-bagging schemes such as cert chains and sequences that
        !           267:           can't be exported in this format and therefore aren't visible to the
        !           268:           user, but that need to be distinguished internally.  The following
        !           269:           types are only visible internally */
        !           270:        CRYPT_ICERTTYPE_CMS_CERTSET,    /* CMS SET OF Certificate = cert chain */
        !           271:        CRYPT_ICERTTYPE_SSL_CERTCHAIN,  /* SSL certificate chain = cert chain */
        !           272: #endif /* _CRYPT_DEFINED */
        !           273:        CRYPT_CERTTYPE_LAST                             /* Last possible cert.type */
        !           274: #ifdef _CRYPT_DEFINED
        !           275:        , CRYPT_CERTTYPE_LAST_EXTERNAL = CRYPT_CERTTYPE_PKIUSER + 1
        !           276: #endif /* _CRYPT_DEFINED */
        !           277:        } CRYPT_CERTTYPE_TYPE;
        !           278: 
        !           279: /* Envelope/data format subtypes */
        !           280: 
        !           281: typedef enum {
        !           282:        CRYPT_FORMAT_NONE,                              /* No format type */
        !           283:        CRYPT_FORMAT_AUTO,                              /* Deenv, auto-determine type */
        !           284:        CRYPT_FORMAT_CRYPTLIB,                  /* cryptlib native format */
        !           285:        CRYPT_FORMAT_CMS,                               /* PKCS #7 / CMS / S/MIME fmt.*/
        !           286:                CRYPT_FORMAT_PKCS7 = CRYPT_FORMAT_CMS,
        !           287:        CRYPT_FORMAT_SMIME,                             /* As CMS with MSG-style behaviour */
        !           288:        CRYPT_FORMAT_PGP,                               /* PGP format */
        !           289: #ifdef _CRYPT_DEFINED
        !           290:        /* Alongside the usual types we can also wind up with various protocol-
        !           291:           specific format types such as SSL and SSH.  The following types are
        !           292:           only visible internally */
        !           293:        CRYPT_IFORMAT_SSL,                              /* SSL format */
        !           294:        CRYPT_IFORMAT_SSH,                              /* SSH format */
        !           295: #endif /* _CRYPT_DEFINED */
        !           296:        CRYPT_FORMAT_LAST                               /* Last possible format type */
        !           297: #ifdef _CRYPT_DEFINED
        !           298:        , CRYPT_FORMAT_LAST_EXTERNAL = CRYPT_FORMAT_PGP + 1
        !           299: #endif /* _CRYPT_DEFINED */
        !           300:        } CRYPT_FORMAT_TYPE;
        !           301: 
        !           302: /* Session subtypes */
        !           303: 
        !           304: typedef enum {
        !           305:        CRYPT_SESSION_NONE,                             /* No session type */
        !           306:        CRYPT_SESSION_SSH,                              /* SSH */
        !           307:        CRYPT_SESSION_SSH_SERVER,               /* SSH server */
        !           308:        CRYPT_SESSION_SSL,                              /* SSL/TLS */
        !           309:        CRYPT_SESSION_SSL_SERVER,               /* SSL/TLS server */
        !           310:        CRYPT_SESSION_RTCS,                             /* RTCS */
        !           311:        CRYPT_SESSION_RTCS_SERVER,              /* RTCS server */
        !           312:        CRYPT_SESSION_OCSP,                             /* OCSP */
        !           313:        CRYPT_SESSION_OCSP_SERVER,              /* OCSP server */
        !           314:        CRYPT_SESSION_TSP,                              /* TSP */
        !           315:        CRYPT_SESSION_TSP_SERVER,               /* TSP server */
        !           316:        CRYPT_SESSION_CMP,                              /* CMP */
        !           317:        CRYPT_SESSION_CMP_SERVER,               /* CMP server */
        !           318:        CRYPT_SESSION_SCEP,                             /* SCEP */
        !           319:        CRYPT_SESSION_SCEP_SERVER,              /* SCEP server */
        !           320:        CRYPT_SESSION_CERTSTORE_SERVER, /* HTTP cert store interface */
        !           321:        CRYPT_SESSION_LAST                              /* Last possible session type */
        !           322:        } CRYPT_SESSION_TYPE;
        !           323: 
        !           324: /* User subtypes */
        !           325: 
        !           326: typedef enum {
        !           327:        CRYPT_USER_NONE,                                /* No user type */
        !           328:        CRYPT_USER_NORMAL,                              /* Normal user */
        !           329:        CRYPT_USER_SO,                                  /* Security officer */
        !           330:        CRYPT_USER_CA,                                  /* CA user */
        !           331:        CRYPT_USER_LAST                                 /* Last possible user type */
        !           332:        } CRYPT_USER_TYPE;
        !           333: 
        !           334: /****************************************************************************
        !           335: *                                                                                                                                                      *
        !           336: *                                                              Attribute Types                                                         *
        !           337: *                                                                                                                                                      *
        !           338: ****************************************************************************/
        !           339: 
        !           340: /* Attribute types.  These are arranged in the following order:
        !           341: 
        !           342:        PROPERTY        - Object property
        !           343:        ATTRIBUTE       - Generic attributes
        !           344:        OPTION          - Global or object-specific config.option
        !           345:        CTXINFO         - Context-specific attribute
        !           346:        CERTINFO        - Certificate-specific attribute
        !           347:        KEYINFO         - Keyset-specific attribute
        !           348:        DEVINFO         - Device-specific attribute
        !           349:        ENVINFO         - Envelope-specific attribute
        !           350:        SESSINFO        - Session-specific attribute
        !           351:        USERINFO        - User-specific attribute */
        !           352: 
        !           353: typedef enum {
        !           354:        CRYPT_ATTRIBUTE_NONE,                   /* Non-value */
        !           355: 
        !           356:        /* Used internally */
        !           357:        CRYPT_PROPERTY_FIRST,
        !           358: 
        !           359:        /*********************/
        !           360:        /* Object attributes */
        !           361:        /*********************/
        !           362: 
        !           363:        /* Object properties */
        !           364:        CRYPT_PROPERTY_HIGHSECURITY,    /* Owned+non-forwardcount+locked */
        !           365:        CRYPT_PROPERTY_OWNER,                   /* Object owner */
        !           366:        CRYPT_PROPERTY_FORWARDCOUNT,    /* No.of times object can be forwarded */
        !           367:        CRYPT_PROPERTY_LOCKED,                  /* Whether properties can be chged/read */
        !           368:        CRYPT_PROPERTY_USAGECOUNT,              /* Usage count before object expires */
        !           369:        CRYPT_PROPERTY_NONEXPORTABLE,   /* Whether key is nonexp.from context */
        !           370: 
        !           371:        /* Used internally */
        !           372:        CRYPT_PROPERTY_LAST, CRYPT_GENERIC_FIRST,
        !           373: 
        !           374:        /* Extended error information */
        !           375:        CRYPT_ATTRIBUTE_ERRORTYPE,              /* Type of last error */
        !           376:        CRYPT_ATTRIBUTE_ERRORLOCUS,             /* Locus of last error */
        !           377:        CRYPT_ATTRIBUTE_INT_ERRORCODE,  /* Low-level software-specific */
        !           378:        CRYPT_ATTRIBUTE_INT_ERRORMESSAGE, /*   error code and message */
        !           379: 
        !           380:        /* Generic information */
        !           381:        CRYPT_ATTRIBUTE_CURRENT_GROUP,  /* Cursor mgt: Group in attribute list */
        !           382:        CRYPT_ATTRIBUTE_CURRENT,                /* Cursor mgt: Entry in attribute list */
        !           383:        CRYPT_ATTRIBUTE_CURRENT_INSTANCE,       /* Cursor mgt: Instance in attribute list */
        !           384:        CRYPT_ATTRIBUTE_BUFFERSIZE,             /* Internal data buffer size */
        !           385: 
        !           386:        /* User internally */
        !           387:        CRYPT_GENERIC_LAST, CRYPT_OPTION_FIRST = 100,
        !           388: 
        !           389:        /****************************/
        !           390:        /* Configuration attributes */
        !           391:        /****************************/
        !           392: 
        !           393:        /* cryptlib information (read-only) */
        !           394:        CRYPT_OPTION_INFO_DESCRIPTION,  /* Text description */
        !           395:        CRYPT_OPTION_INFO_COPYRIGHT,    /* Copyright notice */
        !           396:        CRYPT_OPTION_INFO_MAJORVERSION, /* Major release version */
        !           397:        CRYPT_OPTION_INFO_MINORVERSION, /* Minor release version */
        !           398:        CRYPT_OPTION_INFO_STEPPING,             /* Release stepping */
        !           399: 
        !           400:        /* Encryption options */
        !           401:        CRYPT_OPTION_ENCR_ALGO,                 /* Encryption algorithm */
        !           402:        CRYPT_OPTION_ENCR_HASH,                 /* Hash algorithm */
        !           403:        CRYPT_OPTION_ENCR_MAC,                  /* MAC algorithm */
        !           404: 
        !           405:        /* PKC options */
        !           406:        CRYPT_OPTION_PKC_ALGO,                  /* Public-key encryption algorithm */
        !           407:        CRYPT_OPTION_PKC_KEYSIZE,               /* Public-key encryption key size */
        !           408: 
        !           409:        /* Signature options */
        !           410:        CRYPT_OPTION_SIG_ALGO,                  /* Signature algorithm */
        !           411:        CRYPT_OPTION_SIG_KEYSIZE,               /* Signature keysize */
        !           412: 
        !           413:        /* Keying options */
        !           414:        CRYPT_OPTION_KEYING_ALGO,               /* Key processing algorithm */
        !           415:        CRYPT_OPTION_KEYING_ITERATIONS, /* Key processing iterations */
        !           416: 
        !           417:        /* Certificate options */
        !           418:        CRYPT_OPTION_CERT_SIGNUNRECOGNISEDATTRIBUTES,   /* Whether to sign unrecog.attrs */
        !           419:        CRYPT_OPTION_CERT_VALIDITY,             /* Certificate validity period */
        !           420:        CRYPT_OPTION_CERT_UPDATEINTERVAL,       /* CRL update interval */
        !           421:        CRYPT_OPTION_CERT_COMPLIANCELEVEL,      /* PKIX compliance level for cert chks.*/
        !           422:        CRYPT_OPTION_CERT_REQUIREPOLICY,        /* Whether explicit policy req'd for certs */
        !           423: 
        !           424:        /* CMS/SMIME options */
        !           425:        CRYPT_OPTION_CMS_DEFAULTATTRIBUTES,     /* Add default CMS attributes */
        !           426:                CRYPT_OPTION_SMIME_DEFAULTATTRIBUTES = CRYPT_OPTION_CMS_DEFAULTATTRIBUTES,
        !           427: 
        !           428:        /* LDAP keyset options */
        !           429:        CRYPT_OPTION_KEYS_LDAP_OBJECTCLASS,     /* Object class */
        !           430:        CRYPT_OPTION_KEYS_LDAP_OBJECTTYPE,      /* Object type to fetch */
        !           431:        CRYPT_OPTION_KEYS_LDAP_FILTER,          /* Query filter */
        !           432:        CRYPT_OPTION_KEYS_LDAP_CACERTNAME,      /* CA certificate attribute name */
        !           433:        CRYPT_OPTION_KEYS_LDAP_CERTNAME,        /* Certificate attribute name */
        !           434:        CRYPT_OPTION_KEYS_LDAP_CRLNAME,         /* CRL attribute name */
        !           435:        CRYPT_OPTION_KEYS_LDAP_EMAILNAME,       /* Email attribute name */
        !           436: 
        !           437:        /* Crypto device options */
        !           438:        CRYPT_OPTION_DEVICE_PKCS11_DVR01,       /* Name of first PKCS #11 driver */
        !           439:        CRYPT_OPTION_DEVICE_PKCS11_DVR02,       /* Name of second PKCS #11 driver */
        !           440:        CRYPT_OPTION_DEVICE_PKCS11_DVR03,       /* Name of third PKCS #11 driver */
        !           441:        CRYPT_OPTION_DEVICE_PKCS11_DVR04,       /* Name of fourth PKCS #11 driver */
        !           442:        CRYPT_OPTION_DEVICE_PKCS11_DVR05,       /* Name of fifth PKCS #11 driver */
        !           443:        CRYPT_OPTION_DEVICE_PKCS11_HARDWAREONLY,/* Use only hardware mechanisms */
        !           444: 
        !           445:        /* Network access options */
        !           446:        CRYPT_OPTION_NET_SOCKS_SERVER,          /* Socks server name */
        !           447:        CRYPT_OPTION_NET_SOCKS_USERNAME,        /* Socks user name */
        !           448:        CRYPT_OPTION_NET_HTTP_PROXY,            /* Web proxy server */
        !           449:        CRYPT_OPTION_NET_CONNECTTIMEOUT,        /* Timeout for network connection setup */
        !           450:        CRYPT_OPTION_NET_READTIMEOUT,           /* Timeout for network reads */
        !           451:        CRYPT_OPTION_NET_WRITETIMEOUT,          /* Timeout for network writes */
        !           452: 
        !           453:        /* Miscellaneous options */
        !           454:        CRYPT_OPTION_MISC_ASYNCINIT,    /* Whether to init cryptlib async'ly */
        !           455:        CRYPT_OPTION_MISC_SIDECHANNELPROTECTION, /* Protect against side-channel attacks */
        !           456: 
        !           457:        /* cryptlib state information */
        !           458:        CRYPT_OPTION_CONFIGCHANGED,             /* Whether in-mem.opts match on-disk ones */
        !           459:        CRYPT_OPTION_SELFTESTOK,                /* Whether self-test was completed and OK */
        !           460: 
        !           461:        /* Used internally */
        !           462:        CRYPT_OPTION_LAST, CRYPT_CTXINFO_FIRST = 1000,
        !           463: 
        !           464:        /**********************/
        !           465:        /* Context attributes */
        !           466:        /**********************/
        !           467: 
        !           468:        /* Algorithm and mode information */
        !           469:        CRYPT_CTXINFO_ALGO,                             /* Algorithm */
        !           470:        CRYPT_CTXINFO_MODE,                             /* Mode */
        !           471:        CRYPT_CTXINFO_NAME_ALGO,                /* Algorithm name */
        !           472:        CRYPT_CTXINFO_NAME_MODE,                /* Mode name */
        !           473:        CRYPT_CTXINFO_KEYSIZE,                  /* Key size in bytes */
        !           474:        CRYPT_CTXINFO_BLOCKSIZE,                /* Block size */
        !           475:        CRYPT_CTXINFO_IVSIZE,                   /* IV size */
        !           476:        CRYPT_CTXINFO_KEYING_ALGO,              /* Key processing algorithm */
        !           477:        CRYPT_CTXINFO_KEYING_ITERATIONS,/* Key processing iterations */
        !           478:        CRYPT_CTXINFO_KEYING_SALT,              /* Key processing salt */
        !           479:        CRYPT_CTXINFO_KEYING_VALUE,             /* Value used to derive key */
        !           480: 
        !           481:        /* State information */
        !           482:        CRYPT_CTXINFO_KEY,                              /* Key */
        !           483:        CRYPT_CTXINFO_KEY_COMPONENTS,   /* Public-key components */
        !           484:        CRYPT_CTXINFO_IV,                               /* IV */
        !           485:        CRYPT_CTXINFO_HASHVALUE,                /* Hash value */
        !           486: 
        !           487:        /* Misc.information */
        !           488:        CRYPT_CTXINFO_LABEL,                    /* Label for private/secret key */
        !           489: 
        !           490:        /* Used internally */
        !           491:        CRYPT_CTXINFO_LAST, CRYPT_CERTINFO_FIRST = 2000,
        !           492: 
        !           493:        /**************************/
        !           494:        /* Certificate attributes */
        !           495:        /**************************/
        !           496: 
        !           497:        /* Because there are so many cert attributes, we break them down into
        !           498:           blocks to minimise the number of values that change if a new one is
        !           499:           added halfway through */
        !           500: 
        !           501:        /* Pseudo-information on a cert object or meta-information which is used
        !           502:           to control the way that a cert object is processed */
        !           503:        CRYPT_CERTINFO_SELFSIGNED,              /* Cert is self-signed */
        !           504:        CRYPT_CERTINFO_IMMUTABLE,               /* Cert is signed and immutable */
        !           505:        CRYPT_CERTINFO_XYZZY,                   /* Cert is a magic just-works cert */
        !           506:        CRYPT_CERTINFO_CERTTYPE,                /* Certificate object type */
        !           507:        CRYPT_CERTINFO_FINGERPRINT,             /* Certificate fingerprints */
        !           508:                CRYPT_CERTINFO_FINGERPRINT_MD5 = CRYPT_CERTINFO_FINGERPRINT,
        !           509:        CRYPT_CERTINFO_FINGERPRINT_SHA,
        !           510:        CRYPT_CERTINFO_CURRENT_CERTIFICATE,/* Cursor mgt: Rel.pos in chain/CRL/OCSP */
        !           511:        CRYPT_CERTINFO_TRUSTED_USAGE,   /* Usage that cert is trusted for */
        !           512:        CRYPT_CERTINFO_TRUSTED_IMPLICIT,/* Whether cert is implicitly trusted */
        !           513:        CRYPT_CERTINFO_SIGNATURELEVEL,  /* Amount of detail to include in sigs.*/
        !           514: 
        !           515:        /* General certificate object information */
        !           516:        CRYPT_CERTINFO_VERSION,                 /* Cert.format version */
        !           517:        CRYPT_CERTINFO_SERIALNUMBER,    /* Serial number */
        !           518:        CRYPT_CERTINFO_SUBJECTPUBLICKEYINFO,    /* Public key */
        !           519:        CRYPT_CERTINFO_CERTIFICATE,             /* User certificate */
        !           520:                CRYPT_CERTINFO_USERCERTIFICATE = CRYPT_CERTINFO_CERTIFICATE,
        !           521:        CRYPT_CERTINFO_CACERTIFICATE,   /* CA certificate */
        !           522:        CRYPT_CERTINFO_ISSUERNAME,              /* Issuer DN */
        !           523:        CRYPT_CERTINFO_VALIDFROM,               /* Cert valid-from time */
        !           524:        CRYPT_CERTINFO_VALIDTO,                 /* Cert valid-to time */
        !           525:        CRYPT_CERTINFO_SUBJECTNAME,             /* Subject DN */
        !           526:        CRYPT_CERTINFO_ISSUERUNIQUEID,  /* Issuer unique ID */
        !           527:        CRYPT_CERTINFO_SUBJECTUNIQUEID, /* Subject unique ID */
        !           528:        CRYPT_CERTINFO_CERTREQUEST,             /* Cert.request (DN + public key) */
        !           529:        CRYPT_CERTINFO_THISUPDATE,              /* CRL/OCSP current-update time */
        !           530:        CRYPT_CERTINFO_NEXTUPDATE,              /* CRL/OCSP next-update time */
        !           531:        CRYPT_CERTINFO_REVOCATIONDATE,  /* CRL/OCSP cert-revocation time */
        !           532:        CRYPT_CERTINFO_REVOCATIONSTATUS,/* OCSP revocation status */
        !           533:        CRYPT_CERTINFO_CERTSTATUS,              /* RTCS certificate status */
        !           534:        CRYPT_CERTINFO_DN,                              /* Currently selected DN in string form */
        !           535:        CRYPT_CERTINFO_PKIUSER_ID,              /* PKI user ID */
        !           536:        CRYPT_CERTINFO_PKIUSER_ISSUEPASSWORD,   /* PKI user issue password */
        !           537:        CRYPT_CERTINFO_PKIUSER_REVPASSWORD,             /* PKI user revocation password */
        !           538: 
        !           539:        /* X.520 Distinguished Name components.  This is a composite field, the
        !           540:           DN to be manipulated is selected through the addition of a
        !           541:           pseudocomponent, and then one of the following is used to access the
        !           542:           DN components directly */
        !           543:        CRYPT_CERTINFO_COUNTRYNAME = CRYPT_CERTINFO_FIRST + 100,        /* countryName */
        !           544:        CRYPT_CERTINFO_STATEORPROVINCENAME,     /* stateOrProvinceName */
        !           545:        CRYPT_CERTINFO_LOCALITYNAME,            /* localityName */
        !           546:        CRYPT_CERTINFO_ORGANIZATIONNAME,        /* organizationName */
        !           547:                CRYPT_CERTINFO_ORGANISATIONNAME = CRYPT_CERTINFO_ORGANIZATIONNAME,
        !           548:        CRYPT_CERTINFO_ORGANIZATIONALUNITNAME,  /* organizationalUnitName */
        !           549:                CRYPT_CERTINFO_ORGANISATIONALUNITNAME = CRYPT_CERTINFO_ORGANIZATIONALUNITNAME,
        !           550:        CRYPT_CERTINFO_COMMONNAME,              /* commonName */
        !           551: 
        !           552:        /* X.509 General Name components.  These are handled in the same way as
        !           553:           the DN composite field, with the current GeneralName being selected by
        !           554:           a pseudo-component after which the individual components can be
        !           555:           modified through one of the following */
        !           556:        CRYPT_CERTINFO_OTHERNAME_TYPEID,                /* otherName.typeID */
        !           557:        CRYPT_CERTINFO_OTHERNAME_VALUE,                 /* otherName.value */
        !           558:        CRYPT_CERTINFO_RFC822NAME,                              /* rfc822Name */
        !           559:                CRYPT_CERTINFO_EMAIL = CRYPT_CERTINFO_RFC822NAME,
        !           560:        CRYPT_CERTINFO_DNSNAME,                                 /* dNSName */
        !           561: #if 0  /* Not supported yet, these are never used in practice and have an
        !           562:                   insane internal structure */
        !           563:        CRYPT_CERTINFO_X400ADDRESS,                             /* x400Address */
        !           564: #endif /* 0 */
        !           565:        CRYPT_CERTINFO_DIRECTORYNAME,                   /* directoryName */
        !           566:        CRYPT_CERTINFO_EDIPARTYNAME_NAMEASSIGNER,       /* ediPartyName.nameAssigner */
        !           567:        CRYPT_CERTINFO_EDIPARTYNAME_PARTYNAME,  /* ediPartyName.partyName */
        !           568:        CRYPT_CERTINFO_UNIFORMRESOURCEIDENTIFIER,       /* uniformResourceIdentifier */
        !           569:        CRYPT_CERTINFO_IPADDRESS,                               /* iPAddress */
        !           570:        CRYPT_CERTINFO_REGISTEREDID,                    /* registeredID */
        !           571: 
        !           572:        /* X.509 certificate extensions.  Although it would be nicer to use names
        !           573:           that match the extensions more closely (e.g.
        !           574:           CRYPT_CERTINFO_BASICCONSTRAINTS_PATHLENCONSTRAINT), these exceed the
        !           575:           32-character ANSI minimum length for unique names, and get really
        !           576:           hairy once you get into the weird policy constraints extensions whose
        !           577:           names wrap around the screen about three times.
        !           578: 
        !           579:           The following values are defined in OID order, this isn't absolutely
        !           580:           necessary but saves an extra layer of processing when encoding them */
        !           581: 
        !           582:        /* 1 2 840 113549 1 9 7 challengePassword.  This is here even though it's
        !           583:           a CMS attribute because SCEP stuffs it into PKCS #10 requests */
        !           584:        CRYPT_CERTINFO_CHALLENGEPASSWORD = CRYPT_CERTINFO_FIRST + 200,
        !           585: 
        !           586:        /* 1 3 6 1 4 1 3029 3 1 4 cRLExtReason */
        !           587:        CRYPT_CERTINFO_CRLEXTREASON,
        !           588: 
        !           589:        /* 1 3 6 1 4 1 3029 3 1 5 keyFeatures */
        !           590:        CRYPT_CERTINFO_KEYFEATURES,
        !           591: 
        !           592:        /* 1 3 6 1 5 5 7 1 1 authorityInfoAccess */
        !           593:        CRYPT_CERTINFO_AUTHORITYINFOACCESS,
        !           594:        CRYPT_CERTINFO_AUTHORITYINFO_RTCS,              /* accessDescription.accessLocation */
        !           595:        CRYPT_CERTINFO_AUTHORITYINFO_OCSP,              /* accessDescription.accessLocation */
        !           596:        CRYPT_CERTINFO_AUTHORITYINFO_CAISSUERS, /* accessDescription.accessLocation */
        !           597:        CRYPT_CERTINFO_AUTHORITYINFO_CERTSTORE, /* accessDescription.accessLocation */
        !           598:        CRYPT_CERTINFO_AUTHORITYINFO_CRLS,              /* accessDescription.accessLocation */
        !           599: 
        !           600:        /* 1 3 6 1 5 5 7 1 2 biometricInfo */
        !           601:        CRYPT_CERTINFO_BIOMETRICINFO,
        !           602:        CRYPT_CERTINFO_BIOMETRICINFO_TYPE,              /* biometricData.typeOfData */
        !           603:        CRYPT_CERTINFO_BIOMETRICINFO_HASHALGO,  /* biometricData.hashAlgorithm */
        !           604:        CRYPT_CERTINFO_BIOMETRICINFO_HASH,              /* biometricData.dataHash */
        !           605:        CRYPT_CERTINFO_BIOMETRICINFO_URL,               /* biometricData.sourceDataUri */
        !           606: 
        !           607:        /* 1 3 6 1 5 5 7 1 3 qcStatements */
        !           608:        CRYPT_CERTINFO_QCSTATEMENT,
        !           609:        CRYPT_CERTINFO_QCSTATEMENT_SEMANTICS,
        !           610:                                        /* qcStatement.statementInfo.semanticsIdentifier */
        !           611:        CRYPT_CERTINFO_QCSTATEMENT_REGISTRATIONAUTHORITY,
        !           612:                                        /* qcStatement.statementInfo.nameRegistrationAuthorities */
        !           613: 
        !           614:        /* 1 3 6 1 5 5 7 48 1 2 ocspNonce */
        !           615:        CRYPT_CERTINFO_OCSP_NONCE,                              /* nonce */
        !           616: 
        !           617:        /* 1 3 6 1 5 5 7 48 1 4 ocspAcceptableResponses */
        !           618:        CRYPT_CERTINFO_OCSP_RESPONSE,
        !           619:        CRYPT_CERTINFO_OCSP_RESPONSE_OCSP,              /* OCSP standard response */
        !           620: 
        !           621:        /* 1 3 6 1 5 5 7 48 1 5 ocspNoCheck */
        !           622:        CRYPT_CERTINFO_OCSP_NOCHECK,
        !           623: 
        !           624:        /* 1 3 6 1 5 5 7 48 1 6 ocspArchiveCutoff */
        !           625:        CRYPT_CERTINFO_OCSP_ARCHIVECUTOFF,
        !           626: 
        !           627:        /* 1 3 6 1 5 5 7 48 1 11 subjectInfoAccess */
        !           628:        CRYPT_CERTINFO_SUBJECTINFOACCESS,
        !           629:        CRYPT_CERTINFO_SUBJECTINFO_CAREPOSITORY,/* accessDescription.accessLocation */
        !           630:        CRYPT_CERTINFO_SUBJECTINFO_TIMESTAMPING,/* accessDescription.accessLocation */
        !           631: 
        !           632:        /* 1 3 36 8 3 1 siggDateOfCertGen */
        !           633:        CRYPT_CERTINFO_SIGG_DATEOFCERTGEN,
        !           634: 
        !           635:        /* 1 3 36 8 3 2 siggProcuration */
        !           636:        CRYPT_CERTINFO_SIGG_PROCURATION,
        !           637:        CRYPT_CERTINFO_SIGG_PROCURE_COUNTRY,    /* country */
        !           638:        CRYPT_CERTINFO_SIGG_PROCURE_TYPEOFSUBSTITUTION, /* typeOfSubstitution */
        !           639:        CRYPT_CERTINFO_SIGG_PROCURE_SIGNINGFOR, /* signingFor.thirdPerson */
        !           640: 
        !           641:        /* 1 3 36 8 3 4 siggMonetaryLimit */
        !           642:        CRYPT_CERTINFO_SIGG_MONETARYLIMIT,
        !           643:        CRYPT_CERTINFO_SIGG_MONETARY_CURRENCY,  /* currency */
        !           644:        CRYPT_CERTINFO_SIGG_MONETARY_AMOUNT,    /* amount */
        !           645:        CRYPT_CERTINFO_SIGG_MONETARY_EXPONENT,  /* exponent */
        !           646: 
        !           647:        /* 1 3 36 8 3 8 siggRestriction */
        !           648:        CRYPT_CERTINFO_SIGG_RESTRICTION,
        !           649: 
        !           650:        /* 1 3 101 1 4 1 strongExtranet */
        !           651:        CRYPT_CERTINFO_STRONGEXTRANET,
        !           652:        CRYPT_CERTINFO_STRONGEXTRANET_ZONE,             /* sxNetIDList.sxNetID.zone */
        !           653:        CRYPT_CERTINFO_STRONGEXTRANET_ID,               /* sxNetIDList.sxNetID.id */
        !           654: 
        !           655:        /* 2 5 29 9 subjectDirectoryAttributes */
        !           656:        CRYPT_CERTINFO_SUBJECTDIRECTORYATTRIBUTES,
        !           657:        CRYPT_CERTINFO_SUBJECTDIR_TYPE,                 /* attribute.type */
        !           658:        CRYPT_CERTINFO_SUBJECTDIR_VALUES,               /* attribute.values */
        !           659: 
        !           660:        /* 2 5 29 14 subjectKeyIdentifier */
        !           661:        CRYPT_CERTINFO_SUBJECTKEYIDENTIFIER,
        !           662: 
        !           663:        /* 2 5 29 15 keyUsage */
        !           664:        CRYPT_CERTINFO_KEYUSAGE,
        !           665: 
        !           666:        /* 2 5 29 16 privateKeyUsagePeriod */
        !           667:        CRYPT_CERTINFO_PRIVATEKEYUSAGEPERIOD,
        !           668:        CRYPT_CERTINFO_PRIVATEKEY_NOTBEFORE,    /* notBefore */
        !           669:        CRYPT_CERTINFO_PRIVATEKEY_NOTAFTER,             /* notAfter */
        !           670: 
        !           671:        /* 2 5 29 17 subjectAltName */
        !           672:        CRYPT_CERTINFO_SUBJECTALTNAME,
        !           673: 
        !           674:        /* 2 5 29 18 issuerAltName */
        !           675:        CRYPT_CERTINFO_ISSUERALTNAME,
        !           676: 
        !           677:        /* 2 5 29 19 basicConstraints */
        !           678:        CRYPT_CERTINFO_BASICCONSTRAINTS,
        !           679:        CRYPT_CERTINFO_CA,                                              /* cA */
        !           680:                CRYPT_CERTINFO_AUTHORITY = CRYPT_CERTINFO_CA,
        !           681:        CRYPT_CERTINFO_PATHLENCONSTRAINT,               /* pathLenConstraint */
        !           682: 
        !           683:        /* 2 5 29 20 cRLNumber */
        !           684:        CRYPT_CERTINFO_CRLNUMBER,
        !           685: 
        !           686:        /* 2 5 29 21 cRLReason */
        !           687:        CRYPT_CERTINFO_CRLREASON,
        !           688: 
        !           689:        /* 2 5 29 23 holdInstructionCode */
        !           690:        CRYPT_CERTINFO_HOLDINSTRUCTIONCODE,
        !           691: 
        !           692:        /* 2 5 29 24 invalidityDate */
        !           693:        CRYPT_CERTINFO_INVALIDITYDATE,
        !           694: 
        !           695:        /* 2 5 29 27 deltaCRLIndicator */
        !           696:        CRYPT_CERTINFO_DELTACRLINDICATOR,
        !           697: 
        !           698:        /* 2 5 29 28 issuingDistributionPoint */
        !           699:        CRYPT_CERTINFO_ISSUINGDISTRIBUTIONPOINT,
        !           700:        CRYPT_CERTINFO_ISSUINGDIST_FULLNAME,    /* distributionPointName.fullName */
        !           701:        CRYPT_CERTINFO_ISSUINGDIST_USERCERTSONLY,       /* onlyContainsUserCerts */
        !           702:        CRYPT_CERTINFO_ISSUINGDIST_CACERTSONLY, /* onlyContainsCACerts */
        !           703:        CRYPT_CERTINFO_ISSUINGDIST_SOMEREASONSONLY,     /* onlySomeReasons */
        !           704:        CRYPT_CERTINFO_ISSUINGDIST_INDIRECTCRL, /* indirectCRL */
        !           705: 
        !           706:        /* 2 5 29 29 certificateIssuer */
        !           707:        CRYPT_CERTINFO_CERTIFICATEISSUER,
        !           708: 
        !           709:        /* 2 5 29 30 nameConstraints */
        !           710:        CRYPT_CERTINFO_NAMECONSTRAINTS,
        !           711:        CRYPT_CERTINFO_PERMITTEDSUBTREES,               /* permittedSubtrees */
        !           712:        CRYPT_CERTINFO_EXCLUDEDSUBTREES,                /* excludedSubtrees */
        !           713: 
        !           714:        /* 2 5 29 31 cRLDistributionPoint */
        !           715:        CRYPT_CERTINFO_CRLDISTRIBUTIONPOINT,
        !           716:        CRYPT_CERTINFO_CRLDIST_FULLNAME,                /* distributionPointName.fullName */
        !           717:        CRYPT_CERTINFO_CRLDIST_REASONS,                 /* reasons */
        !           718:        CRYPT_CERTINFO_CRLDIST_CRLISSUER,               /* cRLIssuer */
        !           719: 
        !           720:        /* 2 5 29 32 certificatePolicies */
        !           721:        CRYPT_CERTINFO_CERTIFICATEPOLICIES,
        !           722:        CRYPT_CERTINFO_CERTPOLICYID,            /* policyInformation.policyIdentifier */
        !           723:        CRYPT_CERTINFO_CERTPOLICY_CPSURI,
        !           724:                /* policyInformation.policyQualifiers.qualifier.cPSuri */
        !           725:        CRYPT_CERTINFO_CERTPOLICY_ORGANIZATION,
        !           726:                /* policyInformation.policyQualifiers.qualifier.userNotice.noticeRef.organization */
        !           727:        CRYPT_CERTINFO_CERTPOLICY_NOTICENUMBERS,
        !           728:                /* policyInformation.policyQualifiers.qualifier.userNotice.noticeRef.noticeNumbers */
        !           729:        CRYPT_CERTINFO_CERTPOLICY_EXPLICITTEXT,
        !           730:                /* policyInformation.policyQualifiers.qualifier.userNotice.explicitText */
        !           731: 
        !           732:        /* 2 5 29 33 policyMappings */
        !           733:        CRYPT_CERTINFO_POLICYMAPPINGS,
        !           734:        CRYPT_CERTINFO_ISSUERDOMAINPOLICY,      /* policyMappings.issuerDomainPolicy */
        !           735:        CRYPT_CERTINFO_SUBJECTDOMAINPOLICY,     /* policyMappings.subjectDomainPolicy */
        !           736: 
        !           737:        /* 2 5 29 35 authorityKeyIdentifier */
        !           738:        CRYPT_CERTINFO_AUTHORITYKEYIDENTIFIER,
        !           739:        CRYPT_CERTINFO_AUTHORITY_KEYIDENTIFIER, /* keyIdentifier */
        !           740:        CRYPT_CERTINFO_AUTHORITY_CERTISSUER,    /* authorityCertIssuer */
        !           741:        CRYPT_CERTINFO_AUTHORITY_CERTSERIALNUMBER,      /* authorityCertSerialNumber */
        !           742: 
        !           743:        /* 2 5 29 36 policyConstraints */
        !           744:        CRYPT_CERTINFO_POLICYCONSTRAINTS,
        !           745:        CRYPT_CERTINFO_REQUIREEXPLICITPOLICY,   /* policyConstraints.requireExplicitPolicy */
        !           746:        CRYPT_CERTINFO_INHIBITPOLICYMAPPING,    /* policyConstraints.inhibitPolicyMapping */
        !           747: 
        !           748:        /* 2 5 29 37 extKeyUsage */
        !           749:        CRYPT_CERTINFO_EXTKEYUSAGE,
        !           750:        CRYPT_CERTINFO_EXTKEY_MS_INDIVIDUALCODESIGNING, /* individualCodeSigning */
        !           751:        CRYPT_CERTINFO_EXTKEY_MS_COMMERCIALCODESIGNING, /* commercialCodeSigning */
        !           752:        CRYPT_CERTINFO_EXTKEY_MS_CERTTRUSTLISTSIGNING,  /* certTrustListSigning */
        !           753:        CRYPT_CERTINFO_EXTKEY_MS_TIMESTAMPSIGNING,      /* timeStampSigning */
        !           754:        CRYPT_CERTINFO_EXTKEY_MS_SERVERGATEDCRYPTO,     /* serverGatedCrypto */
        !           755:        CRYPT_CERTINFO_EXTKEY_MS_ENCRYPTEDFILESYSTEM,   /* encrypedFileSystem */
        !           756:        CRYPT_CERTINFO_EXTKEY_SERVERAUTH,               /* serverAuth */
        !           757:        CRYPT_CERTINFO_EXTKEY_CLIENTAUTH,               /* clientAuth */
        !           758:        CRYPT_CERTINFO_EXTKEY_CODESIGNING,              /* codeSigning */
        !           759:        CRYPT_CERTINFO_EXTKEY_EMAILPROTECTION,  /* emailProtection */
        !           760:        CRYPT_CERTINFO_EXTKEY_IPSECENDSYSTEM,   /* ipsecEndSystem */
        !           761:        CRYPT_CERTINFO_EXTKEY_IPSECTUNNEL,              /* ipsecTunnel */
        !           762:        CRYPT_CERTINFO_EXTKEY_IPSECUSER,                /* ipsecUser */
        !           763:        CRYPT_CERTINFO_EXTKEY_TIMESTAMPING,             /* timeStamping */
        !           764:        CRYPT_CERTINFO_EXTKEY_OCSPSIGNING,              /* ocspSigning */
        !           765:        CRYPT_CERTINFO_EXTKEY_DIRECTORYSERVICE, /* directoryService */
        !           766:        CRYPT_CERTINFO_EXTKEY_ANYKEYUSAGE,              /* anyExtendedKeyUsage */
        !           767:        CRYPT_CERTINFO_EXTKEY_NS_SERVERGATEDCRYPTO,     /* serverGatedCrypto */
        !           768:        CRYPT_CERTINFO_EXTKEY_VS_SERVERGATEDCRYPTO_CA,  /* serverGatedCrypto CA */
        !           769: 
        !           770:        /* 2 5 29 46 freshestCRL */
        !           771:        CRYPT_CERTINFO_FRESHESTCRL,
        !           772:        CRYPT_CERTINFO_FRESHESTCRL_FULLNAME,    /* distributionPointName.fullName */
        !           773:        CRYPT_CERTINFO_FRESHESTCRL_REASONS,             /* reasons */
        !           774:        CRYPT_CERTINFO_FRESHESTCRL_CRLISSUER,   /* cRLIssuer */
        !           775: 
        !           776:        /* 2 5 29 54 inhibitAnyPolicy */
        !           777:        CRYPT_CERTINFO_INHIBITANYPOLICY,
        !           778: 
        !           779:        /* 2 16 840 1 113730 1 x Netscape extensions */
        !           780:        CRYPT_CERTINFO_NS_CERTTYPE,                             /* netscape-cert-type */
        !           781:        CRYPT_CERTINFO_NS_BASEURL,                              /* netscape-base-url */
        !           782:        CRYPT_CERTINFO_NS_REVOCATIONURL,                /* netscape-revocation-url */
        !           783:        CRYPT_CERTINFO_NS_CAREVOCATIONURL,              /* netscape-ca-revocation-url */
        !           784:        CRYPT_CERTINFO_NS_CERTRENEWALURL,               /* netscape-cert-renewal-url */
        !           785:        CRYPT_CERTINFO_NS_CAPOLICYURL,                  /* netscape-ca-policy-url */
        !           786:        CRYPT_CERTINFO_NS_SSLSERVERNAME,                /* netscape-ssl-server-name */
        !           787:        CRYPT_CERTINFO_NS_COMMENT,                              /* netscape-comment */
        !           788: 
        !           789:        /* 2 23 42 7 0 SET hashedRootKey */
        !           790:        CRYPT_CERTINFO_SET_HASHEDROOTKEY,
        !           791:        CRYPT_CERTINFO_SET_ROOTKEYTHUMBPRINT,   /* rootKeyThumbPrint */
        !           792: 
        !           793:        /* 2 23 42 7 1 SET certificateType */
        !           794:        CRYPT_CERTINFO_SET_CERTIFICATETYPE,
        !           795: 
        !           796:        /* 2 23 42 7 2 SET merchantData */
        !           797:        CRYPT_CERTINFO_SET_MERCHANTDATA,
        !           798:        CRYPT_CERTINFO_SET_MERID,                               /* merID */
        !           799:        CRYPT_CERTINFO_SET_MERACQUIRERBIN,              /* merAcquirerBIN */
        !           800:        CRYPT_CERTINFO_SET_MERCHANTLANGUAGE,    /* merNames.language */
        !           801:        CRYPT_CERTINFO_SET_MERCHANTNAME,                /* merNames.name */
        !           802:        CRYPT_CERTINFO_SET_MERCHANTCITY,                /* merNames.city */
        !           803:        CRYPT_CERTINFO_SET_MERCHANTSTATEPROVINCE,/* merNames.stateProvince */
        !           804:        CRYPT_CERTINFO_SET_MERCHANTPOSTALCODE,  /* merNames.postalCode */
        !           805:        CRYPT_CERTINFO_SET_MERCHANTCOUNTRYNAME, /* merNames.countryName */
        !           806:        CRYPT_CERTINFO_SET_MERCOUNTRY,                  /* merCountry */
        !           807:        CRYPT_CERTINFO_SET_MERAUTHFLAG,                 /* merAuthFlag */
        !           808: 
        !           809:        /* 2 23 42 7 3 SET certCardRequired */
        !           810:        CRYPT_CERTINFO_SET_CERTCARDREQUIRED,
        !           811: 
        !           812:        /* 2 23 42 7 4 SET tunneling */
        !           813:        CRYPT_CERTINFO_SET_TUNNELING,
        !           814:                CRYPT_CERTINFO_SET_TUNNELLING = CRYPT_CERTINFO_SET_TUNNELING,
        !           815:        CRYPT_CERTINFO_SET_TUNNELINGFLAG,               /* tunneling */
        !           816:                CRYPT_CERTINFO_SET_TUNNELLINGFLAG = CRYPT_CERTINFO_SET_TUNNELINGFLAG,
        !           817:        CRYPT_CERTINFO_SET_TUNNELINGALGID,              /* tunnelingAlgID */
        !           818:                CRYPT_CERTINFO_SET_TUNNELLINGALGID = CRYPT_CERTINFO_SET_TUNNELINGALGID,
        !           819: 
        !           820:        /* S/MIME attributes */
        !           821: 
        !           822:        /* 1 2 840 113549 1 9 3 contentType */
        !           823:        CRYPT_CERTINFO_CMS_CONTENTTYPE = CRYPT_CERTINFO_FIRST + 500,
        !           824: 
        !           825:        /* 1 2 840 113549 1 9 4 messageDigest */
        !           826:        CRYPT_CERTINFO_CMS_MESSAGEDIGEST,
        !           827: 
        !           828:        /* 1 2 840 113549 1 9 5 signingTime */
        !           829:        CRYPT_CERTINFO_CMS_SIGNINGTIME,
        !           830: 
        !           831:        /* 1 2 840 113549 1 9 6 counterSignature */
        !           832:        CRYPT_CERTINFO_CMS_COUNTERSIGNATURE,    /* counterSignature */
        !           833: 
        !           834:        /* 1 2 840 113549 1 9 13 signingDescription */
        !           835:        CRYPT_CERTINFO_CMS_SIGNINGDESCRIPTION,
        !           836: 
        !           837:        /* 1 2 840 113549 1 9 15 sMIMECapabilities */
        !           838:        CRYPT_CERTINFO_CMS_SMIMECAPABILITIES,
        !           839:        CRYPT_CERTINFO_CMS_SMIMECAP_3DES,               /* 3DES encryption */
        !           840:        CRYPT_CERTINFO_CMS_SMIMECAP_AES,                /* AES encryption */
        !           841:        CRYPT_CERTINFO_CMS_SMIMECAP_CAST128,    /* CAST-128 encryption */
        !           842:        CRYPT_CERTINFO_CMS_SMIMECAP_IDEA,               /* IDEA encryption */
        !           843:        CRYPT_CERTINFO_CMS_SMIMECAP_RC2,                /* RC2 encryption (w.128 key) */
        !           844:        CRYPT_CERTINFO_CMS_SMIMECAP_RC5,                /* RC5 encryption (w.128 key) */
        !           845:        CRYPT_CERTINFO_CMS_SMIMECAP_SKIPJACK,   /* Skipjack encryption */
        !           846:        CRYPT_CERTINFO_CMS_SMIMECAP_DES,                /* DES encryption */
        !           847:        CRYPT_CERTINFO_CMS_SMIMECAP_PREFERSIGNEDDATA,   /* preferSignedData */
        !           848:        CRYPT_CERTINFO_CMS_SMIMECAP_CANNOTDECRYPTANY,   /* canNotDecryptAny */
        !           849: 
        !           850:        /* 1 2 840 113549 1 9 16 2 1 receiptRequest */
        !           851:        CRYPT_CERTINFO_CMS_RECEIPTREQUEST,
        !           852:        CRYPT_CERTINFO_CMS_RECEIPT_CONTENTIDENTIFIER, /* contentIdentifier */
        !           853:        CRYPT_CERTINFO_CMS_RECEIPT_FROM,                /* receiptsFrom */
        !           854:        CRYPT_CERTINFO_CMS_RECEIPT_TO,                  /* receiptsTo */
        !           855: 
        !           856:        /* 1 2 840 113549 1 9 16 2 2 essSecurityLabel */
        !           857:        CRYPT_CERTINFO_CMS_SECURITYLABEL,
        !           858:        CRYPT_CERTINFO_CMS_SECLABEL_POLICY,             /* securityPolicyIdentifier */
        !           859:        CRYPT_CERTINFO_CMS_SECLABEL_CLASSIFICATION, /* securityClassification */
        !           860:        CRYPT_CERTINFO_CMS_SECLABEL_PRIVACYMARK,/* privacyMark */
        !           861:        CRYPT_CERTINFO_CMS_SECLABEL_CATTYPE,    /* securityCategories.securityCategory.type */
        !           862:        CRYPT_CERTINFO_CMS_SECLABEL_CATVALUE,   /* securityCategories.securityCategory.value */
        !           863: 
        !           864:        /* 1 2 840 113549 1 9 16 2 3 mlExpansionHistory */
        !           865:        CRYPT_CERTINFO_CMS_MLEXPANSIONHISTORY,
        !           866:        CRYPT_CERTINFO_CMS_MLEXP_ENTITYIDENTIFIER, /* mlData.mailListIdentifier.issuerAndSerialNumber */
        !           867:        CRYPT_CERTINFO_CMS_MLEXP_TIME,                  /* mlData.expansionTime */
        !           868:        CRYPT_CERTINFO_CMS_MLEXP_NONE,                  /* mlData.mlReceiptPolicy.none */
        !           869:        CRYPT_CERTINFO_CMS_MLEXP_INSTEADOF,             /* mlData.mlReceiptPolicy.insteadOf.generalNames.generalName */
        !           870:        CRYPT_CERTINFO_CMS_MLEXP_INADDITIONTO,  /* mlData.mlReceiptPolicy.inAdditionTo.generalNames.generalName */
        !           871: 
        !           872:        /* 1 2 840 113549 1 9 16 2 4 contentHints */
        !           873:        CRYPT_CERTINFO_CMS_CONTENTHINTS,
        !           874:        CRYPT_CERTINFO_CMS_CONTENTHINT_DESCRIPTION,     /* contentDescription */
        !           875:        CRYPT_CERTINFO_CMS_CONTENTHINT_TYPE,    /* contentType */
        !           876: 
        !           877:        /* 1 2 840 113549 1 9 16 2 9 equivalentLabels */
        !           878:        CRYPT_CERTINFO_CMS_EQUIVALENTLABEL,
        !           879:        CRYPT_CERTINFO_CMS_EQVLABEL_POLICY,             /* securityPolicyIdentifier */
        !           880:        CRYPT_CERTINFO_CMS_EQVLABEL_CLASSIFICATION, /* securityClassification */
        !           881:        CRYPT_CERTINFO_CMS_EQVLABEL_PRIVACYMARK,/* privacyMark */
        !           882:        CRYPT_CERTINFO_CMS_EQVLABEL_CATTYPE,    /* securityCategories.securityCategory.type */
        !           883:        CRYPT_CERTINFO_CMS_EQVLABEL_CATVALUE,   /* securityCategories.securityCategory.value */
        !           884: 
        !           885:        /* 1 2 840 113549 1 9 16 2 12 signingCertificate */
        !           886:        CRYPT_CERTINFO_CMS_SIGNINGCERTIFICATE,
        !           887:        CRYPT_CERTINFO_CMS_SIGNINGCERT_ESSCERTID, /* certs.essCertID */
        !           888:        CRYPT_CERTINFO_CMS_SIGNINGCERT_POLICIES,/* policies.policyInformation.policyIdentifier */
        !           889: 
        !           890:        /* 1 2 840 113549 1 9 16 2 15 signaturePolicyID */
        !           891:        CRYPT_CERTINFO_CMS_SIGNATUREPOLICYID,
        !           892:        CRYPT_CERTINFO_CMS_SIGPOLICYID,                 /* sigPolicyID */
        !           893:        CRYPT_CERTINFO_CMS_SIGPOLICYHASH,               /* sigPolicyHash */
        !           894:        CRYPT_CERTINFO_CMS_SIGPOLICY_CPSURI,    /* sigPolicyQualifiers.sigPolicyQualifier.cPSuri */
        !           895:        CRYPT_CERTINFO_CMS_SIGPOLICY_ORGANIZATION,
        !           896:                /* sigPolicyQualifiers.sigPolicyQualifier.userNotice.noticeRef.organization */
        !           897:        CRYPT_CERTINFO_CMS_SIGPOLICY_NOTICENUMBERS,
        !           898:                /* sigPolicyQualifiers.sigPolicyQualifier.userNotice.noticeRef.noticeNumbers */
        !           899:        CRYPT_CERTINFO_CMS_SIGPOLICY_EXPLICITTEXT,
        !           900:                /* sigPolicyQualifiers.sigPolicyQualifier.userNotice.explicitText */
        !           901: 
        !           902:        /* 1 2 840 113549 1 9 16 9 signatureTypeIdentifier */
        !           903:        CRYPT_CERTINFO_CMS_SIGTYPEIDENTIFIER,
        !           904:        CRYPT_CERTINFO_CMS_SIGTYPEID_ORIGINATORSIG, /* originatorSig */
        !           905:        CRYPT_CERTINFO_CMS_SIGTYPEID_DOMAINSIG, /* domainSig */
        !           906:        CRYPT_CERTINFO_CMS_SIGTYPEID_ADDITIONALATTRIBUTES, /* additionalAttributesSig */
        !           907:        CRYPT_CERTINFO_CMS_SIGTYPEID_REVIEWSIG, /* reviewSig */
        !           908: 
        !           909:        /* 1 2 840 113549 1 9 25 3 randomNonce */
        !           910:        CRYPT_CERTINFO_CMS_NONCE,                               /* randomNonce */
        !           911: 
        !           912:        /* SCEP attributes:
        !           913:           2 16 840 1 113733 1 9 2 messageType
        !           914:           2 16 840 1 113733 1 9 3 pkiStatus
        !           915:           2 16 840 1 113733 1 9 4 failInfo
        !           916:           2 16 840 1 113733 1 9 5 senderNonce
        !           917:           2 16 840 1 113733 1 9 6 recipientNonce
        !           918:           2 16 840 1 113733 1 9 7 transID */
        !           919:        CRYPT_CERTINFO_SCEP_MESSAGETYPE,                /* messageType */
        !           920:        CRYPT_CERTINFO_SCEP_PKISTATUS,                  /* pkiStatus */
        !           921:        CRYPT_CERTINFO_SCEP_FAILINFO,                   /* failInfo */
        !           922:        CRYPT_CERTINFO_SCEP_SENDERNONCE,                /* senderNonce */
        !           923:        CRYPT_CERTINFO_SCEP_RECIPIENTNONCE,             /* recipientNonce */
        !           924:        CRYPT_CERTINFO_SCEP_TRANSACTIONID,              /* transID */
        !           925: 
        !           926:        /* 1 3 6 1 4 1 311 2 1 10 spcAgencyInfo */
        !           927:        CRYPT_CERTINFO_CMS_SPCAGENCYINFO,
        !           928:        CRYPT_CERTINFO_CMS_SPCAGENCYURL,                /* spcAgencyInfo.url */
        !           929: 
        !           930:        /* 1 3 6 1 4 1 311 2 1 11 spcStatementType */
        !           931:        CRYPT_CERTINFO_CMS_SPCSTATEMENTTYPE,
        !           932:        CRYPT_CERTINFO_CMS_SPCSTMT_INDIVIDUALCODESIGNING,       /* individualCodeSigning */
        !           933:        CRYPT_CERTINFO_CMS_SPCSTMT_COMMERCIALCODESIGNING,       /* commercialCodeSigning */
        !           934: 
        !           935:        /* 1 3 6 1 4 1 311 2 1 12 spcOpusInfo */
        !           936:        CRYPT_CERTINFO_CMS_SPCOPUSINFO,
        !           937:        CRYPT_CERTINFO_CMS_SPCOPUSINFO_NAME,    /* spcOpusInfo.name */
        !           938:        CRYPT_CERTINFO_CMS_SPCOPUSINFO_URL,             /* spcOpusInfo.url */
        !           939: 
        !           940:        /* Used internally */
        !           941:        CRYPT_CERTINFO_LAST, CRYPT_KEYINFO_FIRST = 3000,
        !           942: 
        !           943:        /*********************/
        !           944:        /* Keyset attributes */
        !           945:        /*********************/
        !           946: 
        !           947:        CRYPT_KEYINFO_QUERY,                    /* Keyset query */
        !           948:        CRYPT_KEYINFO_QUERY_REQUESTS,   /* Query of requests in cert store */
        !           949: 
        !           950:        /* Used internally */
        !           951:        CRYPT_KEYINFO_LAST, CRYPT_DEVINFO_FIRST = 4000,
        !           952: 
        !           953:        /*********************/
        !           954:        /* Device attributes */
        !           955:        /*********************/
        !           956: 
        !           957:        CRYPT_DEVINFO_INITIALISE,       /* Initialise device for use */
        !           958:                CRYPT_DEVINFO_INITIALIZE = CRYPT_DEVINFO_INITIALISE,
        !           959:        CRYPT_DEVINFO_AUTHENT_USER,     /* Authenticate user to device */
        !           960:        CRYPT_DEVINFO_AUTHENT_SUPERVISOR,       /* Authenticate supervisor to dev.*/
        !           961:        CRYPT_DEVINFO_SET_AUTHENT_USER, /* Set user authent.value */
        !           962:        CRYPT_DEVINFO_SET_AUTHENT_SUPERVISOR,   /* Set supervisor auth.val.*/
        !           963:        CRYPT_DEVINFO_ZEROISE,  /* Zeroise device */
        !           964:                CRYPT_DEVINFO_ZEROIZE = CRYPT_DEVINFO_ZEROISE,
        !           965:        CRYPT_DEVINFO_LOGGEDIN,         /* Whether user is logged in */
        !           966:        CRYPT_DEVINFO_LABEL,            /* Device/token label */
        !           967: 
        !           968:        /* Used internally */
        !           969:        CRYPT_DEVINFO_LAST, CRYPT_ENVINFO_FIRST = 5000,
        !           970: 
        !           971:        /***********************/
        !           972:        /* Envelope attributes */
        !           973:        /***********************/
        !           974: 
        !           975:        /* Pseudo-information on an envelope or meta-information which is used to
        !           976:           control the way that data in an envelope is processed */
        !           977:        CRYPT_ENVINFO_DATASIZE,                 /* Data size information */
        !           978:        CRYPT_ENVINFO_COMPRESSION,              /* Compression information */
        !           979:        CRYPT_ENVINFO_CONTENTTYPE,              /* Inner CMS content type */
        !           980:        CRYPT_ENVINFO_DETACHEDSIGNATURE,/* Generate CMS detached signature */
        !           981:        CRYPT_ENVINFO_SIGNATURE_RESULT, /* Signature check result */
        !           982:        CRYPT_ENVINFO_MAC,                              /* Use MAC instead of encrypting */
        !           983: 
        !           984:        /* Resources required for enveloping/deenveloping */
        !           985:        CRYPT_ENVINFO_PASSWORD,                 /* User password */
        !           986:        CRYPT_ENVINFO_KEY,                              /* Conventional encryption key */
        !           987:        CRYPT_ENVINFO_SIGNATURE,                /* Signature/signature check key */
        !           988:        CRYPT_ENVINFO_SIGNATURE_EXTRADATA,      /* Extra information added to CMS sigs */
        !           989:        CRYPT_ENVINFO_RECIPIENT,                /* Recipient email address */
        !           990:        CRYPT_ENVINFO_PUBLICKEY,                /* PKC encryption key */
        !           991:        CRYPT_ENVINFO_PRIVATEKEY,               /* PKC decryption key */
        !           992:        CRYPT_ENVINFO_PRIVATEKEY_LABEL, /* Label of PKC decryption key */
        !           993:        CRYPT_ENVINFO_ORIGINATOR,               /* Originator info/key */
        !           994:        CRYPT_ENVINFO_SESSIONKEY,               /* Session key */
        !           995:        CRYPT_ENVINFO_HASH,                             /* Hash value */
        !           996:        CRYPT_ENVINFO_TIMESTAMP,                /* Timestamp information */
        !           997: 
        !           998:        /* Keysets used to retrieve keys needed for enveloping/deenveloping */
        !           999:        CRYPT_ENVINFO_KEYSET_SIGCHECK,  /* Signature check keyset */
        !          1000:        CRYPT_ENVINFO_KEYSET_ENCRYPT,   /* PKC encryption keyset */
        !          1001:        CRYPT_ENVINFO_KEYSET_DECRYPT,   /* PKC decryption keyset */
        !          1002: 
        !          1003:        /* Used internally */
        !          1004:        CRYPT_ENVINFO_LAST, CRYPT_SESSINFO_FIRST = 6000,
        !          1005: 
        !          1006:        /**********************/
        !          1007:        /* Session attributes */
        !          1008:        /**********************/
        !          1009: 
        !          1010:        /* Pseudo-information about the session */
        !          1011:        CRYPT_SESSINFO_ACTIVE,                  /* Whether session is active */
        !          1012:        CRYPT_SESSINFO_CONNECTIONACTIVE,/* Whether network connection is active */
        !          1013: 
        !          1014:        /* Security-related information */
        !          1015:        CRYPT_SESSINFO_USERNAME,                /* User name */
        !          1016:        CRYPT_SESSINFO_PASSWORD,                /* Password */
        !          1017:        CRYPT_SESSINFO_PRIVATEKEY,              /* Server/client private key */
        !          1018:        CRYPT_SESSINFO_KEYSET,                  /* Certificate store */
        !          1019:        CRYPT_SESSINFO_AUTHRESPONSE,    /* Session authorisation OK */
        !          1020: 
        !          1021:        /* Client/server information */
        !          1022:        CRYPT_SESSINFO_SERVER_NAME,             /* Server name */
        !          1023:        CRYPT_SESSINFO_SERVER_PORT,             /* Server port number */
        !          1024:        CRYPT_SESSINFO_SERVER_FINGERPRINT,/* Server key fingerprint */
        !          1025:        CRYPT_SESSINFO_CLIENT_NAME,             /* Client name */
        !          1026:        CRYPT_SESSINFO_CLIENT_PORT,             /* Client port number */
        !          1027:        CRYPT_SESSINFO_SESSION,                 /* Transport mechanism */
        !          1028:        CRYPT_SESSINFO_NETWORKSOCKET,   /* User-supplied network socket */
        !          1029: 
        !          1030:        /* Generic protocol-related information */
        !          1031:        CRYPT_SESSINFO_VERSION,                 /* Protocol version */
        !          1032:        CRYPT_SESSINFO_REQUEST,                 /* Cert.request object */
        !          1033:        CRYPT_SESSINFO_RESPONSE,                /* Cert.response object */
        !          1034:        CRYPT_SESSINFO_CACERTIFICATE,   /* Issuing CA certificate */
        !          1035: 
        !          1036:        /* Protocol-specific information */
        !          1037:        CRYPT_SESSINFO_TSP_MSGIMPRINT,  /* TSP message imprint */
        !          1038:        CRYPT_SESSINFO_CMP_REQUESTTYPE, /* Request type */
        !          1039:        CRYPT_SESSINFO_CMP_PKIBOOT,             /* Enable PKIBoot facility */
        !          1040:        CRYPT_SESSINFO_CMP_PRIVKEYSET,  /* Private-key keyset */
        !          1041:        CRYPT_SESSINFO_SSH_CHANNEL,             /* SSH current channel */
        !          1042:        CRYPT_SESSINFO_SSH_CHANNEL_TYPE,/* SSH channel type */
        !          1043:        CRYPT_SESSINFO_SSH_CHANNEL_ARG1,/* SSH channel argument 1 */
        !          1044:        CRYPT_SESSINFO_SSH_CHANNEL_ARG2,/* SSH channel argument 2 */
        !          1045:        CRYPT_SESSINFO_SSH_CHANNEL_ACTIVE,/* SSH channel active */
        !          1046: 
        !          1047:        /* Used internally */
        !          1048:        CRYPT_SESSINFO_LAST, CRYPT_USERINFO_FIRST = 7000,
        !          1049: 
        !          1050:        /**********************/
        !          1051:        /* User attributes */
        !          1052:        /**********************/
        !          1053: 
        !          1054:        /* Security-related information */
        !          1055:        CRYPT_USERINFO_PASSWORD,                /* Password */
        !          1056: 
        !          1057:        /* User role-related information */
        !          1058:        CRYPT_USERINFO_CAKEY_CERTSIGN,  /* CA cert signing key */
        !          1059:        CRYPT_USERINFO_CAKEY_CRLSIGN,   /* CA CRL signing key */
        !          1060:        CRYPT_USERINFO_CAKEY_RTCSSIGN,  /* CA RTCS signing key */
        !          1061:        CRYPT_USERINFO_CAKEY_OCSPSIGN,  /* CA OCSP signing key */
        !          1062: 
        !          1063:        /* Used internally for range checking */
        !          1064:        CRYPT_USERINFO_LAST, CRYPT_ATTRIBUTE_LAST = CRYPT_USERINFO_LAST
        !          1065: 
        !          1066: #ifdef _CRYPT_DEFINED
        !          1067:        /***********************/
        !          1068:        /* Internal attributes */
        !          1069:        /***********************/
        !          1070: 
        !          1071:        /* The following attributes are only visible internally and are protected
        !          1072:           from any external access by the kernel (and for good measure by checks
        !          1073:           in other places as well).  The two attributes CRYPT_IATTRIBUTE_KEY_SPKI
        !          1074:           and CRYPT_IATTRIBUTE_SPKI are actually the same thing, the difference
        !          1075:           is that the former is write-only for contexts and the latter is read-
        !          1076:           only for certificates (the former is used when loading a context from
        !          1077:           a key contained in a device, where the actual key components aren't
        !          1078:           directly available in the context but may be needed in the future for
        !          1079:           things like cert requests).  Because a single object can act as both a
        !          1080:           context and a cert, having two explicitly different attribute names
        !          1081:           makes things less confusing.  In addition, some public-key attributes
        !          1082:           have _PARTIAL variants that load the public-key components but don't
        !          1083:           initialise the key/move the context into the high state.  This is
        !          1084:           used for formats in which public and private-key components are loaded
        !          1085:           separately */
        !          1086:        , CRYPT_IATTRIBUTE_FIRST = 8000,
        !          1087:        CRYPT_IATTRIBUTE_TYPE,                  /* Object type */
        !          1088:        CRYPT_IATTRIBUTE_SUBTYPE,               /* Object subtype */
        !          1089:        CRYPT_IATTRIBUTE_STATUS,                /* Object status */
        !          1090:        CRYPT_IATTRIBUTE_INTERNAL,              /* Object internal flag */
        !          1091:        CRYPT_IATTRIBUTE_ACTIONPERMS,   /* Object action permissions */
        !          1092:        CRYPT_IATTRIBUTE_LOCKED,                /* Object locked for exclusive use */
        !          1093:        CRYPT_IATTRIBUTE_INITIALISED,   /* Object inited (in high state) */
        !          1094:        CRYPT_IATTRIBUTE_KEYSIZE,               /* Ctx: Key size (written to non-native ctxs) */
        !          1095:        CRYPT_IATTRIBUTE_KEYFEATURES,   /* Ctx: Key feature info */
        !          1096:        CRYPT_IATTRIBUTE_KEYID,                 /* Ctx: Key ID */
        !          1097:        CRYPT_IATTRIBUTE_KEYID_PGP,             /* Ctx: PGP key ID */
        !          1098:        CRYPT_IATTRIBUTE_KEYID_OPENPGP, /* Ctx: OpenPGP key ID */
        !          1099:        CRYPT_IATTRIBUTE_KEY_KEADOMAINPARAMS,/* Ctx: Key agreement domain parameters */
        !          1100:        CRYPT_IATTRIBUTE_KEY_KEAPUBLICVALUE,/* Ctx: Key agreement public value */
        !          1101:        CRYPT_IATTRIBUTE_KEY_SPKI,              /* Ctx: SubjectPublicKeyInfo */
        !          1102:        CRYPT_IATTRIBUTE_KEY_PGP,               /* Ctx: PGP-format public key */
        !          1103:        CRYPT_IATTRIBUTE_KEY_SSH,               /* Ctx: SSH-format public key */
        !          1104:        CRYPT_IATTRIBUTE_KEY_SSH1,              /* Ctx: SSHv1-format public key */
        !          1105:        CRYPT_IATTRIBUTE_KEY_SSL,               /* Ctx: SSL-format public key */
        !          1106:        CRYPT_IATTRIBUTE_KEY_SPKI_PARTIAL,/* Ctx: SubjectPublicKeyInfo w/o trigger */
        !          1107:        CRYPT_IATTRIBUTE_KEY_PGP_PARTIAL,/* Ctx: PGP public key w/o trigger */
        !          1108:        CRYPT_IATTRIBUTE_PGPVALIDITY,   /* Ctx: PGP key validity */
        !          1109:        CRYPT_IATTRIBUTE_DEVICEOBJECT,  /* Ctx: Device object handle */
        !          1110:        CRYPT_IATTRIBUTE_CRLENTRY,              /* Cert: Individual entry from CRL */
        !          1111:        CRYPT_IATTRIBUTE_SUBJECT,               /* Cert: SubjectName */
        !          1112:        CRYPT_IATTRIBUTE_ISSUER,                /* Cert: IssuerName */
        !          1113:        CRYPT_IATTRIBUTE_ISSUERANDSERIALNUMBER, /* Cert: IssuerAndSerial */
        !          1114:        CRYPT_IATTRIBUTE_SPKI,                  /* Cert: Encoded SubjectPublicKeyInfo */
        !          1115:        CRYPT_IATTRIBUTE_CERTHASHALGO,  /* Cert: Hash algo.used for cert */
        !          1116:        CRYPT_IATTRIBUTE_CERTCOLLECTION,/* Cert: Certs added to cert chain */
        !          1117:        CRYPT_IATTRIBUTE_RESPONDERURL,  /* Cert: RTCS/OCSP responder name */
        !          1118:        CRYPT_IATTRIBUTE_RTCSREQUEST,   /* Cert: RTCS req.info added to RTCS resp.*/
        !          1119:        CRYPT_IATTRIBUTE_OCSPREQUEST,   /* Cert: OCSP req.info added to OCSP resp.*/
        !          1120:        CRYPT_IATTRIBUTE_REVREQUEST,    /* Cert: CRMF rev.request added to CRL */
        !          1121:        CRYPT_IATTRIBUTE_PKIUSERINFO,   /* Cert: Additional user info added to cert.req.*/
        !          1122:        CRYPT_IATTRIBUTE_BLOCKEDATTRS,  /* Cert: Template of disallowed attrs.in cert */
        !          1123:        CRYPT_IATTRIBUTE_AUTHCERTID,    /* Cert: Authorising cert ID for a cert/rev.req.*/
        !          1124:        CRYPT_IATTRIBUTE_ESSCERTID,             /* Cert: ESSCertID */
        !          1125:        CRYPT_IATTRIBUTE_ENTROPY,               /* Dev: Polled entropy data */
        !          1126:        CRYPT_IATTRIBUTE_ENTROPY_QUALITY,/* Dev: Quality of entropy data */
        !          1127:        CRYPT_IATTRIBUTE_RANDOM_LOPICKET,/* Dev: Low picket for random data attrs.*/
        !          1128:        CRYPT_IATTRIBUTE_RANDOM,                /* Dev: Random data */
        !          1129:        CRYPT_IATTRIBUTE_RANDOM_NZ,             /* Dev: Nonzero random data */
        !          1130:        CRYPT_IATTRIBUTE_RANDOM_HIPICKET,/* Dev: High picket for random data attrs.*/
        !          1131:        CRYPT_IATTRIBUTE_RANDOM_NONCE,  /* Dev: Basic nonce */
        !          1132:        CRYPT_IATTRIBUTE_SELFTEST,              /* Dev: Perform self-test */
        !          1133:        CRYPT_IATTRIBUTE_TIME,                  /* Dev: Reliable (hardware-based) time value */
        !          1134:        CRYPT_IATTRIBUTE_INCLUDESIGCERT,/* Env: Whether to include signing cert(s) */
        !          1135:        CRYPT_IATTRIBUTE_ATTRONLY,              /* Env: Signed data contains only CMS attrs.*/
        !          1136:        CRYPT_IATTRIBUTE_CONFIGDATA,    /* Keyset: Config information */
        !          1137:        CRYPT_IATTRIBUTE_USERINDEX,             /* Keyset: Index of users */
        !          1138:        CRYPT_IATTRIBUTE_USERID,                /* Keyset: User ID */
        !          1139:        CRYPT_IATTRIBUTE_USERINFO,              /* Keyset: User information */
        !          1140:        CRYPT_IATTRIBUTE_TRUSTEDCERT,   /* Keyset: First trusted cert */
        !          1141:        CRYPT_IATTRIBUTE_TRUSTEDCERT_NEXT,      /* Keyset: Successive trusted certs */
        !          1142:        CRYPT_IATTRIBUTE_ENC_TIMESTAMP, /* Session: Encoded TSA timestamp */
        !          1143:        CRYPT_IATTRUBUTE_CERTKEYSET,    /* User: Keyset to send trusted certs to */
        !          1144:        CRYPT_IATTRIBUTE_CTL,                   /* User: Cert.trust list */
        !          1145:        CRYPT_IATTRIBUTE_CERT_TRUSTED,  /* User: Set trusted cert */
        !          1146:        CRYPT_IATTRIBUTE_CERT_UNTRUSTED,/* User: Unset trusted cert */
        !          1147:        CRYPT_IATTRIBUTE_CERT_CHECKTRUST,/* User: Check trust status of cert */
        !          1148:        CRYPT_IATTRIBUTE_CERT_TRUSTEDISSUER,/* User: Get trusted issuer of cert */
        !          1149:        CRYPT_IATTRIBUTE_LAST,
        !          1150: 
        !          1151:        /* Subrange values used internally for range checking */
        !          1152:        CRYPT_CERTINFO_FIRST_CERTINFO = CRYPT_CERTINFO_FIRST + 1,
        !          1153:        CRYPT_CERTINFO_LAST_CERTINFO = CRYPT_CERTINFO_PKIUSER_REVPASSWORD,
        !          1154:                CRYPT_CERTINFO_FIRST_PSEUDOINFO = CRYPT_CERTINFO_SELFSIGNED,
        !          1155:                CRYPT_CERTINFO_LAST_PSEUDOINFO = CRYPT_CERTINFO_SIGNATURELEVEL,
        !          1156:        CRYPT_CERTINFO_FIRST_NAME = CRYPT_CERTINFO_COUNTRYNAME,
        !          1157:        CRYPT_CERTINFO_LAST_NAME = CRYPT_CERTINFO_REGISTEREDID,
        !          1158:                CRYPT_CERTINFO_FIRST_DN = CRYPT_CERTINFO_COUNTRYNAME,
        !          1159:                CRYPT_CERTINFO_LAST_DN = CRYPT_CERTINFO_COMMONNAME,
        !          1160:                CRYPT_CERTINFO_FIRST_GENERALNAME = CRYPT_CERTINFO_OTHERNAME_TYPEID,
        !          1161:                CRYPT_CERTINFO_LAST_GENERALNAME = CRYPT_CERTINFO_REGISTEREDID,
        !          1162:        CRYPT_CERTINFO_FIRST_EXTENSION = CRYPT_CERTINFO_CHALLENGEPASSWORD,
        !          1163:        CRYPT_CERTINFO_LAST_EXTENSION = CRYPT_CERTINFO_SET_TUNNELINGALGID,
        !          1164:        CRYPT_CERTINFO_FIRST_CMS = CRYPT_CERTINFO_CMS_CONTENTTYPE,
        !          1165:        CRYPT_CERTINFO_LAST_CMS = CRYPT_CERTINFO_LAST - 1,
        !          1166:        CRYPT_SESSINFO_FIRST_SPECIFIC = CRYPT_SESSINFO_REQUEST,
        !          1167:        CRYPT_SESSINFO_LAST_SPECIFIC = CRYPT_SESSINFO_SSH_CHANNEL_ACTIVE
        !          1168: #endif /* _CRYPT_DEFINED */
        !          1169:        } CRYPT_ATTRIBUTE_TYPE;
        !          1170: 
        !          1171: /****************************************************************************
        !          1172: *                                                                                                                                                      *
        !          1173: *                                              Attribute Subtypes and Related Values                           *
        !          1174: *                                                                                                                                                      *
        !          1175: ****************************************************************************/
        !          1176: 
        !          1177: /* Flags for the X.509 keyUsage extension */
        !          1178: 
        !          1179: #define CRYPT_KEYUSAGE_NONE                                    0x000
        !          1180: #define CRYPT_KEYUSAGE_DIGITALSIGNATURE                0x001
        !          1181: #define CRYPT_KEYUSAGE_NONREPUDIATION          0x002
        !          1182: #define CRYPT_KEYUSAGE_KEYENCIPHERMENT         0x004
        !          1183: #define CRYPT_KEYUSAGE_DATAENCIPHERMENT                0x008
        !          1184: #define CRYPT_KEYUSAGE_KEYAGREEMENT                    0x010
        !          1185: #define CRYPT_KEYUSAGE_KEYCERTSIGN                     0x020
        !          1186: #define CRYPT_KEYUSAGE_CRLSIGN                         0x040
        !          1187: #define CRYPT_KEYUSAGE_ENCIPHERONLY                    0x080
        !          1188: #define CRYPT_KEYUSAGE_DECIPHERONLY                    0x100
        !          1189: #define CRYPT_KEYUSAGE_LAST                                    0x200   /* Last possible value */
        !          1190: 
        !          1191: /* X.509 cRLReason and cryptlib cRLExtReason codes */
        !          1192: 
        !          1193: enum { CRYPT_CRLREASON_UNSPECIFIED, CRYPT_CRLREASON_KEYCOMPROMISE,
        !          1194:           CRYPT_CRLREASON_CACOMPROMISE, CRYPT_CRLREASON_AFFILIATIONCHANGED,
        !          1195:           CRYPT_CRLREASON_SUPERSEDED, CRYPT_CRLREASON_CESSATIONOFOPERATION,
        !          1196:           CRYPT_CRLREASON_CERTIFICATEHOLD, CRYPT_CRLREASON_REMOVEFROMCRL = 8,
        !          1197:           CRYPT_CRLREASON_PRIVILEGEWITHDRAWN, CRYPT_CRLREASON_AACOMPROMISE,
        !          1198:           CRYPT_CRLREASON_LAST, /* End of standard CRL reasons */
        !          1199:           CRYPT_CRLREASON_NEVERVALID = 20, CRYPT_CRLEXTREASON_LAST };
        !          1200: 
        !          1201: /* X.509 CRL reason flags.  These identify the same thing as the cRLReason
        !          1202:    codes but allow for multiple reasons to be specified.  Note that these
        !          1203:    don't follow the X.509 naming since in that scheme the enumerated types
        !          1204:    and bitflags have the same names */
        !          1205: 
        !          1206: #define CRYPT_CRLREASONFLAG_UNUSED                             0x001
        !          1207: #define CRYPT_CRLREASONFLAG_KEYCOMPROMISE              0x002
        !          1208: #define CRYPT_CRLREASONFLAG_CACOMPROMISE               0x004
        !          1209: #define CRYPT_CRLREASONFLAG_AFFILIATIONCHANGED 0x008
        !          1210: #define CRYPT_CRLREASONFLAG_SUPERSEDED                 0x010
        !          1211: #define CRYPT_CRLREASONFLAG_CESSATIONOFOPERATION 0x020
        !          1212: #define CRYPT_CRLREASONFLAG_CERTIFICATEHOLD            0x040
        !          1213: #define CRYPT_CRLREASONFLAG_LAST                               0x080   /* Last poss.value */
        !          1214: 
        !          1215: /* X.509 CRL holdInstruction codes */
        !          1216: 
        !          1217: enum { CRYPT_HOLDINSTRUCTION_NONE, CRYPT_HOLDINSTRUCTION_CALLISSUER,
        !          1218:           CRYPT_HOLDINSTRUCTION_REJECT, CRYPT_HOLDINSTRUCTION_PICKUPTOKEN,
        !          1219:           CRYPT_HOLDINSTRUCTION_LAST };
        !          1220: 
        !          1221: /* Certificate checking compliance levels */
        !          1222: 
        !          1223: enum { CRYPT_COMPLIANCELEVEL_OBLIVIOUS, CRYPT_COMPLIANCELEVEL_REDUCED,
        !          1224:           CRYPT_COMPLIANCELEVEL_STANDARD, CRYPT_COMPLIANCELEVEL_PKIX_PARTIAL,
        !          1225:           CRYPT_COMPLIANCELEVEL_PKIX_FULL, CRYPT_COMPLIANCELEVEL_LAST };
        !          1226: 
        !          1227: /* Flags for the Netscape netscape-cert-type extension */
        !          1228: 
        !          1229: #define CRYPT_NS_CERTTYPE_SSLCLIENT                    0x001
        !          1230: #define CRYPT_NS_CERTTYPE_SSLSERVER                    0x002
        !          1231: #define CRYPT_NS_CERTTYPE_SMIME                                0x004
        !          1232: #define CRYPT_NS_CERTTYPE_OBJECTSIGNING                0x008
        !          1233: #define CRYPT_NS_CERTTYPE_RESERVED                     0x010
        !          1234: #define CRYPT_NS_CERTTYPE_SSLCA                                0x020
        !          1235: #define CRYPT_NS_CERTTYPE_SMIMECA                      0x040
        !          1236: #define CRYPT_NS_CERTTYPE_OBJECTSIGNINGCA      0x080
        !          1237: #define CRYPT_NS_CERTTYPE_LAST                         0x100   /* Last possible value */
        !          1238: 
        !          1239: /* Flags for the SET certificate-type extension */
        !          1240: 
        !          1241: #define CRYPT_SET_CERTTYPE_CARD                                0x001
        !          1242: #define CRYPT_SET_CERTTYPE_MER                         0x002
        !          1243: #define CRYPT_SET_CERTTYPE_PGWY                                0x004
        !          1244: #define CRYPT_SET_CERTTYPE_CCA                         0x008
        !          1245: #define CRYPT_SET_CERTTYPE_MCA                         0x010
        !          1246: #define CRYPT_SET_CERTTYPE_PCA                         0x020
        !          1247: #define CRYPT_SET_CERTTYPE_GCA                         0x040
        !          1248: #define CRYPT_SET_CERTTYPE_BCA                         0x080
        !          1249: #define CRYPT_SET_CERTTYPE_RCA                         0x100
        !          1250: #define CRYPT_SET_CERTTYPE_ACQ                         0x200
        !          1251: #define CRYPT_SET_CERTTYPE_LAST                                0x400   /* Last possible value */
        !          1252: 
        !          1253: /* CMS contentType values */
        !          1254: 
        !          1255: typedef enum { CRYPT_CONTENT_NONE, CRYPT_CONTENT_DATA,
        !          1256:                           CRYPT_CONTENT_SIGNEDDATA, CRYPT_CONTENT_ENVELOPEDDATA,
        !          1257:                           CRYPT_CONTENT_SIGNEDANDENVELOPEDDATA,
        !          1258:                           CRYPT_CONTENT_DIGESTEDDATA, CRYPT_CONTENT_ENCRYPTEDDATA,
        !          1259:                           CRYPT_CONTENT_COMPRESSEDDATA, CRYPT_CONTENT_TSTINFO,
        !          1260:                           CRYPT_CONTENT_SPCINDIRECTDATACONTEXT,
        !          1261:                           CRYPT_CONTENT_RTCSREQUEST, CRYPT_CONTENT_RTCSRESPONSE,
        !          1262:                           CRYPT_CONTENT_RTCSRESPONSE_EXT, CRYPT_CONTENT_LAST
        !          1263:                         } CRYPT_CONTENT_TYPE;
        !          1264: 
        !          1265: /* ESS securityClassification codes */
        !          1266: 
        !          1267: enum { CRYPT_CLASSIFICATION_UNMARKED, CRYPT_CLASSIFICATION_UNCLASSIFIED,
        !          1268:           CRYPT_CLASSIFICATION_RESTRICTED, CRYPT_CLASSIFICATION_CONFIDENTIAL,
        !          1269:           CRYPT_CLASSIFICATION_SECRET, CRYPT_CLASSIFICATION_TOP_SECRET,
        !          1270:           CRYPT_CLASSIFICATION_LAST = 255 };
        !          1271: 
        !          1272: /* RTCS certificate status */
        !          1273: 
        !          1274: enum { CRYPT_CERTSTATUS_VALID, CRYPT_CERTSTATUS_NOTVALID,
        !          1275:           CRYPT_CERTSTATUS_NONAUTHORITATIVE, CRYPT_CERTSTATUS_UNKNOWN };
        !          1276: 
        !          1277: /* OCSP revocation status */
        !          1278: 
        !          1279: enum { CRYPT_OCSPSTATUS_NOTREVOKED, CRYPT_OCSPSTATUS_REVOKED,
        !          1280:           CRYPT_OCSPSTATUS_UNKNOWN };
        !          1281: 
        !          1282: /* The amount of detail to include in signatures when signing certificate
        !          1283:    objects */
        !          1284: 
        !          1285: typedef enum {
        !          1286:        CRYPT_SIGNATURELEVEL_NONE,              /* Include only signature */
        !          1287:        CRYPT_SIGNATURELEVEL_SIGNERCERT,/* Include signer cert */
        !          1288:        CRYPT_SIGNATURELEVEL_ALL,               /* Include all relevant info */
        !          1289:        CRYPT_SIGNATURELEVEL_LAST               /* Last possible sig.level type */
        !          1290:        } CRYPT_SIGNATURELEVEL_TYPE;
        !          1291: 
        !          1292: /* The certificate export format type, which defines the format in which a
        !          1293:    certificate object is exported */
        !          1294: 
        !          1295: typedef enum {
        !          1296:        CRYPT_CERTFORMAT_NONE,                  /* No certificate format */
        !          1297:        CRYPT_CERTFORMAT_CERTIFICATE,   /* DER-encoded certificate */
        !          1298:        CRYPT_CERTFORMAT_CERTCHAIN,             /* PKCS #7 certificate chain */
        !          1299:        CRYPT_CERTFORMAT_TEXT_CERTIFICATE,      /* base-64 wrapped cert */
        !          1300:        CRYPT_CERTFORMAT_TEXT_CERTCHAIN,        /* base-64 wrapped cert chain */
        !          1301:        CRYPT_CERTFORMAT_XML_CERTIFICATE,       /* XML wrapped cert */
        !          1302:        CRYPT_CERTFORMAT_XML_CERTCHAIN, /* XML wrapped cert chain */
        !          1303: #ifdef _CRYPT_DEFINED
        !          1304:        CRYPT_ICERTFORMAT_CERTSET,              /* SET OF Certificate */
        !          1305:        CRYPT_ICERTFORMAT_CERTSEQUENCE, /* SEQUENCE OF Certificate */
        !          1306:        CRYPT_ICERTFORMAT_SSL_CERTCHAIN,/* SSL certificate chain */
        !          1307:        CRYPT_ICERTFORMAT_DATA,                 /* Non-signed object data */
        !          1308: #endif /* CRYPT_DEFINED */
        !          1309:        CRYPT_CERTFORMAT_LAST                   /* Last possible cert.format type */
        !          1310: #ifdef _CRYPT_DEFINED
        !          1311:        /* The following is used as an internal format specifier when the format
        !          1312:           is autodetected, to tell the base64 decoding code to strip MIME
        !          1313:           headers before the base64 data */
        !          1314:        , CRYPT_ICERTFORMAT_SMIME_CERTIFICATE,/* S/MIME cert.request or cert chain */
        !          1315:        CRYPT_CERTFORMAT_LAST_EXTERNAL = CRYPT_CERTFORMAT_XML_CERTCHAIN + 1
        !          1316: #endif /* _CRYPT_DEFINED */
        !          1317:        } CRYPT_CERTFORMAT_TYPE;
        !          1318: 
        !          1319: /* CMP request types */
        !          1320: 
        !          1321: typedef enum {
        !          1322:        CRYPT_REQUESTTYPE_NONE,                 /* No request type */
        !          1323:        CRYPT_REQUESTTYPE_INITIALISATION,       /* Initialisation request */
        !          1324:                CRYPT_REQUESTTYPE_INITIALIZATION = CRYPT_REQUESTTYPE_INITIALISATION,
        !          1325:        CRYPT_REQUESTTYPE_CERTIFICATE,  /* Certification request */
        !          1326:        CRYPT_REQUESTTYPE_KEYUPDATE,    /* Key update request */
        !          1327:        CRYPT_REQUESTTYPE_REVOCATION,   /* Cert revocation request */
        !          1328:        CRYPT_REQUESTTYPE_PKIBOOT,              /* PKIBoot request */
        !          1329:        CRYPT_REQUESTTYPE_LAST                  /* Last possible request type */
        !          1330:        } CRYPT_REQUESTTYPE_TYPE;
        !          1331: 
        !          1332: /* Key ID types */
        !          1333: 
        !          1334: typedef enum {
        !          1335:        CRYPT_KEYID_NONE,                               /* No key ID type */
        !          1336:        CRYPT_KEYID_NAME,                               /* Key owner name */
        !          1337:        CRYPT_KEYID_URI,                                /* Key owner URI */
        !          1338:                CRYPT_KEYID_EMAIL = CRYPT_KEYID_URI, /* Synonym: owner email addr.*/
        !          1339: #ifdef _CRYPT_DEFINED
        !          1340:        /* Internal key ID types */
        !          1341:        CRYPT_IKEYID_KEYID,                             /* SubjectKeyIdentifier/internal ID */
        !          1342:        CRYPT_IKEYID_PGPKEYID,                  /* PGP/OpenPGP key ID */
        !          1343:        CRYPT_IKEYID_CERTID,                    /* Certificate hash */
        !          1344:        CRYPT_IKEYID_ISSUERID,                  /* Hashed issuerAndSerialNumber */
        !          1345:        CRYPT_IKEYID_ISSUERANDSERIALNUMBER,     /* issuerAndSerialNumber */
        !          1346: #endif /* _CRYPT_DEFINED */
        !          1347:        CRYPT_KEYID_LAST                                /* Last possible key ID type */
        !          1348: #ifdef _CRYPT_DEFINED
        !          1349:        , CRYPT_KEYID_LAST_EXTERNAL = CRYPT_KEYID_URI + 1/* Last external key ID */
        !          1350: #endif /* _CRYPT_DEFINED */
        !          1351:        } CRYPT_KEYID_TYPE;
        !          1352: 
        !          1353: /* The encryption object types */
        !          1354: 
        !          1355: typedef enum {
        !          1356:        CRYPT_OBJECT_NONE,                              /* No object type */
        !          1357:        CRYPT_OBJECT_ENCRYPTED_KEY,             /* Conventionally encrypted key */
        !          1358:        CRYPT_OBJECT_PKCENCRYPTED_KEY,  /* PKC-encrypted key */
        !          1359:        CRYPT_OBJECT_KEYAGREEMENT,              /* Key agreement information */
        !          1360:        CRYPT_OBJECT_SIGNATURE,                 /* Signature */
        !          1361:        CRYPT_OBJECT_LAST                               /* Last possible object type */
        !          1362:        } CRYPT_OBJECT_TYPE;
        !          1363: 
        !          1364: /* Object/attribute error type information */
        !          1365: 
        !          1366: typedef enum {
        !          1367:        CRYPT_ERRTYPE_NONE,                             /* No error information */
        !          1368:        CRYPT_ERRTYPE_ATTR_SIZE,                /* Attribute data too small or large */
        !          1369:        CRYPT_ERRTYPE_ATTR_VALUE,               /* Attribute value is invalid */
        !          1370:        CRYPT_ERRTYPE_ATTR_ABSENT,              /* Required attribute missing */
        !          1371:        CRYPT_ERRTYPE_ATTR_PRESENT,             /* Non-allowed attribute present */
        !          1372:        CRYPT_ERRTYPE_CONSTRAINT,               /* Cert: Constraint violation in object */
        !          1373:        CRYPT_ERRTYPE_ISSUERCONSTRAINT, /* Cert: Constraint viol.in issuing cert */
        !          1374:        CRYPT_ERRTYPE_LAST                              /* Last possible error info type */
        !          1375:        } CRYPT_ERRTYPE_TYPE;
        !          1376: 
        !          1377: /* Cert store management action type */
        !          1378: 
        !          1379: typedef enum {
        !          1380:        CRYPT_CERTACTION_NONE,                  /* No cert management action */
        !          1381:        CRYPT_CERTACTION_CREATE,                /* Create cert store */
        !          1382:        CRYPT_CERTACTION_CONNECT,               /* Connect to cert store */
        !          1383:        CRYPT_CERTACTION_DISCONNECT,    /* Disconnect from cert store */
        !          1384:        CRYPT_CERTACTION_ERROR,                 /* Error information */
        !          1385:        CRYPT_CERTACTION_ADDUSER,               /* Add PKI user */
        !          1386:        CRYPT_CERTACTION_DELETEUSER,    /* Delete PKI user */
        !          1387:        CRYPT_CERTACTION_REQUEST_CERT,  /* Cert request */
        !          1388:        CRYPT_CERTACTION_REQUEST_RENEWAL,/* Cert renewal request */
        !          1389:        CRYPT_CERTACTION_REQUEST_REVOCATION,/* Cert revocation request */
        !          1390:        CRYPT_CERTACTION_CERT_CREATION, /* Cert creation */
        !          1391:        CRYPT_CERTACTION_CERT_CREATION_COMPLETE,/* Confirmation of cert creation */
        !          1392:        CRYPT_CERTACTION_CERT_CREATION_DROP,    /* Cancellation of cert creation */
        !          1393:        CRYPT_CERTACTION_CERT_CREATION_REVERSE, /* Cancel of creation w.revocation */
        !          1394:        CRYPT_CERTACTION_RESTART_CLEANUP, /* Delete reqs after restart */
        !          1395:        CRYPT_CERTACTION_RESTART_REVOKE_CERT, /* Complete revocation after restart */
        !          1396:        CRYPT_CERTACTION_ISSUE_CERT,    /* Cert issue */
        !          1397:        CRYPT_CERTACTION_ISSUE_CRL,             /* CRL issue */
        !          1398:        CRYPT_CERTACTION_REVOKE_CERT,   /* Cert revocation */
        !          1399:        CRYPT_CERTACTION_EXPIRE_CERT,   /* Cert expiry */
        !          1400:        CRYPT_CERTACTION_CLEANUP,               /* Clean up on restart */
        !          1401:        CRYPT_CERTACTION_LAST                   /* Last possible cert store log action */
        !          1402: #ifdef _CRYPT_DEFINED
        !          1403:        /* User-settable action types for cert mgmt.actions */
        !          1404:        , CRYPT_CERTACTION_FIRST_USER = CRYPT_CERTACTION_ISSUE_CERT,
        !          1405:        CRYPT_CERTACTION_LAST_USER = CRYPT_CERTACTION_CLEANUP
        !          1406: #endif /* _CRYPT_DEFINED */
        !          1407:        } CRYPT_CERTACTION_TYPE;
        !          1408: 
        !          1409: /****************************************************************************
        !          1410: *                                                                                                                                                      *
        !          1411: *                                                              General Constants                                                       *
        !          1412: *                                                                                                                                                      *
        !          1413: ****************************************************************************/
        !          1414: 
        !          1415: /* The maximum user key size - 2048 bits */
        !          1416: 
        !          1417: #define CRYPT_MAX_KEYSIZE              256
        !          1418: 
        !          1419: /* The maximum IV size - 256 bits */
        !          1420: 
        !          1421: #define CRYPT_MAX_IVSIZE               32
        !          1422: 
        !          1423: /* The maximum public-key component size - 4096 bits */
        !          1424: 
        !          1425: #define CRYPT_MAX_PKCSIZE              512
        !          1426: 
        !          1427: /* The maximum hash size - 256 bits */
        !          1428: 
        !          1429: #define CRYPT_MAX_HASHSIZE             32
        !          1430: 
        !          1431: /* The maximum size of a text string (e.g.key owner name) */
        !          1432: 
        !          1433: #define CRYPT_MAX_TEXTSIZE             64
        !          1434: 
        !          1435: /* A magic value indicating that the default setting for this parameter
        !          1436:    should be used */
        !          1437: 
        !          1438: #define CRYPT_USE_DEFAULT              -100
        !          1439: 
        !          1440: /* A magic value for unused parameters */
        !          1441: 
        !          1442: #define CRYPT_UNUSED                   -101
        !          1443: 
        !          1444: /* Cursor positioning codes for certificate/CRL extensions */
        !          1445: 
        !          1446: #define CRYPT_CURSOR_FIRST             -200
        !          1447: #define CRYPT_CURSOR_PREVIOUS  -201
        !          1448: #define CRYPT_CURSOR_NEXT              -202
        !          1449: #define CRYPT_CURSOR_LAST              -203
        !          1450: 
        !          1451: /* The type of information polling to perform to get random seed 
        !          1452:    information.  These values have to be negative because they're used
        !          1453:    as magic length values for cryptAddRandom() */
        !          1454: 
        !          1455: #define CRYPT_RANDOM_FASTPOLL  -300
        !          1456: #define CRYPT_RANDOM_SLOWPOLL  -301
        !          1457: 
        !          1458: /* Whether the PKC key is a public or private key */
        !          1459: 
        !          1460: #define CRYPT_KEYTYPE_PRIVATE  0
        !          1461: #define CRYPT_KEYTYPE_PUBLIC   1
        !          1462: 
        !          1463: /* Keyset open options */
        !          1464: 
        !          1465: typedef enum {
        !          1466:        CRYPT_KEYOPT_NONE,                              /* No options */
        !          1467:        CRYPT_KEYOPT_READONLY,                  /* Open keyset in read-only mode */
        !          1468:        CRYPT_KEYOPT_CREATE,                    /* Create a new keyset */
        !          1469: #ifdef _CRYPT_DEFINED
        !          1470:        /* Internal keyset options */
        !          1471:        CRYPT_IKEYOPT_EXCLUSIVEACCESS,  /* As _NONE but open for exclusive access */
        !          1472: #endif /* _CRYPT_DEFINED */
        !          1473:        CRYPT_KEYOPT_LAST                               /* Last possible key option type */
        !          1474: #ifdef _CRYPT_DEFINED
        !          1475:        , CRYPT_KEYOPT_LAST_EXTERNAL = CRYPT_KEYOPT_CREATE + 1
        !          1476:                                                                        /* Last external keyset option */
        !          1477: #endif /* _CRYPT_DEFINED */
        !          1478:        } CRYPT_KEYOPT_TYPE;
        !          1479: 
        !          1480: /* The various cryptlib objects - these are just integer handles */
        !          1481: 
        !          1482: typedef int CRYPT_CERTIFICATE;
        !          1483: typedef int CRYPT_CONTEXT;
        !          1484: typedef int CRYPT_DEVICE;
        !          1485: typedef int CRYPT_ENVELOPE;
        !          1486: typedef int CRYPT_KEYSET;
        !          1487: typedef int CRYPT_SESSION;
        !          1488: typedef int CRYPT_USER;
        !          1489: 
        !          1490: /* Sometimes we don't know the exact type of a cryptlib object, so we use a
        !          1491:    generic handle type to identify it */
        !          1492: 
        !          1493: typedef int CRYPT_HANDLE;
        !          1494: 
        !          1495: /****************************************************************************
        !          1496: *                                                                                                                                                      *
        !          1497: *                                                      Encryption Data Structures                                              *
        !          1498: *                                                                                                                                                      *
        !          1499: ****************************************************************************/
        !          1500: 
        !          1501: /* Results returned from the capability query */
        !          1502: 
        !          1503: typedef struct {
        !          1504:        /* Algorithm information */
        !          1505:        C_CHR algoName[ CRYPT_MAX_TEXTSIZE ];/* Algorithm name */
        !          1506:        int blockSize;                                  /* Block size of the algorithm */
        !          1507:        int minKeySize;                                 /* Minimum key size in bytes */
        !          1508:        int keySize;                                    /* Recommended key size in bytes */
        !          1509:        int maxKeySize;                                 /* Maximum key size in bytes */
        !          1510:        } CRYPT_QUERY_INFO;
        !          1511: 
        !          1512: /* Results returned from the encoded object query.  These provide
        !          1513:    information on the objects created by cryptExportKey()/
        !          1514:    cryptCreateSignature() */
        !          1515: 
        !          1516: typedef struct {
        !          1517:        /* The object type */
        !          1518:        CRYPT_OBJECT_TYPE objectType;
        !          1519: 
        !          1520:        /* The encryption algorithm and mode */
        !          1521:        CRYPT_ALGO_TYPE cryptAlgo;
        !          1522:        CRYPT_MODE_TYPE cryptMode;
        !          1523: 
        !          1524:        /* The hash algorithm for Signature objects */
        !          1525:        CRYPT_ALGO_TYPE hashAlgo;
        !          1526: 
        !          1527:        /* The salt for derived keys */
        !          1528:        unsigned char salt[ CRYPT_MAX_HASHSIZE ];
        !          1529:        int saltSize;
        !          1530:        } CRYPT_OBJECT_INFO;
        !          1531: 
        !          1532: /* Key information for the public-key encryption algorithms.  These fields
        !          1533:    are not accessed directly, but can be manipulated with the init/set/
        !          1534:    destroyComponents() macros */
        !          1535: 
        !          1536: typedef struct {
        !          1537:        /* Status information */
        !          1538:        int isPublicKey;                        /* Whether this is a public or private key */
        !          1539: 
        !          1540:        /* Public components */
        !          1541:        unsigned char n[ CRYPT_MAX_PKCSIZE ];   /* Modulus */
        !          1542:        int nLen;                                       /* Length of modulus in bits */
        !          1543:        unsigned char e[ CRYPT_MAX_PKCSIZE ];   /* Public exponent */
        !          1544:        int eLen;                                       /* Length of public exponent in bits */
        !          1545: 
        !          1546:        /* Private components */
        !          1547:        unsigned char d[ CRYPT_MAX_PKCSIZE ];   /* Private exponent */
        !          1548:        int dLen;                                       /* Length of private exponent in bits */
        !          1549:        unsigned char p[ CRYPT_MAX_PKCSIZE ];   /* Prime factor 1 */
        !          1550:        int pLen;                                       /* Length of prime factor 1 in bits */
        !          1551:        unsigned char q[ CRYPT_MAX_PKCSIZE ];   /* Prime factor 2 */
        !          1552:        int qLen;                                       /* Length of prime factor 2 in bits */
        !          1553:        unsigned char u[ CRYPT_MAX_PKCSIZE ];   /* Mult.inverse of q, mod p */
        !          1554:        int uLen;                                       /* Length of private exponent in bits */
        !          1555:        unsigned char e1[ CRYPT_MAX_PKCSIZE ];  /* Private exponent 1 (PKCS) */
        !          1556:        int e1Len;                                      /* Length of private exponent in bits */
        !          1557:        unsigned char e2[ CRYPT_MAX_PKCSIZE ];  /* Private exponent 2 (PKCS) */
        !          1558:        int e2Len;                                      /* Length of private exponent in bits */
        !          1559:        } CRYPT_PKCINFO_RSA;
        !          1560: 
        !          1561: typedef struct {
        !          1562:        /* Status information */
        !          1563:        int isPublicKey;                        /* Whether this is a public or private key */
        !          1564: 
        !          1565:        /* Public components */
        !          1566:        unsigned char p[ CRYPT_MAX_PKCSIZE ];   /* Prime modulus */
        !          1567:        int pLen;                                       /* Length of prime modulus in bits */
        !          1568:        unsigned char q[ CRYPT_MAX_PKCSIZE ];   /* Prime divisor */
        !          1569:        int qLen;                                       /* Length of prime divisor in bits */
        !          1570:        unsigned char g[ CRYPT_MAX_PKCSIZE ];   /* h^( ( p - 1 ) / q ) mod p */
        !          1571:        int gLen;                                       /* Length of g in bits */
        !          1572:        unsigned char y[ CRYPT_MAX_PKCSIZE ];   /* Public random integer */
        !          1573:        int yLen;                                       /* Length of public integer in bits */
        !          1574: 
        !          1575:        /* Private components */
        !          1576:        unsigned char x[ CRYPT_MAX_PKCSIZE ];   /* Private random integer */
        !          1577:        int xLen;                                       /* Length of private integer in bits */
        !          1578:        } CRYPT_PKCINFO_DLP;
        !          1579: 
        !          1580: /* Macros to initialise and destroy the structure that stores the components
        !          1581:    of a public key */
        !          1582: 
        !          1583: #define cryptInitComponents( componentInfo, componentKeyType ) \
        !          1584:        { memset( ( componentInfo ), 0, sizeof( *componentInfo ) ); \
        !          1585:          ( componentInfo )->isPublicKey = ( ( componentKeyType ) ? 1 : 0 ); }
        !          1586: 
        !          1587: #define cryptDestroyComponents( componentInfo ) \
        !          1588:        memset( ( componentInfo ), 0, sizeof( *componentInfo ) )
        !          1589: 
        !          1590: /* Macros to set a component of a public key */
        !          1591: 
        !          1592: #define cryptSetComponent( destination, source, length ) \
        !          1593:        { memcpy( ( destination ), ( source ), ( ( length ) + 7 ) >> 3 ); \
        !          1594:          ( destination##Len ) = length; }
        !          1595: 
        !          1596: /****************************************************************************
        !          1597: *                                                                                                                                                      *
        !          1598: *                                                              Status Codes                                                            *
        !          1599: *                                                                                                                                                      *
        !          1600: ****************************************************************************/
        !          1601: 
        !          1602: /* No error in function call */
        !          1603: 
        !          1604: #define CRYPT_OK                               0       /* No error */
        !          1605: 
        !          1606: /* Error in parameters passed to function */
        !          1607: 
        !          1608: #define CRYPT_ERROR_PARAM1             -1      /* Bad argument, parameter 1 */
        !          1609: #define CRYPT_ERROR_PARAM2             -2      /* Bad argument, parameter 2 */
        !          1610: #define CRYPT_ERROR_PARAM3             -3      /* Bad argument, parameter 3 */
        !          1611: #define CRYPT_ERROR_PARAM4             -4      /* Bad argument, parameter 4 */
        !          1612: #define CRYPT_ERROR_PARAM5             -5      /* Bad argument, parameter 5 */
        !          1613: #define CRYPT_ERROR_PARAM6             -6      /* Bad argument, parameter 6 */
        !          1614: #define CRYPT_ERROR_PARAM7             -7      /* Bad argument, parameter 7 */
        !          1615: 
        !          1616: /* Errors due to insufficient resources */
        !          1617: 
        !          1618: #define CRYPT_ERROR_MEMORY             -10     /* Out of memory */
        !          1619: #define CRYPT_ERROR_NOTINITED  -11     /* Data has not been initialised */
        !          1620: #define CRYPT_ERROR_INITED             -12     /* Data has already been init'd */
        !          1621: #define CRYPT_ERROR_NOSECURE   -13     /* Opn.not avail.at requested sec.level */
        !          1622: #define CRYPT_ERROR_RANDOM             -14     /* No reliable random data available */
        !          1623: #define CRYPT_ERROR_FAILED             -15     /* Operation failed */
        !          1624: #define CRYPT_ERROR_INTERNAL   -16     /* Internal consistency check failed */
        !          1625: 
        !          1626: /* Security violations */
        !          1627: 
        !          1628: #define CRYPT_ERROR_NOTAVAIL   -20     /* This type of opn.not available */
        !          1629: #define CRYPT_ERROR_PERMISSION -21     /* No permiss.to perform this operation */
        !          1630: #define CRYPT_ERROR_WRONGKEY   -22     /* Incorrect key used to decrypt data */
        !          1631: #define CRYPT_ERROR_INCOMPLETE -23     /* Operation incomplete/still in progress */
        !          1632: #define CRYPT_ERROR_COMPLETE   -24     /* Operation complete/can't continue */
        !          1633: #define CRYPT_ERROR_TIMEOUT            -25     /* Operation timed out before completion */
        !          1634: #define CRYPT_ERROR_INVALID            -26     /* Invalid/inconsistent information */
        !          1635: #define CRYPT_ERROR_SIGNALLED  -27     /* Resource destroyed by extnl.event */
        !          1636: 
        !          1637: /* High-level function errors */
        !          1638: 
        !          1639: #define CRYPT_ERROR_OVERFLOW   -30     /* Resources/space exhausted */
        !          1640: #define CRYPT_ERROR_UNDERFLOW  -31     /* Not enough data available */
        !          1641: #define CRYPT_ERROR_BADDATA            -32     /* Bad/unrecognised data format */
        !          1642: #define CRYPT_ERROR_SIGNATURE  -33     /* Signature/integrity check failed */
        !          1643: 
        !          1644: /* Data access function errors */
        !          1645: 
        !          1646: #define CRYPT_ERROR_OPEN               -40     /* Cannot open object */
        !          1647: #define CRYPT_ERROR_READ               -41     /* Cannot read item from object */
        !          1648: #define CRYPT_ERROR_WRITE              -42     /* Cannot write item to object */
        !          1649: #define CRYPT_ERROR_NOTFOUND   -43     /* Requested item not found in object */
        !          1650: #define CRYPT_ERROR_DUPLICATE  -44     /* Item already present in object */
        !          1651: 
        !          1652: /* Data enveloping errors */
        !          1653: 
        !          1654: #define CRYPT_ENVELOPE_RESOURCE        -50     /* Need resource to proceed */
        !          1655: 
        !          1656: /* Macros to examine return values */
        !          1657: 
        !          1658: #define cryptStatusError( status )     ( ( status ) < CRYPT_OK )
        !          1659: #define cryptStatusOK( status )                ( ( status ) == CRYPT_OK )
        !          1660: 
        !          1661: /****************************************************************************
        !          1662: *                                                                                                                                                      *
        !          1663: *                                                                      General Functions                                               *
        !          1664: *                                                                                                                                                      *
        !          1665: ****************************************************************************/
        !          1666: 
        !          1667: /* The following is necessary to stop C++ name mangling */
        !          1668: 
        !          1669: #ifdef __cplusplus
        !          1670: extern "C" {
        !          1671: #endif /* __cplusplus */
        !          1672: 
        !          1673: /* Initialise and shut down cryptlib */
        !          1674: 
        !          1675: C_RET cryptInit( void );
        !          1676: C_RET cryptEnd( void );
        !          1677: 
        !          1678: /* Query cryptlibs capabilities */
        !          1679: 
        !          1680: C_RET cryptQueryCapability( C_IN CRYPT_ALGO_TYPE cryptAlgo,
        !          1681:                                                        C_OUT CRYPT_QUERY_INFO C_PTR cryptQueryInfo );
        !          1682: 
        !          1683: /* Create and destroy an encryption context */
        !          1684: 
        !          1685: C_RET cryptCreateContext( C_OUT CRYPT_CONTEXT C_PTR cryptContext,
        !          1686:                                                  C_IN CRYPT_USER cryptUser,
        !          1687:                                                  C_IN CRYPT_ALGO_TYPE cryptAlgo );
        !          1688: C_RET cryptDestroyContext( C_IN CRYPT_CONTEXT cryptContext );
        !          1689: 
        !          1690: /* Generic "destroy an object" function */
        !          1691: 
        !          1692: C_RET cryptDestroyObject( C_IN CRYPT_HANDLE cryptObject );
        !          1693: 
        !          1694: /* Generate a key into a context */
        !          1695: 
        !          1696: C_RET cryptGenerateKey( C_IN CRYPT_CONTEXT cryptContext );
        !          1697: C_RET cryptGenerateKeyAsync( C_IN CRYPT_CONTEXT cryptContext );
        !          1698: C_RET cryptAsyncQuery( C_IN CRYPT_HANDLE cryptObject );
        !          1699: C_RET cryptAsyncCancel( C_IN CRYPT_HANDLE cryptObject );
        !          1700: 
        !          1701: /* Encrypt/decrypt/hash a block of memory */
        !          1702: 
        !          1703: C_RET cryptEncrypt( C_IN CRYPT_CONTEXT cryptContext, C_INOUT void C_PTR buffer,
        !          1704:                                        C_IN int length );
        !          1705: C_RET cryptDecrypt( C_IN CRYPT_CONTEXT cryptContext, C_INOUT void C_PTR buffer,
        !          1706:                                        C_IN int length );
        !          1707: 
        !          1708: /* Get/set/delete attribute functions */
        !          1709: 
        !          1710: C_RET cryptSetAttribute( C_IN CRYPT_HANDLE cryptHandle,
        !          1711:                                                 C_IN CRYPT_ATTRIBUTE_TYPE attributeType,
        !          1712:                                                 C_IN int value );
        !          1713: C_RET cryptSetAttributeString( C_IN CRYPT_HANDLE cryptHandle,
        !          1714:                                                           C_IN CRYPT_ATTRIBUTE_TYPE attributeType,
        !          1715:                                                           C_IN void C_PTR value, C_IN int valueLength );
        !          1716: C_RET cryptGetAttribute( C_IN CRYPT_HANDLE cryptHandle,
        !          1717:                                                 C_IN CRYPT_ATTRIBUTE_TYPE attributeType,
        !          1718:                                                 C_OUT int C_PTR value );
        !          1719: C_RET cryptGetAttributeString( C_IN CRYPT_HANDLE cryptHandle,
        !          1720:                                                           C_IN CRYPT_ATTRIBUTE_TYPE attributeType,
        !          1721:                                                           C_OUT void C_PTR value,
        !          1722:                                                           C_OUT int C_PTR valueLength );
        !          1723: C_RET cryptDeleteAttribute( C_IN CRYPT_HANDLE cryptHandle,
        !          1724:                                                        C_IN CRYPT_ATTRIBUTE_TYPE attributeType );
        !          1725: 
        !          1726: /* Oddball functions: Add random data to the pool, query an encoded signature
        !          1727:    or key data.  These are due to be replaced once a suitable alternative can
        !          1728:    be found */
        !          1729: 
        !          1730: C_RET cryptAddRandom( C_IN void C_PTR randomData, C_IN int randomDataLength );
        !          1731: C_RET cryptQueryObject( C_IN void C_PTR objectData,
        !          1732:                                                C_IN int objectDataLength,
        !          1733:                                            C_OUT CRYPT_OBJECT_INFO C_PTR cryptObjectInfo );
        !          1734: 
        !          1735: /****************************************************************************
        !          1736: *                                                                                                                                                      *
        !          1737: *                                                      Mid-level Encryption Functions                                  *
        !          1738: *                                                                                                                                                      *
        !          1739: ****************************************************************************/
        !          1740: 
        !          1741: /* Export and import an encrypted session key */
        !          1742: 
        !          1743: C_RET cryptExportKey( C_OUT void C_PTR encryptedKey,
        !          1744:                                          C_IN int encryptedKeyMaxLength,
        !          1745:                                          C_OUT int C_PTR encryptedKeyLength,
        !          1746:                                          C_IN CRYPT_HANDLE exportKey,
        !          1747:                                          C_IN CRYPT_CONTEXT sessionKeyContext );
        !          1748: C_RET cryptExportKeyEx( C_OUT void C_PTR encryptedKey,
        !          1749:                                                C_IN int encryptedKeyMaxLength,
        !          1750:                                                C_OUT int C_PTR encryptedKeyLength,
        !          1751:                                                C_IN CRYPT_FORMAT_TYPE formatType,
        !          1752:                                                C_IN CRYPT_HANDLE exportKey,
        !          1753:                                                C_IN CRYPT_CONTEXT sessionKeyContext );
        !          1754: C_RET cryptImportKey( C_IN void C_PTR encryptedKey,
        !          1755:                                          C_IN int encryptedKeyLength,
        !          1756:                                          C_IN CRYPT_CONTEXT importKey,
        !          1757:                                          C_IN CRYPT_CONTEXT sessionKeyContext );
        !          1758: C_RET cryptImportKeyEx( C_IN void C_PTR encryptedKey,
        !          1759:                                                C_IN int encryptedKeyLength,
        !          1760:                                                C_IN CRYPT_CONTEXT importKey,
        !          1761:                                                C_IN CRYPT_CONTEXT sessionKeyContext,
        !          1762:                                                C_OUT CRYPT_CONTEXT C_PTR returnedContext );
        !          1763: 
        !          1764: /* Create and check a digital signature */
        !          1765: 
        !          1766: C_RET cryptCreateSignature( C_OUT void C_PTR signature,
        !          1767:                                                        C_IN int signatureMaxLength,
        !          1768:                                                        C_OUT int C_PTR signatureLength,
        !          1769:                                                        C_IN CRYPT_CONTEXT signContext,
        !          1770:                                                        C_IN CRYPT_CONTEXT hashContext );
        !          1771: C_RET cryptCreateSignatureEx( C_OUT void C_PTR signature,
        !          1772:                                                          C_IN int signatureMaxLength,
        !          1773:                                                          C_OUT int C_PTR signatureLength,
        !          1774:                                                          C_IN CRYPT_FORMAT_TYPE formatType,
        !          1775:                                                          C_IN CRYPT_CONTEXT signContext,
        !          1776:                                                          C_IN CRYPT_CONTEXT hashContext,
        !          1777:                                                          C_IN CRYPT_CERTIFICATE extraData );
        !          1778: C_RET cryptCheckSignature( C_IN void C_PTR signature,
        !          1779:                                                   C_IN int signatureLength,
        !          1780:                                                   C_IN CRYPT_HANDLE sigCheckKey,
        !          1781:                                                   C_IN CRYPT_CONTEXT hashContext );
        !          1782: C_RET cryptCheckSignatureEx( C_IN void C_PTR signature,
        !          1783:                                                         C_IN int signatureLength,
        !          1784:                                                         C_IN CRYPT_HANDLE sigCheckKey,
        !          1785:                                                         C_IN CRYPT_CONTEXT hashContext,
        !          1786:                                                         C_OUT CRYPT_HANDLE C_PTR extraData );
        !          1787: 
        !          1788: /****************************************************************************
        !          1789: *                                                                                                                                                      *
        !          1790: *                                                                      Keyset Functions                                                *
        !          1791: *                                                                                                                                                      *
        !          1792: ****************************************************************************/
        !          1793: 
        !          1794: /* Open and close a keyset */
        !          1795: 
        !          1796: C_RET cryptKeysetOpen( C_OUT CRYPT_KEYSET C_PTR keyset,
        !          1797:                                           C_IN CRYPT_USER cryptUser,
        !          1798:                                           C_IN CRYPT_KEYSET_TYPE keysetType,
        !          1799:                                           C_IN C_STR name, C_IN CRYPT_KEYOPT_TYPE options );
        !          1800: C_RET cryptKeysetClose( C_IN CRYPT_KEYSET keyset );
        !          1801: 
        !          1802: /* Get a key from a keyset */
        !          1803: 
        !          1804: C_RET cryptGetPublicKey( C_IN CRYPT_KEYSET keyset,
        !          1805:                                                 C_OUT CRYPT_CONTEXT C_PTR cryptContext,
        !          1806:                                                 C_IN CRYPT_KEYID_TYPE keyIDtype,
        !          1807:                                                 C_IN C_STR keyID );
        !          1808: C_RET cryptGetPrivateKey( C_IN CRYPT_KEYSET keyset,
        !          1809:                                                  C_OUT CRYPT_CONTEXT C_PTR cryptContext,
        !          1810:                                                  C_IN CRYPT_KEYID_TYPE keyIDtype,
        !          1811:                                                  C_IN C_STR keyID, C_IN C_STR password );
        !          1812: 
        !          1813: /* Add/delete a key to/from a keyset */
        !          1814: 
        !          1815: C_RET cryptAddPublicKey( C_IN CRYPT_KEYSET keyset,
        !          1816:                                                 C_IN CRYPT_CERTIFICATE certificate );
        !          1817: C_RET cryptAddPrivateKey( C_IN CRYPT_KEYSET keyset,
        !          1818:                                                  C_IN CRYPT_HANDLE cryptKey,
        !          1819:                                                  C_IN C_STR password );
        !          1820: C_RET cryptDeleteKey( C_IN CRYPT_KEYSET keyset,
        !          1821:                                          C_IN CRYPT_KEYID_TYPE keyIDtype,
        !          1822:                                          C_IN C_STR keyID );
        !          1823: 
        !          1824: /****************************************************************************
        !          1825: *                                                                                                                                                      *
        !          1826: *                                                              Certificate Functions                                           *
        !          1827: *                                                                                                                                                      *
        !          1828: ****************************************************************************/
        !          1829: 
        !          1830: /* Create/destroy a certificate */
        !          1831: 
        !          1832: C_RET cryptCreateCert( C_OUT CRYPT_CERTIFICATE C_PTR certificate,
        !          1833:                                           C_IN CRYPT_USER cryptUser,
        !          1834:                                           C_IN CRYPT_CERTTYPE_TYPE certType );
        !          1835: C_RET cryptDestroyCert( C_IN CRYPT_CERTIFICATE certificate );
        !          1836: 
        !          1837: /* Get/add/delete certificate extensions.  These are direct data insertion
        !          1838:    functions whose use is discouraged, so they fix the string at char *
        !          1839:    rather than C_STR */
        !          1840: 
        !          1841: C_RET cryptGetCertExtension( C_IN CRYPT_CERTIFICATE certificate,
        !          1842:                                                         C_IN char C_PTR oid,
        !          1843:                                                         C_OUT int C_PTR criticalFlag,
        !          1844:                                                         C_OUT void C_PTR extension,
        !          1845:                                                         C_IN int extensionMaxLength,
        !          1846:                                                         C_OUT int C_PTR extensionLength );
        !          1847: C_RET cryptAddCertExtension( C_IN CRYPT_CERTIFICATE certificate,
        !          1848:                                                         C_IN char C_PTR oid, C_IN int criticalFlag,
        !          1849:                                                         C_IN void C_PTR extension,
        !          1850:                                                         C_IN int extensionLength );
        !          1851: C_RET cryptDeleteCertExtension( C_IN CRYPT_CERTIFICATE certificate,
        !          1852:                                                            C_IN char C_PTR oid );
        !          1853: 
        !          1854: /* Sign/sig.check a certificate/certification request */
        !          1855: 
        !          1856: C_RET cryptSignCert( C_IN CRYPT_CERTIFICATE certificate,
        !          1857:                                         C_IN CRYPT_CONTEXT signContext );
        !          1858: C_RET cryptCheckCert( C_IN CRYPT_CERTIFICATE certificate,
        !          1859:                                          C_IN CRYPT_HANDLE sigCheckKey );
        !          1860: 
        !          1861: /* Import/export a certificate/certification request */
        !          1862: 
        !          1863: C_RET cryptImportCert( C_IN void C_PTR certObject,
        !          1864:                                           C_IN int certObjectLength,
        !          1865:                                           C_IN CRYPT_USER cryptUser,
        !          1866:                                           C_OUT CRYPT_CERTIFICATE C_PTR certificate );
        !          1867: C_RET cryptExportCert( C_OUT void C_PTR certObject,
        !          1868:                                           C_IN int certObjectMaxLength,
        !          1869:                                           C_OUT int C_PTR certObjectLength,
        !          1870:                                           C_IN CRYPT_CERTFORMAT_TYPE certFormatType,
        !          1871:                                           C_IN CRYPT_CERTIFICATE certificate );
        !          1872: 
        !          1873: /* CA management functions */
        !          1874: 
        !          1875: C_RET cryptCAAddItem( C_IN CRYPT_KEYSET keyset,
        !          1876:                                          C_IN CRYPT_CERTIFICATE certificate );
        !          1877: C_RET cryptCAGetItem( C_IN CRYPT_KEYSET keyset,
        !          1878:                                          C_OUT CRYPT_CERTIFICATE C_PTR certificate,
        !          1879:                                          C_IN CRYPT_CERTTYPE_TYPE certType,
        !          1880:                                          C_IN CRYPT_KEYID_TYPE keyIDtype,
        !          1881:                                          C_IN C_STR keyID );
        !          1882: C_RET cryptCADeleteItem( C_IN CRYPT_KEYSET keyset,
        !          1883:                                                 C_IN CRYPT_CERTTYPE_TYPE certType,
        !          1884:                                                 C_IN CRYPT_KEYID_TYPE keyIDtype,
        !          1885:                                                 C_IN C_STR keyID );
        !          1886: C_RET cryptCACertManagement( C_OUT CRYPT_CERTIFICATE C_PTR certificate,
        !          1887:                                                         C_IN CRYPT_CERTACTION_TYPE action,
        !          1888:                                                         C_IN CRYPT_KEYSET keyset,
        !          1889:                                                         C_IN CRYPT_CONTEXT caKey,
        !          1890:                                                         C_IN CRYPT_CERTIFICATE certRequest );
        !          1891: 
        !          1892: /****************************************************************************
        !          1893: *                                                                                                                                                      *
        !          1894: *                                                      Envelope and Session Functions                                  *
        !          1895: *                                                                                                                                                      *
        !          1896: ****************************************************************************/
        !          1897: 
        !          1898: /* Create/destroy an envelope */
        !          1899: 
        !          1900: C_RET cryptCreateEnvelope( C_OUT CRYPT_ENVELOPE C_PTR envelope,
        !          1901:                                                   C_IN CRYPT_USER cryptUser,
        !          1902:                                                   C_IN CRYPT_FORMAT_TYPE formatType );
        !          1903: C_RET cryptDestroyEnvelope( C_IN CRYPT_ENVELOPE envelope );
        !          1904: 
        !          1905: /* Create/destroy a session */
        !          1906: 
        !          1907: C_RET cryptCreateSession( C_OUT CRYPT_SESSION C_PTR session,
        !          1908:                                                  C_IN CRYPT_USER cryptUser,
        !          1909:                                                  C_IN CRYPT_SESSION_TYPE formatType );
        !          1910: C_RET cryptDestroySession( C_IN CRYPT_SESSION session );
        !          1911: 
        !          1912: /* Add/remove data to/from and envelope or session */
        !          1913: 
        !          1914: C_RET cryptPushData( C_IN CRYPT_HANDLE envelope, C_IN void C_PTR buffer,
        !          1915:                                         C_IN int length, C_OUT int C_PTR bytesCopied );
        !          1916: C_RET cryptFlushData( C_IN CRYPT_HANDLE envelope );
        !          1917: C_RET cryptPopData( C_IN CRYPT_HANDLE envelope, C_OUT void C_PTR buffer,
        !          1918:                                    C_IN int length, C_OUT int C_PTR bytesCopied );
        !          1919: 
        !          1920: /****************************************************************************
        !          1921: *                                                                                                                                                      *
        !          1922: *                                                              Device Functions                                                        *
        !          1923: *                                                                                                                                                      *
        !          1924: ****************************************************************************/
        !          1925: 
        !          1926: /* Open and close a device */
        !          1927: 
        !          1928: C_RET cryptDeviceOpen( C_OUT CRYPT_DEVICE C_PTR device,
        !          1929:                                           C_IN CRYPT_USER cryptUser,
        !          1930:                                           C_IN CRYPT_DEVICE_TYPE deviceType,
        !          1931:                                           C_IN C_STR name );
        !          1932: C_RET cryptDeviceClose( C_IN CRYPT_DEVICE device );
        !          1933: 
        !          1934: /* Query a devices capabilities */
        !          1935: 
        !          1936: C_RET cryptDeviceQueryCapability( C_IN CRYPT_DEVICE device,
        !          1937:                                                                  C_IN CRYPT_ALGO_TYPE cryptAlgo,
        !          1938:                                                                  C_OUT CRYPT_QUERY_INFO C_PTR cryptQueryInfo );
        !          1939: 
        !          1940: /* Create an encryption context via the device */
        !          1941: 
        !          1942: C_RET cryptDeviceCreateContext( C_IN CRYPT_DEVICE device,
        !          1943:                                                            C_OUT CRYPT_CONTEXT C_PTR cryptContext,
        !          1944:                                                            C_IN CRYPT_ALGO_TYPE cryptAlgo );
        !          1945: 
        !          1946: /****************************************************************************
        !          1947: *                                                                                                                                                      *
        !          1948: *                                                      User Management Functions                                               *
        !          1949: *                                                                                                                                                      *
        !          1950: ****************************************************************************/
        !          1951: 
        !          1952: /* Log on and off (create/destroy a user object) */
        !          1953: 
        !          1954: C_RET cryptLogin( C_OUT CRYPT_USER C_PTR user,
        !          1955:                                  C_IN C_STR name, C_IN C_STR password );
        !          1956: C_RET cryptLogout( C_IN CRYPT_USER user );
        !          1957: 
        !          1958: #if ( defined( WIN32 ) || defined( _WIN32 ) || defined( __WIN32__ ) ) && \
        !          1959:        !( defined( _SCCTK ) || defined( _CVI_ ) )
        !          1960: 
        !          1961: /****************************************************************************
        !          1962: *                                                                                                                                                      *
        !          1963: *                                                      User Interface Functions                                                *
        !          1964: *                                                                                                                                                      *
        !          1965: ****************************************************************************/
        !          1966: 
        !          1967: /* User interface functions, only available under Win32 */
        !          1968: 
        !          1969: C_RET cryptUIGenerateKey( C_IN CRYPT_DEVICE cryptDevice,
        !          1970:                                                  C_OUT CRYPT_CONTEXT C_PTR cryptContext,
        !          1971:                                                  C_IN CRYPT_CERTIFICATE cryptCert,
        !          1972:                                                  C_OUT char C_PTR password, C_IN HWND hWnd );
        !          1973: C_RET cryptUIDisplayCert( C_IN CRYPT_CERTIFICATE cryptCert,
        !          1974:                                                  C_IN HWND hWnd );
        !          1975: 
        !          1976: #endif /* Win32 */
        !          1977: 
        !          1978: #ifdef __cplusplus
        !          1979: }
        !          1980: #endif /* __cplusplus */
        !          1981: 
        !          1982: #endif /* _CRYPTLIB_DEFINED */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.