Coverage Report

Created: 2026-04-04 06:13

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/nss/lib/softoken/fipstest.c
Line
Count
Source
1
/*
2
 * PKCS #11 FIPS Power-Up Self Test.
3
 *
4
 * This Source Code Form is subject to the terms of the Mozilla Public
5
 * License, v. 2.0. If a copy of the MPL was not distributed with this
6
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
7
8
#ifndef NSS_FIPS_DISABLED
9
#include "seccomon.h"
10
#include "blapi.h"
11
#include "softoken.h"
12
#include "lowkeyi.h"
13
#include "secoid.h"
14
#include "secerr.h"
15
#include "pkcs11i.h"
16
#include "lowpbe.h"
17
18
/*
19
 * different platforms have different ways of calling and initial entry point
20
 * when the dll/.so is loaded. Most platforms support either a posix pragma
21
 * or the GCC attribute. Some platforms suppor a pre-defined name, and some
22
 * platforms have a link line way of invoking this function.
23
 */
24
25
/* The pragma */
26
#if defined(USE_INIT_PRAGMA)
27
#pragma init(sftk_startup_tests)
28
#endif
29
30
/* GCC Attribute */
31
#if defined(__GNUC__) && !defined(NSS_NO_INIT_SUPPORT)
32
#define INIT_FUNCTION __attribute__((constructor))
33
#else
34
#define INIT_FUNCTION
35
#endif
36
37
static void INIT_FUNCTION sftk_startup_tests(void);
38
39
/* Windows pre-defined entry */
40
#if defined(XP_WIN) && !defined(NSS_NO_INIT_SUPPORT)
41
#include <windows.h>
42
43
BOOL WINAPI
44
DllMain(
45
    HINSTANCE hinstDLL, // handle to DLL module
46
    DWORD fdwReason,    // reason for calling function
47
    LPVOID lpReserved)  // reserved
48
{
49
    // Perform actions based on the reason for calling.
50
    switch (fdwReason) {
51
        case DLL_PROCESS_ATTACH:
52
            // Initialize once for each new process.
53
            // Return FALSE to fail DLL load.
54
            sftk_startup_tests();
55
            break;
56
57
        case DLL_THREAD_ATTACH:
58
            // Do thread-specific initialization.
59
            break;
60
61
        case DLL_THREAD_DETACH:
62
            // Do thread-specific cleanup.
63
            break;
64
65
        case DLL_PROCESS_DETACH:
66
            // Perform any necessary cleanup.
67
            break;
68
    }
69
    return TRUE; // Successful DLL_PROCESS_ATTACH.
70
}
71
#endif
72
73
/* FIPS preprocessor directives for RSA.                         */
74
#define FIPS_RSA_TYPE siBuffer
75
#define FIPS_RSA_PUBLIC_EXPONENT_LENGTH 3    /*   24-bits */
76
#define FIPS_RSA_PRIVATE_VERSION_LENGTH 1    /*    8-bits */
77
#define FIPS_RSA_MESSAGE_LENGTH 256          /* 2048-bits */
78
#define FIPS_RSA_COEFFICIENT_LENGTH 128      /* 1024-bits */
79
#define FIPS_RSA_PRIME0_LENGTH 128           /* 1024-bits */
80
#define FIPS_RSA_PRIME1_LENGTH 128           /* 1024-bits */
81
#define FIPS_RSA_EXPONENT0_LENGTH 128        /* 1024-bits */
82
#define FIPS_RSA_EXPONENT1_LENGTH 128        /* 1024-bits */
83
#define FIPS_RSA_PRIVATE_EXPONENT_LENGTH 256 /* 2048-bits */
84
#define FIPS_RSA_ENCRYPT_LENGTH 256          /* 2048-bits */
85
#define FIPS_RSA_DECRYPT_LENGTH 256          /* 2048-bits */
86
#define FIPS_RSA_SIGNATURE_LENGTH 256        /* 2048-bits */
87
#define FIPS_RSA_MODULUS_LENGTH 256          /* 2048-bits */
88
89
/*
90
 * Test the softoken RSA_HashSign and RSH_HashCheckSign.
91
 */
92
static SECStatus
93
sftk_fips_RSA_PowerUpSigSelfTest(HASH_HashType shaAlg,
94
                                 NSSLOWKEYPublicKey *rsa_public_key,
95
                                 NSSLOWKEYPrivateKey *rsa_private_key,
96
                                 const unsigned char *rsa_known_msg,
97
                                 const unsigned int rsa_kmsg_length,
98
                                 const unsigned char *rsa_known_signature)
99
{
100
    SECOidTag shaOid;                   /* SHA OID */
101
    unsigned char sha[HASH_LENGTH_MAX]; /* SHA digest */
102
    unsigned int shaLength = 0;         /* length of SHA */
103
    unsigned int rsa_bytes_signed;
104
    unsigned char rsa_computed_signature[FIPS_RSA_SIGNATURE_LENGTH];
105
    SECStatus rv;
106
107
    if (shaAlg == HASH_AlgSHA1) {
108
        if (SHA1_HashBuf(sha, rsa_known_msg, rsa_kmsg_length) != SECSuccess) {
109
            goto loser;
110
        }
111
        shaLength = SHA1_LENGTH;
112
        shaOid = SEC_OID_SHA1;
113
    } else if (shaAlg == HASH_AlgSHA256) {
114
        if (SHA256_HashBuf(sha, rsa_known_msg, rsa_kmsg_length) != SECSuccess) {
115
            goto loser;
116
        }
117
        shaLength = SHA256_LENGTH;
118
        shaOid = SEC_OID_SHA256;
119
    } else if (shaAlg == HASH_AlgSHA384) {
120
        if (SHA384_HashBuf(sha, rsa_known_msg, rsa_kmsg_length) != SECSuccess) {
121
            goto loser;
122
        }
123
        shaLength = SHA384_LENGTH;
124
        shaOid = SEC_OID_SHA384;
125
    } else if (shaAlg == HASH_AlgSHA512) {
126
        if (SHA512_HashBuf(sha, rsa_known_msg, rsa_kmsg_length) != SECSuccess) {
127
            goto loser;
128
        }
129
        shaLength = SHA512_LENGTH;
130
        shaOid = SEC_OID_SHA512;
131
    } else {
132
        goto loser;
133
    }
134
135
    /*************************************************/
136
    /* RSA Single-Round Known Answer Signature Test. */
137
    /*************************************************/
138
139
    /* Perform RSA signature with the RSA private key. */
140
    rv = RSA_HashSign(shaOid,
141
                      rsa_private_key,
142
                      rsa_computed_signature,
143
                      &rsa_bytes_signed,
144
                      FIPS_RSA_SIGNATURE_LENGTH,
145
                      sha,
146
                      shaLength);
147
148
    if ((rv != SECSuccess) ||
149
        (rsa_bytes_signed != FIPS_RSA_SIGNATURE_LENGTH) ||
150
        (PORT_Memcmp(rsa_computed_signature, rsa_known_signature,
151
                     FIPS_RSA_SIGNATURE_LENGTH) != 0)) {
152
        goto loser;
153
    }
154
155
    /****************************************************/
156
    /* RSA Single-Round Known Answer Verification Test. */
157
    /****************************************************/
158
159
    /* Perform RSA verification with the RSA public key. */
160
    rv = RSA_HashCheckSign(shaOid,
161
                           rsa_public_key,
162
                           rsa_computed_signature,
163
                           rsa_bytes_signed,
164
                           sha,
165
                           shaLength);
166
167
    if (rv != SECSuccess) {
168
        goto loser;
169
    }
170
    return (SECSuccess);
171
172
loser:
173
174
    return (SECFailure);
175
}
176
177
static SECStatus
178
sftk_fips_RSA_PowerUpSelfTest(void)
179
{
180
    /* RSA Known Modulus used in both Public/Private Key Values (2048-bits). */
181
    static const PRUint8 rsa_modulus[FIPS_RSA_MODULUS_LENGTH] = {
182
        0xb8, 0x15, 0x00, 0x33, 0xda, 0x0c, 0x9d, 0xa5,
183
        0x14, 0x8c, 0xde, 0x1f, 0x23, 0x07, 0x54, 0xe2,
184
        0xc6, 0xb9, 0x51, 0x04, 0xc9, 0x65, 0x24, 0x6e,
185
        0x0a, 0x46, 0x34, 0x5c, 0x37, 0x86, 0x6b, 0x88,
186
        0x24, 0x27, 0xac, 0xa5, 0x02, 0x79, 0xfb, 0xed,
187
        0x75, 0xc5, 0x3f, 0x6e, 0xdf, 0x05, 0x5f, 0x0f,
188
        0x20, 0x70, 0xa0, 0x5b, 0x85, 0xdb, 0xac, 0xb9,
189
        0x5f, 0x02, 0xc2, 0x64, 0x1e, 0x84, 0x5b, 0x3e,
190
        0xad, 0xbf, 0xf6, 0x2e, 0x51, 0xd6, 0xad, 0xf7,
191
        0xa7, 0x86, 0x75, 0x86, 0xec, 0xa7, 0xe1, 0xf7,
192
        0x08, 0xbf, 0xdc, 0x56, 0xb1, 0x3b, 0xca, 0xd8,
193
        0xfc, 0x51, 0xdf, 0x9a, 0x2a, 0x37, 0x06, 0xf2,
194
        0xd1, 0x6b, 0x9a, 0x5e, 0x2a, 0xe5, 0x20, 0x57,
195
        0x35, 0x9f, 0x1f, 0x98, 0xcf, 0x40, 0xc7, 0xd6,
196
        0x98, 0xdb, 0xde, 0xf5, 0x64, 0x53, 0xf7, 0x9d,
197
        0x45, 0xf3, 0xd6, 0x78, 0xb9, 0xe3, 0xa3, 0x20,
198
        0xcd, 0x79, 0x43, 0x35, 0xef, 0xd7, 0xfb, 0xb9,
199
        0x80, 0x88, 0x27, 0x2f, 0x63, 0xa8, 0x67, 0x3d,
200
        0x4a, 0xfa, 0x06, 0xc6, 0xd2, 0x86, 0x0b, 0xa7,
201
        0x28, 0xfd, 0xe0, 0x1e, 0x93, 0x4b, 0x17, 0x2e,
202
        0xb0, 0x11, 0x6f, 0xc6, 0x2b, 0x98, 0x0f, 0x15,
203
        0xe3, 0x87, 0x16, 0x7a, 0x7c, 0x67, 0x3e, 0x12,
204
        0x2b, 0xf8, 0xbe, 0x48, 0xc1, 0x97, 0x47, 0xf4,
205
        0x1f, 0x81, 0x80, 0x12, 0x28, 0xe4, 0x7b, 0x1e,
206
        0xb7, 0x00, 0xa4, 0xde, 0xaa, 0xfb, 0x0f, 0x77,
207
        0x84, 0xa3, 0xd6, 0xb2, 0x03, 0x48, 0xdd, 0x53,
208
        0x8b, 0x46, 0x41, 0x28, 0x52, 0xc4, 0x53, 0xf0,
209
        0x1c, 0x95, 0xd9, 0x36, 0xe0, 0x0f, 0x26, 0x46,
210
        0x9c, 0x61, 0x0e, 0x80, 0xca, 0x86, 0xaf, 0x39,
211
        0x95, 0xe5, 0x60, 0x43, 0x61, 0x3e, 0x2b, 0xb4,
212
        0xe8, 0xbd, 0x8d, 0x77, 0x62, 0xf5, 0x32, 0x43,
213
        0x2f, 0x4b, 0x65, 0x82, 0x14, 0xdd, 0x29, 0x5b
214
    };
215
216
    /* RSA Known Public Key Values (24-bits). */
217
    static const PRUint8 rsa_public_exponent[FIPS_RSA_PUBLIC_EXPONENT_LENGTH] = { 0x01, 0x00, 0x01 };
218
    /* RSA Known Private Key Values (version                 is    8-bits), */
219
    /*                              (private exponent        is 2048-bits), */
220
    /*                              (private prime0          is 1024-bits), */
221
    /*                              (private prime1          is 1024-bits), */
222
    /*                              (private prime exponent0 is 1024-bits), */
223
    /*                              (private prime exponent1 is 1024-bits), */
224
    /*                          and (private coefficient     is 1024-bits). */
225
    static const PRUint8 rsa_version[] = { 0x00 };
226
227
    static const PRUint8 rsa_private_exponent[FIPS_RSA_PRIVATE_EXPONENT_LENGTH] = {
228
        0x29, 0x08, 0x05, 0x53, 0x89, 0x76, 0xe6, 0x6c,
229
        0xb5, 0x77, 0xf0, 0xca, 0xdf, 0xf3, 0xf2, 0x67,
230
        0xda, 0x03, 0xd4, 0x9b, 0x4c, 0x88, 0xce, 0xe5,
231
        0xf8, 0x44, 0x4d, 0xc7, 0x80, 0x58, 0xe5, 0xff,
232
        0x22, 0x8f, 0xf5, 0x5b, 0x92, 0x81, 0xbe, 0x35,
233
        0xdf, 0xda, 0x67, 0x99, 0x3e, 0xfc, 0xe3, 0x83,
234
        0x6b, 0xa7, 0xaf, 0x16, 0xb7, 0x6f, 0x8f, 0xc0,
235
        0x81, 0xfd, 0x0b, 0x77, 0x65, 0x95, 0xfb, 0x00,
236
        0xad, 0x99, 0xec, 0x35, 0xc6, 0xe8, 0x23, 0x3e,
237
        0xe0, 0x88, 0x88, 0x09, 0xdb, 0x16, 0x50, 0xb7,
238
        0xcf, 0xab, 0x74, 0x61, 0x9e, 0x7f, 0xc5, 0x67,
239
        0x38, 0x56, 0xc7, 0x90, 0x85, 0x78, 0x5e, 0x84,
240
        0x21, 0x49, 0xea, 0xce, 0xb2, 0xa0, 0xff, 0xe4,
241
        0x70, 0x7f, 0x57, 0x7b, 0xa8, 0x36, 0xb8, 0x54,
242
        0x8d, 0x1d, 0xf5, 0x44, 0x9d, 0x68, 0x59, 0xf9,
243
        0x24, 0x6e, 0x85, 0x8f, 0xc3, 0x5f, 0x8a, 0x2c,
244
        0x94, 0xb7, 0xbc, 0x0e, 0xa5, 0xef, 0x93, 0x06,
245
        0x38, 0xcd, 0x07, 0x0c, 0xae, 0xb8, 0x44, 0x1a,
246
        0xd8, 0xe7, 0xf5, 0x9a, 0x1e, 0x9c, 0x18, 0xc7,
247
        0x6a, 0xc2, 0x7f, 0x28, 0x01, 0x4f, 0xb4, 0xb8,
248
        0x90, 0x97, 0x5a, 0x43, 0x38, 0xad, 0xe8, 0x95,
249
        0x68, 0x83, 0x1a, 0x1b, 0x10, 0x07, 0xe6, 0x02,
250
        0x52, 0x1f, 0xbf, 0x76, 0x6b, 0x46, 0xd6, 0xfb,
251
        0xc3, 0xbe, 0xb5, 0xac, 0x52, 0x53, 0x01, 0x1c,
252
        0xf3, 0xc5, 0xeb, 0x64, 0xf2, 0x1e, 0xc4, 0x38,
253
        0xe9, 0xaa, 0xd9, 0xc3, 0x72, 0x51, 0xa5, 0x44,
254
        0x58, 0x69, 0x0b, 0x1b, 0x98, 0x7f, 0xf2, 0x23,
255
        0xff, 0xeb, 0xf0, 0x75, 0x24, 0xcf, 0xc5, 0x1e,
256
        0xb8, 0x6a, 0xc5, 0x2f, 0x4f, 0x23, 0x50, 0x7d,
257
        0x15, 0x9d, 0x19, 0x7a, 0x0b, 0x82, 0xe0, 0x21,
258
        0x5b, 0x5f, 0x9d, 0x50, 0x2b, 0x83, 0xe4, 0x48,
259
        0xcc, 0x39, 0xe5, 0xfb, 0x13, 0x7b, 0x6f, 0x81
260
    };
261
262
    static const PRUint8 rsa_prime0[FIPS_RSA_PRIME0_LENGTH] = {
263
        0xe4, 0xbf, 0x21, 0x62, 0x9b, 0xa9, 0x77, 0x40,
264
        0x8d, 0x2a, 0xce, 0xa1, 0x67, 0x5a, 0x4c, 0x96,
265
        0x45, 0x98, 0x67, 0xbd, 0x75, 0x22, 0x33, 0x6f,
266
        0xe6, 0xcb, 0x77, 0xde, 0x9e, 0x97, 0x7d, 0x96,
267
        0x8c, 0x5e, 0x5d, 0x34, 0xfb, 0x27, 0xfc, 0x6d,
268
        0x74, 0xdb, 0x9d, 0x2e, 0x6d, 0xf6, 0xea, 0xfc,
269
        0xce, 0x9e, 0xda, 0xa7, 0x25, 0xa2, 0xf4, 0x58,
270
        0x6d, 0x0a, 0x3f, 0x01, 0xc2, 0xb4, 0xab, 0x38,
271
        0xc1, 0x14, 0x85, 0xb6, 0xfa, 0x94, 0xc3, 0x85,
272
        0xf9, 0x3c, 0x2e, 0x96, 0x56, 0x01, 0xe7, 0xd6,
273
        0x14, 0x71, 0x4f, 0xfb, 0x4c, 0x85, 0x52, 0xc4,
274
        0x61, 0x1e, 0xa5, 0x1e, 0x96, 0x13, 0x0d, 0x8f,
275
        0x66, 0xae, 0xa0, 0xcd, 0x7d, 0x25, 0x66, 0x19,
276
        0x15, 0xc2, 0xcf, 0xc3, 0x12, 0x3c, 0xe8, 0xa4,
277
        0x52, 0x4c, 0xcb, 0x28, 0x3c, 0xc4, 0xbf, 0x95,
278
        0x33, 0xe3, 0x81, 0xea, 0x0c, 0x6c, 0xa2, 0x05
279
    };
280
    static const PRUint8 rsa_prime1[FIPS_RSA_PRIME1_LENGTH] = {
281
        0xce, 0x03, 0x94, 0xf4, 0xa9, 0x2c, 0x1e, 0x06,
282
        0xe7, 0x40, 0x30, 0x01, 0xf7, 0xbb, 0x68, 0x8c,
283
        0x27, 0xd2, 0x15, 0xe3, 0x28, 0x49, 0x5b, 0xa8,
284
        0xc1, 0x9a, 0x42, 0x7e, 0x31, 0xf9, 0x08, 0x34,
285
        0x81, 0xa2, 0x0f, 0x04, 0x61, 0x34, 0xe3, 0x36,
286
        0x92, 0xb1, 0x09, 0x2b, 0xe9, 0xef, 0x84, 0x88,
287
        0xbe, 0x9c, 0x98, 0x60, 0xa6, 0x60, 0x84, 0xe9,
288
        0x75, 0x6f, 0xcc, 0x81, 0xd1, 0x96, 0xef, 0xdd,
289
        0x2e, 0xca, 0xc4, 0xf5, 0x42, 0xfb, 0x13, 0x2b,
290
        0x57, 0xbf, 0x14, 0x5e, 0xc2, 0x7f, 0x77, 0x35,
291
        0x29, 0xc4, 0xe5, 0xe0, 0xf9, 0x6d, 0x15, 0x4a,
292
        0x42, 0x56, 0x1c, 0x3e, 0x0c, 0xc5, 0xce, 0x70,
293
        0x08, 0x63, 0x1e, 0x73, 0xdb, 0x7e, 0x74, 0x05,
294
        0x32, 0x01, 0xc6, 0x36, 0x32, 0x75, 0x6b, 0xed,
295
        0x9d, 0xfe, 0x7c, 0x7e, 0xa9, 0x57, 0xb4, 0xe9,
296
        0x22, 0xe4, 0xe7, 0xfe, 0x36, 0x07, 0x9b, 0xdf
297
    };
298
    static const PRUint8 rsa_exponent0[FIPS_RSA_EXPONENT0_LENGTH] = {
299
        0x04, 0x5a, 0x3a, 0xa9, 0x64, 0xaa, 0xd9, 0xd1,
300
        0x09, 0x9e, 0x99, 0xe5, 0xea, 0x50, 0x86, 0x8a,
301
        0x89, 0x72, 0x77, 0xee, 0xdb, 0xee, 0xb5, 0xa9,
302
        0xd8, 0x6b, 0x60, 0xb1, 0x84, 0xb4, 0xff, 0x37,
303
        0xc1, 0x1d, 0xfe, 0x8a, 0x06, 0x89, 0x61, 0x3d,
304
        0x37, 0xef, 0x01, 0xd3, 0xa3, 0x56, 0x02, 0x6c,
305
        0xa3, 0x05, 0xd4, 0xc5, 0x3f, 0x6b, 0x15, 0x59,
306
        0x25, 0x61, 0xff, 0x86, 0xea, 0x0c, 0x84, 0x01,
307
        0x85, 0x72, 0xfd, 0x84, 0x58, 0xca, 0x41, 0xda,
308
        0x27, 0xbe, 0xe4, 0x68, 0x09, 0xe4, 0xe9, 0x63,
309
        0x62, 0x6a, 0x31, 0x8a, 0x67, 0x8f, 0x55, 0xde,
310
        0xd4, 0xb6, 0x3f, 0x90, 0x10, 0x6c, 0xf6, 0x62,
311
        0x17, 0x23, 0x15, 0x7e, 0x33, 0x76, 0x65, 0xb5,
312
        0xee, 0x7b, 0x11, 0x76, 0xf5, 0xbe, 0xe0, 0xf2,
313
        0x57, 0x7a, 0x8c, 0x97, 0x0c, 0x68, 0xf5, 0xf8,
314
        0x41, 0xcf, 0x7f, 0x66, 0x53, 0xac, 0x31, 0x7d
315
    };
316
    static const PRUint8 rsa_exponent1[FIPS_RSA_EXPONENT1_LENGTH] = {
317
        0x93, 0x54, 0x14, 0x6e, 0x73, 0x9d, 0x4d, 0x4b,
318
        0xfa, 0x8c, 0xf8, 0xc8, 0x2f, 0x76, 0x22, 0xea,
319
        0x38, 0x80, 0x11, 0x8f, 0x05, 0xfc, 0x90, 0x44,
320
        0x3b, 0x50, 0x2a, 0x45, 0x3d, 0x4f, 0xaf, 0x02,
321
        0x7d, 0xc2, 0x7b, 0xa2, 0xd2, 0x31, 0x94, 0x5c,
322
        0x2e, 0xc3, 0xd4, 0x9f, 0x47, 0x09, 0x37, 0x6a,
323
        0xe3, 0x85, 0xf1, 0xa3, 0x0c, 0xd8, 0xf1, 0xb4,
324
        0x53, 0x7b, 0xc4, 0x71, 0x02, 0x86, 0x42, 0xbb,
325
        0x96, 0xff, 0x03, 0xa3, 0xb2, 0x67, 0x03, 0xea,
326
        0x77, 0x31, 0xfb, 0x4b, 0x59, 0x24, 0xf7, 0x07,
327
        0x59, 0xfb, 0xa9, 0xba, 0x1e, 0x26, 0x58, 0x97,
328
        0x66, 0xa1, 0x56, 0x49, 0x39, 0xb1, 0x2c, 0x55,
329
        0x0a, 0x6a, 0x78, 0x18, 0xba, 0xdb, 0xcf, 0xf4,
330
        0xf7, 0x32, 0x35, 0xa2, 0x04, 0xab, 0xdc, 0xa7,
331
        0x6d, 0xd9, 0xd5, 0x06, 0x6f, 0xec, 0x7d, 0x40,
332
        0x4c, 0xe8, 0x0e, 0xd0, 0xc9, 0xaa, 0xdf, 0x59
333
    };
334
    static const PRUint8 rsa_coefficient[FIPS_RSA_COEFFICIENT_LENGTH] = {
335
        0x17, 0xd7, 0xf5, 0x0a, 0xf0, 0x68, 0x97, 0x96,
336
        0xc4, 0x29, 0x18, 0x77, 0x9a, 0x1f, 0xe3, 0xf3,
337
        0x12, 0x13, 0x0f, 0x7e, 0x7b, 0xb9, 0xc1, 0x91,
338
        0xf9, 0xc7, 0x08, 0x56, 0x5c, 0xa4, 0xbc, 0x83,
339
        0x71, 0xf9, 0x78, 0xd9, 0x2b, 0xec, 0xfe, 0x6b,
340
        0xdc, 0x2f, 0x63, 0xc9, 0xcd, 0x50, 0x14, 0x5b,
341
        0xd3, 0x6e, 0x85, 0x4d, 0x0c, 0xa2, 0x0b, 0xa0,
342
        0x09, 0xb6, 0xca, 0x34, 0x9c, 0xc2, 0xc1, 0x4a,
343
        0xb0, 0xbc, 0x45, 0x93, 0xa5, 0x7e, 0x99, 0xb5,
344
        0xbd, 0xe4, 0x69, 0x29, 0x08, 0x28, 0xd2, 0xcd,
345
        0xab, 0x24, 0x78, 0x48, 0x41, 0x26, 0x0b, 0x37,
346
        0xa3, 0x43, 0xd1, 0x95, 0x1a, 0xd6, 0xee, 0x22,
347
        0x1c, 0x00, 0x0b, 0xc2, 0xb7, 0xa4, 0xa3, 0x21,
348
        0xa9, 0xcd, 0xe4, 0x69, 0xd3, 0x45, 0x02, 0xb1,
349
        0xb7, 0x3a, 0xbf, 0x51, 0x35, 0x1b, 0x78, 0xc2,
350
        0xcf, 0x0c, 0x0d, 0x60, 0x09, 0xa9, 0x44, 0x02
351
    };
352
353
    /* RSA Known Plaintext Message (1024-bits). */
354
    static const PRUint8 rsa_known_plaintext_msg[FIPS_RSA_MESSAGE_LENGTH] = {
355
        "Known plaintext message utilized"
356
        "for RSA Encryption &  Decryption"
357
        "blocks SHA256, SHA384  and      "
358
        "SHA512 RSA Signature KAT tests. "
359
        "Known plaintext message utilized"
360
        "for RSA Encryption &  Decryption"
361
        "blocks SHA256, SHA384  and      "
362
        "SHA512 RSA Signature KAT  tests."
363
    };
364
365
    /* RSA Known Signed Hash (2048-bits). */
366
    static const PRUint8 rsa_known_sha256_signature[] = {
367
        0x8c, 0x2d, 0x2e, 0xfb, 0x37, 0xb5, 0x6f, 0x38,
368
        0x9f, 0x06, 0x5a, 0xf3, 0x8c, 0xa0, 0xd0, 0x7a,
369
        0xde, 0xcf, 0xf9, 0x14, 0x95, 0x59, 0xd3, 0x5f,
370
        0x51, 0x5d, 0x5d, 0xad, 0xd8, 0x71, 0x33, 0x50,
371
        0x1d, 0x03, 0x3b, 0x3a, 0x32, 0x00, 0xb4, 0xde,
372
        0x7f, 0xe4, 0xb1, 0xe5, 0x6b, 0x83, 0xf4, 0x80,
373
        0x10, 0x3b, 0xb8, 0x8a, 0xdb, 0xe8, 0x0a, 0x42,
374
        0x9e, 0x8d, 0xd7, 0xbe, 0xed, 0xde, 0x5a, 0x3d,
375
        0xc6, 0xdb, 0xfe, 0x49, 0x6a, 0xe9, 0x1e, 0x75,
376
        0x66, 0xf1, 0x3f, 0x9e, 0x3f, 0xff, 0x05, 0x65,
377
        0xde, 0xca, 0x62, 0x62, 0xf3, 0xec, 0x53, 0x09,
378
        0xa0, 0x37, 0xd5, 0x66, 0x62, 0x72, 0x14, 0xb6,
379
        0x51, 0x32, 0x67, 0x50, 0xc1, 0xe1, 0x2f, 0x9e,
380
        0x98, 0x4e, 0x53, 0x96, 0x55, 0x4b, 0xc4, 0x92,
381
        0xc3, 0xb4, 0x80, 0xf0, 0x35, 0xc9, 0x00, 0x4b,
382
        0x5c, 0x85, 0x92, 0xb1, 0xe8, 0x6e, 0xa5, 0x51,
383
        0x38, 0x9f, 0xc9, 0x11, 0xb6, 0x14, 0xdf, 0x34,
384
        0x64, 0x40, 0x82, 0x82, 0xde, 0x16, 0x69, 0x93,
385
        0x89, 0x4e, 0x5c, 0x32, 0xf2, 0x0a, 0x4e, 0x9e,
386
        0xbd, 0x63, 0x99, 0x4f, 0xf3, 0x15, 0x90, 0xc2,
387
        0xfe, 0x6f, 0xb7, 0xf4, 0xad, 0xd4, 0x8e, 0x0b,
388
        0xd2, 0xf5, 0x22, 0xd2, 0x71, 0x65, 0x13, 0xf7,
389
        0x82, 0x7b, 0x75, 0xb6, 0xc1, 0xb4, 0x45, 0xbd,
390
        0x8f, 0x95, 0xcf, 0x5b, 0x95, 0x32, 0xef, 0x18,
391
        0x5f, 0xd3, 0xdf, 0x7e, 0x22, 0xdd, 0x25, 0xeb,
392
        0xe1, 0xbf, 0x3b, 0x9a, 0x55, 0x75, 0x4f, 0x3c,
393
        0x38, 0x67, 0x57, 0x04, 0x04, 0x57, 0x27, 0xf6,
394
        0x34, 0x0e, 0x57, 0x8a, 0x7c, 0xff, 0x7d, 0xca,
395
        0x8c, 0x06, 0xf8, 0x9d, 0xdb, 0xe4, 0xd8, 0x19,
396
        0xdd, 0x4d, 0xfd, 0x8f, 0xa0, 0x06, 0x53, 0xe8,
397
        0x33, 0x00, 0x70, 0x3f, 0x6b, 0xc3, 0xbd, 0x9a,
398
        0x78, 0xb5, 0xa9, 0xef, 0x6d, 0xda, 0x67, 0x92
399
    };
400
401
    /* RSA Known Signed Hash (2048-bits). */
402
    static const PRUint8 rsa_known_sha384_signature[] = {
403
        0x20, 0x2d, 0x21, 0x3a, 0xaa, 0x1e, 0x05, 0x15,
404
        0x5c, 0xca, 0x84, 0x86, 0xc0, 0x15, 0x81, 0xdf,
405
        0xd4, 0x06, 0x9f, 0xe0, 0xc1, 0xed, 0xef, 0x0f,
406
        0xfe, 0xb3, 0xc3, 0xbb, 0x28, 0xa5, 0x56, 0xbf,
407
        0xe3, 0x11, 0x5c, 0xc2, 0xc0, 0x0b, 0xfa, 0xfa,
408
        0x3d, 0xd3, 0x06, 0x20, 0xe2, 0xc9, 0xe4, 0x66,
409
        0x28, 0xb7, 0xc0, 0x3b, 0x3c, 0x96, 0xc6, 0x49,
410
        0x3b, 0xcf, 0x86, 0x49, 0x31, 0xaf, 0x5b, 0xa3,
411
        0xec, 0x63, 0x10, 0xdf, 0xda, 0x2f, 0x68, 0xac,
412
        0x7b, 0x3a, 0x49, 0xfa, 0xe6, 0x0d, 0xfe, 0x37,
413
        0x17, 0x56, 0x8e, 0x5c, 0x48, 0x97, 0x43, 0xf7,
414
        0xa0, 0xbc, 0xe3, 0x4b, 0x42, 0xde, 0x58, 0x1d,
415
        0xd9, 0x5d, 0xb3, 0x08, 0x35, 0xbd, 0xa4, 0xe1,
416
        0x80, 0xc3, 0x64, 0xab, 0x21, 0x97, 0xad, 0xfb,
417
        0x71, 0xee, 0xa3, 0x3d, 0x9c, 0xaa, 0xfa, 0x16,
418
        0x60, 0x46, 0x32, 0xda, 0x44, 0x2e, 0x10, 0x92,
419
        0x20, 0xd8, 0x98, 0x80, 0x84, 0x75, 0x5b, 0x70,
420
        0x91, 0x00, 0x33, 0x19, 0x69, 0xc9, 0x2a, 0xec,
421
        0x3d, 0xe5, 0x5f, 0x0f, 0x9a, 0xa7, 0x97, 0x1f,
422
        0x79, 0xc3, 0x1d, 0x65, 0x74, 0x62, 0xc5, 0xa1,
423
        0x23, 0x65, 0x4b, 0x84, 0xa1, 0x03, 0x98, 0xf3,
424
        0xf1, 0x02, 0x24, 0xca, 0xe5, 0xd4, 0xc8, 0xa2,
425
        0x30, 0xad, 0x72, 0x7d, 0x29, 0x60, 0x1a, 0x8e,
426
        0x6f, 0x23, 0xa4, 0xda, 0x68, 0xa4, 0x45, 0x9c,
427
        0x39, 0x70, 0x44, 0x18, 0x4b, 0x73, 0xfe, 0xf8,
428
        0x33, 0x53, 0x1d, 0x7e, 0x93, 0x93, 0xac, 0xc7,
429
        0x1e, 0x6e, 0x6b, 0xfd, 0x9e, 0xba, 0xa6, 0x71,
430
        0x70, 0x47, 0x6a, 0xd6, 0x82, 0x32, 0xa2, 0x6e,
431
        0x20, 0x72, 0xb0, 0xba, 0xec, 0x91, 0xbb, 0x6b,
432
        0xcc, 0x84, 0x0a, 0x33, 0x2b, 0x8a, 0x8d, 0xeb,
433
        0x71, 0xcd, 0xca, 0x67, 0x1b, 0xad, 0x10, 0xd4,
434
        0xce, 0x4f, 0xc0, 0x29, 0xec, 0xfa, 0xed, 0xfa
435
    };
436
437
    /* RSA Known Signed Hash (2048-bits). */
438
    static const PRUint8 rsa_known_sha512_signature[] = {
439
        0x35, 0x0e, 0x74, 0x9d, 0xeb, 0xc7, 0x67, 0x31,
440
        0x9f, 0xff, 0x0b, 0xbb, 0x5e, 0x66, 0xb4, 0x2f,
441
        0xbf, 0x72, 0x60, 0x4f, 0xe9, 0xbd, 0xec, 0xc8,
442
        0x17, 0x79, 0x5f, 0x39, 0x83, 0xb4, 0x54, 0x2e,
443
        0x01, 0xb9, 0xd3, 0x20, 0x47, 0xcb, 0xd4, 0x42,
444
        0xf2, 0x6e, 0x36, 0xc1, 0x97, 0xad, 0xef, 0x8e,
445
        0xe6, 0x51, 0xee, 0x5e, 0x9e, 0x88, 0xb4, 0x9d,
446
        0xda, 0x3e, 0x77, 0x4b, 0xe8, 0xae, 0x48, 0x53,
447
        0x2c, 0xc4, 0xd3, 0x25, 0x6b, 0x23, 0xb7, 0x54,
448
        0x3c, 0x95, 0x8f, 0xfb, 0x6f, 0x6d, 0xc5, 0x56,
449
        0x39, 0x69, 0x28, 0x0e, 0x74, 0x9b, 0x31, 0xe8,
450
        0x76, 0x77, 0x2b, 0xc1, 0x44, 0x89, 0x81, 0x93,
451
        0xfc, 0xf6, 0xec, 0x5f, 0x8f, 0x89, 0xfc, 0x1d,
452
        0xa4, 0x53, 0x58, 0x8c, 0xe9, 0xc0, 0xc0, 0x26,
453
        0xe6, 0xdf, 0x6d, 0x27, 0xb1, 0x8e, 0x3e, 0xb6,
454
        0x47, 0xe1, 0x02, 0x96, 0xc2, 0x5f, 0x7f, 0x3d,
455
        0xc5, 0x6c, 0x2f, 0xea, 0xaa, 0x5e, 0x39, 0xfc,
456
        0x77, 0xca, 0x00, 0x02, 0x5c, 0x64, 0x7c, 0xce,
457
        0x7d, 0x63, 0x82, 0x05, 0xed, 0xf7, 0x5b, 0x55,
458
        0x58, 0xc0, 0xeb, 0x76, 0xd7, 0x95, 0x55, 0x37,
459
        0x85, 0x7d, 0x17, 0xad, 0xd2, 0x11, 0xfd, 0x97,
460
        0x48, 0xb5, 0xc2, 0x5e, 0xc7, 0x62, 0xc0, 0xe0,
461
        0x68, 0xa8, 0x61, 0x14, 0x41, 0xca, 0x25, 0x3a,
462
        0xec, 0x48, 0x54, 0x22, 0x83, 0x2b, 0x69, 0x54,
463
        0xfd, 0xc8, 0x99, 0x9a, 0xee, 0x37, 0x03, 0xa3,
464
        0x8f, 0x0f, 0x32, 0xb0, 0xaa, 0x74, 0x39, 0x04,
465
        0x7c, 0xd9, 0xc2, 0x8f, 0xbe, 0xf2, 0xc4, 0xbe,
466
        0xdd, 0x7a, 0x7a, 0x7f, 0x72, 0xd3, 0x80, 0x59,
467
        0x18, 0xa0, 0xa1, 0x2d, 0x6f, 0xa3, 0xa9, 0x48,
468
        0xed, 0x20, 0xa6, 0xea, 0xaa, 0x10, 0x83, 0x98,
469
        0x0c, 0x13, 0x69, 0x6e, 0xcd, 0x31, 0x6b, 0xd0,
470
        0x66, 0xa6, 0x5e, 0x30, 0x0c, 0x82, 0xd5, 0x81
471
    };
472
473
    static const RSAPublicKey bl_public_key = {
474
        NULL,
475
        { FIPS_RSA_TYPE, (unsigned char *)rsa_modulus,
476
          FIPS_RSA_MODULUS_LENGTH },
477
        { FIPS_RSA_TYPE, (unsigned char *)rsa_public_exponent,
478
          FIPS_RSA_PUBLIC_EXPONENT_LENGTH },
479
        PR_FALSE,
480
    };
481
    static const RSAPrivateKey bl_private_key = {
482
        NULL,
483
        { FIPS_RSA_TYPE, (unsigned char *)rsa_version,
484
          FIPS_RSA_PRIVATE_VERSION_LENGTH },
485
        { FIPS_RSA_TYPE, (unsigned char *)rsa_modulus,
486
          FIPS_RSA_MODULUS_LENGTH },
487
        { FIPS_RSA_TYPE, (unsigned char *)rsa_public_exponent,
488
          FIPS_RSA_PUBLIC_EXPONENT_LENGTH },
489
        { FIPS_RSA_TYPE, (unsigned char *)rsa_private_exponent,
490
          FIPS_RSA_PRIVATE_EXPONENT_LENGTH },
491
        { FIPS_RSA_TYPE, (unsigned char *)rsa_prime0,
492
          FIPS_RSA_PRIME0_LENGTH },
493
        { FIPS_RSA_TYPE, (unsigned char *)rsa_prime1,
494
          FIPS_RSA_PRIME1_LENGTH },
495
        { FIPS_RSA_TYPE, (unsigned char *)rsa_exponent0,
496
          FIPS_RSA_EXPONENT0_LENGTH },
497
        { FIPS_RSA_TYPE, (unsigned char *)rsa_exponent1,
498
          FIPS_RSA_EXPONENT1_LENGTH },
499
        { FIPS_RSA_TYPE, (unsigned char *)rsa_coefficient,
500
          FIPS_RSA_COEFFICIENT_LENGTH }
501
    };
502
503
/* RSA variables. */
504
#ifdef CREATE_TEMP_ARENAS
505
    PLArenaPool *rsa_public_arena;
506
    PLArenaPool *rsa_private_arena;
507
#endif
508
    NSSLOWKEYPublicKey *rsa_public_key;
509
    NSSLOWKEYPrivateKey *rsa_private_key;
510
    SECStatus rsa_status;
511
512
    NSSLOWKEYPublicKey low_public_key = { NULL, NSSLOWKEYRSAKey };
513
    NSSLOWKEYPrivateKey low_private_key = { NULL, NSSLOWKEYRSAKey };
514
515
    /****************************************/
516
    /* Compose RSA Public/Private Key Pair. */
517
    /****************************************/
518
519
    low_public_key.u.rsa = bl_public_key;
520
    low_private_key.u.rsa = bl_private_key;
521
522
    rsa_public_key = &low_public_key;
523
    rsa_private_key = &low_private_key;
524
525
#ifdef CREATE_TEMP_ARENAS
526
    /* Create some space for the RSA public key. */
527
    rsa_public_arena = PORT_NewArena(NSS_SOFTOKEN_DEFAULT_CHUNKSIZE);
528
529
    if (rsa_public_arena == NULL) {
530
        PORT_SetError(SEC_ERROR_NO_MEMORY);
531
        return (SECFailure);
532
    }
533
534
    /* Create some space for the RSA private key. */
535
    rsa_private_arena = PORT_NewArena(NSS_SOFTOKEN_DEFAULT_CHUNKSIZE);
536
537
    if (rsa_private_arena == NULL) {
538
        PORT_FreeArena(rsa_public_arena, PR_TRUE);
539
        PORT_SetError(SEC_ERROR_NO_MEMORY);
540
        return (SECFailure);
541
    }
542
543
    rsa_public_key->arena = rsa_public_arena;
544
    rsa_private_key->arena = rsa_private_arena;
545
#endif
546
547
    /**************************************************/
548
    /* RSA Hash tests                                 */
549
    /**************************************************/
550
551
    rsa_status = sftk_fips_RSA_PowerUpSigSelfTest(HASH_AlgSHA256,
552
                                                  rsa_public_key, rsa_private_key,
553
                                                  rsa_known_plaintext_msg, FIPS_RSA_MESSAGE_LENGTH,
554
                                                  rsa_known_sha256_signature);
555
    if (rsa_status != SECSuccess)
556
        goto rsa_loser;
557
558
    rsa_status = sftk_fips_RSA_PowerUpSigSelfTest(HASH_AlgSHA384,
559
                                                  rsa_public_key, rsa_private_key,
560
                                                  rsa_known_plaintext_msg, FIPS_RSA_MESSAGE_LENGTH,
561
                                                  rsa_known_sha384_signature);
562
    if (rsa_status != SECSuccess)
563
        goto rsa_loser;
564
565
    rsa_status = sftk_fips_RSA_PowerUpSigSelfTest(HASH_AlgSHA512,
566
                                                  rsa_public_key, rsa_private_key,
567
                                                  rsa_known_plaintext_msg, FIPS_RSA_MESSAGE_LENGTH,
568
                                                  rsa_known_sha512_signature);
569
    if (rsa_status != SECSuccess)
570
        goto rsa_loser;
571
572
    /* Dispose of all RSA key material. */
573
    nsslowkey_DestroyPublicKey(rsa_public_key);
574
    nsslowkey_DestroyPrivateKey(rsa_private_key);
575
576
    return (SECSuccess);
577
578
rsa_loser:
579
580
    nsslowkey_DestroyPublicKey(rsa_public_key);
581
    nsslowkey_DestroyPrivateKey(rsa_private_key);
582
583
    PORT_SetError(SEC_ERROR_LIBRARY_FAILURE);
584
    return (SECFailure);
585
}
586
587
static SECStatus
588
sftk_fips_HKDF_PowerUpSelfTest(void)
589
{
590
    SECStatus status;
591
    static const unsigned char base_key[] = {
592
        0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
593
        0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
594
        0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
595
        0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
596
        0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
597
        0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
598
        0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
599
        0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f
600
    };
601
    static const unsigned char known_hkdf_sha256_key[] = {
602
        0xdd, 0xdb, 0xeb, 0xe5, 0x6d, 0xd2, 0x96, 0xa4,
603
        0x07, 0xc5, 0x7d, 0xda, 0x31, 0x56, 0x8d, 0xa5,
604
        0x41, 0x3e, 0x90, 0xd4, 0xe6, 0x98, 0xeb, 0xf8,
605
        0x5a, 0x49, 0x7f, 0x38, 0xef, 0x01, 0x8a, 0xe5,
606
        0xda, 0x36, 0xe5, 0xcf, 0x21, 0xe3, 0x9f, 0xc3,
607
        0x32, 0xb3, 0x1e, 0xf6, 0xc5, 0x10, 0x4c, 0x86,
608
        0x53, 0x5e, 0x6f, 0xe0, 0x63, 0x6e, 0x43, 0x33,
609
        0x61, 0x35, 0xf4, 0x17, 0x10, 0x77, 0x75, 0x2a
610
    };
611
/* current NIST IG's say we only need to test one instance
612
 * of kdfs, keep these others around in case the guidance
613
 * changes */
614
#ifdef NSS_FULL_POST
615
    static const unsigned char known_hkdf_sha384_key[] = {
616
        0x35, 0x64, 0xc4, 0xa1, 0xcc, 0xc1, 0xdc, 0xe4,
617
        0xe2, 0xca, 0x51, 0xae, 0xe8, 0x92, 0x88, 0x30,
618
        0x8b, 0xb0, 0x2b, 0xac, 0x00, 0x15, 0xac, 0x15,
619
        0x97, 0xc9, 0xf4, 0x6b, 0xf6, 0x3f, 0x97, 0xea,
620
        0x48, 0x55, 0x38, 0x25, 0x06, 0x5d, 0x91, 0x64,
621
        0xbd, 0x09, 0xf3, 0x44, 0xbc, 0x82, 0xbe, 0xdb,
622
        0x5c, 0xd7, 0xf2, 0x24, 0xa5, 0x55, 0x8d, 0xa9,
623
        0xa8, 0x85, 0xde, 0x8c, 0x33, 0xe0, 0x4d, 0xc3
624
    };
625
    static const unsigned char known_hkdf_sha512_key[] = {
626
        0x63, 0x4e, 0xbc, 0x42, 0xb3, 0x56, 0x74, 0x7d,
627
        0x1b, 0x55, 0xf0, 0x34, 0x54, 0xcb, 0x6d, 0x58,
628
        0x39, 0x96, 0x10, 0xda, 0x03, 0x20, 0x8f, 0x77,
629
        0x0d, 0xb4, 0xf7, 0xf6, 0x67, 0x0d, 0x5b, 0x6b,
630
        0xd0, 0x30, 0xc4, 0xdd, 0x67, 0x61, 0x5d, 0x9a,
631
        0xf5, 0x18, 0x6e, 0x1b, 0x60, 0x97, 0xc2, 0x4d,
632
        0x23, 0x43, 0x69, 0xe6, 0x3b, 0xa5, 0xdf, 0xe9,
633
        0x7c, 0xf1, 0x87, 0x48, 0x6f, 0xb9, 0xd3, 0x02
634
    };
635
#endif
636
    unsigned char outBytes[64] = { 0 };
637
638
    CK_HKDF_PARAMS hkdf_params;
639
640
    hkdf_params.bExpand = CK_TRUE;
641
    hkdf_params.bExtract = CK_TRUE;
642
    hkdf_params.ulSaltType = CKF_HKDF_SALT_DATA;
643
    hkdf_params.pSalt = (CK_BYTE_PTR)base_key;
644
    hkdf_params.ulSaltLen = sizeof(base_key);
645
    hkdf_params.pInfo = (CK_BYTE_PTR)base_key;
646
    hkdf_params.ulInfoLen = sizeof(base_key);
647
648
    /**************************************************/
649
    /* HKDF tests                                     */
650
    /**************************************************/
651
652
    hkdf_params.prfHashMechanism = CKM_SHA256_HMAC;
653
    status = sftk_HKDF(&hkdf_params, CK_INVALID_HANDLE, NULL,
654
                       base_key, 32, NULL, outBytes, sizeof(outBytes),
655
                       PR_TRUE, PR_TRUE);
656
    if ((status != SECSuccess) ||
657
        PORT_Memcmp(outBytes, known_hkdf_sha256_key, sizeof(outBytes)) != 0) {
658
        PORT_SetError(SEC_ERROR_LIBRARY_FAILURE);
659
        return (SECFailure);
660
    }
661
662
#ifdef NSS_FULL_POST
663
    hkdf_params.prfHashMechanism = CKM_SHA384_HMAC;
664
    status = sftk_HKDF(&hkdf_params, CK_INVALID_HANDLE, NULL,
665
                       base_key, 48, NULL, outBytes, sizeof(outBytes),
666
                       PR_TRUE, PR_TRUE);
667
    if ((status != SECSuccess) ||
668
        PORT_Memcmp(outBytes, known_hkdf_sha384_key, sizeof(outBytes)) != 0) {
669
        PORT_SetError(SEC_ERROR_LIBRARY_FAILURE);
670
        return (SECFailure);
671
    }
672
673
    hkdf_params.prfHashMechanism = CKM_SHA512_HMAC;
674
    status = sftk_HKDF(&hkdf_params, CK_INVALID_HANDLE, NULL,
675
                       base_key, 64, NULL, outBytes, sizeof(outBytes),
676
                       PR_TRUE, PR_TRUE);
677
    if ((status != SECSuccess) ||
678
        PORT_Memcmp(outBytes, known_hkdf_sha512_key, sizeof(outBytes)) != 0) {
679
        PORT_SetError(SEC_ERROR_LIBRARY_FAILURE);
680
        return (SECFailure);
681
    }
682
#endif
683
684
    return (SECSuccess);
685
}
686
687
static PRBool sftk_self_tests_ran = PR_FALSE;
688
static PRBool sftk_self_tests_success = PR_FALSE;
689
690
/*
691
 * This function is called at dll load time, the code tha makes this
692
 * happen is platform specific on defined above.
693
 */
694
void
695
sftk_startup_tests_with_rerun(PRBool rerun)
696
{
697
    SECStatus rv;
698
    const char *libraryName = rerun ? BLAPI_FIPS_RERUN_FLAG_STRING SOFTOKEN_LIB_NAME : SOFTOKEN_LIB_NAME;
699
700
    PORT_Assert(!sftk_self_tests_ran);
701
    PORT_Assert(!sftk_self_tests_success);
702
    sftk_self_tests_ran = PR_TRUE;
703
    sftk_self_tests_success = PR_FALSE; /* just in case */
704
705
    /* need to initiallize the oid library before the RSA tests */
706
    rv = SECOID_Init();
707
    if (rv != SECSuccess) {
708
        return;
709
    }
710
    /* make sure freebl is initialized, or our RSA check
711
     * may fail. This is normally done at freebl load time, but it's
712
     * possible we may have shut freebl down without unloading it. */
713
    rv = BL_Init();
714
    if (rv != SECSuccess) {
715
        return;
716
    }
717
718
    rv = RNG_RNGInit();
719
    if (rv != SECSuccess) {
720
        return;
721
    }
722
    /* check the RSA combined functions in softoken */
723
    rv = sftk_fips_RSA_PowerUpSelfTest();
724
    if (rv != SECSuccess) {
725
        return;
726
    }
727
    if (!BLAPI_SHVerify(libraryName,
728
                        (PRFuncPtr)&sftk_fips_RSA_PowerUpSelfTest)) {
729
        /* something is wrong with the library, fail without enabling
730
         * the token */
731
        return;
732
    }
733
    rv = sftk_fips_IKE_PowerUpSelfTests();
734
    if (rv != SECSuccess) {
735
        return;
736
    }
737
738
    rv = sftk_fips_SP800_108_PowerUpSelfTests();
739
    if (rv != SECSuccess) {
740
        return;
741
    }
742
743
    rv = sftk_fips_HKDF_PowerUpSelfTest();
744
    if (rv != SECSuccess) {
745
        return;
746
    }
747
748
    rv = sftk_fips_pbkdf_PowerUpSelfTests();
749
    if (rv != SECSuccess) {
750
        return;
751
    }
752
753
    sftk_self_tests_success = PR_TRUE;
754
}
755
756
static void
757
sftk_startup_tests(void)
758
{
759
    sftk_startup_tests_with_rerun(PR_FALSE);
760
}
761
762
/*
763
 * this is called from nsc_Common_Initizialize entry points that gates access
764
 * to * all other pkcs11 functions. This prevents softoken operation if our
765
 * power on selftest failed.
766
 */
767
CK_RV
768
sftk_FIPSEntryOK(PRBool rerun)
769
{
770
#ifdef NSS_NO_INIT_SUPPORT
771
    /* this should only be set on platforms that can't handle one of the INIT
772
     * schemes.  This code allows those platforms to continue to function,
773
     * though they don't meet the strict NIST requirements. If NSS_NO_INIT_SUPPORT
774
     * is not set, and init support has not been properly enabled, softken
775
     * will always fail because of the test below
776
     */
777
    if (!sftk_self_tests_ran) {
778
        sftk_startup_tests();
779
    }
780
#endif
781
    if (rerun) {
782
        sftk_self_tests_ran = PR_FALSE;
783
        sftk_self_tests_success = PR_FALSE;
784
        sftk_startup_tests_with_rerun(PR_TRUE);
785
    }
786
    if (!sftk_self_tests_success) {
787
        return CKR_DEVICE_ERROR;
788
    }
789
    return CKR_OK;
790
}
791
#else
792
#include "pkcs11t.h"
793
CK_RV
794
sftk_FIPSEntryOK()
795
0
{
796
0
    return CKR_DEVICE_ERROR;
797
0
}
798
#endif /* NSS_FIPS_DISABLED */