Coverage Report

Created: 2025-07-04 06:19

/src/nss/lib/softoken/fipstest.c
Line
Count
Source (jump to first uncovered line)
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
    };
480
    static const RSAPrivateKey bl_private_key = {
481
        NULL,
482
        { FIPS_RSA_TYPE, (unsigned char *)rsa_version,
483
          FIPS_RSA_PRIVATE_VERSION_LENGTH },
484
        { FIPS_RSA_TYPE, (unsigned char *)rsa_modulus,
485
          FIPS_RSA_MODULUS_LENGTH },
486
        { FIPS_RSA_TYPE, (unsigned char *)rsa_public_exponent,
487
          FIPS_RSA_PUBLIC_EXPONENT_LENGTH },
488
        { FIPS_RSA_TYPE, (unsigned char *)rsa_private_exponent,
489
          FIPS_RSA_PRIVATE_EXPONENT_LENGTH },
490
        { FIPS_RSA_TYPE, (unsigned char *)rsa_prime0,
491
          FIPS_RSA_PRIME0_LENGTH },
492
        { FIPS_RSA_TYPE, (unsigned char *)rsa_prime1,
493
          FIPS_RSA_PRIME1_LENGTH },
494
        { FIPS_RSA_TYPE, (unsigned char *)rsa_exponent0,
495
          FIPS_RSA_EXPONENT0_LENGTH },
496
        { FIPS_RSA_TYPE, (unsigned char *)rsa_exponent1,
497
          FIPS_RSA_EXPONENT1_LENGTH },
498
        { FIPS_RSA_TYPE, (unsigned char *)rsa_coefficient,
499
          FIPS_RSA_COEFFICIENT_LENGTH }
500
    };
501
502
/* RSA variables. */
503
#ifdef CREATE_TEMP_ARENAS
504
    PLArenaPool *rsa_public_arena;
505
    PLArenaPool *rsa_private_arena;
506
#endif
507
    NSSLOWKEYPublicKey *rsa_public_key;
508
    NSSLOWKEYPrivateKey *rsa_private_key;
509
    SECStatus rsa_status;
510
511
    NSSLOWKEYPublicKey low_public_key = { NULL, NSSLOWKEYRSAKey };
512
    NSSLOWKEYPrivateKey low_private_key = { NULL, NSSLOWKEYRSAKey };
513
514
    /****************************************/
515
    /* Compose RSA Public/Private Key Pair. */
516
    /****************************************/
517
518
    low_public_key.u.rsa = bl_public_key;
519
    low_private_key.u.rsa = bl_private_key;
520
521
    rsa_public_key = &low_public_key;
522
    rsa_private_key = &low_private_key;
523
524
#ifdef CREATE_TEMP_ARENAS
525
    /* Create some space for the RSA public key. */
526
    rsa_public_arena = PORT_NewArena(NSS_SOFTOKEN_DEFAULT_CHUNKSIZE);
527
528
    if (rsa_public_arena == NULL) {
529
        PORT_SetError(SEC_ERROR_NO_MEMORY);
530
        return (SECFailure);
531
    }
532
533
    /* Create some space for the RSA private key. */
534
    rsa_private_arena = PORT_NewArena(NSS_SOFTOKEN_DEFAULT_CHUNKSIZE);
535
536
    if (rsa_private_arena == NULL) {
537
        PORT_FreeArena(rsa_public_arena, PR_TRUE);
538
        PORT_SetError(SEC_ERROR_NO_MEMORY);
539
        return (SECFailure);
540
    }
541
542
    rsa_public_key->arena = rsa_public_arena;
543
    rsa_private_key->arena = rsa_private_arena;
544
#endif
545
546
    /**************************************************/
547
    /* RSA Hash tests                                 */
548
    /**************************************************/
549
550
    rsa_status = sftk_fips_RSA_PowerUpSigSelfTest(HASH_AlgSHA256,
551
                                                  rsa_public_key, rsa_private_key,
552
                                                  rsa_known_plaintext_msg, FIPS_RSA_MESSAGE_LENGTH,
553
                                                  rsa_known_sha256_signature);
554
    if (rsa_status != SECSuccess)
555
        goto rsa_loser;
556
557
    rsa_status = sftk_fips_RSA_PowerUpSigSelfTest(HASH_AlgSHA384,
558
                                                  rsa_public_key, rsa_private_key,
559
                                                  rsa_known_plaintext_msg, FIPS_RSA_MESSAGE_LENGTH,
560
                                                  rsa_known_sha384_signature);
561
    if (rsa_status != SECSuccess)
562
        goto rsa_loser;
563
564
    rsa_status = sftk_fips_RSA_PowerUpSigSelfTest(HASH_AlgSHA512,
565
                                                  rsa_public_key, rsa_private_key,
566
                                                  rsa_known_plaintext_msg, FIPS_RSA_MESSAGE_LENGTH,
567
                                                  rsa_known_sha512_signature);
568
    if (rsa_status != SECSuccess)
569
        goto rsa_loser;
570
571
    /* Dispose of all RSA key material. */
572
    nsslowkey_DestroyPublicKey(rsa_public_key);
573
    nsslowkey_DestroyPrivateKey(rsa_private_key);
574
575
    return (SECSuccess);
576
577
rsa_loser:
578
579
    nsslowkey_DestroyPublicKey(rsa_public_key);
580
    nsslowkey_DestroyPrivateKey(rsa_private_key);
581
582
    PORT_SetError(SEC_ERROR_LIBRARY_FAILURE);
583
    return (SECFailure);
584
}
585
586
static SECStatus
587
sftk_fips_HKDF_PowerUpSelfTest(void)
588
{
589
    SECStatus status;
590
    static const unsigned char base_key[] = {
591
        0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
592
        0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
593
        0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
594
        0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
595
        0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
596
        0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
597
        0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
598
        0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f
599
    };
600
    static const unsigned char known_hkdf_sha256_key[] = {
601
        0xdd, 0xdb, 0xeb, 0xe5, 0x6d, 0xd2, 0x96, 0xa4,
602
        0x07, 0xc5, 0x7d, 0xda, 0x31, 0x56, 0x8d, 0xa5,
603
        0x41, 0x3e, 0x90, 0xd4, 0xe6, 0x98, 0xeb, 0xf8,
604
        0x5a, 0x49, 0x7f, 0x38, 0xef, 0x01, 0x8a, 0xe5,
605
        0xda, 0x36, 0xe5, 0xcf, 0x21, 0xe3, 0x9f, 0xc3,
606
        0x32, 0xb3, 0x1e, 0xf6, 0xc5, 0x10, 0x4c, 0x86,
607
        0x53, 0x5e, 0x6f, 0xe0, 0x63, 0x6e, 0x43, 0x33,
608
        0x61, 0x35, 0xf4, 0x17, 0x10, 0x77, 0x75, 0x2a
609
    };
610
/* current NIST IG's say we only need to test one instance
611
 * of kdfs, keep these others around in case the guidance
612
 * changes */
613
#ifdef NSS_FULL_POST
614
    static const unsigned char known_hkdf_sha384_key[] = {
615
        0x35, 0x64, 0xc4, 0xa1, 0xcc, 0xc1, 0xdc, 0xe4,
616
        0xe2, 0xca, 0x51, 0xae, 0xe8, 0x92, 0x88, 0x30,
617
        0x8b, 0xb0, 0x2b, 0xac, 0x00, 0x15, 0xac, 0x15,
618
        0x97, 0xc9, 0xf4, 0x6b, 0xf6, 0x3f, 0x97, 0xea,
619
        0x48, 0x55, 0x38, 0x25, 0x06, 0x5d, 0x91, 0x64,
620
        0xbd, 0x09, 0xf3, 0x44, 0xbc, 0x82, 0xbe, 0xdb,
621
        0x5c, 0xd7, 0xf2, 0x24, 0xa5, 0x55, 0x8d, 0xa9,
622
        0xa8, 0x85, 0xde, 0x8c, 0x33, 0xe0, 0x4d, 0xc3
623
    };
624
    static const unsigned char known_hkdf_sha512_key[] = {
625
        0x63, 0x4e, 0xbc, 0x42, 0xb3, 0x56, 0x74, 0x7d,
626
        0x1b, 0x55, 0xf0, 0x34, 0x54, 0xcb, 0x6d, 0x58,
627
        0x39, 0x96, 0x10, 0xda, 0x03, 0x20, 0x8f, 0x77,
628
        0x0d, 0xb4, 0xf7, 0xf6, 0x67, 0x0d, 0x5b, 0x6b,
629
        0xd0, 0x30, 0xc4, 0xdd, 0x67, 0x61, 0x5d, 0x9a,
630
        0xf5, 0x18, 0x6e, 0x1b, 0x60, 0x97, 0xc2, 0x4d,
631
        0x23, 0x43, 0x69, 0xe6, 0x3b, 0xa5, 0xdf, 0xe9,
632
        0x7c, 0xf1, 0x87, 0x48, 0x6f, 0xb9, 0xd3, 0x02
633
    };
634
#endif
635
    unsigned char outBytes[64] = { 0 };
636
637
    CK_HKDF_PARAMS hkdf_params;
638
639
    hkdf_params.bExpand = CK_TRUE;
640
    hkdf_params.bExtract = CK_TRUE;
641
    hkdf_params.ulSaltType = CKF_HKDF_SALT_DATA;
642
    hkdf_params.pSalt = (CK_BYTE_PTR)base_key;
643
    hkdf_params.ulSaltLen = sizeof(base_key);
644
    hkdf_params.pInfo = (CK_BYTE_PTR)base_key;
645
    hkdf_params.ulInfoLen = sizeof(base_key);
646
647
    /**************************************************/
648
    /* HKDF tests                                     */
649
    /**************************************************/
650
651
    hkdf_params.prfHashMechanism = CKM_SHA256_HMAC;
652
    status = sftk_HKDF(&hkdf_params, CK_INVALID_HANDLE, NULL,
653
                       base_key, 32, NULL, outBytes, sizeof(outBytes),
654
                       PR_TRUE, PR_TRUE);
655
    if ((status != SECSuccess) ||
656
        PORT_Memcmp(outBytes, known_hkdf_sha256_key, sizeof(outBytes)) != 0) {
657
        PORT_SetError(SEC_ERROR_LIBRARY_FAILURE);
658
        return (SECFailure);
659
    }
660
661
#ifdef NSS_FULL_POST
662
    hkdf_params.prfHashMechanism = CKM_SHA384_HMAC;
663
    status = sftk_HKDF(&hkdf_params, CK_INVALID_HANDLE, NULL,
664
                       base_key, 48, NULL, outBytes, sizeof(outBytes),
665
                       PR_TRUE, PR_TRUE);
666
    if ((status != SECSuccess) ||
667
        PORT_Memcmp(outBytes, known_hkdf_sha384_key, sizeof(outBytes)) != 0) {
668
        PORT_SetError(SEC_ERROR_LIBRARY_FAILURE);
669
        return (SECFailure);
670
    }
671
672
    hkdf_params.prfHashMechanism = CKM_SHA512_HMAC;
673
    status = sftk_HKDF(&hkdf_params, CK_INVALID_HANDLE, NULL,
674
                       base_key, 64, NULL, outBytes, sizeof(outBytes),
675
                       PR_TRUE, PR_TRUE);
676
    if ((status != SECSuccess) ||
677
        PORT_Memcmp(outBytes, known_hkdf_sha512_key, sizeof(outBytes)) != 0) {
678
        PORT_SetError(SEC_ERROR_LIBRARY_FAILURE);
679
        return (SECFailure);
680
    }
681
#endif
682
683
    return (SECSuccess);
684
}
685
686
static PRBool sftk_self_tests_ran = PR_FALSE;
687
static PRBool sftk_self_tests_success = PR_FALSE;
688
689
/*
690
 * This function is called at dll load time, the code tha makes this
691
 * happen is platform specific on defined above.
692
 */
693
void
694
sftk_startup_tests_with_rerun(PRBool rerun)
695
{
696
    SECStatus rv;
697
    const char *libraryName = rerun ? BLAPI_FIPS_RERUN_FLAG_STRING SOFTOKEN_LIB_NAME : SOFTOKEN_LIB_NAME;
698
699
    PORT_Assert(!sftk_self_tests_ran);
700
    PORT_Assert(!sftk_self_tests_success);
701
    sftk_self_tests_ran = PR_TRUE;
702
    sftk_self_tests_success = PR_FALSE; /* just in case */
703
704
    /* need to initiallize the oid library before the RSA tests */
705
    rv = SECOID_Init();
706
    if (rv != SECSuccess) {
707
        return;
708
    }
709
    /* make sure freebl is initialized, or our RSA check
710
     * may fail. This is normally done at freebl load time, but it's
711
     * possible we may have shut freebl down without unloading it. */
712
    rv = BL_Init();
713
    if (rv != SECSuccess) {
714
        return;
715
    }
716
717
    rv = RNG_RNGInit();
718
    if (rv != SECSuccess) {
719
        return;
720
    }
721
    /* check the RSA combined functions in softoken */
722
    rv = sftk_fips_RSA_PowerUpSelfTest();
723
    if (rv != SECSuccess) {
724
        return;
725
    }
726
    if (!BLAPI_SHVerify(libraryName,
727
                        (PRFuncPtr)&sftk_fips_RSA_PowerUpSelfTest)) {
728
        /* something is wrong with the library, fail without enabling
729
         * the token */
730
        return;
731
    }
732
    rv = sftk_fips_IKE_PowerUpSelfTests();
733
    if (rv != SECSuccess) {
734
        return;
735
    }
736
737
    rv = sftk_fips_SP800_108_PowerUpSelfTests();
738
    if (rv != SECSuccess) {
739
        return;
740
    }
741
742
    rv = sftk_fips_HKDF_PowerUpSelfTest();
743
    if (rv != SECSuccess) {
744
        return;
745
    }
746
747
    rv = sftk_fips_pbkdf_PowerUpSelfTests();
748
    if (rv != SECSuccess) {
749
        return;
750
    }
751
752
    sftk_self_tests_success = PR_TRUE;
753
}
754
755
static void
756
sftk_startup_tests(void)
757
{
758
    sftk_startup_tests_with_rerun(PR_FALSE);
759
}
760
761
/*
762
 * this is called from nsc_Common_Initizialize entry points that gates access
763
 * to * all other pkcs11 functions. This prevents softoken operation if our
764
 * power on selftest failed.
765
 */
766
CK_RV
767
sftk_FIPSEntryOK(PRBool rerun)
768
{
769
#ifdef NSS_NO_INIT_SUPPORT
770
    /* this should only be set on platforms that can't handle one of the INIT
771
     * schemes.  This code allows those platforms to continue to function,
772
     * though they don't meet the strict NIST requirements. If NSS_NO_INIT_SUPPORT
773
     * is not set, and init support has not been properly enabled, softken
774
     * will always fail because of the test below
775
     */
776
    if (!sftk_self_tests_ran) {
777
        sftk_startup_tests();
778
    }
779
#endif
780
    if (rerun) {
781
        sftk_self_tests_ran = PR_FALSE;
782
        sftk_self_tests_success = PR_FALSE;
783
        sftk_startup_tests_with_rerun(PR_TRUE);
784
    }
785
    if (!sftk_self_tests_success) {
786
        return CKR_DEVICE_ERROR;
787
    }
788
    return CKR_OK;
789
}
790
#else
791
#include "pkcs11t.h"
792
CK_RV
793
sftk_FIPSEntryOK()
794
0
{
795
0
    return CKR_DEVICE_ERROR;
796
0
}
797
#endif /* NSS_FIPS_DISABLED */