0c41dc
/* This Source Code Form is subject to the terms of the Mozilla Public
0c41dc
 * License, v. 2.0. If a copy of the MPL was not distributed with this
0c41dc
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
0c41dc
0c41dc
/*
0c41dc
 * Vendors should replace this header file with the file containing those
0c41dc
 * algorithms which have NIST algorithm Certificates.
0c41dc
 */
0c41dc
0c41dc
/* handle special cases. Classes require existing code to already be
0c41dc
 * in place for that class */
0c41dc
typedef enum {
0c41dc
    SFTKFIPSNone = 0,
0c41dc
    SFTKFIPSDH,  /* allow only specific primes */
0c41dc
    SFTKFIPSECC, /* not just keys but specific curves */
0c41dc
    SFTKFIPSAEAD, /* single shot AEAD functions not allowed in FIPS mode */
0c41dc
    SFTKFIPSRSAPSS, /* make sure salt isn't too big */
0c41dc
    SFTKFIPSPBKDF2  /* handle pbkdf2 FIPS restrictions */
0c41dc
} SFTKFIPSSpecialClass;
0c41dc
0c41dc
/* set according to your security policy */
0c41dc
#define SFTKFIPS_PBKDF2_MIN_PW_LEN  7
0c41dc
0c41dc
typedef struct SFTKFIPSAlgorithmListStr SFTKFIPSAlgorithmList;
0c41dc
struct SFTKFIPSAlgorithmListStr {
0c41dc
    CK_MECHANISM_TYPE type;
0c41dc
    CK_MECHANISM_INFO info;
0c41dc
    CK_ULONG step;
0c41dc
    SFTKFIPSSpecialClass special;
0c41dc
};
0c41dc
0c41dc
SFTKFIPSAlgorithmList sftk_fips_mechs[] = {
0c41dc
/* A sample set of algorithms to allow basic testing in our continous
0c41dc
 * testing infrastructure. The vendor version should replace this with
0c41dc
 * a version that matches their algorithm testing and security policy */
0c41dc
/* NOTE, This looks a lot like the PKCS #11 mechanism list in pkcs11.c, it
0c41dc
 * differs in the following ways:
0c41dc
 *    1) the addition of step and class elements to help restrict
0c41dc
 *       the supported key sizes and types.
0c41dc
 *    2) The mechanism flags are restricted to only those that map to
0c41dc
 *       fips approved operations.
0c41dc
 *    3) All key sizes are in bits, independent of mechanism.
0c41dc
 *    4) You can add more then one entry for the same mechanism to handle
0c41dc
 *       multiple descrete keys where the MIN/MAX/STEP semantics doesn't apply
0c41dc
 *       or where different operations have different key requirements.
0c41dc
 * This table does not encode all the modules legal FIPS semantics, only
0c41dc
 * those semantics that might possibly change due to algorithms dropping
0c41dc
 * of the security policy late in the process. */
0c41dc
/* handy common flag types */
0c41dc
#define CKF_KPG CKF_GENERATE_KEY_PAIR
0c41dc
#define CKF_GEN CKF_GENERATE
0c41dc
#define CKF_SGN (CKF_SIGN | CKF_VERIFY)
0c41dc
#define CKF_ENC (CKF_ENCRYPT | CKF_DECRYPT | CKF_WRAP | CKF_UNWRAP)
0c41dc
#define CKF_KEK (CKF_WRAP | CKF_UNWRAP)
0c41dc
#define CKF_KEA CKF_DERIVE
0c41dc
#define CKF_KDF CKF_DERIVE
0c41dc
#define CKF_HSH CKF_DIGEST
0c41dc
#define CK_MAX 0xffffffffUL
0c41dc
/* mechanisms using the same key types share the same key type
0c41dc
 * limits */
0c41dc
#define RSA_FB_KEY 2048, 4096 /* min, max */
0c41dc
#define RSA_FB_STEP 1
0c41dc
#define RSA_LEGACY_FB_KEY 1024, 1792 /* min, max */
0c41dc
#define RSA_LEGACY_FB_STEP 256
0c41dc
0c41dc
#define DSA_FB_KEY 2048, 4096 /* min, max */
0c41dc
#define DSA_FB_STEP 1024
0c41dc
#define DH_FB_KEY 2048, 8192 /* min, max */
0c41dc
#define DH_FB_STEP 1024
0c41dc
#define EC_FB_KEY 256, 521 /* min, max */
0c41dc
#define EC_FB_STEP 1       /* key limits handled by special operation */
0c41dc
#define AES_FB_KEY 128, 256
0c41dc
#define AES_FB_STEP 64
0c41dc
    { CKM_RSA_PKCS_KEY_PAIR_GEN, { RSA_FB_KEY, CKF_KPG }, RSA_FB_STEP, SFTKFIPSNone },
0c41dc
0c41dc
    /* -------------- RSA Multipart Signing Operations -------------------- */
0c41dc
    { CKM_SHA224_RSA_PKCS, { RSA_FB_KEY, CKF_SGN }, RSA_FB_STEP, SFTKFIPSNone },
0c41dc
    { CKM_SHA256_RSA_PKCS, { RSA_FB_KEY, CKF_SGN }, RSA_FB_STEP, SFTKFIPSNone },
0c41dc
    { CKM_SHA384_RSA_PKCS, { RSA_FB_KEY, CKF_SGN }, RSA_FB_STEP, SFTKFIPSNone },
0c41dc
    { CKM_SHA512_RSA_PKCS, { RSA_FB_KEY, CKF_SGN }, RSA_FB_STEP, SFTKFIPSNone },
0c41dc
    { CKM_SHA224_RSA_PKCS, { RSA_LEGACY_FB_KEY, CKF_VERIFY }, RSA_LEGACY_FB_STEP, SFTKFIPSNone },
0c41dc
    { CKM_SHA256_RSA_PKCS, { RSA_LEGACY_FB_KEY, CKF_VERIFY }, RSA_LEGACY_FB_STEP, SFTKFIPSNone },
0c41dc
    { CKM_SHA384_RSA_PKCS, { RSA_LEGACY_FB_KEY, CKF_VERIFY }, RSA_LEGACY_FB_STEP, SFTKFIPSNone },
0c41dc
    { CKM_SHA512_RSA_PKCS, { RSA_LEGACY_FB_KEY, CKF_VERIFY }, RSA_LEGACY_FB_STEP, SFTKFIPSNone },
0c41dc
    { CKM_SHA224_RSA_PKCS_PSS, { RSA_LEGACY_FB_KEY, CKF_VERIFY }, RSA_LEGACY_FB_STEP, SFTKFIPSRSAPSS },
0c41dc
    { CKM_SHA256_RSA_PKCS_PSS, { RSA_LEGACY_FB_KEY, CKF_VERIFY }, RSA_LEGACY_FB_STEP, SFTKFIPSRSAPSS },
0c41dc
    { CKM_SHA384_RSA_PKCS_PSS, { RSA_LEGACY_FB_KEY, CKF_VERIFY }, RSA_LEGACY_FB_STEP, SFTKFIPSRSAPSS },
0c41dc
    { CKM_SHA512_RSA_PKCS_PSS, { RSA_LEGACY_FB_KEY, CKF_VERIFY }, RSA_LEGACY_FB_STEP, SFTKFIPSRSAPSS },
0c41dc
    { CKM_SHA224_RSA_PKCS_PSS, { RSA_FB_KEY, CKF_SGN }, RSA_FB_STEP, SFTKFIPSRSAPSS },
0c41dc
    { CKM_SHA256_RSA_PKCS_PSS, { RSA_FB_KEY, CKF_SGN }, RSA_FB_STEP, SFTKFIPSRSAPSS },
0c41dc
    { CKM_SHA384_RSA_PKCS_PSS, { RSA_FB_KEY, CKF_SGN }, RSA_FB_STEP, SFTKFIPSRSAPSS },
0c41dc
    { CKM_SHA512_RSA_PKCS_PSS, { RSA_FB_KEY, CKF_SGN }, RSA_FB_STEP, SFTKFIPSRSAPSS },
0c41dc
    /* ------------------------- DSA Operations --------------------------- */
0c41dc
    { CKM_DSA_SHA224, { DSA_FB_KEY, CKF_VERIFY }, DSA_FB_STEP, SFTKFIPSNone },
0c41dc
    { CKM_DSA_SHA256, { DSA_FB_KEY, CKF_VERIFY }, DSA_FB_STEP, SFTKFIPSNone },
0c41dc
    { CKM_DSA_SHA384, { DSA_FB_KEY, CKF_VERIFY }, DSA_FB_STEP, SFTKFIPSNone },
0c41dc
    { CKM_DSA_SHA512, { DSA_FB_KEY, CKF_VERIFY }, DSA_FB_STEP, SFTKFIPSNone },
0c41dc
    /* -------------------- Diffie Hellman Operations --------------------- */
0c41dc
    { CKM_DH_PKCS_KEY_PAIR_GEN, { DH_FB_KEY, CKF_KPG }, DH_FB_STEP, SFTKFIPSDH },
0c41dc
    { CKM_DH_PKCS_DERIVE, { DH_FB_KEY, CKF_KEA }, DH_FB_STEP, SFTKFIPSDH },
0c41dc
    /* -------------------- Elliptic Curve Operations --------------------- */
0c41dc
    { CKM_EC_KEY_PAIR_GEN, { EC_FB_KEY, CKF_KPG }, EC_FB_STEP, SFTKFIPSECC },
0c41dc
    { CKM_ECDH1_DERIVE, { EC_FB_KEY, CKF_KEA }, EC_FB_STEP, SFTKFIPSECC },
0c41dc
    { CKM_ECDSA_SHA224, { EC_FB_KEY, CKF_SGN }, EC_FB_STEP, SFTKFIPSECC },
0c41dc
    { CKM_ECDSA_SHA256, { EC_FB_KEY, CKF_SGN }, EC_FB_STEP, SFTKFIPSECC },
0c41dc
    { CKM_ECDSA_SHA384, { EC_FB_KEY, CKF_SGN }, EC_FB_STEP, SFTKFIPSECC },
0c41dc
    { CKM_ECDSA_SHA512, { EC_FB_KEY, CKF_SGN }, EC_FB_STEP, SFTKFIPSECC },
0c41dc
    /* ------------------------- RC2 Operations --------------------------- */
0c41dc
    /* ------------------------- AES Operations --------------------------- */
0c41dc
    { CKM_AES_KEY_GEN, { AES_FB_KEY, CKF_GEN }, AES_FB_STEP, SFTKFIPSNone },
0c41dc
    { CKM_AES_ECB, { AES_FB_KEY, CKF_ENC }, AES_FB_STEP, SFTKFIPSNone },
0c41dc
    { CKM_AES_CBC, { AES_FB_KEY, CKF_ENC }, AES_FB_STEP, SFTKFIPSNone },
0c41dc
    { CKM_AES_CMAC, { AES_FB_KEY, CKF_SGN }, AES_FB_STEP, SFTKFIPSNone },
0c41dc
    { CKM_AES_CMAC_GENERAL, { AES_FB_KEY, CKF_SGN }, AES_FB_STEP, SFTKFIPSNone },
0c41dc
    { CKM_AES_CBC_PAD, { AES_FB_KEY, CKF_ENC }, AES_FB_STEP, SFTKFIPSNone },
0c41dc
    { CKM_AES_CTS, { AES_FB_KEY, CKF_ENC }, AES_FB_STEP, SFTKFIPSNone },
0c41dc
    { CKM_AES_CTR, { AES_FB_KEY, CKF_ENC }, AES_FB_STEP, SFTKFIPSNone },
0c41dc
    { CKM_AES_GCM, { AES_FB_KEY, CKF_ENC }, AES_FB_STEP, SFTKFIPSAEAD },
0c41dc
    { CKM_AES_KEY_WRAP, { AES_FB_KEY, CKF_ENC }, AES_FB_STEP, SFTKFIPSNone },
0c41dc
    { CKM_AES_KEY_WRAP_PAD, { AES_FB_KEY, CKF_ENC }, AES_FB_STEP, SFTKFIPSNone },
0c41dc
    { CKM_AES_KEY_WRAP_KWP, { AES_FB_KEY, CKF_ENC }, AES_FB_STEP, SFTKFIPSNone },
0c41dc
    /* ------------------------- Hashing Operations ----------------------- */
0c41dc
    { CKM_SHA224, { 0, 0, CKF_HSH }, 1, SFTKFIPSNone },
0c41dc
    { CKM_SHA224_HMAC, { 112, 224, CKF_SGN }, 1, SFTKFIPSNone },
0c41dc
    { CKM_SHA224_HMAC_GENERAL, { 112, 224, CKF_SGN }, 1, SFTKFIPSNone },
0c41dc
    { CKM_SHA256, { 0, 0, CKF_HSH }, 1, SFTKFIPSNone },
0c41dc
    { CKM_SHA256_HMAC, { 112, 256, CKF_SGN }, 1, SFTKFIPSNone },
0c41dc
    { CKM_SHA256_HMAC_GENERAL, { 112, 256, CKF_SGN }, 1, SFTKFIPSNone },
0c41dc
    { CKM_SHA384, { 0, 0, CKF_HSH }, 1, SFTKFIPSNone },
0c41dc
    { CKM_SHA384_HMAC, { 112, 384, CKF_SGN }, 1, SFTKFIPSNone },
0c41dc
    { CKM_SHA384_HMAC_GENERAL, { 112, 384, CKF_SGN }, 1, SFTKFIPSNone },
0c41dc
    { CKM_SHA512, { 0, 0, CKF_HSH }, 1, SFTKFIPSNone },
0c41dc
    { CKM_SHA512_HMAC, { 112, 512, CKF_SGN }, 1, SFTKFIPSNone },
0c41dc
    { CKM_SHA512_HMAC_GENERAL, { 112, 512, CKF_SGN }, 1, SFTKFIPSNone },
0c41dc
    /* --------------------- Secret Key Operations ------------------------ */
0c41dc
    { CKM_GENERIC_SECRET_KEY_GEN, { 112, 256, CKF_GEN }, 1, SFTKFIPSNone },
0c41dc
    /* ---------------------- SSL/TLS operations ------------------------- */
0c41dc
    { CKM_SSL3_PRE_MASTER_KEY_GEN, { 384, 384, CKF_GEN }, 1, SFTKFIPSNone },
0c41dc
    { CKM_TLS_MASTER_KEY_DERIVE, { 384, 384, CKF_KDF }, 1, SFTKFIPSNone },
0c41dc
    { CKM_TLS_MASTER_KEY_DERIVE_DH, { DH_FB_KEY, CKF_KDF }, 1, SFTKFIPSNone },
0c41dc
    { CKM_TLS_KEY_AND_MAC_DERIVE, { 384, 384, CKF_KDF }, 1, SFTKFIPSNone },
0c41dc
    { CKM_TLS12_MASTER_KEY_DERIVE, { 384, 384, CKF_KDF }, 1, SFTKFIPSNone },
0c41dc
    { CKM_TLS12_MASTER_KEY_DERIVE_DH, { DH_FB_KEY, CKF_KDF }, 1, SFTKFIPSNone },
0c41dc
    { CKM_TLS12_KEY_AND_MAC_DERIVE, { 384, 384, CKF_KDF }, 1, SFTKFIPSNone },
0c41dc
    { CKM_NSS_TLS_MASTER_KEY_DERIVE_SHA256, { 384, 384, CKF_KDF }, 1, SFTKFIPSNone },
0c41dc
    { CKM_NSS_TLS_MASTER_KEY_DERIVE_DH_SHA256, { DH_FB_KEY, CKF_KDF }, 1, SFTKFIPSNone },
0c41dc
    { CKM_NSS_TLS_KEY_AND_MAC_DERIVE_SHA256, { 384, 384, CKF_KDF }, 1, SFTKFIPSNone },
0c41dc
    { CKM_NSS_TLS_PRF_GENERAL_SHA256, { 112, 512, CKF_SGN }, 1, SFTKFIPSNone },
0c41dc
    { CKM_TLS_PRF_GENERAL, { 112, 512, CKF_SGN }, 1, SFTKFIPSNone },
0c41dc
    { CKM_TLS_MAC, { 112, 512, CKF_SGN }, 1, SFTKFIPSNone },
0c41dc
    { CKM_NSS_TLS_EXTENDED_MASTER_KEY_DERIVE, { 192, 1024, CKF_KDF }, 1, SFTKFIPSNone },
0c41dc
    { CKM_NSS_TLS_EXTENDED_MASTER_KEY_DERIVE_DH, { 192, 1024, CKF_DERIVE }, 1, SFTKFIPSNone },
0c41dc
0c41dc
    /* ------------------------- HKDF Operations -------------------------- */
0c41dc
    { CKM_HKDF_DERIVE, { 112, 255 * 64 * 8, CKF_KDF }, 1, SFTKFIPSNone },
0c41dc
    { CKM_HKDF_DATA, { 112, 255 * 64 * 8, CKF_KDF }, 1, SFTKFIPSNone },
0c41dc
    { CKM_HKDF_KEY_GEN, { 160, 224, CKF_GEN }, 1, SFTKFIPSNone },
0c41dc
    { CKM_HKDF_KEY_GEN, { 256, 512, CKF_GEN }, 128, SFTKFIPSNone },
0c41dc
    /* ------------------ NIST 800-108 Key Derivations  ------------------- */
0c41dc
    { CKM_SP800_108_COUNTER_KDF, { 112, CK_MAX, CKF_KDF }, 1, SFTKFIPSNone },
0c41dc
    { CKM_SP800_108_FEEDBACK_KDF, { 112, CK_MAX, CKF_KDF }, 1, SFTKFIPSNone },
0c41dc
    { CKM_SP800_108_DOUBLE_PIPELINE_KDF, { 112, CK_MAX, CKF_KDF }, 1, SFTKFIPSNone },
0c41dc
    { CKM_NSS_SP800_108_COUNTER_KDF_DERIVE_DATA, { 112, CK_MAX, CKF_KDF }, 1, SFTKFIPSNone },
0c41dc
    { CKM_NSS_SP800_108_FEEDBACK_KDF_DERIVE_DATA, { 112, CK_MAX, CKF_KDF }, 1, SFTKFIPSNone },
0c41dc
    { CKM_NSS_SP800_108_DOUBLE_PIPELINE_KDF_DERIVE_DATA, { 112, CK_MAX, CKF_KDF }, 1, SFTKFIPSNone },
0c41dc
    /* --------------------IPSEC ----------------------- */
0c41dc
    { CKM_NSS_IKE_PRF_PLUS_DERIVE, { 112, 255 * 64 * 8, CKF_KDF }, 1, SFTKFIPSNone },
0c41dc
    { CKM_NSS_IKE_PRF_DERIVE, { 112, 64 * 8, CKF_KDF }, 1, SFTKFIPSNone },
0c41dc
    /* ------------------ PBE Key Derivations  ------------------- */
0c41dc
    { CKM_PKCS5_PBKD2, { 112, 256, CKF_GEN }, 1, SFTKFIPSPBKDF2 },
0c41dc
};
0c41dc
const int SFTK_NUMBER_FIPS_ALGORITHMS = PR_ARRAY_SIZE(sftk_fips_mechs);