Coverage Report

Created: 2024-05-20 06:23

/src/nss/lib/pk11wrap/pk11mech.c
Line
Count
Source (jump to first uncovered line)
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
 * This file maps various PKCS #11 Mechanisms to related mechanisms, key
6
 * types, and ASN.1 encodings.
7
 */
8
#include "seccomon.h"
9
#include "secmod.h"
10
#include "secmodi.h"
11
#include "pkcs11t.h"
12
#include "pk11func.h"
13
#include "secitem.h"
14
#include "secder.h"
15
#include "secasn1.h"
16
#include "secoid.h"
17
#include "secerr.h"
18
19
/*************************************************************
20
 * local static and global data
21
 *************************************************************/
22
23
/*
24
 * Tables used for Extended mechanism mapping (currently not used)
25
 */
26
typedef struct {
27
    CK_MECHANISM_TYPE keyGen;
28
    CK_KEY_TYPE keyType;
29
    CK_MECHANISM_TYPE type;
30
    CK_MECHANISM_TYPE padType;
31
    int blockSize;
32
    int iv;
33
} pk11MechanismData;
34
35
static pk11MechanismData pk11_default = { CKM_GENERIC_SECRET_KEY_GEN, CKK_GENERIC_SECRET,
36
                                          CKM_FAKE_RANDOM, CKM_FAKE_RANDOM, 8, 8 };
37
static pk11MechanismData *pk11_MechanismTable = NULL;
38
static int pk11_MechTableSize = 0;
39
static int pk11_MechEntrySize = 0;
40
41
/*
42
 * list of mechanisms we're willing to wrap secret keys with.
43
 * This list is ordered by preference.
44
 */
45
CK_MECHANISM_TYPE wrapMechanismList[] = {
46
    CKM_DES3_ECB,
47
    CKM_CAST5_ECB,
48
    CKM_AES_ECB,
49
    CKM_CAMELLIA_ECB,
50
    CKM_SEED_ECB,
51
    CKM_CAST5_ECB,
52
    CKM_DES_ECB,
53
    CKM_KEY_WRAP_LYNKS,
54
    CKM_IDEA_ECB,
55
    CKM_CAST3_ECB,
56
    CKM_CAST_ECB,
57
    CKM_RC5_ECB,
58
    CKM_RC2_ECB,
59
    CKM_CDMF_ECB,
60
    CKM_SKIPJACK_WRAP,
61
};
62
63
int wrapMechanismCount = sizeof(wrapMechanismList) / sizeof(wrapMechanismList[0]);
64
65
/*********************************************************************
66
 *       Mechanism Mapping functions
67
 *********************************************************************/
68
69
/*
70
 * lookup an entry in the mechanism table. If none found, return the
71
 * default structure.
72
 */
73
static pk11MechanismData *
74
pk11_lookup(CK_MECHANISM_TYPE type)
75
49
{
76
49
    int i;
77
49
    for (i = 0; i < pk11_MechEntrySize; i++) {
78
0
        if (pk11_MechanismTable[i].type == type) {
79
0
            return (&pk11_MechanismTable[i]);
80
0
        }
81
0
    }
82
49
    return &pk11_default;
83
49
}
84
85
/*
86
 * find the best key wrap mechanism for this slot.
87
 */
88
CK_MECHANISM_TYPE
89
PK11_GetBestWrapMechanism(PK11SlotInfo *slot)
90
14
{
91
14
    int i;
92
14
    for (i = 0; i < wrapMechanismCount; i++) {
93
14
        if (PK11_DoesMechanism(slot, wrapMechanismList[i])) {
94
14
            return wrapMechanismList[i];
95
14
        }
96
14
    }
97
0
    return CKM_INVALID_MECHANISM;
98
14
}
99
100
/*
101
 * NOTE: This is not thread safe. Called at init time, and when loading
102
 * a new Entry. It is reasonably safe as long as it is not re-entered
103
 * (readers will always see a consistant table)
104
 *
105
 * This routine is called to add entries to the mechanism table, once there,
106
 * they can not be removed.
107
 */
108
void
109
PK11_AddMechanismEntry(CK_MECHANISM_TYPE type, CK_KEY_TYPE key,
110
                       CK_MECHANISM_TYPE keyGen,
111
                       CK_MECHANISM_TYPE padType,
112
                       int ivLen, int blockSize)
113
0
{
114
0
    int tableSize = pk11_MechTableSize;
115
0
    int size = pk11_MechEntrySize;
116
0
    int entry = size++;
117
0
    pk11MechanismData *old = pk11_MechanismTable;
118
0
    pk11MechanismData *newt = pk11_MechanismTable;
119
120
0
    if (size > tableSize) {
121
0
        int oldTableSize = tableSize;
122
0
        tableSize += 10;
123
0
        newt = PORT_NewArray(pk11MechanismData, tableSize);
124
0
        if (newt == NULL)
125
0
            return;
126
127
0
        if (old)
128
0
            PORT_Memcpy(newt, old, oldTableSize * sizeof(*newt));
129
0
    } else
130
0
        old = NULL;
131
132
0
    newt[entry].type = type;
133
0
    newt[entry].keyType = key;
134
0
    newt[entry].keyGen = keyGen;
135
0
    newt[entry].padType = padType;
136
0
    newt[entry].iv = ivLen;
137
0
    newt[entry].blockSize = blockSize;
138
139
0
    pk11_MechanismTable = newt;
140
0
    pk11_MechTableSize = tableSize;
141
0
    pk11_MechEntrySize = size;
142
0
    if (old)
143
0
        PORT_Free(old);
144
0
}
145
146
/*
147
 * Get the mechanism needed for the given key type
148
 */
149
CK_MECHANISM_TYPE
150
PK11_GetKeyMechanism(CK_KEY_TYPE type)
151
0
{
152
0
    switch (type) {
153
0
        case CKK_SEED:
154
0
            return CKM_SEED_CBC;
155
0
        case CKK_CAMELLIA:
156
0
            return CKM_CAMELLIA_CBC;
157
0
        case CKK_NSS_CHACHA20:
158
0
            return CKM_NSS_CHACHA20_POLY1305;
159
0
        case CKK_CHACHA20:
160
0
            return CKM_CHACHA20_POLY1305;
161
0
        case CKK_AES:
162
0
            return CKM_AES_CBC;
163
0
        case CKK_DES:
164
0
            return CKM_DES_CBC;
165
0
        case CKK_DES3:
166
0
            return CKM_DES3_KEY_GEN;
167
0
        case CKK_DES2:
168
0
            return CKM_DES2_KEY_GEN;
169
0
        case CKK_CDMF:
170
0
            return CKM_CDMF_CBC;
171
0
        case CKK_RC2:
172
0
            return CKM_RC2_CBC;
173
0
        case CKK_RC4:
174
0
            return CKM_RC4;
175
0
        case CKK_RC5:
176
0
            return CKM_RC5_CBC;
177
0
        case CKK_SKIPJACK:
178
0
            return CKM_SKIPJACK_CBC64;
179
0
        case CKK_BATON:
180
0
            return CKM_BATON_CBC128;
181
0
        case CKK_JUNIPER:
182
0
            return CKM_JUNIPER_CBC128;
183
0
        case CKK_IDEA:
184
0
            return CKM_IDEA_CBC;
185
0
        case CKK_CAST:
186
0
            return CKM_CAST_CBC;
187
0
        case CKK_CAST3:
188
0
            return CKM_CAST3_CBC;
189
0
        case CKK_CAST5:
190
0
            return CKM_CAST5_CBC;
191
0
        case CKK_RSA:
192
0
            return CKM_RSA_PKCS;
193
0
        case CKK_DSA:
194
0
            return CKM_DSA;
195
0
        case CKK_DH:
196
0
            return CKM_DH_PKCS_DERIVE;
197
0
        case CKK_KEA:
198
0
            return CKM_KEA_KEY_DERIVE;
199
0
        case CKK_EC: /* CKK_ECDSA is deprecated */
200
0
            return CKM_ECDSA;
201
0
        case CKK_EC_EDWARDS:
202
0
            return CKM_EDDSA;
203
0
        case CKK_HKDF:
204
0
            return CKM_HKDF_DERIVE;
205
0
        case CKK_GENERIC_SECRET:
206
0
        default:
207
0
            return CKM_SHA_1_HMAC;
208
0
    }
209
0
}
210
211
/*
212
 * Get the key type needed for the given mechanism
213
 */
214
CK_KEY_TYPE
215
PK11_GetKeyType(CK_MECHANISM_TYPE type, unsigned long len)
216
8.16k
{
217
8.16k
    switch (type) {
218
0
        case CKM_SEED_ECB:
219
0
        case CKM_SEED_CBC:
220
0
        case CKM_SEED_MAC:
221
0
        case CKM_SEED_MAC_GENERAL:
222
0
        case CKM_SEED_CBC_PAD:
223
0
        case CKM_SEED_KEY_GEN:
224
0
            return CKK_SEED;
225
0
        case CKM_CAMELLIA_ECB:
226
0
        case CKM_CAMELLIA_CBC:
227
0
        case CKM_CAMELLIA_MAC:
228
0
        case CKM_CAMELLIA_MAC_GENERAL:
229
0
        case CKM_CAMELLIA_CBC_PAD:
230
0
        case CKM_CAMELLIA_KEY_GEN:
231
0
            return CKK_CAMELLIA;
232
0
        case CKM_NSS_CHACHA20_POLY1305:
233
0
        case CKM_NSS_CHACHA20_KEY_GEN:
234
0
        case CKM_NSS_CHACHA20_CTR:
235
0
            return CKK_NSS_CHACHA20;
236
429
        case CKM_CHACHA20_POLY1305:
237
429
        case CKM_CHACHA20_KEY_GEN:
238
429
        case CKM_CHACHA20:
239
429
            return CKK_CHACHA20;
240
0
        case CKM_AES_ECB:
241
10
        case CKM_AES_CBC:
242
10
        case CKM_AES_CCM:
243
10
        case CKM_AES_CTR:
244
10
        case CKM_AES_CTS:
245
866
        case CKM_AES_GCM:
246
866
        case CKM_AES_MAC:
247
866
        case CKM_AES_MAC_GENERAL:
248
866
        case CKM_AES_CMAC:
249
866
        case CKM_AES_CMAC_GENERAL:
250
866
        case CKM_AES_CBC_PAD:
251
866
        case CKM_AES_KEY_GEN:
252
866
        case CKM_NSS_AES_KEY_WRAP:
253
866
        case CKM_NSS_AES_KEY_WRAP_PAD:
254
866
        case CKM_AES_KEY_WRAP:
255
866
        case CKM_AES_KEY_WRAP_KWP:
256
866
        case CKM_AES_XCBC_MAC:
257
866
        case CKM_AES_XCBC_MAC_96:
258
866
            return CKK_AES;
259
0
        case CKM_DES_ECB:
260
0
        case CKM_DES_CBC:
261
0
        case CKM_DES_MAC:
262
0
        case CKM_DES_MAC_GENERAL:
263
0
        case CKM_DES_CBC_PAD:
264
0
        case CKM_DES_KEY_GEN:
265
0
        case CKM_KEY_WRAP_LYNKS:
266
0
        case CKM_PBE_MD2_DES_CBC:
267
0
        case CKM_PBE_MD5_DES_CBC:
268
0
            return CKK_DES;
269
1
        case CKM_DES3_ECB:
270
3
        case CKM_DES3_CBC:
271
3
        case CKM_DES3_MAC:
272
3
        case CKM_DES3_MAC_GENERAL:
273
3
        case CKM_DES3_CBC_PAD:
274
3
            return (len == 16) ? CKK_DES2 : CKK_DES3;
275
0
        case CKM_DES2_KEY_GEN:
276
0
        case CKM_PBE_SHA1_DES2_EDE_CBC:
277
0
            return CKK_DES2;
278
0
        case CKM_PBE_SHA1_DES3_EDE_CBC:
279
0
        case CKM_DES3_KEY_GEN:
280
0
            return CKK_DES3;
281
0
        case CKM_CDMF_ECB:
282
0
        case CKM_CDMF_CBC:
283
0
        case CKM_CDMF_MAC:
284
0
        case CKM_CDMF_MAC_GENERAL:
285
0
        case CKM_CDMF_CBC_PAD:
286
0
        case CKM_CDMF_KEY_GEN:
287
0
            return CKK_CDMF;
288
0
        case CKM_RC2_ECB:
289
0
        case CKM_RC2_CBC:
290
0
        case CKM_RC2_MAC:
291
0
        case CKM_RC2_MAC_GENERAL:
292
0
        case CKM_RC2_CBC_PAD:
293
0
        case CKM_RC2_KEY_GEN:
294
0
        case CKM_PBE_SHA1_RC2_128_CBC:
295
0
        case CKM_PBE_SHA1_RC2_40_CBC:
296
0
            return CKK_RC2;
297
0
        case CKM_RC4:
298
0
        case CKM_RC4_KEY_GEN:
299
0
            return CKK_RC4;
300
0
        case CKM_RC5_ECB:
301
0
        case CKM_RC5_CBC:
302
0
        case CKM_RC5_MAC:
303
0
        case CKM_RC5_MAC_GENERAL:
304
0
        case CKM_RC5_CBC_PAD:
305
0
        case CKM_RC5_KEY_GEN:
306
0
            return CKK_RC5;
307
0
        case CKM_SKIPJACK_CBC64:
308
0
        case CKM_SKIPJACK_ECB64:
309
0
        case CKM_SKIPJACK_OFB64:
310
0
        case CKM_SKIPJACK_CFB64:
311
0
        case CKM_SKIPJACK_CFB32:
312
0
        case CKM_SKIPJACK_CFB16:
313
0
        case CKM_SKIPJACK_CFB8:
314
0
        case CKM_SKIPJACK_KEY_GEN:
315
0
        case CKM_SKIPJACK_WRAP:
316
0
        case CKM_SKIPJACK_PRIVATE_WRAP:
317
0
            return CKK_SKIPJACK;
318
0
        case CKM_BATON_ECB128:
319
0
        case CKM_BATON_ECB96:
320
0
        case CKM_BATON_CBC128:
321
0
        case CKM_BATON_COUNTER:
322
0
        case CKM_BATON_SHUFFLE:
323
0
        case CKM_BATON_WRAP:
324
0
        case CKM_BATON_KEY_GEN:
325
0
            return CKK_BATON;
326
0
        case CKM_JUNIPER_ECB128:
327
0
        case CKM_JUNIPER_CBC128:
328
0
        case CKM_JUNIPER_COUNTER:
329
0
        case CKM_JUNIPER_SHUFFLE:
330
0
        case CKM_JUNIPER_WRAP:
331
0
        case CKM_JUNIPER_KEY_GEN:
332
0
            return CKK_JUNIPER;
333
0
        case CKM_IDEA_CBC:
334
0
        case CKM_IDEA_ECB:
335
0
        case CKM_IDEA_MAC:
336
0
        case CKM_IDEA_MAC_GENERAL:
337
0
        case CKM_IDEA_CBC_PAD:
338
0
        case CKM_IDEA_KEY_GEN:
339
0
            return CKK_IDEA;
340
0
        case CKM_CAST_ECB:
341
0
        case CKM_CAST_CBC:
342
0
        case CKM_CAST_MAC:
343
0
        case CKM_CAST_MAC_GENERAL:
344
0
        case CKM_CAST_CBC_PAD:
345
0
        case CKM_CAST_KEY_GEN:
346
0
        case CKM_PBE_MD5_CAST_CBC:
347
0
            return CKK_CAST;
348
0
        case CKM_CAST3_ECB:
349
0
        case CKM_CAST3_CBC:
350
0
        case CKM_CAST3_MAC:
351
0
        case CKM_CAST3_MAC_GENERAL:
352
0
        case CKM_CAST3_CBC_PAD:
353
0
        case CKM_CAST3_KEY_GEN:
354
0
        case CKM_PBE_MD5_CAST3_CBC:
355
0
            return CKK_CAST3;
356
0
        case CKM_CAST5_ECB:
357
0
        case CKM_CAST5_CBC:
358
0
        case CKM_CAST5_MAC:
359
0
        case CKM_CAST5_MAC_GENERAL:
360
0
        case CKM_CAST5_CBC_PAD:
361
0
        case CKM_CAST5_KEY_GEN:
362
0
        case CKM_PBE_MD5_CAST5_CBC:
363
0
            return CKK_CAST5;
364
0
        case CKM_RSA_PKCS:
365
0
        case CKM_RSA_9796:
366
0
        case CKM_RSA_X_509:
367
0
        case CKM_MD2_RSA_PKCS:
368
0
        case CKM_MD5_RSA_PKCS:
369
0
        case CKM_SHA1_RSA_PKCS:
370
0
        case CKM_SHA224_RSA_PKCS:
371
0
        case CKM_SHA256_RSA_PKCS:
372
0
        case CKM_SHA384_RSA_PKCS:
373
0
        case CKM_SHA512_RSA_PKCS:
374
0
        case CKM_KEY_WRAP_SET_OAEP:
375
0
        case CKM_RSA_PKCS_KEY_PAIR_GEN:
376
0
        case CKM_RSA_X9_31_KEY_PAIR_GEN:
377
0
            return CKK_RSA;
378
0
        case CKM_DSA:
379
0
        case CKM_DSA_SHA1:
380
0
        case CKM_DSA_KEY_PAIR_GEN:
381
0
            return CKK_DSA;
382
0
        case CKM_DH_PKCS_DERIVE:
383
0
        case CKM_DH_PKCS_KEY_PAIR_GEN:
384
0
            return CKK_DH;
385
0
        case CKM_KEA_KEY_DERIVE:
386
0
        case CKM_KEA_KEY_PAIR_GEN:
387
0
            return CKK_KEA;
388
0
        case CKM_ECDSA:
389
0
        case CKM_ECDSA_SHA1:
390
0
        case CKM_EC_KEY_PAIR_GEN: /* aka CKM_ECDSA_KEY_PAIR_GEN */
391
0
        case CKM_ECDH1_DERIVE:
392
0
            return CKK_EC; /* CKK_ECDSA is deprecated */
393
0
        case CKM_EC_EDWARDS_KEY_PAIR_GEN:
394
0
        case CKM_EDDSA:
395
0
            return CKK_EC_EDWARDS;
396
0
        case CKM_HKDF_KEY_GEN:
397
6.36k
        case CKM_HKDF_DERIVE:
398
6.36k
        case CKM_HKDF_DATA:
399
6.36k
            return CKK_HKDF;
400
0
        case CKM_SSL3_PRE_MASTER_KEY_GEN:
401
0
        case CKM_GENERIC_SECRET_KEY_GEN:
402
13
        case CKM_SSL3_MASTER_KEY_DERIVE:
403
13
        case CKM_SSL3_MASTER_KEY_DERIVE_DH:
404
13
        case CKM_SSL3_KEY_AND_MAC_DERIVE:
405
13
        case CKM_SSL3_SHA1_MAC:
406
13
        case CKM_SSL3_MD5_MAC:
407
13
        case CKM_TLS_MASTER_KEY_DERIVE:
408
13
        case CKM_NSS_TLS_MASTER_KEY_DERIVE_SHA256:
409
16
        case CKM_TLS_MASTER_KEY_DERIVE_DH:
410
16
        case CKM_NSS_TLS_MASTER_KEY_DERIVE_DH_SHA256:
411
16
        case CKM_TLS_KEY_AND_MAC_DERIVE:
412
16
        case CKM_NSS_TLS_KEY_AND_MAC_DERIVE_SHA256:
413
16
        case CKM_NSS_TLS_EXTENDED_MASTER_KEY_DERIVE:
414
16
        case CKM_NSS_TLS_EXTENDED_MASTER_KEY_DERIVE_DH:
415
16
        case CKM_SHA_1_HMAC:
416
16
        case CKM_SHA_1_HMAC_GENERAL:
417
16
        case CKM_SHA224_HMAC:
418
16
        case CKM_SHA224_HMAC_GENERAL:
419
202
        case CKM_SHA256_HMAC:
420
202
        case CKM_SHA256_HMAC_GENERAL:
421
454
        case CKM_SHA384_HMAC:
422
454
        case CKM_SHA384_HMAC_GENERAL:
423
454
        case CKM_SHA512_HMAC:
424
454
        case CKM_SHA512_HMAC_GENERAL:
425
454
        case CKM_MD2_HMAC:
426
454
        case CKM_MD2_HMAC_GENERAL:
427
454
        case CKM_MD5_HMAC:
428
454
        case CKM_MD5_HMAC_GENERAL:
429
454
        case CKM_TLS_PRF_GENERAL:
430
454
        case CKM_NSS_TLS_PRF_GENERAL_SHA256:
431
454
            return CKK_GENERIC_SECRET;
432
0
        case CKM_NSS_KYBER_KEY_PAIR_GEN:
433
0
            return CKK_NSS_KYBER;
434
49
        default:
435
49
            return pk11_lookup(type)->keyType;
436
8.16k
    }
437
8.16k
}
438
439
/*
440
 * Get the Key Gen Mechanism needed for the given
441
 * crypto mechanism
442
 */
443
CK_MECHANISM_TYPE
444
PK11_GetKeyGen(CK_MECHANISM_TYPE type)
445
0
{
446
0
    return PK11_GetKeyGenWithSize(type, 0);
447
0
}
448
449
CK_MECHANISM_TYPE
450
PK11_GetKeyGenWithSize(CK_MECHANISM_TYPE type, int size)
451
17
{
452
17
    switch (type) {
453
0
        case CKM_SEED_ECB:
454
0
        case CKM_SEED_CBC:
455
0
        case CKM_SEED_MAC:
456
0
        case CKM_SEED_MAC_GENERAL:
457
0
        case CKM_SEED_CBC_PAD:
458
0
        case CKM_SEED_KEY_GEN:
459
0
            return CKM_SEED_KEY_GEN;
460
0
        case CKM_CAMELLIA_ECB:
461
0
        case CKM_CAMELLIA_CBC:
462
0
        case CKM_CAMELLIA_MAC:
463
0
        case CKM_CAMELLIA_MAC_GENERAL:
464
0
        case CKM_CAMELLIA_CBC_PAD:
465
0
        case CKM_CAMELLIA_KEY_GEN:
466
0
            return CKM_CAMELLIA_KEY_GEN;
467
0
        case CKM_NSS_CHACHA20_POLY1305:
468
0
        case CKM_NSS_CHACHA20_CTR:
469
0
            return CKM_NSS_CHACHA20_KEY_GEN;
470
0
        case CKM_CHACHA20_POLY1305:
471
0
        case CKM_CHACHA20:
472
0
            return CKM_CHACHA20_KEY_GEN;
473
0
        case CKM_AES_ECB:
474
1
        case CKM_AES_CBC:
475
1
        case CKM_AES_CCM:
476
1
        case CKM_AES_CTR:
477
1
        case CKM_AES_CTS:
478
1
        case CKM_AES_GCM:
479
1
        case CKM_AES_MAC:
480
1
        case CKM_AES_MAC_GENERAL:
481
1
        case CKM_AES_CMAC:
482
1
        case CKM_AES_CMAC_GENERAL:
483
1
        case CKM_AES_CBC_PAD:
484
1
        case CKM_AES_KEY_GEN:
485
1
            return CKM_AES_KEY_GEN;
486
0
        case CKM_DES_ECB:
487
0
        case CKM_DES_CBC:
488
0
        case CKM_DES_MAC:
489
0
        case CKM_DES_MAC_GENERAL:
490
0
        case CKM_KEY_WRAP_LYNKS:
491
0
        case CKM_DES_CBC_PAD:
492
0
        case CKM_DES_KEY_GEN:
493
0
            return CKM_DES_KEY_GEN;
494
2
        case CKM_DES3_ECB:
495
2
        case CKM_DES3_CBC:
496
2
        case CKM_DES3_MAC:
497
2
        case CKM_DES3_MAC_GENERAL:
498
2
        case CKM_DES3_CBC_PAD:
499
2
            return (size == 16) ? CKM_DES2_KEY_GEN : CKM_DES3_KEY_GEN;
500
0
        case CKM_DES3_KEY_GEN:
501
0
            return CKM_DES3_KEY_GEN;
502
0
        case CKM_DES2_KEY_GEN:
503
0
            return CKM_DES2_KEY_GEN;
504
0
        case CKM_CDMF_ECB:
505
0
        case CKM_CDMF_CBC:
506
0
        case CKM_CDMF_MAC:
507
0
        case CKM_CDMF_MAC_GENERAL:
508
0
        case CKM_CDMF_CBC_PAD:
509
0
        case CKM_CDMF_KEY_GEN:
510
0
            return CKM_CDMF_KEY_GEN;
511
0
        case CKM_RC2_ECB:
512
0
        case CKM_RC2_CBC:
513
0
        case CKM_RC2_MAC:
514
0
        case CKM_RC2_MAC_GENERAL:
515
0
        case CKM_RC2_CBC_PAD:
516
0
        case CKM_RC2_KEY_GEN:
517
0
            return CKM_RC2_KEY_GEN;
518
0
        case CKM_RC4:
519
0
        case CKM_RC4_KEY_GEN:
520
0
            return CKM_RC4_KEY_GEN;
521
0
        case CKM_RC5_ECB:
522
0
        case CKM_RC5_CBC:
523
0
        case CKM_RC5_MAC:
524
0
        case CKM_RC5_MAC_GENERAL:
525
0
        case CKM_RC5_CBC_PAD:
526
0
        case CKM_RC5_KEY_GEN:
527
0
            return CKM_RC5_KEY_GEN;
528
0
        case CKM_SKIPJACK_CBC64:
529
0
        case CKM_SKIPJACK_ECB64:
530
0
        case CKM_SKIPJACK_OFB64:
531
0
        case CKM_SKIPJACK_CFB64:
532
0
        case CKM_SKIPJACK_CFB32:
533
0
        case CKM_SKIPJACK_CFB16:
534
0
        case CKM_SKIPJACK_CFB8:
535
0
        case CKM_SKIPJACK_WRAP:
536
0
        case CKM_SKIPJACK_KEY_GEN:
537
0
            return CKM_SKIPJACK_KEY_GEN;
538
0
        case CKM_BATON_ECB128:
539
0
        case CKM_BATON_ECB96:
540
0
        case CKM_BATON_CBC128:
541
0
        case CKM_BATON_COUNTER:
542
0
        case CKM_BATON_SHUFFLE:
543
0
        case CKM_BATON_WRAP:
544
0
        case CKM_BATON_KEY_GEN:
545
0
            return CKM_BATON_KEY_GEN;
546
0
        case CKM_JUNIPER_ECB128:
547
0
        case CKM_JUNIPER_CBC128:
548
0
        case CKM_JUNIPER_COUNTER:
549
0
        case CKM_JUNIPER_SHUFFLE:
550
0
        case CKM_JUNIPER_WRAP:
551
0
        case CKM_JUNIPER_KEY_GEN:
552
0
            return CKM_JUNIPER_KEY_GEN;
553
0
        case CKM_IDEA_CBC:
554
0
        case CKM_IDEA_ECB:
555
0
        case CKM_IDEA_MAC:
556
0
        case CKM_IDEA_MAC_GENERAL:
557
0
        case CKM_IDEA_CBC_PAD:
558
0
        case CKM_IDEA_KEY_GEN:
559
0
            return CKM_IDEA_KEY_GEN;
560
0
        case CKM_CAST_ECB:
561
0
        case CKM_CAST_CBC:
562
0
        case CKM_CAST_MAC:
563
0
        case CKM_CAST_MAC_GENERAL:
564
0
        case CKM_CAST_CBC_PAD:
565
0
        case CKM_CAST_KEY_GEN:
566
0
            return CKM_CAST_KEY_GEN;
567
0
        case CKM_CAST3_ECB:
568
0
        case CKM_CAST3_CBC:
569
0
        case CKM_CAST3_MAC:
570
0
        case CKM_CAST3_MAC_GENERAL:
571
0
        case CKM_CAST3_CBC_PAD:
572
0
        case CKM_CAST3_KEY_GEN:
573
0
            return CKM_CAST3_KEY_GEN;
574
0
        case CKM_CAST5_ECB:
575
0
        case CKM_CAST5_CBC:
576
0
        case CKM_CAST5_MAC:
577
0
        case CKM_CAST5_MAC_GENERAL:
578
0
        case CKM_CAST5_CBC_PAD:
579
0
        case CKM_CAST5_KEY_GEN:
580
0
            return CKM_CAST5_KEY_GEN;
581
0
        case CKM_RSA_PKCS:
582
0
        case CKM_RSA_9796:
583
0
        case CKM_RSA_X_509:
584
0
        case CKM_MD2_RSA_PKCS:
585
0
        case CKM_MD5_RSA_PKCS:
586
0
        case CKM_SHA1_RSA_PKCS:
587
0
        case CKM_SHA224_RSA_PKCS:
588
0
        case CKM_SHA256_RSA_PKCS:
589
0
        case CKM_SHA384_RSA_PKCS:
590
0
        case CKM_SHA512_RSA_PKCS:
591
0
        case CKM_KEY_WRAP_SET_OAEP:
592
0
        case CKM_RSA_PKCS_KEY_PAIR_GEN:
593
0
            return CKM_RSA_PKCS_KEY_PAIR_GEN;
594
0
        case CKM_RSA_X9_31_KEY_PAIR_GEN:
595
0
            return CKM_RSA_X9_31_KEY_PAIR_GEN;
596
0
        case CKM_DSA:
597
0
        case CKM_DSA_SHA1:
598
0
        case CKM_DSA_KEY_PAIR_GEN:
599
0
            return CKM_DSA_KEY_PAIR_GEN;
600
0
        case CKM_DH_PKCS_DERIVE:
601
0
        case CKM_DH_PKCS_KEY_PAIR_GEN:
602
0
            return CKM_DH_PKCS_KEY_PAIR_GEN;
603
0
        case CKM_KEA_KEY_DERIVE:
604
0
        case CKM_KEA_KEY_PAIR_GEN:
605
0
            return CKM_KEA_KEY_PAIR_GEN;
606
0
        case CKM_ECDSA:
607
0
        case CKM_ECDSA_SHA1:
608
0
        case CKM_EC_KEY_PAIR_GEN: /* aka CKM_ECDSA_KEY_PAIR_GEN */
609
0
        case CKM_ECDH1_DERIVE:
610
0
            return CKM_EC_KEY_PAIR_GEN;
611
0
        case CKM_EDDSA:
612
0
            return CKM_EC_EDWARDS_KEY_PAIR_GEN;
613
13
        case CKM_SSL3_PRE_MASTER_KEY_GEN:
614
13
        case CKM_SSL3_MASTER_KEY_DERIVE:
615
13
        case CKM_SSL3_KEY_AND_MAC_DERIVE:
616
13
        case CKM_SSL3_SHA1_MAC:
617
13
        case CKM_SSL3_MD5_MAC:
618
13
        case CKM_TLS_MASTER_KEY_DERIVE:
619
13
        case CKM_TLS_KEY_AND_MAC_DERIVE:
620
13
        case CKM_NSS_TLS_KEY_AND_MAC_DERIVE_SHA256:
621
13
        case CKM_NSS_TLS_EXTENDED_MASTER_KEY_DERIVE:
622
13
        case CKM_NSS_TLS_EXTENDED_MASTER_KEY_DERIVE_DH:
623
13
            return CKM_SSL3_PRE_MASTER_KEY_GEN;
624
0
        case CKM_SHA_1_HMAC:
625
0
        case CKM_SHA_1_HMAC_GENERAL:
626
0
        case CKM_SHA224_HMAC:
627
0
        case CKM_SHA224_HMAC_GENERAL:
628
1
        case CKM_SHA256_HMAC:
629
1
        case CKM_SHA256_HMAC_GENERAL:
630
1
        case CKM_SHA384_HMAC:
631
1
        case CKM_SHA384_HMAC_GENERAL:
632
1
        case CKM_SHA512_HMAC:
633
1
        case CKM_SHA512_HMAC_GENERAL:
634
1
        case CKM_MD2_HMAC:
635
1
        case CKM_MD2_HMAC_GENERAL:
636
1
        case CKM_MD5_HMAC:
637
1
        case CKM_MD5_HMAC_GENERAL:
638
1
        case CKM_TLS_PRF_GENERAL:
639
1
        case CKM_NSS_TLS_PRF_GENERAL_SHA256:
640
1
        case CKM_GENERIC_SECRET_KEY_GEN:
641
1
            return CKM_GENERIC_SECRET_KEY_GEN;
642
0
        case CKM_PBE_MD2_DES_CBC:
643
0
        case CKM_PBE_MD5_DES_CBC:
644
0
        case CKM_PBA_SHA1_WITH_SHA1_HMAC:
645
0
        case CKM_NSS_PBE_SHA1_HMAC_KEY_GEN:
646
0
        case CKM_NSS_PBE_MD5_HMAC_KEY_GEN:
647
0
        case CKM_NSS_PBE_MD2_HMAC_KEY_GEN:
648
0
        case CKM_NSS_PKCS12_PBE_SHA224_HMAC_KEY_GEN:
649
0
        case CKM_NSS_PKCS12_PBE_SHA256_HMAC_KEY_GEN:
650
0
        case CKM_NSS_PKCS12_PBE_SHA384_HMAC_KEY_GEN:
651
0
        case CKM_NSS_PKCS12_PBE_SHA512_HMAC_KEY_GEN:
652
0
        case CKM_NSS_PBE_SHA1_DES_CBC:
653
0
        case CKM_NSS_PBE_SHA1_40_BIT_RC2_CBC:
654
0
        case CKM_NSS_PBE_SHA1_128_BIT_RC2_CBC:
655
0
        case CKM_NSS_PBE_SHA1_40_BIT_RC4:
656
0
        case CKM_NSS_PBE_SHA1_128_BIT_RC4:
657
0
        case CKM_NSS_PBE_SHA1_TRIPLE_DES_CBC:
658
0
        case CKM_NSS_PBE_SHA1_FAULTY_3DES_CBC:
659
0
        case CKM_PBE_SHA1_RC2_40_CBC:
660
0
        case CKM_PBE_SHA1_RC2_128_CBC:
661
0
        case CKM_PBE_SHA1_RC4_40:
662
0
        case CKM_PBE_SHA1_RC4_128:
663
0
        case CKM_PBE_SHA1_DES3_EDE_CBC:
664
0
        case CKM_PBE_SHA1_DES2_EDE_CBC:
665
0
        case CKM_PKCS5_PBKD2:
666
0
            return type;
667
0
        default:
668
0
            return pk11_lookup(type)->keyGen;
669
17
    }
670
17
}
671
672
/*
673
 * get the mechanism block size
674
 */
675
int
676
PK11_GetBlockSize(CK_MECHANISM_TYPE type, SECItem *params)
677
0
{
678
0
    CK_RC5_PARAMS *rc5_params;
679
0
    CK_RC5_CBC_PARAMS *rc5_cbc_params;
680
0
    switch (type) {
681
0
        case CKM_RC5_ECB:
682
0
            if ((params) && (params->data)) {
683
0
                rc5_params = (CK_RC5_PARAMS *)params->data;
684
0
                return (rc5_params->ulWordsize) * 2;
685
0
            }
686
0
            return 8;
687
0
        case CKM_RC5_CBC:
688
0
        case CKM_RC5_CBC_PAD:
689
0
            if ((params) && (params->data)) {
690
0
                rc5_cbc_params = (CK_RC5_CBC_PARAMS *)params->data;
691
0
                return (rc5_cbc_params->ulWordsize) * 2;
692
0
            }
693
0
            return 8;
694
0
        case CKM_DES_ECB:
695
0
        case CKM_DES3_ECB:
696
0
        case CKM_RC2_ECB:
697
0
        case CKM_IDEA_ECB:
698
0
        case CKM_CAST_ECB:
699
0
        case CKM_CAST3_ECB:
700
0
        case CKM_CAST5_ECB:
701
0
        case CKM_RC2_CBC:
702
0
        case CKM_SKIPJACK_CBC64:
703
0
        case CKM_SKIPJACK_ECB64:
704
0
        case CKM_SKIPJACK_OFB64:
705
0
        case CKM_SKIPJACK_CFB64:
706
0
        case CKM_DES_CBC:
707
0
        case CKM_DES3_CBC:
708
0
        case CKM_IDEA_CBC:
709
0
        case CKM_CAST_CBC:
710
0
        case CKM_CAST3_CBC:
711
0
        case CKM_CAST5_CBC:
712
0
        case CKM_DES_CBC_PAD:
713
0
        case CKM_DES3_CBC_PAD:
714
0
        case CKM_RC2_CBC_PAD:
715
0
        case CKM_IDEA_CBC_PAD:
716
0
        case CKM_CAST_CBC_PAD:
717
0
        case CKM_CAST3_CBC_PAD:
718
0
        case CKM_CAST5_CBC_PAD:
719
0
        case CKM_PBE_MD2_DES_CBC:
720
0
        case CKM_PBE_MD5_DES_CBC:
721
0
        case CKM_NSS_PBE_SHA1_DES_CBC:
722
0
        case CKM_NSS_PBE_SHA1_40_BIT_RC2_CBC:
723
0
        case CKM_NSS_PBE_SHA1_128_BIT_RC2_CBC:
724
0
        case CKM_NSS_PBE_SHA1_TRIPLE_DES_CBC:
725
0
        case CKM_NSS_PBE_SHA1_FAULTY_3DES_CBC:
726
0
        case CKM_PBE_SHA1_RC2_40_CBC:
727
0
        case CKM_PBE_SHA1_RC2_128_CBC:
728
0
        case CKM_PBE_SHA1_DES3_EDE_CBC:
729
0
        case CKM_PBE_SHA1_DES2_EDE_CBC:
730
0
            return 8;
731
0
        case CKM_SKIPJACK_CFB32:
732
0
        case CKM_SKIPJACK_CFB16:
733
0
        case CKM_SKIPJACK_CFB8:
734
0
            return 4;
735
0
        case CKM_SEED_ECB:
736
0
        case CKM_SEED_CBC:
737
0
        case CKM_SEED_CBC_PAD:
738
0
        case CKM_CAMELLIA_ECB:
739
0
        case CKM_CAMELLIA_CBC:
740
0
        case CKM_CAMELLIA_CBC_PAD:
741
0
        case CKM_AES_ECB:
742
0
        case CKM_AES_CBC:
743
0
        case CKM_AES_CBC_PAD:
744
0
        case CKM_BATON_ECB128:
745
0
        case CKM_BATON_CBC128:
746
0
        case CKM_BATON_COUNTER:
747
0
        case CKM_BATON_SHUFFLE:
748
0
        case CKM_JUNIPER_ECB128:
749
0
        case CKM_JUNIPER_CBC128:
750
0
        case CKM_JUNIPER_COUNTER:
751
0
        case CKM_JUNIPER_SHUFFLE:
752
0
            return 16;
753
0
        case CKM_BATON_ECB96:
754
0
            return 12;
755
0
        case CKM_RC4:
756
0
        case CKM_NSS_PBE_SHA1_40_BIT_RC4:
757
0
        case CKM_NSS_PBE_SHA1_128_BIT_RC4:
758
0
        case CKM_PBE_SHA1_RC4_40:
759
0
        case CKM_PBE_SHA1_RC4_128:
760
0
            return 0;
761
0
        case CKM_RSA_PKCS:
762
0
        case CKM_RSA_9796:
763
0
        case CKM_RSA_X_509:
764
            /*actually it's the modulus length of the key!*/
765
0
            return -1; /* failure */
766
0
        case CKM_NSS_CHACHA20_POLY1305:
767
0
        case CKM_NSS_CHACHA20_CTR:
768
0
        case CKM_CHACHA20_POLY1305:
769
0
        case CKM_CHACHA20:
770
0
            return 64;
771
0
        default:
772
0
            return pk11_lookup(type)->blockSize;
773
0
    }
774
0
}
775
776
/*
777
 * get the iv length
778
 */
779
int
780
PK11_GetIVLength(CK_MECHANISM_TYPE type)
781
0
{
782
0
    switch (type) {
783
0
        case CKM_SEED_ECB:
784
0
        case CKM_CAMELLIA_ECB:
785
0
        case CKM_AES_ECB:
786
0
        case CKM_DES_ECB:
787
0
        case CKM_DES3_ECB:
788
0
        case CKM_RC2_ECB:
789
0
        case CKM_IDEA_ECB:
790
0
        case CKM_SKIPJACK_WRAP:
791
0
        case CKM_BATON_WRAP:
792
0
        case CKM_RC5_ECB:
793
0
        case CKM_CAST_ECB:
794
0
        case CKM_CAST3_ECB:
795
0
        case CKM_CAST5_ECB:
796
0
            return 0;
797
0
        case CKM_RC2_CBC:
798
0
        case CKM_DES_CBC:
799
0
        case CKM_DES3_CBC:
800
0
        case CKM_IDEA_CBC:
801
0
        case CKM_PBE_MD2_DES_CBC:
802
0
        case CKM_PBE_MD5_DES_CBC:
803
0
        case CKM_NSS_PBE_SHA1_DES_CBC:
804
0
        case CKM_NSS_PBE_SHA1_40_BIT_RC2_CBC:
805
0
        case CKM_NSS_PBE_SHA1_128_BIT_RC2_CBC:
806
0
        case CKM_NSS_PBE_SHA1_TRIPLE_DES_CBC:
807
0
        case CKM_NSS_PBE_SHA1_FAULTY_3DES_CBC:
808
0
        case CKM_PBE_SHA1_RC2_40_CBC:
809
0
        case CKM_PBE_SHA1_RC2_128_CBC:
810
0
        case CKM_PBE_SHA1_DES3_EDE_CBC:
811
0
        case CKM_PBE_SHA1_DES2_EDE_CBC:
812
0
        case CKM_RC5_CBC:
813
0
        case CKM_CAST_CBC:
814
0
        case CKM_CAST3_CBC:
815
0
        case CKM_CAST5_CBC:
816
0
        case CKM_RC2_CBC_PAD:
817
0
        case CKM_DES_CBC_PAD:
818
0
        case CKM_DES3_CBC_PAD:
819
0
        case CKM_IDEA_CBC_PAD:
820
0
        case CKM_RC5_CBC_PAD:
821
0
        case CKM_CAST_CBC_PAD:
822
0
        case CKM_CAST3_CBC_PAD:
823
0
        case CKM_CAST5_CBC_PAD:
824
0
            return 8;
825
0
        case CKM_AES_GCM:
826
0
        case CKM_NSS_CHACHA20_POLY1305:
827
0
        case CKM_CHACHA20_POLY1305:
828
0
            return 12;
829
0
        case CKM_SEED_CBC:
830
0
        case CKM_SEED_CBC_PAD:
831
0
        case CKM_CAMELLIA_CBC:
832
0
        case CKM_CAMELLIA_CBC_PAD:
833
0
        case CKM_AES_CBC:
834
0
        case CKM_AES_CBC_PAD:
835
0
        case CKM_NSS_CHACHA20_CTR:
836
0
        case CKM_CHACHA20:
837
0
            return 16;
838
0
        case CKM_SKIPJACK_CBC64:
839
0
        case CKM_SKIPJACK_ECB64:
840
0
        case CKM_SKIPJACK_OFB64:
841
0
        case CKM_SKIPJACK_CFB64:
842
0
        case CKM_SKIPJACK_CFB32:
843
0
        case CKM_SKIPJACK_CFB16:
844
0
        case CKM_SKIPJACK_CFB8:
845
0
        case CKM_BATON_ECB128:
846
0
        case CKM_BATON_ECB96:
847
0
        case CKM_BATON_CBC128:
848
0
        case CKM_BATON_COUNTER:
849
0
        case CKM_BATON_SHUFFLE:
850
0
        case CKM_JUNIPER_ECB128:
851
0
        case CKM_JUNIPER_CBC128:
852
0
        case CKM_JUNIPER_COUNTER:
853
0
        case CKM_JUNIPER_SHUFFLE:
854
0
            return 24;
855
0
        case CKM_RC4:
856
0
        case CKM_RSA_PKCS:
857
0
        case CKM_RSA_9796:
858
0
        case CKM_RSA_X_509:
859
0
        case CKM_NSS_PBE_SHA1_40_BIT_RC4:
860
0
        case CKM_NSS_PBE_SHA1_128_BIT_RC4:
861
0
        case CKM_PBE_SHA1_RC4_40:
862
0
        case CKM_PBE_SHA1_RC4_128:
863
0
            return 0;
864
0
        default:
865
0
            return pk11_lookup(type)->iv;
866
0
    }
867
0
}
868
869
/* These next two utilities are here to help facilitate future
870
 * Dynamic Encrypt/Decrypt symetric key mechanisms, and to allow functions
871
 * like SSL and S-MIME to automatically add them.
872
 */
873
SECItem *
874
pk11_ParamFromIVWithLen(CK_MECHANISM_TYPE type, SECItem *iv, int keyLen)
875
28
{
876
28
    CK_RC2_CBC_PARAMS *rc2_params = NULL;
877
28
    CK_RC2_PARAMS *rc2_ecb_params = NULL;
878
28
    CK_RC5_PARAMS *rc5_params = NULL;
879
28
    CK_RC5_CBC_PARAMS *rc5_cbc_params = NULL;
880
28
    SECItem *param;
881
882
28
    param = (SECItem *)PORT_Alloc(sizeof(SECItem));
883
28
    if (param == NULL)
884
0
        return NULL;
885
28
    param->data = NULL;
886
28
    param->len = 0;
887
28
    param->type = 0;
888
28
    switch (type) {
889
0
        case CKM_SEED_ECB:
890
0
        case CKM_CAMELLIA_ECB:
891
0
        case CKM_AES_ECB:
892
0
        case CKM_DES_ECB:
893
15
        case CKM_DES3_ECB:
894
28
        case CKM_RSA_PKCS:
895
28
        case CKM_RSA_X_509:
896
28
        case CKM_RSA_9796:
897
28
        case CKM_IDEA_ECB:
898
28
        case CKM_CDMF_ECB:
899
28
        case CKM_CAST_ECB:
900
28
        case CKM_CAST3_ECB:
901
28
        case CKM_CAST5_ECB:
902
28
        case CKM_RC4:
903
28
            break;
904
0
        case CKM_RC2_ECB:
905
0
            rc2_ecb_params = (CK_RC2_PARAMS *)PORT_Alloc(sizeof(CK_RC2_PARAMS));
906
0
            if (rc2_ecb_params == NULL)
907
0
                break;
908
            /*  Maybe we should pass the key size in too to get this value? */
909
0
            *rc2_ecb_params = keyLen ? keyLen * 8 : 128;
910
0
            param->data = (unsigned char *)rc2_ecb_params;
911
0
            param->len = sizeof(CK_RC2_PARAMS);
912
0
            break;
913
0
        case CKM_RC2_CBC:
914
0
        case CKM_RC2_CBC_PAD:
915
0
            rc2_params = (CK_RC2_CBC_PARAMS *)PORT_Alloc(sizeof(CK_RC2_CBC_PARAMS));
916
0
            if (rc2_params == NULL)
917
0
                break;
918
            /* Maybe we should pass the key size in too to get this value? */
919
0
            rc2_params->ulEffectiveBits = keyLen ? keyLen * 8 : 128;
920
0
            if (iv && iv->data)
921
0
                PORT_Memcpy(rc2_params->iv, iv->data, sizeof(rc2_params->iv));
922
0
            param->data = (unsigned char *)rc2_params;
923
0
            param->len = sizeof(CK_RC2_CBC_PARAMS);
924
0
            break;
925
0
        case CKM_RC5_CBC:
926
0
        case CKM_RC5_CBC_PAD:
927
0
            rc5_cbc_params = (CK_RC5_CBC_PARAMS *)
928
0
                PORT_Alloc(sizeof(CK_RC5_CBC_PARAMS) + ((iv) ? iv->len : 0));
929
0
            if (rc5_cbc_params == NULL)
930
0
                break;
931
0
            if (iv && iv->data && iv->len) {
932
0
                rc5_cbc_params->pIv = ((CK_BYTE_PTR)rc5_cbc_params) + sizeof(CK_RC5_CBC_PARAMS);
933
0
                PORT_Memcpy(rc5_cbc_params->pIv, iv->data, iv->len);
934
0
                rc5_cbc_params->ulIvLen = iv->len;
935
0
                rc5_cbc_params->ulWordsize = iv->len / 2;
936
0
            } else {
937
0
                rc5_cbc_params->ulWordsize = 4;
938
0
                rc5_cbc_params->pIv = NULL;
939
0
                rc5_cbc_params->ulIvLen = 0;
940
0
            }
941
0
            rc5_cbc_params->ulRounds = 16;
942
0
            param->data = (unsigned char *)rc5_cbc_params;
943
0
            param->len = sizeof(CK_RC5_CBC_PARAMS);
944
0
            break;
945
0
        case CKM_RC5_ECB:
946
0
            rc5_params = (CK_RC5_PARAMS *)PORT_Alloc(sizeof(CK_RC5_PARAMS));
947
0
            if (rc5_params == NULL)
948
0
                break;
949
0
            if (iv && iv->data && iv->len) {
950
0
                rc5_params->ulWordsize = iv->len / 2;
951
0
            } else {
952
0
                rc5_params->ulWordsize = 4;
953
0
            }
954
0
            rc5_params->ulRounds = 16;
955
0
            param->data = (unsigned char *)rc5_params;
956
0
            param->len = sizeof(CK_RC5_PARAMS);
957
0
            break;
958
959
0
        case CKM_SEED_CBC:
960
0
        case CKM_CAMELLIA_CBC:
961
0
        case CKM_AES_CBC:
962
0
        case CKM_DES_CBC:
963
0
        case CKM_DES3_CBC:
964
0
        case CKM_IDEA_CBC:
965
0
        case CKM_CDMF_CBC:
966
0
        case CKM_CAST_CBC:
967
0
        case CKM_CAST3_CBC:
968
0
        case CKM_CAST5_CBC:
969
0
        case CKM_CAMELLIA_CBC_PAD:
970
0
        case CKM_AES_CBC_PAD:
971
0
        case CKM_DES_CBC_PAD:
972
0
        case CKM_DES3_CBC_PAD:
973
0
        case CKM_IDEA_CBC_PAD:
974
0
        case CKM_CDMF_CBC_PAD:
975
0
        case CKM_CAST_CBC_PAD:
976
0
        case CKM_CAST3_CBC_PAD:
977
0
        case CKM_CAST5_CBC_PAD:
978
0
        case CKM_SKIPJACK_CBC64:
979
0
        case CKM_SKIPJACK_ECB64:
980
0
        case CKM_SKIPJACK_OFB64:
981
0
        case CKM_SKIPJACK_CFB64:
982
0
        case CKM_SKIPJACK_CFB32:
983
0
        case CKM_SKIPJACK_CFB16:
984
0
        case CKM_SKIPJACK_CFB8:
985
0
        case CKM_BATON_ECB128:
986
0
        case CKM_BATON_ECB96:
987
0
        case CKM_BATON_CBC128:
988
0
        case CKM_BATON_COUNTER:
989
0
        case CKM_BATON_SHUFFLE:
990
0
        case CKM_JUNIPER_ECB128:
991
0
        case CKM_JUNIPER_CBC128:
992
0
        case CKM_JUNIPER_COUNTER:
993
0
        case CKM_JUNIPER_SHUFFLE:
994
0
            if ((iv == NULL) || (iv->data == NULL))
995
0
                break;
996
0
            param->data = (unsigned char *)PORT_Alloc(iv->len);
997
0
            if (param->data != NULL) {
998
0
                PORT_Memcpy(param->data, iv->data, iv->len);
999
0
                param->len = iv->len;
1000
0
            }
1001
0
            break;
1002
        /* unknown mechanism, pass IV in if it's there */
1003
0
        default:
1004
0
            if (pk11_lookup(type)->iv == 0) {
1005
0
                break;
1006
0
            }
1007
0
            if ((iv == NULL) || (iv->data == NULL)) {
1008
0
                break;
1009
0
            }
1010
0
            param->data = (unsigned char *)PORT_Alloc(iv->len);
1011
0
            if (param->data != NULL) {
1012
0
                PORT_Memcpy(param->data, iv->data, iv->len);
1013
0
                param->len = iv->len;
1014
0
            }
1015
0
            break;
1016
28
    }
1017
28
    return param;
1018
28
}
1019
1020
/* These next two utilities are here to help facilitate future
1021
 * Dynamic Encrypt/Decrypt symetric key mechanisms, and to allow functions
1022
 * like SSL and S-MIME to automatically add them.
1023
 */
1024
SECItem *
1025
PK11_ParamFromIV(CK_MECHANISM_TYPE type, SECItem *iv)
1026
28
{
1027
28
    return pk11_ParamFromIVWithLen(type, iv, 0);
1028
28
}
1029
1030
unsigned char *
1031
PK11_IVFromParam(CK_MECHANISM_TYPE type, SECItem *param, int *len)
1032
0
{
1033
0
    CK_RC2_CBC_PARAMS *rc2_params;
1034
0
    CK_RC5_CBC_PARAMS *rc5_cbc_params;
1035
1036
0
    *len = 0;
1037
0
    switch (type) {
1038
0
        case CKM_SEED_ECB:
1039
0
        case CKM_CAMELLIA_ECB:
1040
0
        case CKM_AES_ECB:
1041
0
        case CKM_DES_ECB:
1042
0
        case CKM_DES3_ECB:
1043
0
        case CKM_RSA_PKCS:
1044
0
        case CKM_RSA_X_509:
1045
0
        case CKM_RSA_9796:
1046
0
        case CKM_IDEA_ECB:
1047
0
        case CKM_CDMF_ECB:
1048
0
        case CKM_CAST_ECB:
1049
0
        case CKM_CAST3_ECB:
1050
0
        case CKM_CAST5_ECB:
1051
0
        case CKM_RC4:
1052
0
            return NULL;
1053
0
        case CKM_RC2_ECB:
1054
0
            return NULL;
1055
0
        case CKM_RC2_CBC:
1056
0
        case CKM_RC2_CBC_PAD:
1057
0
            rc2_params = (CK_RC2_CBC_PARAMS *)param->data;
1058
0
            *len = sizeof(rc2_params->iv);
1059
0
            return &rc2_params->iv[0];
1060
0
        case CKM_RC5_CBC:
1061
0
        case CKM_RC5_CBC_PAD:
1062
0
            rc5_cbc_params = (CK_RC5_CBC_PARAMS *)param->data;
1063
0
            *len = rc5_cbc_params->ulIvLen;
1064
0
            return rc5_cbc_params->pIv;
1065
0
        case CKM_SEED_CBC:
1066
0
        case CKM_CAMELLIA_CBC:
1067
0
        case CKM_AES_CBC:
1068
0
        case CKM_DES_CBC:
1069
0
        case CKM_DES3_CBC:
1070
0
        case CKM_IDEA_CBC:
1071
0
        case CKM_CDMF_CBC:
1072
0
        case CKM_CAST_CBC:
1073
0
        case CKM_CAST3_CBC:
1074
0
        case CKM_CAST5_CBC:
1075
0
        case CKM_CAMELLIA_CBC_PAD:
1076
0
        case CKM_AES_CBC_PAD:
1077
0
        case CKM_DES_CBC_PAD:
1078
0
        case CKM_DES3_CBC_PAD:
1079
0
        case CKM_IDEA_CBC_PAD:
1080
0
        case CKM_CDMF_CBC_PAD:
1081
0
        case CKM_CAST_CBC_PAD:
1082
0
        case CKM_CAST3_CBC_PAD:
1083
0
        case CKM_CAST5_CBC_PAD:
1084
0
        case CKM_SKIPJACK_CBC64:
1085
0
        case CKM_SKIPJACK_ECB64:
1086
0
        case CKM_SKIPJACK_OFB64:
1087
0
        case CKM_SKIPJACK_CFB64:
1088
0
        case CKM_SKIPJACK_CFB32:
1089
0
        case CKM_SKIPJACK_CFB16:
1090
0
        case CKM_SKIPJACK_CFB8:
1091
0
        case CKM_BATON_ECB128:
1092
0
        case CKM_BATON_ECB96:
1093
0
        case CKM_BATON_CBC128:
1094
0
        case CKM_BATON_COUNTER:
1095
0
        case CKM_BATON_SHUFFLE:
1096
0
        case CKM_JUNIPER_ECB128:
1097
0
        case CKM_JUNIPER_CBC128:
1098
0
        case CKM_JUNIPER_COUNTER:
1099
0
        case CKM_JUNIPER_SHUFFLE:
1100
0
            break;
1101
        /* unknown mechanism, pass IV in if it's there */
1102
0
        default:
1103
0
            break;
1104
0
    }
1105
0
    if (param->data) {
1106
0
        *len = param->len;
1107
0
    }
1108
0
    return param->data;
1109
0
}
1110
1111
typedef struct sec_rc5cbcParameterStr {
1112
    SECItem version;
1113
    SECItem rounds;
1114
    SECItem blockSizeInBits;
1115
    SECItem iv;
1116
} sec_rc5cbcParameter;
1117
1118
static const SEC_ASN1Template sec_rc5ecb_parameter_template[] = {
1119
    { SEC_ASN1_SEQUENCE,
1120
      0, NULL, sizeof(sec_rc5cbcParameter) },
1121
    { SEC_ASN1_INTEGER,
1122
      offsetof(sec_rc5cbcParameter, version) },
1123
    { SEC_ASN1_INTEGER,
1124
      offsetof(sec_rc5cbcParameter, rounds) },
1125
    { SEC_ASN1_INTEGER,
1126
      offsetof(sec_rc5cbcParameter, blockSizeInBits) },
1127
    { 0 }
1128
};
1129
1130
static const SEC_ASN1Template sec_rc5cbc_parameter_template[] = {
1131
    { SEC_ASN1_SEQUENCE,
1132
      0, NULL, sizeof(sec_rc5cbcParameter) },
1133
    { SEC_ASN1_INTEGER,
1134
      offsetof(sec_rc5cbcParameter, version) },
1135
    { SEC_ASN1_INTEGER,
1136
      offsetof(sec_rc5cbcParameter, rounds) },
1137
    { SEC_ASN1_INTEGER,
1138
      offsetof(sec_rc5cbcParameter, blockSizeInBits) },
1139
    { SEC_ASN1_OCTET_STRING,
1140
      offsetof(sec_rc5cbcParameter, iv) },
1141
    { 0 }
1142
};
1143
1144
typedef struct sec_rc2cbcParameterStr {
1145
    SECItem rc2ParameterVersion;
1146
    SECItem iv;
1147
} sec_rc2cbcParameter;
1148
1149
static const SEC_ASN1Template sec_rc2cbc_parameter_template[] = {
1150
    { SEC_ASN1_SEQUENCE,
1151
      0, NULL, sizeof(sec_rc2cbcParameter) },
1152
    { SEC_ASN1_INTEGER,
1153
      offsetof(sec_rc2cbcParameter, rc2ParameterVersion) },
1154
    { SEC_ASN1_OCTET_STRING,
1155
      offsetof(sec_rc2cbcParameter, iv) },
1156
    { 0 }
1157
};
1158
1159
static const SEC_ASN1Template sec_rc2ecb_parameter_template[] = {
1160
    { SEC_ASN1_SEQUENCE,
1161
      0, NULL, sizeof(sec_rc2cbcParameter) },
1162
    { SEC_ASN1_INTEGER,
1163
      offsetof(sec_rc2cbcParameter, rc2ParameterVersion) },
1164
    { 0 }
1165
};
1166
1167
/* S/MIME picked id values to represent differnt keysizes */
1168
/* I do have a formula, but it ain't pretty, and it only works because you
1169
 * can always match three points to a parabola:) */
1170
static unsigned char
1171
rc2_map(SECItem *version)
1172
0
{
1173
0
    long x;
1174
1175
0
    x = DER_GetInteger(version);
1176
1177
0
    switch (x) {
1178
0
        case 58:
1179
0
            return 128;
1180
0
        case 120:
1181
0
            return 64;
1182
0
        case 160:
1183
0
            return 40;
1184
0
    }
1185
0
    return 128;
1186
0
}
1187
1188
static unsigned long
1189
rc2_unmap(unsigned long x)
1190
0
{
1191
0
    switch (x) {
1192
0
        case 128:
1193
0
            return 58;
1194
0
        case 64:
1195
0
            return 120;
1196
0
        case 40:
1197
0
            return 160;
1198
0
    }
1199
0
    return 58;
1200
0
}
1201
1202
/* Generate a mechaism param from a type, and iv. */
1203
SECItem *
1204
PK11_ParamFromAlgid(SECAlgorithmID *algid)
1205
0
{
1206
0
    CK_RC2_CBC_PARAMS *rc2_cbc_params = NULL;
1207
0
    CK_RC2_PARAMS *rc2_ecb_params = NULL;
1208
0
    CK_RC5_CBC_PARAMS *rc5_cbc_params = NULL;
1209
0
    CK_RC5_PARAMS *rc5_ecb_params = NULL;
1210
0
    PLArenaPool *arena = NULL;
1211
0
    SECItem *mech = NULL;
1212
0
    SECOidTag algtag;
1213
0
    SECStatus rv;
1214
0
    CK_MECHANISM_TYPE type;
1215
    /* initialize these to prevent UMRs in the ASN1 decoder. */
1216
0
    SECItem iv = { siBuffer, NULL, 0 };
1217
0
    sec_rc2cbcParameter rc2 = { { siBuffer, NULL, 0 }, { siBuffer, NULL, 0 } };
1218
0
    sec_rc5cbcParameter rc5 = { { siBuffer, NULL, 0 }, { siBuffer, NULL, 0 }, { siBuffer, NULL, 0 }, { siBuffer, NULL, 0 } };
1219
1220
0
    algtag = SECOID_GetAlgorithmTag(algid);
1221
0
    type = PK11_AlgtagToMechanism(algtag);
1222
1223
0
    mech = PORT_New(SECItem);
1224
0
    if (mech == NULL) {
1225
0
        return NULL;
1226
0
    }
1227
0
    mech->type = siBuffer;
1228
0
    mech->data = NULL;
1229
0
    mech->len = 0;
1230
1231
0
    arena = PORT_NewArena(1024);
1232
0
    if (!arena) {
1233
0
        goto loser;
1234
0
    }
1235
1236
    /* handle the complicated cases */
1237
0
    switch (type) {
1238
0
        case CKM_RC2_ECB:
1239
0
            rv = SEC_ASN1DecodeItem(arena, &rc2, sec_rc2ecb_parameter_template,
1240
0
                                    &(algid->parameters));
1241
0
            if (rv != SECSuccess) {
1242
0
                goto loser;
1243
0
            }
1244
0
            rc2_ecb_params = PORT_New(CK_RC2_PARAMS);
1245
0
            if (rc2_ecb_params == NULL) {
1246
0
                goto loser;
1247
0
            }
1248
0
            *rc2_ecb_params = rc2_map(&rc2.rc2ParameterVersion);
1249
0
            mech->data = (unsigned char *)rc2_ecb_params;
1250
0
            mech->len = sizeof *rc2_ecb_params;
1251
0
            break;
1252
0
        case CKM_RC2_CBC:
1253
0
        case CKM_RC2_CBC_PAD:
1254
0
            rv = SEC_ASN1DecodeItem(arena, &rc2, sec_rc2cbc_parameter_template,
1255
0
                                    &(algid->parameters));
1256
0
            if (rv != SECSuccess) {
1257
0
                goto loser;
1258
0
            }
1259
0
            rc2_cbc_params = PORT_New(CK_RC2_CBC_PARAMS);
1260
0
            if (rc2_cbc_params == NULL) {
1261
0
                goto loser;
1262
0
            }
1263
0
            mech->data = (unsigned char *)rc2_cbc_params;
1264
0
            mech->len = sizeof *rc2_cbc_params;
1265
0
            rc2_cbc_params->ulEffectiveBits = rc2_map(&rc2.rc2ParameterVersion);
1266
0
            if (rc2.iv.len != sizeof rc2_cbc_params->iv) {
1267
0
                PORT_SetError(SEC_ERROR_INPUT_LEN);
1268
0
                goto loser;
1269
0
            }
1270
0
            PORT_Memcpy(rc2_cbc_params->iv, rc2.iv.data, rc2.iv.len);
1271
0
            break;
1272
0
        case CKM_RC5_ECB:
1273
0
            rv = SEC_ASN1DecodeItem(arena, &rc5, sec_rc5ecb_parameter_template,
1274
0
                                    &(algid->parameters));
1275
0
            if (rv != SECSuccess) {
1276
0
                goto loser;
1277
0
            }
1278
0
            rc5_ecb_params = PORT_New(CK_RC5_PARAMS);
1279
0
            if (rc5_ecb_params == NULL) {
1280
0
                goto loser;
1281
0
            }
1282
0
            rc5_ecb_params->ulRounds = DER_GetInteger(&rc5.rounds);
1283
0
            rc5_ecb_params->ulWordsize = DER_GetInteger(&rc5.blockSizeInBits) / 8;
1284
0
            mech->data = (unsigned char *)rc5_ecb_params;
1285
0
            mech->len = sizeof *rc5_ecb_params;
1286
0
            break;
1287
0
        case CKM_RC5_CBC:
1288
0
        case CKM_RC5_CBC_PAD:
1289
0
            rv = SEC_ASN1DecodeItem(arena, &rc5, sec_rc5cbc_parameter_template,
1290
0
                                    &(algid->parameters));
1291
0
            if (rv != SECSuccess) {
1292
0
                goto loser;
1293
0
            }
1294
0
            rc5_cbc_params = (CK_RC5_CBC_PARAMS *)
1295
0
                PORT_Alloc(sizeof(CK_RC5_CBC_PARAMS) + rc5.iv.len);
1296
0
            if (rc5_cbc_params == NULL) {
1297
0
                goto loser;
1298
0
            }
1299
0
            mech->data = (unsigned char *)rc5_cbc_params;
1300
0
            mech->len = sizeof *rc5_cbc_params;
1301
0
            rc5_cbc_params->ulRounds = DER_GetInteger(&rc5.rounds);
1302
0
            rc5_cbc_params->ulWordsize = DER_GetInteger(&rc5.blockSizeInBits) / 8;
1303
0
            rc5_cbc_params->pIv = ((CK_BYTE_PTR)rc5_cbc_params) + sizeof(CK_RC5_CBC_PARAMS);
1304
0
            rc5_cbc_params->ulIvLen = rc5.iv.len;
1305
0
            PORT_Memcpy(rc5_cbc_params->pIv, rc5.iv.data, rc5.iv.len);
1306
0
            break;
1307
0
        case CKM_PBE_MD2_DES_CBC:
1308
0
        case CKM_PBE_MD5_DES_CBC:
1309
0
        case CKM_NSS_PBE_SHA1_DES_CBC:
1310
0
        case CKM_NSS_PBE_SHA1_TRIPLE_DES_CBC:
1311
0
        case CKM_NSS_PBE_SHA1_FAULTY_3DES_CBC:
1312
0
        case CKM_NSS_PBE_SHA1_40_BIT_RC2_CBC:
1313
0
        case CKM_NSS_PBE_SHA1_128_BIT_RC2_CBC:
1314
0
        case CKM_NSS_PBE_SHA1_40_BIT_RC4:
1315
0
        case CKM_NSS_PBE_SHA1_128_BIT_RC4:
1316
0
        case CKM_PBE_SHA1_DES2_EDE_CBC:
1317
0
        case CKM_PBE_SHA1_DES3_EDE_CBC:
1318
0
        case CKM_PBE_SHA1_RC2_40_CBC:
1319
0
        case CKM_PBE_SHA1_RC2_128_CBC:
1320
0
        case CKM_PBE_SHA1_RC4_40:
1321
0
        case CKM_PBE_SHA1_RC4_128:
1322
0
        case CKM_PKCS5_PBKD2:
1323
0
            rv = pbe_PK11AlgidToParam(algid, mech);
1324
0
            if (rv != SECSuccess) {
1325
0
                goto loser;
1326
0
            }
1327
0
            break;
1328
0
        case CKM_RC4:
1329
0
        case CKM_SEED_ECB:
1330
0
        case CKM_CAMELLIA_ECB:
1331
0
        case CKM_AES_ECB:
1332
0
        case CKM_DES_ECB:
1333
0
        case CKM_DES3_ECB:
1334
0
        case CKM_IDEA_ECB:
1335
0
        case CKM_CDMF_ECB:
1336
0
        case CKM_CAST_ECB:
1337
0
        case CKM_CAST3_ECB:
1338
0
        case CKM_CAST5_ECB:
1339
0
            break;
1340
1341
0
        default:
1342
0
            if (pk11_lookup(type)->iv == 0) {
1343
0
                break;
1344
0
            }
1345
        /* FALL THROUGH */
1346
0
        case CKM_SEED_CBC:
1347
0
        case CKM_CAMELLIA_CBC:
1348
0
        case CKM_AES_CBC:
1349
0
        case CKM_DES_CBC:
1350
0
        case CKM_DES3_CBC:
1351
0
        case CKM_IDEA_CBC:
1352
0
        case CKM_CDMF_CBC:
1353
0
        case CKM_CAST_CBC:
1354
0
        case CKM_CAST3_CBC:
1355
0
        case CKM_CAST5_CBC:
1356
0
        case CKM_SEED_CBC_PAD:
1357
0
        case CKM_CAMELLIA_CBC_PAD:
1358
0
        case CKM_AES_CBC_PAD:
1359
0
        case CKM_DES_CBC_PAD:
1360
0
        case CKM_DES3_CBC_PAD:
1361
0
        case CKM_IDEA_CBC_PAD:
1362
0
        case CKM_CDMF_CBC_PAD:
1363
0
        case CKM_CAST_CBC_PAD:
1364
0
        case CKM_CAST3_CBC_PAD:
1365
0
        case CKM_CAST5_CBC_PAD:
1366
0
        case CKM_SKIPJACK_CBC64:
1367
0
        case CKM_SKIPJACK_ECB64:
1368
0
        case CKM_SKIPJACK_OFB64:
1369
0
        case CKM_SKIPJACK_CFB64:
1370
0
        case CKM_SKIPJACK_CFB32:
1371
0
        case CKM_SKIPJACK_CFB16:
1372
0
        case CKM_SKIPJACK_CFB8:
1373
0
        case CKM_BATON_ECB128:
1374
0
        case CKM_BATON_ECB96:
1375
0
        case CKM_BATON_CBC128:
1376
0
        case CKM_BATON_COUNTER:
1377
0
        case CKM_BATON_SHUFFLE:
1378
0
        case CKM_JUNIPER_ECB128:
1379
0
        case CKM_JUNIPER_CBC128:
1380
0
        case CKM_JUNIPER_COUNTER:
1381
0
        case CKM_JUNIPER_SHUFFLE:
1382
            /* simple cases are simply octet string encoded IVs */
1383
0
            rv = SEC_ASN1DecodeItem(arena, &iv,
1384
0
                                    SEC_ASN1_GET(SEC_OctetStringTemplate),
1385
0
                                    &(algid->parameters));
1386
0
            if (rv != SECSuccess || iv.data == NULL) {
1387
0
                goto loser;
1388
0
            }
1389
            /* XXX Should be some IV length sanity check here. */
1390
0
            mech->data = (unsigned char *)PORT_Alloc(iv.len);
1391
0
            if (mech->data == NULL) {
1392
0
                goto loser;
1393
0
            }
1394
0
            PORT_Memcpy(mech->data, iv.data, iv.len);
1395
0
            mech->len = iv.len;
1396
0
            break;
1397
0
    }
1398
0
    PORT_FreeArena(arena, PR_FALSE);
1399
0
    return mech;
1400
1401
0
loser:
1402
0
    if (arena)
1403
0
        PORT_FreeArena(arena, PR_FALSE);
1404
0
    SECITEM_FreeItem(mech, PR_TRUE);
1405
0
    return NULL;
1406
0
}
1407
1408
/*
1409
 * Generate an IV for the given mechanism
1410
 */
1411
static SECStatus
1412
pk11_GenIV(CK_MECHANISM_TYPE type, SECItem *iv)
1413
0
{
1414
0
    int iv_size = PK11_GetIVLength(type);
1415
0
    SECStatus rv;
1416
1417
0
    iv->len = iv_size;
1418
0
    if (iv_size == 0) {
1419
0
        iv->data = NULL;
1420
0
        return SECSuccess;
1421
0
    }
1422
1423
0
    iv->data = (unsigned char *)PORT_Alloc(iv_size);
1424
0
    if (iv->data == NULL) {
1425
0
        iv->len = 0;
1426
0
        return SECFailure;
1427
0
    }
1428
1429
0
    rv = PK11_GenerateRandom(iv->data, iv->len);
1430
0
    if (rv != SECSuccess) {
1431
0
        PORT_Free(iv->data);
1432
0
        iv->data = NULL;
1433
0
        iv->len = 0;
1434
0
        return SECFailure;
1435
0
    }
1436
0
    return SECSuccess;
1437
0
}
1438
1439
/*
1440
 * create a new parameter block from the passed in MECHANISM and the
1441
 * key. Use Netscape's S/MIME Rules for the New param block.
1442
 */
1443
SECItem *
1444
pk11_GenerateNewParamWithKeyLen(CK_MECHANISM_TYPE type, int keyLen)
1445
0
{
1446
0
    CK_RC2_CBC_PARAMS *rc2_params;
1447
0
    CK_RC2_PARAMS *rc2_ecb_params;
1448
0
    SECItem *mech;
1449
0
    SECItem iv;
1450
0
    SECStatus rv;
1451
1452
0
    mech = (SECItem *)PORT_Alloc(sizeof(SECItem));
1453
0
    if (mech == NULL)
1454
0
        return NULL;
1455
1456
0
    rv = SECSuccess;
1457
0
    mech->type = siBuffer;
1458
0
    mech->data = NULL;
1459
0
    mech->len = 0;
1460
0
    switch (type) {
1461
0
        case CKM_RC4:
1462
0
        case CKM_SEED_ECB:
1463
0
        case CKM_CAMELLIA_ECB:
1464
0
        case CKM_AES_ECB:
1465
0
        case CKM_DES_ECB:
1466
0
        case CKM_DES3_ECB:
1467
0
        case CKM_IDEA_ECB:
1468
0
        case CKM_CDMF_ECB:
1469
0
        case CKM_CAST_ECB:
1470
0
        case CKM_CAST3_ECB:
1471
0
        case CKM_CAST5_ECB:
1472
0
            break;
1473
0
        case CKM_RC2_ECB:
1474
0
            rc2_ecb_params = (CK_RC2_PARAMS *)PORT_Alloc(sizeof(CK_RC2_PARAMS));
1475
0
            if (rc2_ecb_params == NULL) {
1476
0
                rv = SECFailure;
1477
0
                break;
1478
0
            }
1479
            /* NOTE PK11_GetKeyLength can return -1 if the key isn't and RC2, RC5,
1480
             *   or RC4 key. Of course that wouldn't happen here doing RC2:).*/
1481
0
            *rc2_ecb_params = keyLen ? keyLen * 8 : 128;
1482
0
            mech->data = (unsigned char *)rc2_ecb_params;
1483
0
            mech->len = sizeof(CK_RC2_PARAMS);
1484
0
            break;
1485
0
        case CKM_RC2_CBC:
1486
0
        case CKM_RC2_CBC_PAD:
1487
0
            rv = pk11_GenIV(type, &iv);
1488
0
            if (rv != SECSuccess) {
1489
0
                break;
1490
0
            }
1491
0
            rc2_params = (CK_RC2_CBC_PARAMS *)PORT_Alloc(sizeof(CK_RC2_CBC_PARAMS));
1492
0
            if (rc2_params == NULL) {
1493
0
                PORT_Free(iv.data);
1494
0
                rv = SECFailure;
1495
0
                break;
1496
0
            }
1497
            /* NOTE PK11_GetKeyLength can return -1 if the key isn't and RC2, RC5,
1498
             *   or RC4 key. Of course that wouldn't happen here doing RC2:).*/
1499
0
            rc2_params->ulEffectiveBits = keyLen ? keyLen * 8 : 128;
1500
0
            if (iv.data)
1501
0
                PORT_Memcpy(rc2_params->iv, iv.data, sizeof(rc2_params->iv));
1502
0
            mech->data = (unsigned char *)rc2_params;
1503
0
            mech->len = sizeof(CK_RC2_CBC_PARAMS);
1504
0
            PORT_Free(iv.data);
1505
0
            break;
1506
0
        case CKM_RC5_ECB:
1507
0
            PORT_Free(mech);
1508
0
            return PK11_ParamFromIV(type, NULL);
1509
0
        case CKM_RC5_CBC:
1510
0
        case CKM_RC5_CBC_PAD:
1511
0
            rv = pk11_GenIV(type, &iv);
1512
0
            if (rv != SECSuccess) {
1513
0
                break;
1514
0
            }
1515
0
            PORT_Free(mech);
1516
0
            return PK11_ParamFromIV(type, &iv);
1517
0
        default:
1518
0
            if (pk11_lookup(type)->iv == 0) {
1519
0
                break;
1520
0
            }
1521
0
        case CKM_SEED_CBC:
1522
0
        case CKM_CAMELLIA_CBC:
1523
0
        case CKM_AES_CBC:
1524
0
        case CKM_DES_CBC:
1525
0
        case CKM_DES3_CBC:
1526
0
        case CKM_IDEA_CBC:
1527
0
        case CKM_CDMF_CBC:
1528
0
        case CKM_CAST_CBC:
1529
0
        case CKM_CAST3_CBC:
1530
0
        case CKM_CAST5_CBC:
1531
0
        case CKM_DES_CBC_PAD:
1532
0
        case CKM_DES3_CBC_PAD:
1533
0
        case CKM_IDEA_CBC_PAD:
1534
0
        case CKM_CDMF_CBC_PAD:
1535
0
        case CKM_CAST_CBC_PAD:
1536
0
        case CKM_CAST3_CBC_PAD:
1537
0
        case CKM_CAST5_CBC_PAD:
1538
0
        case CKM_SKIPJACK_CBC64:
1539
0
        case CKM_SKIPJACK_ECB64:
1540
0
        case CKM_SKIPJACK_OFB64:
1541
0
        case CKM_SKIPJACK_CFB64:
1542
0
        case CKM_SKIPJACK_CFB32:
1543
0
        case CKM_SKIPJACK_CFB16:
1544
0
        case CKM_SKIPJACK_CFB8:
1545
0
        case CKM_BATON_ECB128:
1546
0
        case CKM_BATON_ECB96:
1547
0
        case CKM_BATON_CBC128:
1548
0
        case CKM_BATON_COUNTER:
1549
0
        case CKM_BATON_SHUFFLE:
1550
0
        case CKM_JUNIPER_ECB128:
1551
0
        case CKM_JUNIPER_CBC128:
1552
0
        case CKM_JUNIPER_COUNTER:
1553
0
        case CKM_JUNIPER_SHUFFLE:
1554
0
            rv = pk11_GenIV(type, &iv);
1555
0
            if (rv != SECSuccess) {
1556
0
                break;
1557
0
            }
1558
0
            mech->data = (unsigned char *)PORT_Alloc(iv.len);
1559
0
            if (mech->data == NULL) {
1560
0
                PORT_Free(iv.data);
1561
0
                rv = SECFailure;
1562
0
                break;
1563
0
            }
1564
0
            PORT_Memcpy(mech->data, iv.data, iv.len);
1565
0
            mech->len = iv.len;
1566
0
            PORT_Free(iv.data);
1567
0
            break;
1568
0
    }
1569
0
    if (rv != SECSuccess) {
1570
0
        SECITEM_FreeItem(mech, PR_TRUE);
1571
0
        return NULL;
1572
0
    }
1573
0
    return mech;
1574
0
}
1575
1576
SECItem *
1577
PK11_GenerateNewParam(CK_MECHANISM_TYPE type, PK11SymKey *key)
1578
0
{
1579
0
    int keyLen = key ? PK11_GetKeyLength(key) : 0;
1580
1581
0
    return pk11_GenerateNewParamWithKeyLen(type, keyLen);
1582
0
}
1583
1584
0
#define RC5_V10 0x10
1585
1586
/* turn a PKCS #11 parameter into a DER Encoded Algorithm ID */
1587
SECStatus
1588
PK11_ParamToAlgid(SECOidTag algTag, SECItem *param,
1589
                  PLArenaPool *arena, SECAlgorithmID *algid)
1590
0
{
1591
0
    CK_RC2_CBC_PARAMS *rc2_params;
1592
0
    sec_rc2cbcParameter rc2;
1593
0
    CK_RC5_CBC_PARAMS *rc5_params;
1594
0
    sec_rc5cbcParameter rc5;
1595
0
    CK_MECHANISM_TYPE type = PK11_AlgtagToMechanism(algTag);
1596
0
    SECItem *newParams = NULL;
1597
0
    SECStatus rv = SECFailure;
1598
0
    unsigned long rc2version;
1599
1600
0
    switch (type) {
1601
0
        case CKM_RC4:
1602
0
        case CKM_SEED_ECB:
1603
0
        case CKM_CAMELLIA_ECB:
1604
0
        case CKM_AES_ECB:
1605
0
        case CKM_DES_ECB:
1606
0
        case CKM_DES3_ECB:
1607
0
        case CKM_IDEA_ECB:
1608
0
        case CKM_CDMF_ECB:
1609
0
        case CKM_CAST_ECB:
1610
0
        case CKM_CAST3_ECB:
1611
0
        case CKM_CAST5_ECB:
1612
0
            newParams = NULL;
1613
0
            rv = SECSuccess;
1614
0
            break;
1615
0
        case CKM_RC2_ECB:
1616
0
            break;
1617
0
        case CKM_RC2_CBC:
1618
0
        case CKM_RC2_CBC_PAD:
1619
0
            rc2_params = (CK_RC2_CBC_PARAMS *)param->data;
1620
0
            rc2version = rc2_unmap(rc2_params->ulEffectiveBits);
1621
0
            if (SEC_ASN1EncodeUnsignedInteger(NULL, &(rc2.rc2ParameterVersion),
1622
0
                                              rc2version) == NULL)
1623
0
                break;
1624
0
            rc2.iv.data = rc2_params->iv;
1625
0
            rc2.iv.len = sizeof(rc2_params->iv);
1626
0
            newParams = SEC_ASN1EncodeItem(NULL, NULL, &rc2,
1627
0
                                           sec_rc2cbc_parameter_template);
1628
0
            PORT_Free(rc2.rc2ParameterVersion.data);
1629
0
            if (newParams == NULL)
1630
0
                break;
1631
0
            rv = SECSuccess;
1632
0
            break;
1633
1634
0
        case CKM_RC5_ECB: /* well not really... */
1635
0
            break;
1636
0
        case CKM_RC5_CBC:
1637
0
        case CKM_RC5_CBC_PAD:
1638
0
            rc5_params = (CK_RC5_CBC_PARAMS *)param->data;
1639
0
            if (SEC_ASN1EncodeUnsignedInteger(NULL, &rc5.version, RC5_V10) == NULL)
1640
0
                break;
1641
0
            if (SEC_ASN1EncodeUnsignedInteger(NULL, &rc5.blockSizeInBits,
1642
0
                                              rc5_params->ulWordsize * 8) == NULL) {
1643
0
                PORT_Free(rc5.version.data);
1644
0
                break;
1645
0
            }
1646
0
            if (SEC_ASN1EncodeUnsignedInteger(NULL, &rc5.rounds,
1647
0
                                              rc5_params->ulWordsize * 8) == NULL) {
1648
0
                PORT_Free(rc5.blockSizeInBits.data);
1649
0
                PORT_Free(rc5.version.data);
1650
0
                break;
1651
0
            }
1652
0
            rc5.iv.data = rc5_params->pIv;
1653
0
            rc5.iv.len = rc5_params->ulIvLen;
1654
0
            newParams = SEC_ASN1EncodeItem(NULL, NULL, &rc5,
1655
0
                                           sec_rc5cbc_parameter_template);
1656
0
            PORT_Free(rc5.version.data);
1657
0
            PORT_Free(rc5.blockSizeInBits.data);
1658
0
            PORT_Free(rc5.rounds.data);
1659
0
            if (newParams == NULL)
1660
0
                break;
1661
0
            rv = SECSuccess;
1662
0
            break;
1663
0
        case CKM_PBE_MD2_DES_CBC:
1664
0
        case CKM_PBE_MD5_DES_CBC:
1665
0
        case CKM_NSS_PBE_SHA1_DES_CBC:
1666
0
        case CKM_NSS_PBE_SHA1_TRIPLE_DES_CBC:
1667
0
        case CKM_NSS_PBE_SHA1_FAULTY_3DES_CBC:
1668
0
        case CKM_NSS_PBE_SHA1_40_BIT_RC2_CBC:
1669
0
        case CKM_NSS_PBE_SHA1_128_BIT_RC2_CBC:
1670
0
        case CKM_NSS_PBE_SHA1_40_BIT_RC4:
1671
0
        case CKM_NSS_PBE_SHA1_128_BIT_RC4:
1672
0
        case CKM_PBE_SHA1_DES3_EDE_CBC:
1673
0
        case CKM_PBE_SHA1_DES2_EDE_CBC:
1674
0
        case CKM_PBE_SHA1_RC2_40_CBC:
1675
0
        case CKM_PBE_SHA1_RC2_128_CBC:
1676
0
        case CKM_PBE_SHA1_RC4_40:
1677
0
        case CKM_PBE_SHA1_RC4_128:
1678
0
            return PBE_PK11ParamToAlgid(algTag, param, arena, algid);
1679
0
        default:
1680
0
            if (pk11_lookup(type)->iv == 0) {
1681
0
                rv = SECSuccess;
1682
0
                newParams = NULL;
1683
0
                break;
1684
0
            }
1685
0
        case CKM_SEED_CBC:
1686
0
        case CKM_CAMELLIA_CBC:
1687
0
        case CKM_AES_CBC:
1688
0
        case CKM_DES_CBC:
1689
0
        case CKM_DES3_CBC:
1690
0
        case CKM_IDEA_CBC:
1691
0
        case CKM_CDMF_CBC:
1692
0
        case CKM_CAST_CBC:
1693
0
        case CKM_CAST3_CBC:
1694
0
        case CKM_CAST5_CBC:
1695
0
        case CKM_DES_CBC_PAD:
1696
0
        case CKM_DES3_CBC_PAD:
1697
0
        case CKM_IDEA_CBC_PAD:
1698
0
        case CKM_CDMF_CBC_PAD:
1699
0
        case CKM_CAST_CBC_PAD:
1700
0
        case CKM_CAST3_CBC_PAD:
1701
0
        case CKM_CAST5_CBC_PAD:
1702
0
        case CKM_SKIPJACK_CBC64:
1703
0
        case CKM_SKIPJACK_ECB64:
1704
0
        case CKM_SKIPJACK_OFB64:
1705
0
        case CKM_SKIPJACK_CFB64:
1706
0
        case CKM_SKIPJACK_CFB32:
1707
0
        case CKM_SKIPJACK_CFB16:
1708
0
        case CKM_SKIPJACK_CFB8:
1709
0
        case CKM_BATON_ECB128:
1710
0
        case CKM_BATON_ECB96:
1711
0
        case CKM_BATON_CBC128:
1712
0
        case CKM_BATON_COUNTER:
1713
0
        case CKM_BATON_SHUFFLE:
1714
0
        case CKM_JUNIPER_ECB128:
1715
0
        case CKM_JUNIPER_CBC128:
1716
0
        case CKM_JUNIPER_COUNTER:
1717
0
        case CKM_JUNIPER_SHUFFLE:
1718
0
            newParams = SEC_ASN1EncodeItem(NULL, NULL, param,
1719
0
                                           SEC_ASN1_GET(SEC_OctetStringTemplate));
1720
0
            if (newParams == NULL)
1721
0
                break;
1722
0
            rv = SECSuccess;
1723
0
            break;
1724
0
    }
1725
1726
0
    if (rv != SECSuccess) {
1727
0
        if (newParams)
1728
0
            SECITEM_FreeItem(newParams, PR_TRUE);
1729
0
        return rv;
1730
0
    }
1731
1732
0
    rv = SECOID_SetAlgorithmID(arena, algid, algTag, newParams);
1733
0
    SECITEM_FreeItem(newParams, PR_TRUE);
1734
0
    return rv;
1735
0
}
1736
1737
/* turn an OID algorithm tag into a PKCS #11 mechanism. This allows us to
1738
 * map OID's directly into the PKCS #11 mechanism we want to call. We find
1739
 * this mapping in our standard OID table */
1740
CK_MECHANISM_TYPE
1741
PK11_AlgtagToMechanism(SECOidTag algTag)
1742
5.94k
{
1743
5.94k
    SECOidData *oid = SECOID_FindOIDByTag(algTag);
1744
1745
5.94k
    if (oid)
1746
5.94k
        return (CK_MECHANISM_TYPE)oid->mechanism;
1747
0
    return CKM_INVALID_MECHANISM;
1748
5.94k
}
1749
1750
/* turn a mechanism into an oid. */
1751
SECOidTag
1752
PK11_MechanismToAlgtag(CK_MECHANISM_TYPE type)
1753
0
{
1754
0
    SECOidData *oid = SECOID_FindOIDByMechanism((unsigned long)type);
1755
1756
0
    if (oid)
1757
0
        return oid->offset;
1758
0
    return SEC_OID_UNKNOWN;
1759
0
}
1760
1761
/* Determine appropriate blocking mechanism, used when wrapping private keys
1762
 * which require PKCS padding.  If the mechanism does not map to a padding
1763
 * mechanism, we simply return the mechanism.
1764
 */
1765
CK_MECHANISM_TYPE
1766
PK11_GetPadMechanism(CK_MECHANISM_TYPE type)
1767
0
{
1768
0
    switch (type) {
1769
0
        case CKM_SEED_CBC:
1770
0
            return CKM_SEED_CBC_PAD;
1771
0
        case CKM_CAMELLIA_CBC:
1772
0
            return CKM_CAMELLIA_CBC_PAD;
1773
0
        case CKM_AES_CBC:
1774
0
            return CKM_AES_CBC_PAD;
1775
0
        case CKM_DES_CBC:
1776
0
            return CKM_DES_CBC_PAD;
1777
0
        case CKM_DES3_CBC:
1778
0
            return CKM_DES3_CBC_PAD;
1779
0
        case CKM_RC2_CBC:
1780
0
            return CKM_RC2_CBC_PAD;
1781
0
        case CKM_CDMF_CBC:
1782
0
            return CKM_CDMF_CBC_PAD;
1783
0
        case CKM_CAST_CBC:
1784
0
            return CKM_CAST_CBC_PAD;
1785
0
        case CKM_CAST3_CBC:
1786
0
            return CKM_CAST3_CBC_PAD;
1787
0
        case CKM_CAST5_CBC:
1788
0
            return CKM_CAST5_CBC_PAD;
1789
0
        case CKM_RC5_CBC:
1790
0
            return CKM_RC5_CBC_PAD;
1791
0
        case CKM_IDEA_CBC:
1792
0
            return CKM_IDEA_CBC_PAD;
1793
0
        default:
1794
0
            break;
1795
0
    }
1796
1797
0
    return type;
1798
0
}
1799
1800
static PRBool
1801
pk11_isAllZero(unsigned char *data, int len)
1802
0
{
1803
0
    while (len--) {
1804
0
        if (*data++) {
1805
0
            return PR_FALSE;
1806
0
        }
1807
0
    }
1808
0
    return PR_TRUE;
1809
0
}
1810
1811
CK_RV
1812
PK11_MapPBEMechanismToCryptoMechanism(CK_MECHANISM_PTR pPBEMechanism,
1813
                                      CK_MECHANISM_PTR pCryptoMechanism,
1814
                                      SECItem *pbe_pwd, PRBool faulty3DES)
1815
0
{
1816
0
    int iv_len = 0;
1817
0
    CK_PBE_PARAMS_PTR pPBEparams;
1818
0
    CK_RC2_CBC_PARAMS_PTR rc2_params;
1819
0
    CK_ULONG rc2_key_len;
1820
1821
0
    if ((pPBEMechanism == CK_NULL_PTR) || (pCryptoMechanism == CK_NULL_PTR)) {
1822
0
        return CKR_HOST_MEMORY;
1823
0
    }
1824
1825
    /* pkcs5 v2 cannot be supported by this interface.
1826
     * use PK11_GetPBECryptoMechanism instead.
1827
     */
1828
0
    if ((pPBEMechanism->mechanism == CKM_INVALID_MECHANISM) ||
1829
0
        (pPBEMechanism->mechanism == CKM_PKCS5_PBKD2)) {
1830
0
        return CKR_MECHANISM_INVALID;
1831
0
    }
1832
1833
0
    pPBEparams = (CK_PBE_PARAMS_PTR)pPBEMechanism->pParameter;
1834
0
    iv_len = PK11_GetIVLength(pPBEMechanism->mechanism);
1835
1836
0
    if (iv_len) {
1837
0
        if (pk11_isAllZero(pPBEparams->pInitVector, iv_len)) {
1838
0
            SECItem param;
1839
0
            PK11SymKey *symKey;
1840
0
            PK11SlotInfo *intSlot = PK11_GetInternalSlot();
1841
1842
0
            if (intSlot == NULL) {
1843
0
                return CKR_DEVICE_ERROR;
1844
0
            }
1845
1846
0
            param.data = pPBEMechanism->pParameter;
1847
0
            param.len = pPBEMechanism->ulParameterLen;
1848
1849
0
            symKey = PK11_RawPBEKeyGen(intSlot,
1850
0
                                       pPBEMechanism->mechanism, &param, pbe_pwd, faulty3DES, NULL);
1851
0
            PK11_FreeSlot(intSlot);
1852
0
            if (symKey == NULL) {
1853
0
                return CKR_DEVICE_ERROR; /* sigh */
1854
0
            }
1855
0
            PK11_FreeSymKey(symKey);
1856
0
        }
1857
0
    }
1858
1859
0
    switch (pPBEMechanism->mechanism) {
1860
0
        case CKM_PBE_MD2_DES_CBC:
1861
0
        case CKM_PBE_MD5_DES_CBC:
1862
0
        case CKM_NSS_PBE_SHA1_DES_CBC:
1863
0
            pCryptoMechanism->mechanism = CKM_DES_CBC;
1864
0
            goto have_crypto_mechanism;
1865
0
        case CKM_NSS_PBE_SHA1_TRIPLE_DES_CBC:
1866
0
        case CKM_NSS_PBE_SHA1_FAULTY_3DES_CBC:
1867
0
        case CKM_PBE_SHA1_DES3_EDE_CBC:
1868
0
        case CKM_PBE_SHA1_DES2_EDE_CBC:
1869
0
            pCryptoMechanism->mechanism = CKM_DES3_CBC;
1870
0
        have_crypto_mechanism:
1871
0
            pCryptoMechanism->pParameter = PORT_Alloc(iv_len);
1872
0
            pCryptoMechanism->ulParameterLen = (CK_ULONG)iv_len;
1873
0
            if (pCryptoMechanism->pParameter == NULL) {
1874
0
                return CKR_HOST_MEMORY;
1875
0
            }
1876
0
            PORT_Memcpy((unsigned char *)(pCryptoMechanism->pParameter),
1877
0
                        (unsigned char *)(pPBEparams->pInitVector),
1878
0
                        iv_len);
1879
0
            break;
1880
0
        case CKM_NSS_PBE_SHA1_40_BIT_RC4:
1881
0
        case CKM_NSS_PBE_SHA1_128_BIT_RC4:
1882
0
        case CKM_PBE_SHA1_RC4_40:
1883
0
        case CKM_PBE_SHA1_RC4_128:
1884
0
            pCryptoMechanism->mechanism = CKM_RC4;
1885
0
            pCryptoMechanism->ulParameterLen = 0;
1886
0
            pCryptoMechanism->pParameter = CK_NULL_PTR;
1887
0
            break;
1888
0
        case CKM_NSS_PBE_SHA1_40_BIT_RC2_CBC:
1889
0
        case CKM_PBE_SHA1_RC2_40_CBC:
1890
0
            rc2_key_len = 40;
1891
0
            goto have_key_len;
1892
0
        case CKM_NSS_PBE_SHA1_128_BIT_RC2_CBC:
1893
0
            rc2_key_len = 128;
1894
0
        have_key_len:
1895
0
            pCryptoMechanism->mechanism = CKM_RC2_CBC;
1896
0
            pCryptoMechanism->ulParameterLen = (CK_ULONG)sizeof(CK_RC2_CBC_PARAMS);
1897
0
            pCryptoMechanism->pParameter = (CK_RC2_CBC_PARAMS_PTR)
1898
0
                PORT_ZAlloc(sizeof(CK_RC2_CBC_PARAMS));
1899
0
            if (pCryptoMechanism->pParameter == NULL) {
1900
0
                return CKR_HOST_MEMORY;
1901
0
            }
1902
0
            rc2_params = (CK_RC2_CBC_PARAMS_PTR)pCryptoMechanism->pParameter;
1903
0
            PORT_Memcpy((unsigned char *)rc2_params->iv,
1904
0
                        (unsigned char *)pPBEparams->pInitVector,
1905
0
                        iv_len);
1906
0
            rc2_params->ulEffectiveBits = rc2_key_len;
1907
0
            break;
1908
0
        default:
1909
0
            return CKR_MECHANISM_INVALID;
1910
0
    }
1911
1912
0
    return CKR_OK;
1913
0
}
1914
1915
/* Make a Key type to an appropriate signing/verification mechanism */
1916
CK_MECHANISM_TYPE
1917
PK11_MapSignKeyType(KeyType keyType)
1918
2.23k
{
1919
2.23k
    switch (keyType) {
1920
1.89k
        case rsaKey:
1921
1.89k
            return CKM_RSA_PKCS;
1922
0
        case fortezzaKey:
1923
0
        case dsaKey:
1924
0
            return CKM_DSA;
1925
348
        case ecKey:
1926
348
            return CKM_ECDSA;
1927
0
        case edKey:
1928
0
            return CKM_EDDSA;
1929
0
        case dhKey:
1930
0
        default:
1931
0
            break;
1932
2.23k
    }
1933
0
    return CKM_INVALID_MECHANISM;
1934
2.23k
}
1935
1936
CK_MECHANISM_TYPE
1937
pk11_mapWrapKeyType(KeyType keyType)
1938
16
{
1939
16
    switch (keyType) {
1940
16
        case rsaKey:
1941
16
            return CKM_RSA_PKCS;
1942
        /* Add fortezza?? */
1943
0
        default:
1944
0
            break;
1945
16
    }
1946
0
    return CKM_INVALID_MECHANISM;
1947
16
}
1948
1949
SECOidTag
1950
PK11_FortezzaMapSig(SECOidTag algTag)
1951
0
{
1952
0
    switch (algTag) {
1953
0
        case SEC_OID_MISSI_KEA_DSS:
1954
0
        case SEC_OID_MISSI_DSS:
1955
0
        case SEC_OID_MISSI_DSS_OLD:
1956
0
        case SEC_OID_MISSI_KEA_DSS_OLD:
1957
0
        case SEC_OID_BOGUS_DSA_SIGNATURE_WITH_SHA1_DIGEST:
1958
0
            return SEC_OID_ANSIX9_DSA_SIGNATURE;
1959
0
        default:
1960
0
            break;
1961
0
    }
1962
0
    return algTag;
1963
0
}