tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

pk11table.c (74027B)


      1 /* This Source Code Form is subject to the terms of the Mozilla Public
      2 * License, v. 2.0. If a copy of the MPL was not distributed with this
      3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      4 
      5 #include "pk11table.h"
      6 
      7 const char *_valueString[] = {
      8    "None",
      9    "Variable",
     10    "CK_ULONG",
     11    "Data",
     12    "UTF8",
     13    "CK_INFO",
     14    "CK_SLOT_INFO",
     15    "CK_TOKEN_INFO",
     16    "CK_SESSION_INFO",
     17    "CK_ATTRIBUTE",
     18    "CK_MECHANISM",
     19    "CK_MECHANISM_INFO",
     20    "CK_C_INITIALIZE_ARGS",
     21    "CK_FUNCTION_LIST"
     22 };
     23 
     24 const char **valueString = &_valueString[0];
     25 const int valueCount = sizeof(_valueString) / sizeof(_valueString[0]);
     26 
     27 const char *_constTypeString[] = {
     28    "None",
     29    "Bool",
     30    "InfoFlags",
     31    "SlotFlags",
     32    "TokenFlags",
     33    "SessionFlags",
     34    "MechanismFlags",
     35    "InitializeFlags",
     36    "Users",
     37    "SessionState",
     38    "Object",
     39    "Hardware",
     40    "KeyType",
     41    "CertificateType",
     42    "Attribute",
     43    "Mechanism",
     44    "Result",
     45    "Trust",
     46    "AvailableSizes",
     47    "CertCategory",
     48    "SecurityDomain",
     49    "OTPFormat",
     50    "OTPParam",
     51    "CurrentSize"
     52 };
     53 
     54 const char **constTypeString = &_constTypeString[0];
     55 const int constTypeCount = sizeof(_constTypeString) / sizeof(_constTypeString[0]);
     56 
     57 #define mkEntry(x, t)              \
     58    {                              \
     59 #x, x, Const##t, ConstNone \
     60    }
     61 #define mkEntry2(x, t, t2)         \
     62    {                              \
     63 #x, x, Const##t, Const##t2 \
     64    }
     65 
     66 const Constant _consts[] = {
     67    mkEntry(CK_FALSE, Bool),
     68    mkEntry(CK_TRUE, Bool),
     69 
     70    mkEntry(CKF_TOKEN_PRESENT, SlotFlags),
     71    mkEntry(CKF_REMOVABLE_DEVICE, SlotFlags),
     72    mkEntry(CKF_HW_SLOT, SlotFlags),
     73 
     74    mkEntry(CKF_RNG, TokenFlags),
     75    mkEntry(CKF_WRITE_PROTECTED, TokenFlags),
     76    mkEntry(CKF_LOGIN_REQUIRED, TokenFlags),
     77    mkEntry(CKF_USER_PIN_INITIALIZED, TokenFlags),
     78    mkEntry(CKF_RESTORE_KEY_NOT_NEEDED, TokenFlags),
     79    mkEntry(CKF_CLOCK_ON_TOKEN, TokenFlags),
     80    mkEntry(CKF_PROTECTED_AUTHENTICATION_PATH, TokenFlags),
     81    mkEntry(CKF_DUAL_CRYPTO_OPERATIONS, TokenFlags),
     82    mkEntry(CKF_TOKEN_INITIALIZED, TokenFlags),
     83    mkEntry(CKF_SECONDARY_AUTHENTICATION, TokenFlags),
     84    mkEntry(CKF_USER_PIN_COUNT_LOW, TokenFlags),
     85    mkEntry(CKF_USER_PIN_FINAL_TRY, TokenFlags),
     86    mkEntry(CKF_USER_PIN_LOCKED, TokenFlags),
     87    mkEntry(CKF_USER_PIN_TO_BE_CHANGED, TokenFlags),
     88    mkEntry(CKF_SO_PIN_COUNT_LOW, TokenFlags),
     89    mkEntry(CKF_SO_PIN_FINAL_TRY, TokenFlags),
     90    mkEntry(CKF_SO_PIN_LOCKED, TokenFlags),
     91    mkEntry(CKF_SO_PIN_TO_BE_CHANGED, TokenFlags),
     92    mkEntry(CKF_ERROR_STATE, TokenFlags),
     93    mkEntry(CKF_SEED_RANDOM_REQUIRED, TokenFlags),
     94    mkEntry(CKF_ASYNC_SESSION_SUPPORTED, TokenFlags),
     95 
     96    mkEntry(CKF_RW_SESSION, SessionFlags),
     97    mkEntry(CKF_SERIAL_SESSION, SessionFlags),
     98    mkEntry(CKF_ASYNC_SESSION, SessionFlags),
     99 
    100    mkEntry(CKF_HW, MechanismFlags),
    101    mkEntry(CKF_MESSAGE_ENCRYPT, MechanismFlags),
    102    mkEntry(CKF_MESSAGE_DECRYPT, MechanismFlags),
    103    mkEntry(CKF_MESSAGE_SIGN, MechanismFlags),
    104    mkEntry(CKF_MESSAGE_VERIFY, MechanismFlags),
    105    mkEntry(CKF_MULTI_MESSAGE, MechanismFlags),
    106    mkEntry(CKF_FIND_OBJECTS, MechanismFlags),
    107 
    108    mkEntry(CKF_ENCRYPT, MechanismFlags),
    109    mkEntry(CKF_DECRYPT, MechanismFlags),
    110    mkEntry(CKF_DIGEST, MechanismFlags),
    111    mkEntry(CKF_SIGN, MechanismFlags),
    112    mkEntry(CKF_SIGN_RECOVER, MechanismFlags),
    113    mkEntry(CKF_VERIFY, MechanismFlags),
    114    mkEntry(CKF_VERIFY_RECOVER, MechanismFlags),
    115    mkEntry(CKF_GENERATE, MechanismFlags),
    116    mkEntry(CKF_GENERATE_KEY_PAIR, MechanismFlags),
    117    mkEntry(CKF_WRAP, MechanismFlags),
    118    mkEntry(CKF_UNWRAP, MechanismFlags),
    119    mkEntry(CKF_DERIVE, MechanismFlags),
    120    mkEntry(CKF_EC_F_P, MechanismFlags),
    121    mkEntry(CKF_EC_F_2M, MechanismFlags),
    122    mkEntry(CKF_EC_ECPARAMETERS, MechanismFlags),
    123    mkEntry(CKF_EC_NAMEDCURVE, MechanismFlags),
    124    mkEntry(CKF_EC_UNCOMPRESS, MechanismFlags),
    125    mkEntry(CKF_EC_COMPRESS, MechanismFlags),
    126    mkEntry(CKF_DECAPSULATE, MechanismFlags),
    127    mkEntry(CKF_ENCAPSULATE, MechanismFlags),
    128    mkEntry(CKF_EXTENSION, MechanismFlags),
    129 
    130    mkEntry(CKF_LIBRARY_CANT_CREATE_OS_THREADS, InitializeFlags),
    131    mkEntry(CKF_OS_LOCKING_OK, InitializeFlags),
    132 
    133    mkEntry(CKU_SO, Users),
    134    mkEntry(CKU_USER, Users),
    135    mkEntry(CKU_CONTEXT_SPECIFIC, Users),
    136 
    137    mkEntry(CKS_RO_PUBLIC_SESSION, SessionState),
    138    mkEntry(CKS_RO_USER_FUNCTIONS, SessionState),
    139    mkEntry(CKS_RW_PUBLIC_SESSION, SessionState),
    140    mkEntry(CKS_RW_USER_FUNCTIONS, SessionState),
    141    mkEntry(CKS_RW_SO_FUNCTIONS, SessionState),
    142 
    143    mkEntry(CKO_DATA, Object),
    144    mkEntry(CKO_CERTIFICATE, Object),
    145    mkEntry(CKO_PUBLIC_KEY, Object),
    146    mkEntry(CKO_PRIVATE_KEY, Object),
    147    mkEntry(CKO_SECRET_KEY, Object),
    148    mkEntry(CKO_HW_FEATURE, Object),
    149    mkEntry(CKO_DOMAIN_PARAMETERS, Object),
    150    mkEntry(CKO_MECHANISM, Object),
    151    mkEntry(CKO_OTP_KEY, Object),
    152    mkEntry(CKO_PROFILE, Object),
    153    mkEntry(CKO_TRUST, Object),
    154    mkEntry(CKO_VALIDATION, Object),
    155    mkEntry(CKO_NSS_CRL, Object),
    156    mkEntry(CKO_NSS_SMIME, Object),
    157    mkEntry(CKO_NSS_TRUST, Object),
    158    mkEntry(CKO_NSS_BUILTIN_ROOT_LIST, Object),
    159 
    160    mkEntry(CKH_MONOTONIC_COUNTER, Hardware),
    161    mkEntry(CKH_CLOCK, Hardware),
    162    mkEntry(CKH_USER_INTERFACE, Hardware),
    163 
    164    mkEntry(CKK_RSA, KeyType),
    165    mkEntry(CKK_DSA, KeyType),
    166    mkEntry(CKK_DH, KeyType),
    167    mkEntry(CKK_ECDSA, KeyType),
    168    mkEntry(CKK_EC, KeyType),
    169    mkEntry(CKK_X9_42_DH, KeyType),
    170    mkEntry(CKK_KEA, KeyType),
    171    mkEntry(CKK_GENERIC_SECRET, KeyType),
    172    mkEntry(CKK_RC2, KeyType),
    173    mkEntry(CKK_RC4, KeyType),
    174    mkEntry(CKK_DES, KeyType),
    175    mkEntry(CKK_DES2, KeyType),
    176    mkEntry(CKK_DES3, KeyType),
    177    mkEntry(CKK_CAST, KeyType),
    178    mkEntry(CKK_CAST3, KeyType),
    179    mkEntry(CKK_CAST5, KeyType),
    180    mkEntry(CKK_CAST128, KeyType),
    181    mkEntry(CKK_RC5, KeyType),
    182    mkEntry(CKK_IDEA, KeyType),
    183    mkEntry(CKK_SKIPJACK, KeyType),
    184    mkEntry(CKK_BATON, KeyType),
    185    mkEntry(CKK_JUNIPER, KeyType),
    186    mkEntry(CKK_CDMF, KeyType),
    187    mkEntry(CKK_AES, KeyType),
    188    mkEntry(CKK_BLOWFISH, KeyType),
    189    mkEntry(CKK_TWOFISH, KeyType),
    190    mkEntry(CKK_SECURID, KeyType),
    191    mkEntry(CKK_ACTI, KeyType),
    192    mkEntry(CKK_HOTP, KeyType),
    193    mkEntry(CKK_CAMELLIA, KeyType),
    194    mkEntry(CKK_SEED, KeyType),
    195    mkEntry(CKK_ARIA, KeyType),
    196    mkEntry(CKK_MD5_HMAC, KeyType),
    197    mkEntry(CKK_SHA_1_HMAC, KeyType),
    198    mkEntry(CKK_RIPEMD128_HMAC, KeyType),
    199    mkEntry(CKK_RIPEMD160_HMAC, KeyType),
    200    mkEntry(CKK_SHA256_HMAC, KeyType),
    201    mkEntry(CKK_SHA384_HMAC, KeyType),
    202    mkEntry(CKK_SHA512_HMAC, KeyType),
    203    mkEntry(CKK_SHA224_HMAC, KeyType),
    204    mkEntry(CKK_GOSTR3410, KeyType),
    205    mkEntry(CKK_GOSTR3411, KeyType),
    206    mkEntry(CKK_GOST28147, KeyType),
    207    mkEntry(CKK_CHACHA20, KeyType),
    208    mkEntry(CKK_POLY1305, KeyType),
    209    mkEntry(CKK_AES_XTS, KeyType),
    210    mkEntry(CKK_SHA3_224_HMAC, KeyType),
    211    mkEntry(CKK_SHA3_256_HMAC, KeyType),
    212    mkEntry(CKK_SHA3_384_HMAC, KeyType),
    213    mkEntry(CKK_SHA3_512_HMAC, KeyType),
    214    mkEntry(CKK_BLAKE2B_160_HMAC, KeyType),
    215    mkEntry(CKK_BLAKE2B_256_HMAC, KeyType),
    216    mkEntry(CKK_BLAKE2B_384_HMAC, KeyType),
    217    mkEntry(CKK_BLAKE2B_512_HMAC, KeyType),
    218    mkEntry(CKK_SALSA20, KeyType),
    219    mkEntry(CKK_X2RATCHET, KeyType),
    220    mkEntry(CKK_EC_EDWARDS, KeyType),
    221    mkEntry(CKK_EC_MONTGOMERY, KeyType),
    222    mkEntry(CKK_HKDF, KeyType),
    223    mkEntry(CKK_SHA512_224_HMAC, KeyType),
    224    mkEntry(CKK_SHA512_256_HMAC, KeyType),
    225    mkEntry(CKK_SHA512_T_HMAC, KeyType),
    226    mkEntry(CKK_HSS, KeyType),
    227    mkEntry(CKK_ML_DSA, KeyType),
    228    mkEntry(CKK_ML_KEM, KeyType),
    229    mkEntry(CKK_SLH_DSA, KeyType),
    230    mkEntry(CKK_XMSS, KeyType),
    231    mkEntry(CKK_XMSSMT, KeyType),
    232    mkEntry(CKK_NSS_PKCS8, KeyType),
    233 
    234    mkEntry(CKC_X_509, CertType),
    235    mkEntry(CKC_X_509_ATTR_CERT, CertType),
    236    mkEntry(CKC_WTLS, CertType),
    237 
    238    mkEntry(CK_CERTIFICATE_CATEGORY_UNSPECIFIED, CertCategory),
    239    mkEntry(CK_CERTIFICATE_CATEGORY_TOKEN_USER, CertCategory),
    240    mkEntry(CK_CERTIFICATE_CATEGORY_AUTHORITY, CertCategory),
    241    mkEntry(CK_CERTIFICATE_CATEGORY_OTHER_ENTITY, CertCategory),
    242 
    243    mkEntry(CK_SECURITY_DOMAIN_UNSPECIFIED, SecurityDomain),
    244    mkEntry(CK_SECURITY_DOMAIN_MANUFACTURER, SecurityDomain),
    245    mkEntry(CK_SECURITY_DOMAIN_OPERATOR, SecurityDomain),
    246    mkEntry(CK_SECURITY_DOMAIN_THIRD_PARTY, SecurityDomain),
    247 
    248    mkEntry(CK_OTP_FORMAT_DECIMAL, OTPFormat),
    249    mkEntry(CK_OTP_FORMAT_HEXADECIMAL, OTPFormat),
    250    mkEntry(CK_OTP_FORMAT_ALPHANUMERIC, OTPFormat),
    251    mkEntry(CK_OTP_FORMAT_BINARY, OTPFormat),
    252 
    253    mkEntry(CK_OTP_PARAM_IGNORED, OTPParam),
    254    mkEntry(CK_OTP_PARAM_OPTIONAL, OTPParam),
    255    mkEntry(CK_OTP_PARAM_MANDATORY, OTPParam),
    256 
    257    mkEntry2(CKA_CLASS, Attribute, Object),
    258    mkEntry2(CKA_TOKEN, Attribute, Bool),
    259    mkEntry2(CKA_PRIVATE, Attribute, Bool),
    260    mkEntry2(CKA_LABEL, Attribute, None),
    261    mkEntry2(CKA_UNIQUE_ID, Attribute, None),
    262    mkEntry2(CKA_APPLICATION, Attribute, None),
    263    mkEntry2(CKA_VALUE, Attribute, None),
    264    mkEntry2(CKA_OBJECT_ID, Attribute, None),
    265    mkEntry2(CKA_CERTIFICATE_TYPE, Attribute, CertType),
    266    mkEntry2(CKA_ISSUER, Attribute, None),
    267    mkEntry2(CKA_SERIAL_NUMBER, Attribute, None),
    268    mkEntry2(CKA_AC_ISSUER, Attribute, None),
    269    mkEntry2(CKA_OWNER, Attribute, None),
    270    mkEntry2(CKA_ATTR_TYPES, Attribute, None),
    271    mkEntry2(CKA_TRUSTED, Attribute, Bool),
    272    mkEntry2(CKA_CERTIFICATE_CATEGORY, Attribute, CertCategory),
    273    mkEntry2(CKA_JAVA_MIDP_SECURITY_DOMAIN, Attribute, SecurityDomain),
    274    mkEntry2(CKA_URL, Attribute, None),
    275    mkEntry2(CKA_HASH_OF_SUBJECT_PUBLIC_KEY, Attribute, None),
    276    mkEntry2(CKA_HASH_OF_ISSUER_PUBLIC_KEY, Attribute, None),
    277    mkEntry2(CKA_NAME_HASH_ALGORITHM, Attribute, Mechanism),
    278    mkEntry2(CKA_CHECK_VALUE, Attribute, None),
    279    mkEntry2(CKA_KEY_TYPE, Attribute, KeyType),
    280    mkEntry2(CKA_SUBJECT, Attribute, None),
    281    mkEntry2(CKA_ID, Attribute, None),
    282    mkEntry2(CKA_SENSITIVE, Attribute, Bool),
    283    mkEntry2(CKA_ENCRYPT, Attribute, Bool),
    284    mkEntry2(CKA_DECRYPT, Attribute, Bool),
    285    mkEntry2(CKA_WRAP, Attribute, Bool),
    286    mkEntry2(CKA_UNWRAP, Attribute, Bool),
    287    mkEntry2(CKA_SIGN, Attribute, Bool),
    288    mkEntry2(CKA_SIGN_RECOVER, Attribute, Bool),
    289    mkEntry2(CKA_VERIFY, Attribute, Bool),
    290    mkEntry2(CKA_VERIFY_RECOVER, Attribute, Bool),
    291    mkEntry2(CKA_DERIVE, Attribute, Bool),
    292    mkEntry2(CKA_START_DATE, Attribute, None),
    293    mkEntry2(CKA_END_DATE, Attribute, None),
    294    mkEntry2(CKA_MODULUS, Attribute, None),
    295    mkEntry2(CKA_MODULUS_BITS, Attribute, None),
    296    mkEntry2(CKA_PUBLIC_EXPONENT, Attribute, None),
    297    mkEntry2(CKA_PRIVATE_EXPONENT, Attribute, None),
    298    mkEntry2(CKA_PRIME_1, Attribute, None),
    299    mkEntry2(CKA_PRIME_2, Attribute, None),
    300    mkEntry2(CKA_EXPONENT_1, Attribute, None),
    301    mkEntry2(CKA_EXPONENT_2, Attribute, None),
    302    mkEntry2(CKA_COEFFICIENT, Attribute, None),
    303    mkEntry2(CKA_PUBLIC_KEY_INFO, Attribute, None),
    304    mkEntry2(CKA_PRIME, Attribute, None),
    305    mkEntry2(CKA_SUBPRIME, Attribute, None),
    306    mkEntry2(CKA_BASE, Attribute, None),
    307    mkEntry2(CKA_PRIME_BITS, Attribute, None),
    308    mkEntry2(CKA_SUBPRIME_BITS, Attribute, None),
    309    mkEntry2(CKA_SUB_PRIME_BITS, Attribute, None),
    310    mkEntry2(CKA_VALUE_BITS, Attribute, None),
    311    mkEntry2(CKA_VALUE_LEN, Attribute, None),
    312    mkEntry2(CKA_EXTRACTABLE, Attribute, Bool),
    313    mkEntry2(CKA_LOCAL, Attribute, Bool),
    314    mkEntry2(CKA_NEVER_EXTRACTABLE, Attribute, Bool),
    315    mkEntry2(CKA_ALWAYS_SENSITIVE, Attribute, Bool),
    316    mkEntry2(CKA_KEY_GEN_MECHANISM, Attribute, Mechanism),
    317    mkEntry2(CKA_MODIFIABLE, Attribute, Bool),
    318    mkEntry2(CKA_COPYABLE, Attribute, Bool),
    319    mkEntry2(CKA_DESTROYABLE, Attribute, Bool),
    320    mkEntry2(CKA_ECDSA_PARAMS, Attribute, None),
    321    mkEntry2(CKA_EC_PARAMS, Attribute, None),
    322    mkEntry2(CKA_EC_POINT, Attribute, None),
    323    mkEntry2(CKA_SECONDARY_AUTH, Attribute, None),
    324    mkEntry2(CKA_AUTH_PIN_FLAGS, Attribute, None),
    325    mkEntry2(CKA_ALWAYS_AUTHENTICATE, Attribute, Bool),
    326    mkEntry2(CKA_WRAP_WITH_TRUSTED, Attribute, Bool),
    327    mkEntry2(CKA_WRAP_TEMPLATE, Attribute, None),
    328    mkEntry2(CKA_UNWRAP_TEMPLATE, Attribute, None),
    329    mkEntry2(CKA_DERIVE_TEMPLATE, Attribute, None),
    330    mkEntry2(CKA_OTP_FORMAT, Attribute, OTPFormat),
    331    mkEntry2(CKA_OTP_LENGTH, Attribute, None),
    332    mkEntry2(CKA_OTP_TIME_INTERVAL, Attribute, None),
    333    mkEntry2(CKA_OTP_USER_FRIENDLY_MODE, Attribute, None),
    334    mkEntry2(CKA_OTP_CHALLENGE_REQUIREMENT, Attribute, OTPParam),
    335    mkEntry2(CKA_OTP_TIME_REQUIREMENT, Attribute, OTPParam),
    336    mkEntry2(CKA_OTP_COUNTER_REQUIREMENT, Attribute, OTPParam),
    337    mkEntry2(CKA_OTP_PIN_REQUIREMENT, Attribute, OTPParam),
    338    mkEntry2(CKA_OTP_COUNTER, Attribute, None),
    339    mkEntry2(CKA_OTP_TIME, Attribute, None),
    340    mkEntry2(CKA_OTP_USER_IDENTIFIER, Attribute, None),
    341    mkEntry2(CKA_OTP_SERVICE_IDENTIFIER, Attribute, None),
    342    mkEntry2(CKA_OTP_SERVICE_LOGO, Attribute, None),
    343    mkEntry2(CKA_OTP_SERVICE_LOGO_TYPE, Attribute, None),
    344    mkEntry2(CKA_GOSTR3410_PARAMS, Attribute, None),
    345    mkEntry2(CKA_GOSTR3411_PARAMS, Attribute, None),
    346    mkEntry2(CKA_GOST28147_PARAMS, Attribute, None),
    347    mkEntry2(CKA_HW_FEATURE_TYPE, Attribute, Hardware),
    348    mkEntry2(CKA_RESET_ON_INIT, Attribute, Bool),
    349    mkEntry2(CKA_HAS_RESET, Attribute, Bool),
    350    mkEntry2(CKA_PROFILE_ID, Attribute, None),
    351    mkEntry2(CKA_PKCS_TRUST_SERVER_AUTH, Attribute, Trust),
    352    mkEntry2(CKA_PKCS_TRUST_CLIENT_AUTH, Attribute, Trust),
    353    mkEntry2(CKA_PKCS_TRUST_CODE_SIGNING, Attribute, Trust),
    354    mkEntry2(CKA_PKCS_TRUST_EMAIL_PROTECTION, Attribute, Trust),
    355    mkEntry2(CKA_TRUST_IPSEC_IKE, Attribute, Trust),
    356    mkEntry2(CKA_PKCS_TRUST_TIME_STAMPING, Attribute, Trust),
    357    mkEntry2(CKA_NAME_HASH_ALGORITHM, Attribute, Trust),
    358    mkEntry2(CKA_HASH_OF_CERTIFICATE, Attribute, Trust),
    359    mkEntry2(CKA_NSS_URL, Attribute, None),
    360    mkEntry2(CKA_NSS_EMAIL, Attribute, None),
    361    mkEntry2(CKA_NSS_SMIME_INFO, Attribute, None),
    362    mkEntry2(CKA_NSS_SMIME_TIMESTAMP, Attribute, None),
    363    mkEntry2(CKA_NSS_PKCS8_SALT, Attribute, None),
    364    mkEntry2(CKA_NSS_PASSWORD_CHECK, Attribute, None),
    365    mkEntry2(CKA_NSS_EXPIRES, Attribute, None),
    366    mkEntry2(CKA_NSS_KRL, Attribute, None),
    367    mkEntry2(CKA_NSS_PQG_COUNTER, Attribute, None),
    368    mkEntry2(CKA_NSS_PQG_SEED, Attribute, None),
    369    mkEntry2(CKA_NSS_PQG_H, Attribute, None),
    370    mkEntry2(CKA_NSS_PQG_SEED_BITS, Attribute, None),
    371    mkEntry2(CKA_NSS_TRUST_DIGITAL_SIGNATURE, Attribute, Trust),
    372    mkEntry2(CKA_NSS_TRUST_NON_REPUDIATION, Attribute, Trust),
    373    mkEntry2(CKA_NSS_TRUST_KEY_ENCIPHERMENT, Attribute, Trust),
    374    mkEntry2(CKA_NSS_TRUST_DATA_ENCIPHERMENT, Attribute, Trust),
    375    mkEntry2(CKA_NSS_TRUST_KEY_AGREEMENT, Attribute, Trust),
    376    mkEntry2(CKA_NSS_TRUST_KEY_CERT_SIGN, Attribute, Trust),
    377    mkEntry2(CKA_NSS_TRUST_CRL_SIGN, Attribute, Trust),
    378    mkEntry2(CKA_NSS_TRUST_SERVER_AUTH, Attribute, Trust),
    379    mkEntry2(CKA_NSS_TRUST_CLIENT_AUTH, Attribute, Trust),
    380    mkEntry2(CKA_NSS_TRUST_CODE_SIGNING, Attribute, Trust),
    381    mkEntry2(CKA_NSS_TRUST_EMAIL_PROTECTION, Attribute, Trust),
    382    mkEntry2(CKA_NSS_TRUST_IPSEC_END_SYSTEM, Attribute, Trust),
    383    mkEntry2(CKA_NSS_TRUST_IPSEC_TUNNEL, Attribute, Trust),
    384    mkEntry2(CKA_NSS_TRUST_IPSEC_USER, Attribute, Trust),
    385    mkEntry2(CKA_NSS_TRUST_TIME_STAMPING, Attribute, Trust),
    386    mkEntry2(CKA_NSS_TRUST_STEP_UP_APPROVED, Attribute, Bool),
    387    mkEntry2(CKA_NSS_CERT_SHA1_HASH, Attribute, None),
    388    mkEntry2(CKA_NSS_CERT_MD5_HASH, Attribute, None),
    389    mkEntry2(CKA_NSS_DB, Attribute, None),
    390    mkEntry2(CKA_NSS_TRUST, Attribute, Trust),
    391 
    392    mkEntry(CKM_RSA_PKCS, Mechanism),
    393    mkEntry(CKM_RSA_9796, Mechanism),
    394    mkEntry(CKM_RSA_X_509, Mechanism),
    395    mkEntry(CKM_RSA_PKCS_KEY_PAIR_GEN, Mechanism),
    396    mkEntry(CKM_MD2_RSA_PKCS, Mechanism),
    397    mkEntry(CKM_MD5_RSA_PKCS, Mechanism),
    398    mkEntry(CKM_SHA1_RSA_PKCS, Mechanism),
    399    mkEntry(CKM_RIPEMD128_RSA_PKCS, Mechanism),
    400    mkEntry(CKM_RIPEMD160_RSA_PKCS, Mechanism),
    401    mkEntry(CKM_RSA_PKCS_OAEP, Mechanism),
    402    mkEntry(CKM_RSA_X9_31_KEY_PAIR_GEN, Mechanism),
    403    mkEntry(CKM_RSA_X9_31, Mechanism),
    404    mkEntry(CKM_SHA1_RSA_X9_31, Mechanism),
    405    mkEntry(CKM_DSA_KEY_PAIR_GEN, Mechanism),
    406    mkEntry(CKM_DSA, Mechanism),
    407    mkEntry(CKM_DSA_SHA1, Mechanism),
    408    mkEntry(CKM_DH_PKCS_KEY_PAIR_GEN, Mechanism),
    409    mkEntry(CKM_DH_PKCS_DERIVE, Mechanism),
    410    mkEntry(CKM_X9_42_DH_DERIVE, Mechanism),
    411    mkEntry(CKM_X9_42_DH_HYBRID_DERIVE, Mechanism),
    412    mkEntry(CKM_X9_42_MQV_DERIVE, Mechanism),
    413    mkEntry(CKM_SHA256_RSA_PKCS, Mechanism),
    414    mkEntry(CKM_SHA384_RSA_PKCS, Mechanism),
    415    mkEntry(CKM_SHA512_RSA_PKCS, Mechanism),
    416    mkEntry(CKM_RC2_KEY_GEN, Mechanism),
    417    mkEntry(CKM_RC2_ECB, Mechanism),
    418    mkEntry(CKM_RC2_CBC, Mechanism),
    419    mkEntry(CKM_RC2_MAC, Mechanism),
    420    mkEntry(CKM_RC2_MAC_GENERAL, Mechanism),
    421    mkEntry(CKM_RC2_CBC_PAD, Mechanism),
    422    mkEntry(CKM_RC4_KEY_GEN, Mechanism),
    423    mkEntry(CKM_RC4, Mechanism),
    424    mkEntry(CKM_DES_KEY_GEN, Mechanism),
    425    mkEntry(CKM_DES_ECB, Mechanism),
    426    mkEntry(CKM_DES_CBC, Mechanism),
    427    mkEntry(CKM_DES_MAC, Mechanism),
    428    mkEntry(CKM_DES_MAC_GENERAL, Mechanism),
    429    mkEntry(CKM_DES_CBC_PAD, Mechanism),
    430    mkEntry(CKM_DES2_KEY_GEN, Mechanism),
    431    mkEntry(CKM_DES3_KEY_GEN, Mechanism),
    432    mkEntry(CKM_DES3_ECB, Mechanism),
    433    mkEntry(CKM_DES3_CBC, Mechanism),
    434    mkEntry(CKM_DES3_MAC, Mechanism),
    435    mkEntry(CKM_DES3_MAC_GENERAL, Mechanism),
    436    mkEntry(CKM_DES3_CBC_PAD, Mechanism),
    437    mkEntry(CKM_CDMF_KEY_GEN, Mechanism),
    438    mkEntry(CKM_CDMF_ECB, Mechanism),
    439    mkEntry(CKM_CDMF_CBC, Mechanism),
    440    mkEntry(CKM_CDMF_MAC, Mechanism),
    441    mkEntry(CKM_CDMF_MAC_GENERAL, Mechanism),
    442    mkEntry(CKM_CDMF_CBC_PAD, Mechanism),
    443    mkEntry(CKM_MD2, Mechanism),
    444    mkEntry(CKM_MD2_HMAC, Mechanism),
    445    mkEntry(CKM_MD2_HMAC_GENERAL, Mechanism),
    446    mkEntry(CKM_MD5, Mechanism),
    447    mkEntry(CKM_MD5_HMAC, Mechanism),
    448    mkEntry(CKM_MD5_HMAC_GENERAL, Mechanism),
    449    mkEntry(CKM_SHA_1, Mechanism),
    450    mkEntry(CKM_SHA_1_HMAC, Mechanism),
    451    mkEntry(CKM_SHA_1_HMAC_GENERAL, Mechanism),
    452    mkEntry(CKM_RIPEMD128, Mechanism),
    453    mkEntry(CKM_RIPEMD128_HMAC, Mechanism),
    454    mkEntry(CKM_RIPEMD128_HMAC_GENERAL, Mechanism),
    455    mkEntry(CKM_RIPEMD160, Mechanism),
    456    mkEntry(CKM_RIPEMD160_HMAC, Mechanism),
    457    mkEntry(CKM_RIPEMD160_HMAC_GENERAL, Mechanism),
    458    mkEntry(CKM_SHA256, Mechanism),
    459    mkEntry(CKM_SHA256_HMAC_GENERAL, Mechanism),
    460    mkEntry(CKM_SHA256_HMAC, Mechanism),
    461    mkEntry(CKM_SHA384, Mechanism),
    462    mkEntry(CKM_SHA384_HMAC_GENERAL, Mechanism),
    463    mkEntry(CKM_SHA384_HMAC, Mechanism),
    464    mkEntry(CKM_SHA512, Mechanism),
    465    mkEntry(CKM_SHA512_HMAC_GENERAL, Mechanism),
    466    mkEntry(CKM_SHA512_HMAC, Mechanism),
    467    mkEntry(CKM_AES_CMAC, Mechanism),
    468    mkEntry(CKM_AES_CMAC_GENERAL, Mechanism),
    469    mkEntry(CKM_CAST_KEY_GEN, Mechanism),
    470    mkEntry(CKM_CAST_ECB, Mechanism),
    471    mkEntry(CKM_CAST_CBC, Mechanism),
    472    mkEntry(CKM_CAST_MAC, Mechanism),
    473    mkEntry(CKM_CAST_MAC_GENERAL, Mechanism),
    474    mkEntry(CKM_CAST_CBC_PAD, Mechanism),
    475    mkEntry(CKM_CAST3_KEY_GEN, Mechanism),
    476    mkEntry(CKM_CAST3_ECB, Mechanism),
    477    mkEntry(CKM_CAST3_CBC, Mechanism),
    478    mkEntry(CKM_CAST3_MAC, Mechanism),
    479    mkEntry(CKM_CAST3_MAC_GENERAL, Mechanism),
    480    mkEntry(CKM_CAST3_CBC_PAD, Mechanism),
    481    mkEntry(CKM_CAST5_KEY_GEN, Mechanism),
    482    mkEntry(CKM_CAST128_KEY_GEN, Mechanism),
    483    mkEntry(CKM_CAST5_ECB, Mechanism),
    484    mkEntry(CKM_CAST128_ECB, Mechanism),
    485    mkEntry(CKM_CAST5_CBC, Mechanism),
    486    mkEntry(CKM_CAST128_CBC, Mechanism),
    487    mkEntry(CKM_CAST5_MAC, Mechanism),
    488    mkEntry(CKM_CAST128_MAC, Mechanism),
    489    mkEntry(CKM_CAST5_MAC_GENERAL, Mechanism),
    490    mkEntry(CKM_CAST128_MAC_GENERAL, Mechanism),
    491    mkEntry(CKM_CAST5_CBC_PAD, Mechanism),
    492    mkEntry(CKM_CAST128_CBC_PAD, Mechanism),
    493    mkEntry(CKM_RC5_KEY_GEN, Mechanism),
    494    mkEntry(CKM_RC5_ECB, Mechanism),
    495    mkEntry(CKM_RC5_CBC, Mechanism),
    496    mkEntry(CKM_RC5_MAC, Mechanism),
    497    mkEntry(CKM_RC5_MAC_GENERAL, Mechanism),
    498    mkEntry(CKM_RC5_CBC_PAD, Mechanism),
    499    mkEntry(CKM_IDEA_KEY_GEN, Mechanism),
    500    mkEntry(CKM_IDEA_ECB, Mechanism),
    501    mkEntry(CKM_IDEA_CBC, Mechanism),
    502    mkEntry(CKM_IDEA_MAC, Mechanism),
    503    mkEntry(CKM_IDEA_MAC_GENERAL, Mechanism),
    504    mkEntry(CKM_IDEA_CBC_PAD, Mechanism),
    505    mkEntry(CKM_GENERIC_SECRET_KEY_GEN, Mechanism),
    506    mkEntry(CKM_CONCATENATE_BASE_AND_KEY, Mechanism),
    507    mkEntry(CKM_CONCATENATE_BASE_AND_DATA, Mechanism),
    508    mkEntry(CKM_CONCATENATE_DATA_AND_BASE, Mechanism),
    509    mkEntry(CKM_XOR_BASE_AND_DATA, Mechanism),
    510    mkEntry(CKM_EXTRACT_KEY_FROM_KEY, Mechanism),
    511    mkEntry(CKM_SSL3_PRE_MASTER_KEY_GEN, Mechanism),
    512    mkEntry(CKM_SSL3_MASTER_KEY_DERIVE, Mechanism),
    513    mkEntry(CKM_SSL3_KEY_AND_MAC_DERIVE, Mechanism),
    514    mkEntry(CKM_SSL3_MASTER_KEY_DERIVE_DH, Mechanism),
    515    mkEntry(CKM_TLS_PRE_MASTER_KEY_GEN, Mechanism),
    516    mkEntry(CKM_TLS_MASTER_KEY_DERIVE, Mechanism),
    517    mkEntry(CKM_NSS_TLS_MASTER_KEY_DERIVE_SHA256, Mechanism),
    518    mkEntry(CKM_TLS_KEY_AND_MAC_DERIVE, Mechanism),
    519    mkEntry(CKM_NSS_TLS_KEY_AND_MAC_DERIVE_SHA256, Mechanism),
    520    mkEntry(CKM_TLS_MASTER_KEY_DERIVE_DH, Mechanism),
    521    mkEntry(CKM_NSS_TLS_MASTER_KEY_DERIVE_DH_SHA256, Mechanism),
    522    mkEntry(CKM_SSL3_MD5_MAC, Mechanism),
    523    mkEntry(CKM_SSL3_SHA1_MAC, Mechanism),
    524    mkEntry(CKM_MD5_KEY_DERIVATION, Mechanism),
    525    mkEntry(CKM_MD2_KEY_DERIVATION, Mechanism),
    526    mkEntry(CKM_SHA1_KEY_DERIVATION, Mechanism),
    527    mkEntry(CKM_SHA256_KEY_DERIVATION, Mechanism),
    528    mkEntry(CKM_SHA384_KEY_DERIVATION, Mechanism),
    529    mkEntry(CKM_SHA512_KEY_DERIVATION, Mechanism),
    530    mkEntry(CKM_PBE_MD2_DES_CBC, Mechanism),
    531    mkEntry(CKM_PBE_MD5_DES_CBC, Mechanism),
    532    mkEntry(CKM_PBE_MD5_CAST_CBC, Mechanism),
    533    mkEntry(CKM_PBE_MD5_CAST3_CBC, Mechanism),
    534    mkEntry(CKM_PBE_MD5_CAST5_CBC, Mechanism),
    535    mkEntry(CKM_PBE_MD5_CAST128_CBC, Mechanism),
    536    mkEntry(CKM_PBE_SHA1_CAST5_CBC, Mechanism),
    537    mkEntry(CKM_PBE_SHA1_CAST128_CBC, Mechanism),
    538    mkEntry(CKM_PBE_SHA1_RC4_128, Mechanism),
    539    mkEntry(CKM_PBE_SHA1_RC4_40, Mechanism),
    540    mkEntry(CKM_PBE_SHA1_DES3_EDE_CBC, Mechanism),
    541    mkEntry(CKM_PBE_SHA1_DES2_EDE_CBC, Mechanism),
    542    mkEntry(CKM_PBE_SHA1_RC2_128_CBC, Mechanism),
    543    mkEntry(CKM_PBE_SHA1_RC2_40_CBC, Mechanism),
    544    mkEntry(CKM_PKCS5_PBKD2, Mechanism),
    545    mkEntry(CKM_PBA_SHA1_WITH_SHA1_HMAC, Mechanism),
    546    mkEntry(CKM_KEY_WRAP_LYNKS, Mechanism),
    547    mkEntry(CKM_KEY_WRAP_SET_OAEP, Mechanism),
    548    mkEntry(CKM_SKIPJACK_KEY_GEN, Mechanism),
    549    mkEntry(CKM_SKIPJACK_ECB64, Mechanism),
    550    mkEntry(CKM_SKIPJACK_CBC64, Mechanism),
    551    mkEntry(CKM_SKIPJACK_OFB64, Mechanism),
    552    mkEntry(CKM_SKIPJACK_CFB64, Mechanism),
    553    mkEntry(CKM_SKIPJACK_CFB32, Mechanism),
    554    mkEntry(CKM_SKIPJACK_CFB16, Mechanism),
    555    mkEntry(CKM_SKIPJACK_CFB8, Mechanism),
    556    mkEntry(CKM_SKIPJACK_WRAP, Mechanism),
    557    mkEntry(CKM_SKIPJACK_PRIVATE_WRAP, Mechanism),
    558    mkEntry(CKM_SKIPJACK_RELAYX, Mechanism),
    559    mkEntry(CKM_KEA_KEY_PAIR_GEN, Mechanism),
    560    mkEntry(CKM_KEA_KEY_DERIVE, Mechanism),
    561    mkEntry(CKM_FORTEZZA_TIMESTAMP, Mechanism),
    562    mkEntry(CKM_BATON_KEY_GEN, Mechanism),
    563    mkEntry(CKM_BATON_ECB128, Mechanism),
    564    mkEntry(CKM_BATON_ECB96, Mechanism),
    565    mkEntry(CKM_BATON_CBC128, Mechanism),
    566    mkEntry(CKM_BATON_COUNTER, Mechanism),
    567    mkEntry(CKM_BATON_SHUFFLE, Mechanism),
    568    mkEntry(CKM_BATON_WRAP, Mechanism),
    569    mkEntry(CKM_ECDSA_KEY_PAIR_GEN, Mechanism),
    570    mkEntry(CKM_EC_KEY_PAIR_GEN, Mechanism),
    571    mkEntry(CKM_ECDSA, Mechanism),
    572    mkEntry(CKM_ECDSA_SHA1, Mechanism),
    573    mkEntry(CKM_ECDH1_DERIVE, Mechanism),
    574    mkEntry(CKM_ECDH1_COFACTOR_DERIVE, Mechanism),
    575    mkEntry(CKM_EC_EDWARDS_KEY_PAIR_GEN, Mechanism),
    576    mkEntry(CKM_EDDSA, Mechanism),
    577    mkEntry(CKM_ECMQV_DERIVE, Mechanism),
    578    mkEntry(CKM_JUNIPER_KEY_GEN, Mechanism),
    579    mkEntry(CKM_JUNIPER_ECB128, Mechanism),
    580    mkEntry(CKM_JUNIPER_CBC128, Mechanism),
    581    mkEntry(CKM_JUNIPER_COUNTER, Mechanism),
    582    mkEntry(CKM_JUNIPER_SHUFFLE, Mechanism),
    583    mkEntry(CKM_JUNIPER_WRAP, Mechanism),
    584    mkEntry(CKM_FASTHASH, Mechanism),
    585    mkEntry(CKM_AES_KEY_GEN, Mechanism),
    586    mkEntry(CKM_AES_ECB, Mechanism),
    587    mkEntry(CKM_AES_CBC, Mechanism),
    588    mkEntry(CKM_AES_MAC, Mechanism),
    589    mkEntry(CKM_AES_MAC_GENERAL, Mechanism),
    590    mkEntry(CKM_AES_CBC_PAD, Mechanism),
    591    mkEntry(CKM_CAMELLIA_KEY_GEN, Mechanism),
    592    mkEntry(CKM_CAMELLIA_ECB, Mechanism),
    593    mkEntry(CKM_CAMELLIA_CBC, Mechanism),
    594    mkEntry(CKM_CAMELLIA_MAC, Mechanism),
    595    mkEntry(CKM_CAMELLIA_MAC_GENERAL, Mechanism),
    596    mkEntry(CKM_CAMELLIA_CBC_PAD, Mechanism),
    597    mkEntry(CKM_SEED_KEY_GEN, Mechanism),
    598    mkEntry(CKM_SEED_ECB, Mechanism),
    599    mkEntry(CKM_SEED_CBC, Mechanism),
    600    mkEntry(CKM_SEED_MAC, Mechanism),
    601    mkEntry(CKM_SEED_MAC_GENERAL, Mechanism),
    602    mkEntry(CKM_SEED_CBC_PAD, Mechanism),
    603    mkEntry(CKM_SEED_ECB_ENCRYPT_DATA, Mechanism),
    604    mkEntry(CKM_SEED_CBC_ENCRYPT_DATA, Mechanism),
    605    mkEntry(CKM_DSA_PARAMETER_GEN, Mechanism),
    606    mkEntry(CKM_DH_PKCS_PARAMETER_GEN, Mechanism),
    607    mkEntry(CKM_NSS_AES_KEY_WRAP, Mechanism),
    608    mkEntry(CKM_NSS_AES_KEY_WRAP_PAD, Mechanism),
    609    mkEntry(CKM_NSS_PBE_SHA1_DES_CBC, Mechanism),
    610    mkEntry(CKM_NSS_PBE_SHA1_TRIPLE_DES_CBC, Mechanism),
    611    mkEntry(CKM_NSS_PBE_SHA1_40_BIT_RC2_CBC, Mechanism),
    612    mkEntry(CKM_NSS_PBE_SHA1_128_BIT_RC2_CBC, Mechanism),
    613    mkEntry(CKM_NSS_PBE_SHA1_40_BIT_RC4, Mechanism),
    614    mkEntry(CKM_NSS_PBE_SHA1_128_BIT_RC4, Mechanism),
    615    mkEntry(CKM_NSS_PBE_SHA1_FAULTY_3DES_CBC, Mechanism),
    616    mkEntry(CKM_NSS_PBE_SHA1_HMAC_KEY_GEN, Mechanism),
    617    mkEntry(CKM_NSS_PBE_MD5_HMAC_KEY_GEN, Mechanism),
    618    mkEntry(CKM_NSS_PBE_MD2_HMAC_KEY_GEN, Mechanism),
    619    mkEntry(CKM_TLS_PRF_GENERAL, Mechanism),
    620    mkEntry(CKM_NSS_TLS_PRF_GENERAL_SHA256, Mechanism),
    621 
    622    mkEntry(CKR_OK, Result),
    623    mkEntry(CKR_CANCEL, Result),
    624    mkEntry(CKR_HOST_MEMORY, Result),
    625    mkEntry(CKR_SLOT_ID_INVALID, Result),
    626    mkEntry(CKR_GENERAL_ERROR, Result),
    627    mkEntry(CKR_FUNCTION_FAILED, Result),
    628    mkEntry(CKR_ARGUMENTS_BAD, Result),
    629    mkEntry(CKR_NO_EVENT, Result),
    630    mkEntry(CKR_NEED_TO_CREATE_THREADS, Result),
    631    mkEntry(CKR_CANT_LOCK, Result),
    632    mkEntry(CKR_ATTRIBUTE_READ_ONLY, Result),
    633    mkEntry(CKR_ATTRIBUTE_SENSITIVE, Result),
    634    mkEntry(CKR_ATTRIBUTE_TYPE_INVALID, Result),
    635    mkEntry(CKR_ATTRIBUTE_VALUE_INVALID, Result),
    636    mkEntry(CKR_DATA_INVALID, Result),
    637    mkEntry(CKR_DATA_LEN_RANGE, Result),
    638    mkEntry(CKR_DEVICE_ERROR, Result),
    639    mkEntry(CKR_DEVICE_MEMORY, Result),
    640    mkEntry(CKR_DEVICE_REMOVED, Result),
    641    mkEntry(CKR_ENCRYPTED_DATA_INVALID, Result),
    642    mkEntry(CKR_ENCRYPTED_DATA_LEN_RANGE, Result),
    643    mkEntry(CKR_FUNCTION_CANCELED, Result),
    644    mkEntry(CKR_FUNCTION_NOT_PARALLEL, Result),
    645    mkEntry(CKR_FUNCTION_NOT_SUPPORTED, Result),
    646    mkEntry(CKR_KEY_HANDLE_INVALID, Result),
    647    mkEntry(CKR_KEY_SIZE_RANGE, Result),
    648    mkEntry(CKR_KEY_TYPE_INCONSISTENT, Result),
    649    mkEntry(CKR_KEY_NOT_NEEDED, Result),
    650    mkEntry(CKR_KEY_CHANGED, Result),
    651    mkEntry(CKR_KEY_NEEDED, Result),
    652    mkEntry(CKR_KEY_INDIGESTIBLE, Result),
    653    mkEntry(CKR_KEY_FUNCTION_NOT_PERMITTED, Result),
    654    mkEntry(CKR_KEY_NOT_WRAPPABLE, Result),
    655    mkEntry(CKR_KEY_UNEXTRACTABLE, Result),
    656    mkEntry(CKR_MECHANISM_INVALID, Result),
    657    mkEntry(CKR_MECHANISM_PARAM_INVALID, Result),
    658    mkEntry(CKR_OBJECT_HANDLE_INVALID, Result),
    659    mkEntry(CKR_OPERATION_ACTIVE, Result),
    660    mkEntry(CKR_OPERATION_NOT_INITIALIZED, Result),
    661    mkEntry(CKR_PIN_INCORRECT, Result),
    662    mkEntry(CKR_PIN_INVALID, Result),
    663    mkEntry(CKR_PIN_LEN_RANGE, Result),
    664    mkEntry(CKR_PIN_EXPIRED, Result),
    665    mkEntry(CKR_PIN_LOCKED, Result),
    666    mkEntry(CKR_SESSION_CLOSED, Result),
    667    mkEntry(CKR_SESSION_COUNT, Result),
    668    mkEntry(CKR_SESSION_HANDLE_INVALID, Result),
    669    mkEntry(CKR_SESSION_PARALLEL_NOT_SUPPORTED, Result),
    670    mkEntry(CKR_SESSION_READ_ONLY, Result),
    671    mkEntry(CKR_SESSION_EXISTS, Result),
    672    mkEntry(CKR_SESSION_READ_ONLY_EXISTS, Result),
    673    mkEntry(CKR_SESSION_READ_WRITE_SO_EXISTS, Result),
    674    mkEntry(CKR_SIGNATURE_INVALID, Result),
    675    mkEntry(CKR_SIGNATURE_LEN_RANGE, Result),
    676    mkEntry(CKR_TEMPLATE_INCOMPLETE, Result),
    677    mkEntry(CKR_TEMPLATE_INCONSISTENT, Result),
    678    mkEntry(CKR_TOKEN_NOT_PRESENT, Result),
    679    mkEntry(CKR_TOKEN_NOT_RECOGNIZED, Result),
    680    mkEntry(CKR_TOKEN_WRITE_PROTECTED, Result),
    681    mkEntry(CKR_UNWRAPPING_KEY_HANDLE_INVALID, Result),
    682    mkEntry(CKR_UNWRAPPING_KEY_SIZE_RANGE, Result),
    683    mkEntry(CKR_UNWRAPPING_KEY_TYPE_INCONSISTENT, Result),
    684    mkEntry(CKR_USER_ALREADY_LOGGED_IN, Result),
    685    mkEntry(CKR_USER_NOT_LOGGED_IN, Result),
    686    mkEntry(CKR_USER_PIN_NOT_INITIALIZED, Result),
    687    mkEntry(CKR_USER_TYPE_INVALID, Result),
    688    mkEntry(CKR_USER_ANOTHER_ALREADY_LOGGED_IN, Result),
    689    mkEntry(CKR_USER_TOO_MANY_TYPES, Result),
    690    mkEntry(CKR_WRAPPED_KEY_INVALID, Result),
    691    mkEntry(CKR_WRAPPED_KEY_LEN_RANGE, Result),
    692    mkEntry(CKR_WRAPPING_KEY_HANDLE_INVALID, Result),
    693    mkEntry(CKR_WRAPPING_KEY_SIZE_RANGE, Result),
    694    mkEntry(CKR_WRAPPING_KEY_TYPE_INCONSISTENT, Result),
    695    mkEntry(CKR_RANDOM_SEED_NOT_SUPPORTED, Result),
    696    mkEntry(CKR_RANDOM_NO_RNG, Result),
    697    mkEntry(CKR_DOMAIN_PARAMS_INVALID, Result),
    698    mkEntry(CKR_BUFFER_TOO_SMALL, Result),
    699    mkEntry(CKR_SAVED_STATE_INVALID, Result),
    700    mkEntry(CKR_INFORMATION_SENSITIVE, Result),
    701    mkEntry(CKR_STATE_UNSAVEABLE, Result),
    702    mkEntry(CKR_CRYPTOKI_NOT_INITIALIZED, Result),
    703    mkEntry(CKR_CRYPTOKI_ALREADY_INITIALIZED, Result),
    704    mkEntry(CKR_MUTEX_BAD, Result),
    705    mkEntry(CKR_MUTEX_NOT_LOCKED, Result),
    706    mkEntry(CKR_VENDOR_DEFINED, Result),
    707 
    708    mkEntry(CKT_NSS_TRUSTED, Trust),
    709    mkEntry(CKT_NSS_TRUSTED_DELEGATOR, Trust),
    710    mkEntry(CKT_NSS_NOT_TRUSTED, Trust),
    711    mkEntry(CKT_NSS_MUST_VERIFY_TRUST, Trust),
    712    mkEntry(CKT_NSS_TRUST_UNKNOWN, Trust),
    713    mkEntry(CKT_NSS_VALID_DELEGATOR, Trust),
    714    mkEntry(CKT_TRUSTED, Trust),
    715    mkEntry(CKT_TRUST_ANCHOR, Trust),
    716    mkEntry(CKT_NOT_TRUSTED, Trust),
    717    mkEntry(CKT_TRUST_MUST_VERIFY_TRUST, Trust),
    718    mkEntry(CKT_TRUST_UNKNOWN, Trust),
    719 
    720    mkEntry(CK_EFFECTIVELY_INFINITE, AvailableSizes),
    721    mkEntry(CK_UNAVAILABLE_INFORMATION, CurrentSize),
    722 };
    723 
    724 const Constant *consts = &_consts[0];
    725 const unsigned int constCount = sizeof(_consts) / sizeof(_consts[0]);
    726 
    727 const Commands _commands[] = {
    728    { "C_Initialize",
    729      F_C_Initialize,
    730      "C_Initialize pInitArgs\n\n"
    731      "C_Initialize initializes the PKCS #11 library.\n"
    732      "  pInitArgs  if this is not NULL_PTR it gets cast to and dereferenced\n",
    733      { ArgInitializeArgs, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone,
    734        ArgNone, ArgNone } },
    735    { "C_Finalize",
    736      F_C_Finalize,
    737      "C_Finalize pReserved\n\n"
    738      "C_Finalize indicates that an application is done with the PKCS #11 library.\n"
    739      " pReserved  reserved. Should be NULL_PTR\n",
    740      { ArgInitializeArgs, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone,
    741        ArgNone, ArgNone } },
    742    { "C_GetInfo",
    743      F_C_GetInfo,
    744      "C_GetInfo pInfo\n\n"
    745      "C_GetInfo returns general information about PKCS #11.\n"
    746      " pInfo   location that receives information\n",
    747      { ArgInfo | ArgOut, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone,
    748        ArgNone, ArgNone } },
    749    { "C_GetFunctionList",
    750      F_C_GetFunctionList,
    751      "C_GetFunctionList ppFunctionList\n\n"
    752      "C_GetFunctionList returns the function list.\n"
    753      " ppFunctionList   receives pointer to function list\n",
    754      { ArgFunctionList | ArgOut, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone,
    755        ArgNone, ArgNone, ArgNone } },
    756    { "C_GetSlotList",
    757      F_C_GetSlotList,
    758      "C_GetSlotList tokenPresent pSlotList pulCount\n\n"
    759      "C_GetSlotList obtains a list of slots in the system.\n"
    760      " tokenPresent    only slots with tokens?\n"
    761      " pSlotList       receives array of slot IDs\n"
    762      " pulCount        receives number of slots\n",
    763      { ArgULong, ArgULong | ArgArray | ArgOut, ArgULong | ArgOut, ArgNone, ArgNone,
    764        ArgNone, ArgNone, ArgNone, ArgNone, ArgNone } },
    765    { "C_GetSlotInfo",
    766      F_C_GetSlotInfo,
    767      "C_GetSlotInfo slotID pInfo\n\n"
    768      "C_GetSlotInfo obtains information about a particular slot in the system.\n"
    769      " slotID    the ID of the slot\n"
    770      " pInfo     receives the slot information\n",
    771      { ArgULong, ArgSlotInfo | ArgOut, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone,
    772        ArgNone, ArgNone, ArgNone } },
    773    { "C_GetTokenInfo",
    774      F_C_GetTokenInfo,
    775      "C_GetTokenInfo slotID pInfo\n\n"
    776      "C_GetTokenInfo obtains information about a particular token in the system.\n"
    777      " slotID    ID of the token's slot\n"
    778      " pInfo     receives the token information\n",
    779      { ArgULong, ArgTokenInfo | ArgOut, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone,
    780        ArgNone, ArgNone, ArgNone } },
    781    { "C_GetMechanismList",
    782      F_C_GetMechanismList,
    783      "C_GetMechanismList slotID pMechanismList pulCount\n\n"
    784      "C_GetMechanismList obtains a list of mechanism types supported by a token.\n"
    785      " slotID            ID of token's slot\n"
    786      " pMechanismList    gets mech. array\n"
    787      " pulCount          gets # of mechs.\n",
    788      { ArgULong, ArgULong | ArgArray | ArgOut, ArgULong | ArgOut, ArgNone, ArgNone,
    789        ArgNone, ArgNone, ArgNone, ArgNone, ArgNone } },
    790    { "C_GetMechanismInfo",
    791      F_C_GetMechanismInfo,
    792      "C_GetMechanismInfo slotID type pInfo\n\n"
    793      "C_GetMechanismInfo obtains information about a particular mechanism possibly\n"
    794      "supported by a token.\n"
    795      " slotID    ID of the token's slot\n"
    796      " type      type of mechanism\n"
    797      " pInfo     receives mechanism info\n",
    798      { ArgULong, ArgULong, ArgMechanismInfo | ArgOut, ArgNone, ArgNone, ArgNone, ArgNone,
    799        ArgNone, ArgNone, ArgNone } },
    800    { "C_InitToken",
    801      F_C_InitToken,
    802      "C_InitToken slotID pPin ulPinLen pLabel\n\n"
    803      "C_InitToken initializes a token.\n"
    804      " slotID      ID of the token's slot\n"
    805      " pPin        the SO's initial PIN\n"
    806      " ulPinLen    length in bytes of the PIN\n"
    807      " pLabel      32-byte token label (blank padded)\n",
    808      { ArgULong, ArgUTF8, ArgULong, ArgUTF8, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone,
    809        ArgNone } },
    810    { "C_InitPIN",
    811      F_C_InitPIN,
    812      "C_InitPIN hSession pPin ulPinLen\n\n"
    813      "C_InitPIN initializes the normal user's PIN.\n"
    814      " hSession    the session's handle\n"
    815      " pPin        the normal user's PIN\n"
    816      " ulPinLen    length in bytes of the PIN\n",
    817      { ArgULong, ArgUTF8, ArgULong, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone,
    818        ArgNone } },
    819    { "C_SetPIN",
    820      F_C_SetPIN,
    821      "C_SetPIN hSession pOldPin ulOldLen pNewPin ulNewLen\n\n"
    822      "C_SetPIN modifies the PIN of the user who is logged in.\n"
    823      " hSession    the session's handle\n"
    824      " pOldPin     the old PIN\n"
    825      " ulOldLen    length of the old PIN\n"
    826      " pNewPin     the new PIN\n"
    827      " ulNewLen    length of the new PIN\n",
    828      { ArgULong, ArgUTF8, ArgULong, ArgUTF8, ArgULong, ArgNone, ArgNone, ArgNone,
    829        ArgNone, ArgNone } },
    830    { "C_OpenSession",
    831      F_C_OpenSession,
    832      "C_OpenSession slotID flags phSession\n\n"
    833      "C_OpenSession opens a session between an application and a token.\n"
    834      " slotID          the slot's ID\n"
    835      " flags           from\n"
    836      " phSession       gets session handle\n",
    837      { ArgULong, ArgULong, ArgULong | ArgOut, ArgNone, ArgNone, ArgNone, ArgNone,
    838        ArgNone, ArgNone, ArgNone } },
    839    { "C_CloseSession",
    840      F_C_CloseSession,
    841      "C_CloseSession hSession\n\n"
    842      "C_CloseSession closes a session between an application and a token.\n"
    843      " hSession   the session's handle\n",
    844      { ArgULong, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone,
    845        ArgNone } },
    846    { "C_CloseAllSessions",
    847      F_C_CloseAllSessions,
    848      "C_CloseAllSessions slotID\n\n"
    849      "C_CloseAllSessions closes all sessions with a token.\n"
    850      " slotID   the token's slot\n",
    851      { ArgULong, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone,
    852        ArgNone } },
    853    { "C_GetSessionInfo",
    854      F_C_GetSessionInfo,
    855      "C_GetSessionInfo hSession pInfo\n\n"
    856      "C_GetSessionInfo obtains information about the session.\n"
    857      " hSession    the session's handle\n"
    858      " pInfo       receives session info\n",
    859      { ArgULong, ArgSessionInfo | ArgOut, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone,
    860        ArgNone, ArgNone, ArgNone } },
    861    { "C_GetOperationState",
    862      F_C_GetOperationState,
    863      "C_GetOperationState hSession pOpState pulOpStateLen\n\n"
    864      "C_GetOperationState obtains the state of the cryptographic operation in a\n"
    865      "session.\n"
    866      " hSession        session's handle\n"
    867      " pOpState        gets state\n"
    868      " pulOpStateLen   gets state length\n",
    869      { ArgULong, ArgChar | ArgOut, ArgULong | ArgOut, ArgNone, ArgNone, ArgNone, ArgNone,
    870        ArgNone, ArgNone, ArgNone } },
    871    { "C_SetOperationState",
    872      F_C_SetOperationState,
    873      "C_SetOperationState hSession pOpState ulOpStateLen hEncKey hAuthKey\n\n"
    874      "C_SetOperationState restores the state of the cryptographic operation in a\n"
    875      "session.\n"
    876      " hSession        session's handle\n"
    877      " pOpState        holds state\n"
    878      " ulOpStateLen    holds state length\n"
    879      " hEncKey         en/decryption key\n"
    880      " hAuthnKey       sign/verify key\n",
    881      { ArgULong, ArgChar | ArgOut, ArgULong, ArgULong, ArgULong, ArgNone, ArgNone,
    882        ArgNone, ArgNone, ArgNone } },
    883    { "C_Login",
    884      F_C_Login,
    885      "C_Login hSession userType pPin ulPinLen\n\n"
    886      "C_Login logs a user into a token.\n"
    887      " hSession    the session's handle\n"
    888      " userType    the user type\n"
    889      " pPin        the user's PIN\n"
    890      " ulPinLen    the length of the PIN\n",
    891      { ArgULong, ArgULong, ArgVar, ArgULong, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone,
    892        ArgNone } },
    893    { "C_Logout",
    894      F_C_Logout,
    895      "C_Logout hSession\n\n"
    896      "C_Logout logs a user out from a token.\n"
    897      " hSession   the session's handle\n",
    898      { ArgULong, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone,
    899        ArgNone } },
    900    { "C_CreateObject",
    901      F_C_CreateObject,
    902      "C_CreateObject hSession pTemplate ulCount phObject\n\n"
    903      "C_CreateObject creates a new object.\n"
    904      " hSession      the session's handle\n"
    905      " pTemplate     the object's template\n"
    906      " ulCount       attributes in template\n"
    907      " phObject   gets new object's handle.\n",
    908      { ArgULong, ArgAttribute | ArgArray, ArgULong, ArgULong | ArgOut, ArgNone, ArgNone,
    909        ArgNone, ArgNone, ArgNone, ArgNone } },
    910    { "C_CopyObject",
    911      F_C_CopyObject,
    912      "C_CopyObject hSession hObject pTemplate ulCount phNewObject\n\n"
    913      "C_CopyObject copies an object creating a new object for the copy.\n"
    914      " hSession      the session's handle\n"
    915      " hObject       the object's handle\n"
    916      " pTemplate     template for new object\n"
    917      " ulCount       attributes in template\n"
    918      " phNewObject   receives handle of copy\n",
    919      { ArgULong, ArgULong, ArgAttribute | ArgArray, ArgULong, ArgULong | ArgOut, ArgNone,
    920        ArgNone, ArgNone, ArgNone, ArgNone } },
    921    { "C_DestroyObject",
    922      F_C_DestroyObject,
    923      "C_DestroyObject hSession hObject\n\n"
    924      "C_DestroyObject destroys an object.\n"
    925      " hSession    the session's handle\n"
    926      " hObject     the object's handle\n",
    927      { ArgULong, ArgULong, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone,
    928        ArgNone } },
    929    { "C_GetObjectSize",
    930      F_C_GetObjectSize,
    931      "C_GetObjectSize hSession hObject pulSize\n\n"
    932      "C_GetObjectSize gets the size of an object in bytes.\n"
    933      " hSession    the session's handle\n"
    934      " hObject     the object's handle\n"
    935      " pulSize     receives size of object\n",
    936      { ArgULong, ArgULong, ArgULong | ArgOut, ArgNone, ArgNone, ArgNone, ArgNone,
    937        ArgNone, ArgNone, ArgNone } },
    938    { "C_GetAttributeValue",
    939      F_C_GetAttributeValue,
    940      "C_GetAttributeValue hSession hObject pTemplate ulCount\n\n"
    941      "C_GetAttributeValue obtains the value of one or more object attributes.\n"
    942      " hSession     the session's handle\n"
    943      " hObject      the object's handle\n"
    944      " pTemplate    specifies attrs; gets vals\n"
    945      " ulCount      attributes in template\n",
    946      { ArgULong, ArgULong, ArgAttribute | ArgArray, ArgULong, ArgNone, ArgNone, ArgNone,
    947        ArgNone, ArgNone, ArgNone } },
    948    { "C_SetAttributeValue",
    949      F_C_SetAttributeValue,
    950      "C_SetAttributeValue hSession hObject pTemplate ulCount\n\n"
    951      "C_SetAttributeValue modifies the value of one or more object attributes\n"
    952      " hSession     the session's handle\n"
    953      " hObject      the object's handle\n"
    954      " pTemplate    specifies attrs and values\n"
    955      " ulCount      attributes in template\n",
    956      { ArgULong, ArgULong, ArgAttribute | ArgArray, ArgULong, ArgNone, ArgNone, ArgNone,
    957        ArgNone, ArgNone, ArgNone } },
    958    { "C_FindObjectsInit",
    959      F_C_FindObjectsInit,
    960      "C_FindObjectsInit hSession pTemplate ulCount\n\n"
    961      "C_FindObjectsInit initializes a search for token and session objects that\n"
    962      "match a template.\n"
    963      " hSession     the session's handle\n"
    964      " pTemplate    attribute values to match\n"
    965      " ulCount      attrs in search template\n",
    966      { ArgULong, ArgAttribute | ArgArray, ArgULong, ArgNone, ArgNone, ArgNone, ArgNone,
    967        ArgNone, ArgNone, ArgNone } },
    968    { "C_FindObjectsFinal",
    969      F_C_FindObjectsFinal,
    970      "C_FindObjectsFinal hSession\n\n"
    971      "C_FindObjectsFinal finishes a search for token and session objects.\n"
    972      " hSession   the session's handle\n",
    973      { ArgULong, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone,
    974        ArgNone } },
    975    { "C_FindObjects",
    976      F_C_FindObjects,
    977      "C_FindObjects hSession phObject ulMaxObjectCount pulObjectCount\n\n"
    978      "C_FindObjects continues a search for token and session objects that match\n"
    979      "a template obtaining additional object handles.\n"
    980      " hSession            session's handle\n"
    981      " phObject            gets obj. handles\n"
    982      " ulMaxObjectCount    max handles to get\n"
    983      " pulObjectCount      actual # returned\n",
    984      { ArgULong, ArgULong | ArgOut, ArgULong, ArgULong | ArgOut, ArgNone, ArgNone,
    985        ArgNone, ArgNone, ArgNone, ArgNone } },
    986    { "C_EncryptInit",
    987      F_C_EncryptInit,
    988      "C_EncryptInit hSession pMechanism hKey\n\n"
    989      "C_EncryptInit initializes an encryption operation.\n"
    990      " hSession      the session's handle\n"
    991      " pMechanism    the encryption mechanism\n"
    992      " hKey          handle of encryption key\n",
    993      { ArgULong, ArgMechanism, ArgULong, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone,
    994        ArgNone, ArgNone } },
    995    { "C_EncryptUpdate",
    996      F_C_EncryptUpdate,
    997      "C_EncryptUpdate hSession pPart ulPartLen pEncryptedPart pulEncryptedPartLen\n"
    998      "\n"
    999      "C_EncryptUpdate continues a multiple-part encryption operation.\n"
   1000      " hSession             session's handle\n"
   1001      " pPart                the plaintext data\n"
   1002      " ulPartLen            plaintext data len\n"
   1003      " pEncryptedPart       gets ciphertext\n"
   1004      " pulEncryptedPartLen  gets c-text size\n",
   1005      { ArgULong, ArgChar, ArgULong, ArgChar | ArgOut, ArgULong | ArgOut, ArgNone,
   1006        ArgNone, ArgNone, ArgNone, ArgNone } },
   1007    { "C_EncryptFinal",
   1008      F_C_EncryptFinal,
   1009      "C_EncryptFinal hSession pLastEncryptedPart pulLastEncryptedPartLen\n\n"
   1010      "C_EncryptFinal finishes a multiple-part encryption operation.\n"
   1011      " hSession                  session handle\n"
   1012      " pLastEncryptedPart        last c-text\n"
   1013      " pulLastEncryptedPartLen   gets last size\n",
   1014      { ArgULong, ArgChar, ArgULong, ArgChar | ArgOut, ArgULong | ArgOut, ArgNone,
   1015        ArgNone, ArgNone, ArgNone, ArgNone } },
   1016    { "C_Encrypt",
   1017      F_C_Encrypt,
   1018      "C_Encrypt hSession pData ulDataLen pEncryptedData pulEncryptedDataLen\n\n"
   1019      "C_Encrypt encrypts single-part data.\n"
   1020      " hSession              session's handle\n"
   1021      " pData                 the plaintext data\n"
   1022      " ulDataLen             bytes of plaintext\n"
   1023      " pEncryptedData        gets ciphertext\n"
   1024      " pulEncryptedDataLen   gets c-text size\n",
   1025      { ArgULong, ArgChar, ArgULong, ArgChar | ArgOut, ArgULong | ArgOut, ArgNone,
   1026        ArgNone, ArgNone, ArgNone, ArgNone } },
   1027    { "C_DecryptInit",
   1028      F_C_DecryptInit,
   1029      "C_DecryptInit hSession pMechanism hKey\n\n"
   1030      "C_DecryptInit initializes a decryption operation.\n"
   1031      " hSession      the session's handle\n"
   1032      " pMechanism    the decryption mechanism\n"
   1033      " hKey          handle of decryption key\n",
   1034      { ArgULong, ArgMechanism, ArgULong, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone,
   1035        ArgNone, ArgNone } },
   1036    { "C_DecryptUpdate",
   1037      F_C_DecryptUpdate,
   1038      "C_DecryptUpdate hSession pEncryptedPart ulEncryptedPartLen pPart pulPartLen\n"
   1039      "\n"
   1040      "C_DecryptUpdate continues a multiple-part decryption operation.\n"
   1041      " hSession              session's handle\n"
   1042      " pEncryptedPart        encrypted data\n"
   1043      " ulEncryptedPartLen    input length\n"
   1044      " pPart                 gets plaintext\n"
   1045      " pulPartLen            p-text size\n",
   1046      { ArgULong, ArgChar, ArgULong, ArgChar | ArgOut, ArgULong | ArgOut, ArgNone,
   1047        ArgNone, ArgNone, ArgNone, ArgNone } },
   1048    { "C_DecryptFinal",
   1049      F_C_DecryptFinal,
   1050      "C_DecryptFinal hSession pLastPart pulLastPartLen\n\n"
   1051      "C_DecryptFinal finishes a multiple-part decryption operation.\n"
   1052      " hSession         the session's handle\n"
   1053      " pLastPart        gets plaintext\n"
   1054      " pulLastPartLen   p-text size\n",
   1055      { ArgULong, ArgChar, ArgULong, ArgChar | ArgOut, ArgULong | ArgOut, ArgNone,
   1056        ArgNone, ArgNone, ArgNone, ArgNone } },
   1057    { "C_Decrypt",
   1058      F_C_Decrypt,
   1059      "C_Decrypt hSession pEncryptedData ulEncryptedDataLen pData pulDataLen\n\n"
   1060      "C_Decrypt decrypts encrypted data in a single part.\n"
   1061      " hSession             session's handle\n"
   1062      " pEncryptedData       ciphertext\n"
   1063      " ulEncryptedDataLen   ciphertext length\n"
   1064      " pData                gets plaintext\n"
   1065      " pulDataLen           gets p-text size\n",
   1066      { ArgULong, ArgChar, ArgULong, ArgChar | ArgOut, ArgULong | ArgOut, ArgNone,
   1067        ArgNone, ArgNone, ArgNone, ArgNone } },
   1068    { "C_DigestInit",
   1069      F_C_DigestInit,
   1070      "C_DigestInit hSession pMechanism\n\n"
   1071      "C_DigestInit initializes a message-digesting operation.\n"
   1072      " hSession     the session's handle\n"
   1073      " pMechanism   the digesting mechanism\n",
   1074      { ArgULong, ArgMechanism, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone,
   1075        ArgNone, ArgNone } },
   1076    { "C_DigestUpdate",
   1077      F_C_DigestUpdate,
   1078      "C_DigestUpdate hSession pPart ulPartLen\n\n"
   1079      "C_DigestUpdate continues a multiple-part message-digesting operation.\n"
   1080      " hSession    the session's handle\n"
   1081      " pPart       data to be digested\n"
   1082      " ulPartLen   bytes of data to be digested\n",
   1083      { ArgULong, ArgChar, ArgULong, ArgChar | ArgOut, ArgULong | ArgOut, ArgNone,
   1084        ArgNone, ArgNone, ArgNone, ArgNone } },
   1085    { "C_DigestKey",
   1086      F_C_DigestKey,
   1087      "C_DigestKey hSession hKey\n\n"
   1088      "C_DigestKey continues a multi-part message-digesting operation by digesting\n"
   1089      "the value of a secret key as part of the data already digested.\n"
   1090      " hSession    the session's handle\n"
   1091      " hKey        secret key to digest\n",
   1092      { ArgULong, ArgULong, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone,
   1093        ArgNone } },
   1094    { "C_DigestFinal",
   1095      F_C_DigestFinal,
   1096      "C_DigestFinal hSession pDigest pulDigestLen\n\n"
   1097      "C_DigestFinal finishes a multiple-part message-digesting operation.\n"
   1098      " hSession       the session's handle\n"
   1099      " pDigest        gets the message digest\n"
   1100      " pulDigestLen   gets byte count of digest\n",
   1101      { ArgULong, ArgChar | ArgOut, ArgULong | ArgOut, ArgNone, ArgNone, ArgNone, ArgNone,
   1102        ArgNone, ArgNone, ArgNone } },
   1103    { "C_Digest",
   1104      F_C_Digest,
   1105      "C_Digest hSession pData ulDataLen pDigest pulDigestLen\n\n"
   1106      "C_Digest digests data in a single part.\n"
   1107      " hSession       the session's handle\n"
   1108      " pData          data to be digested\n"
   1109      " ulDataLen      bytes of data to digest\n"
   1110      " pDigest        gets the message digest\n"
   1111      " pulDigestLen   gets digest length\n",
   1112      { ArgULong, ArgChar, ArgULong, ArgChar | ArgOut, ArgULong | ArgOut, ArgNone,
   1113        ArgNone, ArgNone, ArgNone, ArgNone } },
   1114    { "C_SignInit",
   1115      F_C_SignInit,
   1116      "C_SignInit hSession pMechanism hKey\n\n"
   1117      "C_SignInit initializes a signature (private key encryption operation where\n"
   1118      "the signature is (will be) an appendix to the data and plaintext cannot be\n"
   1119      "recovered from the signature.\n"
   1120      " hSession      the session's handle\n"
   1121      " pMechanism    the signature mechanism\n"
   1122      " hKey          handle of signature key\n",
   1123      { ArgULong, ArgMechanism, ArgULong, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone,
   1124        ArgNone, ArgNone } },
   1125    { "C_SignUpdate",
   1126      F_C_SignUpdate,
   1127      "C_SignUpdate hSession pPart ulPartLen\n\n"
   1128      "C_SignUpdate continues a multiple-part signature operation where the\n"
   1129      "signature is (will be) an appendix to the data and plaintext cannot be\n"
   1130      "recovered from the signature.\n"
   1131      " hSession    the session's handle\n"
   1132      " pPart       the data to sign\n"
   1133      " ulPartLen   count of bytes to sign\n",
   1134      { ArgULong, ArgChar | ArgOut, ArgULong | ArgOut, ArgNone, ArgNone, ArgNone, ArgNone,
   1135        ArgNone, ArgNone, ArgNone } },
   1136    { "C_SignFinal",
   1137      F_C_SignFinal,
   1138      "C_SignFinal hSession pSignature pulSignatureLen\n\n"
   1139      "C_SignFinal finishes a multiple-part signature operation returning the\n"
   1140      "signature.\n"
   1141      " hSession          the session's handle\n"
   1142      " pSignature        gets the signature\n"
   1143      " pulSignatureLen   gets signature length\n",
   1144      { ArgULong, ArgChar | ArgOut, ArgULong | ArgOut, ArgNone, ArgNone, ArgNone, ArgNone,
   1145        ArgNone, ArgNone, ArgNone } },
   1146    { "C_SignRecoverInit",
   1147      F_C_SignRecoverInit,
   1148      "C_SignRecoverInit hSession pMechanism hKey\n\n"
   1149      "C_SignRecoverInit initializes a signature operation where the data can be\n"
   1150      "recovered from the signature.\n"
   1151      " hSession     the session's handle\n"
   1152      " pMechanism   the signature mechanism\n"
   1153      " hKey         handle of the signature key\n",
   1154      { ArgULong, ArgMechanism, ArgULong, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone,
   1155        ArgNone, ArgNone } },
   1156    { "C_SignRecover",
   1157      F_C_SignRecover,
   1158      "C_SignRecover hSession pData ulDataLen pSignature pulSignatureLen\n\n"
   1159      "C_SignRecover signs data in a single operation where the data can be\n"
   1160      "recovered from the signature.\n"
   1161      " hSession          the session's handle\n"
   1162      " pData             the data to sign\n"
   1163      " ulDataLen         count of bytes to sign\n"
   1164      " pSignature        gets the signature\n"
   1165      " pulSignatureLen   gets signature length\n",
   1166      { ArgULong, ArgChar, ArgULong, ArgChar | ArgOut, ArgULong | ArgOut, ArgNone,
   1167        ArgNone, ArgNone, ArgNone, ArgNone } },
   1168    { "C_Sign",
   1169      F_C_Sign,
   1170      "C_Sign hSession pData ulDataLen pSignature pulSignatureLen\n\n"
   1171      "C_Sign signs (encrypts with private key) data in a single part where the\n"
   1172      "signature is (will be) an appendix to the data and plaintext cannot be\n"
   1173      "recovered from the signature.\n"
   1174      " hSession          the session's handle\n"
   1175      " pData             the data to sign\n"
   1176      " ulDataLen         count of bytes to sign\n"
   1177      " pSignature        gets the signature\n"
   1178      " pulSignatureLen   gets signature length\n",
   1179      { ArgULong, ArgChar, ArgULong, ArgChar | ArgOut, ArgULong | ArgOut, ArgNone,
   1180        ArgNone, ArgNone, ArgNone, ArgNone } },
   1181    { "C_VerifyInit",
   1182      F_C_VerifyInit,
   1183      "C_VerifyInit hSession pMechanism hKey\n\n"
   1184      "C_VerifyInit initializes a verification operation where the signature is an\n"
   1185      "appendix to the data and plaintext cannot cannot be recovered from the\n"
   1186      "signature (e.g. DSA).\n"
   1187      " hSession      the session's handle\n"
   1188      " pMechanism    the verification mechanism\n"
   1189      " hKey          verification key\n",
   1190      { ArgULong, ArgMechanism, ArgULong, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone,
   1191        ArgNone, ArgNone } },
   1192    { "C_VerifyUpdate",
   1193      F_C_VerifyUpdate,
   1194      "C_VerifyUpdate hSession pPart ulPartLen\n\n"
   1195      "C_VerifyUpdate continues a multiple-part verification operation where the\n"
   1196      "signature is an appendix to the data and plaintext cannot be recovered from\n"
   1197      "the signature.\n"
   1198      " hSession    the session's handle\n"
   1199      " pPart       signed data\n"
   1200      " ulPartLen   length of signed data\n",
   1201      { ArgULong, ArgChar | ArgOut, ArgULong | ArgOut, ArgNone, ArgNone, ArgNone, ArgNone,
   1202        ArgNone, ArgNone, ArgNone } },
   1203    { "C_VerifyFinal",
   1204      F_C_VerifyFinal,
   1205      "C_VerifyFinal hSession pSignature ulSignatureLen\n\n"
   1206      "C_VerifyFinal finishes a multiple-part verification operation checking the\n"
   1207      "signature.\n"
   1208      " hSession         the session's handle\n"
   1209      " pSignature       signature to verify\n"
   1210      " ulSignatureLen   signature length\n",
   1211      { ArgULong, ArgChar | ArgOut, ArgULong | ArgOut, ArgNone, ArgNone, ArgNone, ArgNone,
   1212        ArgNone, ArgNone, ArgNone } },
   1213    { "C_VerifyRecoverInit",
   1214      F_C_VerifyRecoverInit,
   1215      "C_VerifyRecoverInit hSession pMechanism hKey\n\n"
   1216      "C_VerifyRecoverInit initializes a signature verification operation where the\n"
   1217      "data is recovered from the signature.\n"
   1218      " hSession      the session's handle\n"
   1219      " pMechanism    the verification mechanism\n"
   1220      " hKey          verification key\n",
   1221      { ArgULong, ArgMechanism, ArgULong, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone,
   1222        ArgNone, ArgNone } },
   1223    { "C_VerifyRecover",
   1224      F_C_VerifyRecover,
   1225      "C_VerifyRecover hSession pSignature ulSignatureLen pData pulDataLen\n\n"
   1226      "C_VerifyRecover verifies a signature in a single-part operation where the\n"
   1227      "data is recovered from the signature.\n"
   1228      " hSession          the session's handle\n"
   1229      " pSignature        signature to verify\n"
   1230      " ulSignatureLen    signature length\n"
   1231      " pData             gets signed data\n"
   1232      " pulDataLen        gets signed data len\n",
   1233      { ArgULong, ArgChar, ArgULong, ArgChar | ArgOut, ArgULong | ArgOut, ArgNone,
   1234        ArgNone, ArgNone, ArgNone, ArgNone } },
   1235    { "C_Verify",
   1236      F_C_Verify,
   1237      "C_Verify hSession pData ulDataLen pSignature ulSignatureLen\n\n"
   1238      "C_Verify verifies a signature in a single-part operation where the signature\n"
   1239      "is an appendix to the data and plaintext cannot be recovered from the\n"
   1240      "signature.\n"
   1241      " hSession         the session's handle\n"
   1242      " pData            signed data\n"
   1243      " ulDataLen        length of signed data\n"
   1244      " pSignature       signature\n"
   1245      " ulSignatureLen   signature length*/\n",
   1246      { ArgULong, ArgChar, ArgULong, ArgChar | ArgOut, ArgULong | ArgOut, ArgNone,
   1247        ArgNone, ArgNone, ArgNone, ArgNone } },
   1248    { "C_DigestEncryptUpdate",
   1249      F_C_DigestEncryptUpdate,
   1250      "C_DigestEncryptUpdate hSession pPart ulPartLen pEncryptedPart \\\n"
   1251      "    pulEncryptedPartLen\n\n"
   1252      "C_DigestEncryptUpdate continues a multiple-part digesting and encryption\n"
   1253      "operation.\n"
   1254      " hSession              session's handle\n"
   1255      " pPart                 the plaintext data\n"
   1256      " ulPartLen             plaintext length\n"
   1257      " pEncryptedPart        gets ciphertext\n"
   1258      " pulEncryptedPartLen   gets c-text length\n",
   1259      { ArgULong, ArgChar, ArgULong, ArgChar | ArgOut, ArgULong | ArgOut, ArgNone,
   1260        ArgNone, ArgNone, ArgNone, ArgNone } },
   1261    { "C_DecryptDigestUpdate",
   1262      F_C_DecryptDigestUpdate,
   1263      "C_DecryptDigestUpdate hSession pEncryptedPart ulEncryptedPartLen pPart \\\n"
   1264      "    pulPartLen\n\n"
   1265      "C_DecryptDigestUpdate continues a multiple-part decryption and digesting\n"
   1266      "operation.\n"
   1267      " hSession              session's handle\n"
   1268      " pEncryptedPart        ciphertext\n"
   1269      " ulEncryptedPartLen    ciphertext length\n"
   1270      " pPart                 gets plaintext\n"
   1271      " pulPartLen            gets plaintext len\n",
   1272      { ArgULong, ArgChar, ArgULong, ArgChar | ArgOut, ArgULong | ArgOut, ArgNone,
   1273        ArgNone, ArgNone, ArgNone, ArgNone } },
   1274    { "C_SignEncryptUpdate",
   1275      F_C_SignEncryptUpdate,
   1276      "C_SignEncryptUpdate hSession pPart ulPartLen pEncryptedPart \\\n"
   1277      "    pulEncryptedPartLen\n\n"
   1278      "C_SignEncryptUpdate continues a multiple-part signing and encryption\n"
   1279      "operation.\n"
   1280      " hSession              session's handle\n"
   1281      " pPart                 the plaintext data\n"
   1282      " ulPartLen             plaintext length\n"
   1283      " pEncryptedPart        gets ciphertext\n"
   1284      " pulEncryptedPartLen   gets c-text length\n",
   1285      { ArgULong, ArgChar, ArgULong, ArgChar | ArgOut, ArgULong | ArgOut, ArgNone,
   1286        ArgNone, ArgNone, ArgNone, ArgNone } },
   1287    { "C_DecryptVerifyUpdate",
   1288      F_C_DecryptVerifyUpdate,
   1289      "C_DecryptVerifyUpdate hSession pEncryptedPart ulEncryptedPartLen pPart \\\n"
   1290      "    pulPartLen\n\n"
   1291      "C_DecryptVerifyUpdate continues a multiple-part decryption and verify\n"
   1292      "operation.\n"
   1293      " hSession              session's handle\n"
   1294      " pEncryptedPart        ciphertext\n"
   1295      " ulEncryptedPartLen    ciphertext length\n"
   1296      " pPart                 gets plaintext\n"
   1297      " pulPartLen            gets p-text length\n",
   1298      { ArgULong, ArgChar, ArgULong, ArgChar | ArgOut, ArgULong | ArgOut, ArgNone,
   1299        ArgNone, ArgNone, ArgNone, ArgNone } },
   1300    { "C_GenerateKeyPair",
   1301      F_C_GenerateKeyPair,
   1302      "C_GenerateKeyPair hSession pMechanism pPublicKeyTemplate \\\n"
   1303      "    ulPublicKeyAttributeCount pPrivateKeyTemplate ulPrivateKeyAttributeCount \\\n"
   1304      "    phPublicKey phPrivateKey\n\n"
   1305      "C_GenerateKeyPair generates a public-key/private-key pair creating new key\n"
   1306      "objects.\n"
   1307      " hSession                      sessionhandle\n"
   1308      " pMechanism                    key-genmech.\n"
   1309      " pPublicKeyTemplate            templatefor pub. key\n"
   1310      " ulPublicKeyAttributeCount     # pub. attrs.\n"
   1311      " pPrivateKeyTemplate           templatefor priv. key\n"
   1312      " ulPrivateKeyAttributeCount    # priv. attrs.\n"
   1313      " phPublicKey                   gets pub. keyhandle\n"
   1314      " phPrivateKey                  getspriv. keyhandle\n",
   1315      { ArgULong, ArgMechanism, ArgAttribute | ArgArray, ArgULong,
   1316        ArgAttribute | ArgArray, ArgULong, ArgULong | ArgOut, ArgULong | ArgOut, ArgNone,
   1317        ArgNone } },
   1318    { "C_GenerateKey",
   1319      F_C_GenerateKey,
   1320      "C_GenerateKey hSession pMechanism pTemplate ulCount phKey\n\n"
   1321      "C_GenerateKey generates a secret key creating a new key object.\n"
   1322      " hSession      the session's handle\n"
   1323      " pMechanism    key generation mech.\n"
   1324      " pTemplate     template for new key\n"
   1325      " ulCount       # of attrs in template\n"
   1326      " phKey         gets handle of new key\n",
   1327      { ArgULong, ArgMechanism, ArgAttribute | ArgArray, ArgULong, ArgULong | ArgOut,
   1328        ArgNone, ArgNone, ArgNone, ArgNone, ArgNone } },
   1329    { "C_WrapKey",
   1330      F_C_WrapKey,
   1331      "C_WrapKey hSession pMechanism hWrappingKey hKey pWrappedKey pulWrappedKeyLen\n\n"
   1332      "C_WrapKey wraps (i.e. encrypts) a key.\n"
   1333      " hSession          the session's handle\n"
   1334      " pMechanism        the wrapping mechanism\n"
   1335      " hWrappingKey      wrapping key\n"
   1336      " hKey              key to be wrapped\n"
   1337      " pWrappedKey       gets wrapped key\n"
   1338      " pulWrappedKeyLen  gets wrapped key size\n",
   1339      { ArgULong, ArgMechanism, ArgULong, ArgULong, ArgULong, ArgChar | ArgOut,
   1340        ArgULong | ArgOut, ArgNone, ArgNone, ArgNone } },
   1341    { "C_UnwrapKey",
   1342      F_C_UnwrapKey,
   1343      "C_UnwrapKey hSession pMechanism hUnwrappingKey pWrappedKey ulWrappedKeyLen \\\n"
   1344      "    pTemplate ulAttributeCount phKey\n\n"
   1345      "C_UnwrapKey unwraps (decrypts) a wrapped key creating a new key object.\n"
   1346      " hSession            session's handle\n"
   1347      " pMechanism          unwrapping mech.\n"
   1348      " hUnwrappingKey      unwrapping key\n"
   1349      " pWrappedKey         the wrapped key\n"
   1350      " ulWrappedKeyLen     wrapped key len\n"
   1351      " pTemplate           new key template\n"
   1352      " ulAttributeCount    template length\n"
   1353      " phKey               gets new handle\n",
   1354      { ArgULong, ArgMechanism, ArgULong, ArgChar, ArgULong, ArgAttribute | ArgArray,
   1355        ArgULong, ArgULong | ArgOut, ArgNone, ArgNone } },
   1356    { "C_DeriveKey",
   1357      F_C_DeriveKey,
   1358      "C_DeriveKey hSession pMechanism hBaseKey pTemplate ulAttributeCount phKey\n\n"
   1359      "C_DeriveKey derives a key from a base key creating a new key object.\n"
   1360      " hSession            session's handle\n"
   1361      " pMechanism          key deriv. mech.\n"
   1362      " hBaseKey            base key\n"
   1363      " pTemplate           new key template\n"
   1364      " ulAttributeCount    template length\n"
   1365      " phKey               gets new handle\n",
   1366      { ArgULong, ArgMechanism, ArgULong, ArgAttribute | ArgArray, ArgULong,
   1367        ArgULong | ArgOut, ArgNone, ArgNone, ArgNone, ArgNone } },
   1368    { "C_SeedRandom",
   1369      F_C_SeedRandom,
   1370      "C_SeedRandom hSession pSeed ulSeedLen\n\n"
   1371      "C_SeedRandom mixes additional seed material into the token's random number\n"
   1372      "generator.\n"
   1373      " hSession    the session's handle\n"
   1374      " pSeed       the seed material\n"
   1375      " ulSeedLen   length of seed material\n",
   1376      { ArgULong, ArgChar, ArgULong, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone,
   1377        ArgNone } },
   1378    { "C_GenerateRandom",
   1379      F_C_GenerateRandom,
   1380      "C_GenerateRandom hSession RandomData ulRandomLen\n\n"
   1381      "C_GenerateRandom generates random data.\n"
   1382      " hSession      the session's handle\n"
   1383      " RandomData    receives the random data\n"
   1384      " ulRandomLen   # of bytes to generate\n",
   1385      { ArgULong, ArgChar, ArgULong, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone,
   1386        ArgNone } },
   1387    { "C_GetFunctionStatus",
   1388      F_C_GetFunctionStatus,
   1389      "C_GetFunctionStatus hSession\n\n"
   1390      "C_GetFunctionStatus is a legacy function; it obtains an updated status of\n"
   1391      "a function running in parallel with an application.\n"
   1392      " hSession   the session's handle\n",
   1393      { ArgULong, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone,
   1394        ArgNone } },
   1395    { "C_CancelFunction",
   1396      F_C_CancelFunction,
   1397      "C_CancelFunction hSession\n\n"
   1398      "C_CancelFunction is a legacy function; it cancels a function running in\n"
   1399      "parallel.\n"
   1400      " hSession   the session's handle\n",
   1401      { ArgULong, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone,
   1402        ArgNone } },
   1403    { "C_WaitForSlotEvent",
   1404      F_C_WaitForSlotEvent,
   1405      "C_WaitForSlotEvent flags pSlot pRserved\n\n"
   1406      "C_WaitForSlotEvent waits for a slot event (token insertion removal etc.)\n"
   1407      "to occur.\n"
   1408      " flags          blocking/nonblocking flag\n"
   1409      " pSlot    location that receives the slot ID\n"
   1410      " pRserved    reserved.  Should be NULL_PTR\n",
   1411      { ArgULong, ArgULong | ArgArray, ArgVar, ArgNone, ArgNone, ArgNone, ArgNone,
   1412        ArgNone, ArgNone, ArgNone } },
   1413    { "NewArray",
   1414      F_NewArray,
   1415      "NewArray varName varType array size\n\n"
   1416      "Creates a new array variable.\n"
   1417      " varName     variable name of the new array\n"
   1418      " varType     data type of the new array\n"
   1419      " size        number of elements in the array\n",
   1420      { ArgVar | ArgNew, ArgVar, ArgULong, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone,
   1421        ArgNone, ArgNone } },
   1422    { "NewInitArg",
   1423      F_NewInitializeArgs,
   1424      "NewInitArg varName flags string\n\n"
   1425      "Creates a new init variable.\n"
   1426      " varName     variable name of the new initArg\n"
   1427      " flags       value to set the flags field\n"
   1428      " string      string parameter for init arg\n",
   1429      { ArgVar | ArgNew, ArgULong, ArgVar | ArgNew, ArgNone, ArgNone, ArgNone, ArgNone,
   1430        ArgNone, ArgNone, ArgNone } },
   1431    { "NewTemplate",
   1432      F_NewTemplate,
   1433      "NewTemplate varName attributeList\n\n"
   1434      "Create a new empty template and populate the attribute list\n"
   1435      " varName        variable name of the new template\n"
   1436      " attributeList  comma separated list of CKA_ATTRIBUTE types\n",
   1437      { ArgVar | ArgNew, ArgVar, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone,
   1438        ArgNone, ArgNone } },
   1439    { "NewMechanism",
   1440      F_NewMechanism,
   1441      "NewMechanism varName mechanismType\n\n"
   1442      "Create a new CK_MECHANISM object with type NULL parameters and specified type\n"
   1443      " varName        variable name of the new mechansim\n"
   1444      " mechanismType  CKM_ mechanism type value to set int the type field\n",
   1445      { ArgVar | ArgNew, ArgULong, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone,
   1446        ArgNone, ArgNone } },
   1447    { "BuildTemplate",
   1448      F_BuildTemplate,
   1449      "BuildTemplate template\n\n"
   1450      "Allocates space for the value in a template which has the sizes filled in,\n"
   1451      "but no values allocated yet.\n"
   1452      " template        variable name of the template\n",
   1453      { ArgAttribute, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone,
   1454        ArgNone, ArgNone } },
   1455    { "SetTemplate",
   1456      F_SetTemplate,
   1457      "SetTemplate template index value\n\n"
   1458      "Sets a particular element of a template to a CK_ULONG\n"
   1459      " template        variable name of the template\n"
   1460      " index           index into the template to the element to change\n"
   1461      " value           32 bit value to set in the template\n",
   1462      { ArgAttribute, ArgULong, ArgULong, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone,
   1463        ArgNone, ArgNone } },
   1464    { "SetString",
   1465      F_SetStringVar,
   1466      "SetString varName string\n\n"
   1467      "Sets a particular variable to a string value\n"
   1468      " variable        variable name of new string\n"
   1469      " string          String to set the variable to\n",
   1470      { ArgVar | ArgNew, ArgVar, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone,
   1471        ArgNone, ArgNone } },
   1472    { "Set",
   1473      F_SetVar,
   1474      "Set varName value\n\n"
   1475      "Sets a particular variable to CK_ULONG\n"
   1476      " variable        name of the new variable\n"
   1477      " value           32 bit value to set variable to\n",
   1478      { ArgVar | ArgNew, ArgULong, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone,
   1479        ArgNone, ArgNone } },
   1480    { "Print",
   1481      F_Print,
   1482      "Print varName\n\n"
   1483      "prints a variable\n"
   1484      " variable        name of the variable to print\n",
   1485      { ArgVar, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone,
   1486        ArgNone } },
   1487    { "Delete",
   1488      F_Delete,
   1489      "Delete varName\n\n"
   1490      "delete a variable\n"
   1491      " variable        name of the variable to delete\n",
   1492      { ArgVar | ArgNew, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone,
   1493        ArgNone, ArgNone } },
   1494    { "Load",
   1495      F_Load,
   1496      "load libraryName\n\n"
   1497      "load a pkcs #11 module\n"
   1498      " libraryName        Name of a shared library\n",
   1499      { ArgVar, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone,
   1500        ArgNone } },
   1501    { "Save",
   1502      F_SaveVar,
   1503      "Save filename variable\n\n"
   1504      "Saves the binary value of 'variable' in file 'filename'\n"
   1505      " fileName        target file to save the variable in\n"
   1506      " variable        variable to save\n",
   1507      { ArgVar | ArgNew, ArgVar, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone,
   1508        ArgNone, ArgNone } },
   1509    { "Restore",
   1510      F_RestoreVar,
   1511      "Restore filename variable\n\n"
   1512      "Restores a variable from a file\n"
   1513      " fileName        target file to restore the variable from\n"
   1514      " variable        variable to restore\n",
   1515      { ArgVar | ArgNew, ArgVar, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone,
   1516        ArgNone, ArgNone } },
   1517    { "Increment",
   1518      F_Increment,
   1519      "Increment variable value\n\n"
   1520      "Increment a variable by value\n",
   1521      { ArgVar, ArgULong, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone,
   1522        ArgNone } },
   1523    { "Decrement",
   1524      F_Decrement,
   1525      "Decrement variable value\n\n"
   1526      "Decrement a variable by value\n",
   1527      { ArgVar, ArgULong, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone,
   1528        ArgNone } },
   1529    { "List",
   1530      F_List,
   1531      "List all the variables\n",
   1532      { ArgNone, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone,
   1533        ArgNone } },
   1534    { "Unload",
   1535      F_Unload,
   1536      "Unload the currrently loaded PKCS #11 library\n",
   1537      { ArgNone, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone,
   1538        ArgNone } },
   1539    { "Run",
   1540      F_Run,
   1541      "Run filename\n\n"
   1542      "reads filename as script of commands to execute\n",
   1543      { ArgVar | ArgNew, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone,
   1544        ArgNone, ArgNone } },
   1545    { "Time",
   1546      F_Time,
   1547      "Time pkcs11 command\n\n"
   1548      "Execute a pkcs #11 command and time the results\n",
   1549      { ArgVar | ArgFull, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone,
   1550        ArgNone, ArgNone } },
   1551    { "System",
   1552      F_System,
   1553      "Set System Flag",
   1554      { ArgULong, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone,
   1555        ArgNone } },
   1556    { "LoopRun",
   1557      F_Loop,
   1558      "LoopRun filename var start end step\n\n"
   1559      "Run in a loop. Loop exit if scrip does and explicit quit (Quit QuitIf etc.)",
   1560      { ArgVar | ArgNew, ArgVar | ArgNew, ArgULong, ArgULong, ArgULong, ArgNone, ArgNone,
   1561        ArgNone, ArgNone, ArgNone } },
   1562    { "Help",
   1563      F_Help,
   1564      "Help [command]\n\n"
   1565      "print general help, or help for a specific command\n",
   1566      { ArgVar | ArgOpt, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone,
   1567        ArgNone, ArgNone } },
   1568    { "QuitIf",
   1569      F_QuitIf,
   1570      "QuitIf arg1 comparator arg2\n\n"
   1571      "Exit from this program if Condition is valid, valid comparators:\n"
   1572      "  < > <= >= = !=\n",
   1573      { ArgULong, ArgVar | ArgNew, ArgULong, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone,
   1574        ArgNone, ArgNone } },
   1575    { "QuitIfString",
   1576      F_QuitIfString,
   1577      "QuitIfString arg1 comparator arg2\n\n"
   1578      "Exit from this program if Condition is valid, valid comparators:\n"
   1579      "  = !=\n",
   1580      { ArgVar | ArgNew, ArgVar | ArgNew, ArgVar | ArgNew, ArgNone, ArgNone, ArgNone,
   1581        ArgNone, ArgNone, ArgNone, ArgNone } },
   1582    { "Quit",
   1583      F_Quit,
   1584      "Exit from this program",
   1585      { ArgNone, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone, ArgNone,
   1586        ArgNone } },
   1587 };
   1588 
   1589 const Commands *commands = &_commands[0];
   1590 const int commandCount = sizeof(_commands) / sizeof(_commands[0]);
   1591 
   1592 const Topics _topics[] = {
   1593    { "variables",
   1594      "Variables are random strings of characters. These should begin with alpha\n"
   1595      " characters, and should not contain any spaces, nor should they match any\n"
   1596      " built-in constants. There is some checking in the code for these things,\n"
   1597      " but it's not 100% and using invalid variable names can cause problems.\n"
   1598      " Variables are created by any 'OUT' parameter. If the variable does not\n"
   1599      " exist, it will be created. For in parameters variables must already exist.\n" },
   1600    { "constants",
   1601      "pk11util recognizes *lots* of constants. All CKA_, CKF_, CKO_, CKU_, CKS_,\n"
   1602      " CKC_, CKK_, CKH_, CKM_, CKT_ values from the PKCS #11 spec are recognized.\n"
   1603      " Constants can be specified with their fully qualified CK?_ value, or the\n"
   1604      " prefix can be dropped. Constants are matched case insensitve.\n" },
   1605    { "arrays",
   1606      "Arrays are special variables which represent 'C' arrays. Each array \n"
   1607      " variable can be referenced as a group (using just the name), or as \n"
   1608      " individual elements (with the [int] operator). Example:\n"
   1609      "      print myArray    # prints the full array.\n"
   1610      "      print myArray[3] # prints the 3rd elemement of the array \n" },
   1611    { "sizes",
   1612      "Size operaters returns the size in bytes of a variable, or the number of\n"
   1613      " elements in an array.\n"
   1614      "    size(var) and sizeof(var) return the size of var in bytes.\n"
   1615      "    sizea(var) and sizeofarray(var) return the number of elements in var.\n"
   1616      "       If var is not an array, sizea(var) returns 1.\n" },
   1617 };
   1618 
   1619 const Topics *topics = &_topics[0];
   1620 const int topicCount = sizeof(_topics) / sizeof(_topics[0]);
   1621 
   1622 const char *
   1623 getName(CK_ULONG value, ConstType type)
   1624 {
   1625    unsigned int i;
   1626 
   1627    for (i = 0; i < constCount; i++) {
   1628        if (consts[i].type == type && consts[i].value == value) {
   1629            return consts[i].name;
   1630        }
   1631        if (type == ConstNone && consts[i].value == value) {
   1632            return consts[i].name;
   1633        }
   1634    }
   1635 
   1636    return NULL;
   1637 }
   1638 
   1639 const char *
   1640 getNameFromAttribute(CK_ATTRIBUTE_TYPE type)
   1641 {
   1642    return getName(type, ConstAttribute);
   1643 }
   1644 
   1645 unsigned int
   1646 totalKnownType(ConstType type)
   1647 {
   1648    unsigned int count = 0;
   1649    unsigned int i;
   1650 
   1651    for (i = 0; i < constCount; i++) {
   1652        if (consts[i].type == type)
   1653            count++;
   1654    }
   1655    return count;
   1656 }