60 |
60 |
61 #define ANSI_X962_OID 0x2a, 0x86, 0x48, 0xce, 0x3d |
61 #define ANSI_X962_OID 0x2a, 0x86, 0x48, 0xce, 0x3d |
62 #define ANSI_X962_CURVE_OID ANSI_X962_OID, 0x03 |
62 #define ANSI_X962_CURVE_OID ANSI_X962_OID, 0x03 |
63 #define ANSI_X962_GF2m_OID ANSI_X962_CURVE_OID, 0x00 |
63 #define ANSI_X962_GF2m_OID ANSI_X962_CURVE_OID, 0x00 |
64 #define ANSI_X962_GFp_OID ANSI_X962_CURVE_OID, 0x01 |
64 #define ANSI_X962_GFp_OID ANSI_X962_CURVE_OID, 0x01 |
|
65 |
|
66 #define TELETRUST_ALGO_OID 0x2b, 0x24, 0x03 |
|
67 #define ECC_BRAINPOOL TELETRUST_ALGO_OID, 0x03, 0x02, 0x08 |
|
68 #define ECC_BRAINPOOL_EC_V1 ECC_BRAINPOOL, 0x01, 0x01 |
65 |
69 |
66 #define CONST_OID static const unsigned char |
70 #define CONST_OID static const unsigned char |
67 |
71 |
68 /* ANSI X9.62 prime curve OIDs */ |
72 /* ANSI X9.62 prime curve OIDs */ |
69 /* NOTE: prime192v1 is the same as secp192r1, prime256v1 is the |
73 /* NOTE: prime192v1 is the same as secp192r1, prime256v1 is the |
132 CONST_OID ansiX962c2pnb304w1[] = { ANSI_X962_GF2m_OID, 0x11 }; |
136 CONST_OID ansiX962c2pnb304w1[] = { ANSI_X962_GF2m_OID, 0x11 }; |
133 CONST_OID ansiX962c2tnb359v1[] = { ANSI_X962_GF2m_OID, 0x12 }; |
137 CONST_OID ansiX962c2tnb359v1[] = { ANSI_X962_GF2m_OID, 0x12 }; |
134 CONST_OID ansiX962c2pnb368w1[] = { ANSI_X962_GF2m_OID, 0x13 }; |
138 CONST_OID ansiX962c2pnb368w1[] = { ANSI_X962_GF2m_OID, 0x13 }; |
135 CONST_OID ansiX962c2tnb431r1[] = { ANSI_X962_GF2m_OID, 0x14 }; |
139 CONST_OID ansiX962c2tnb431r1[] = { ANSI_X962_GF2m_OID, 0x14 }; |
136 |
140 |
|
141 /* TeleTrusT ECC Brainpool prime curve OIDs */ |
|
142 CONST_OID brainpoolP160r1[] = { ECC_BRAINPOOL_EC_V1, 0x01 }; |
|
143 CONST_OID brainpoolP160t1[] = { ECC_BRAINPOOL_EC_V1, 0x02 }; |
|
144 CONST_OID brainpoolP192r1[] = { ECC_BRAINPOOL_EC_V1, 0x03 }; |
|
145 CONST_OID brainpoolP192t1[] = { ECC_BRAINPOOL_EC_V1, 0x04 }; |
|
146 CONST_OID brainpoolP224r1[] = { ECC_BRAINPOOL_EC_V1, 0x05 }; |
|
147 CONST_OID brainpoolP224t1[] = { ECC_BRAINPOOL_EC_V1, 0x06 }; |
|
148 CONST_OID brainpoolP256r1[] = { ECC_BRAINPOOL_EC_V1, 0x07 }; |
|
149 CONST_OID brainpoolP256t1[] = { ECC_BRAINPOOL_EC_V1, 0x08 }; |
|
150 CONST_OID brainpoolP320r1[] = { ECC_BRAINPOOL_EC_V1, 0x09 }; |
|
151 CONST_OID brainpoolP320t1[] = { ECC_BRAINPOOL_EC_V1, 0x0a }; |
|
152 CONST_OID brainpoolP384r1[] = { ECC_BRAINPOOL_EC_V1, 0x0b }; |
|
153 CONST_OID brainpoolP384t1[] = { ECC_BRAINPOOL_EC_V1, 0x0c }; |
|
154 CONST_OID brainpoolP512r1[] = { ECC_BRAINPOOL_EC_V1, 0x0d }; |
|
155 CONST_OID brainpoolP512t1[] = { ECC_BRAINPOOL_EC_V1, 0x0e }; |
|
156 |
137 #define OI(x) { siDEROID, (unsigned char *)x, sizeof x } |
157 #define OI(x) { siDEROID, (unsigned char *)x, sizeof x } |
138 #ifndef SECOID_NO_STRINGS |
158 #ifndef SECOID_NO_STRINGS |
139 #define OD(oid,tag,desc,mech,ext) { OI(oid), tag, desc, mech, ext } |
159 #define OD(oid,tag,desc,mech,ext) { OI(oid), tag, desc, mech, ext } |
140 #else |
160 #else |
141 #define OD(oid,tag,desc,mech,ext) { OI(oid), tag, 0, mech, ext } |
161 #define OD(oid,tag,desc,mech,ext) { OI(oid), tag, 0, mech, ext } |
407 "ANSI X9.62 elliptic curve c2tnb431r1", |
427 "ANSI X9.62 elliptic curve c2tnb431r1", |
408 CKM_INVALID_MECHANISM, |
428 CKM_INVALID_MECHANISM, |
409 INVALID_CERT_EXTENSION ) |
429 INVALID_CERT_EXTENSION ) |
410 }; |
430 }; |
411 |
431 |
|
432 static SECOidData BRAINPOOL_oids[] = { |
|
433 { { siDEROID, NULL, 0 }, ECCurve_noName, |
|
434 "Unknown OID", CKM_INVALID_MECHANISM, INVALID_CERT_EXTENSION }, |
|
435 |
|
436 /* RFC 5639 Brainpool named elliptic curves */ |
|
437 { { siDEROID, NULL, 0 }, ECCurve_noName, |
|
438 "Unknown OID", CKM_INVALID_MECHANISM, INVALID_CERT_EXTENSION }, |
|
439 { { siDEROID, NULL, 0 }, ECCurve_noName, |
|
440 "Unknown OID", CKM_INVALID_MECHANISM, INVALID_CERT_EXTENSION }, |
|
441 { { siDEROID, NULL, 0 }, ECCurve_noName, |
|
442 "Unknown OID", CKM_INVALID_MECHANISM, INVALID_CERT_EXTENSION }, |
|
443 { { siDEROID, NULL, 0 }, ECCurve_noName, |
|
444 "Unknown OID", CKM_INVALID_MECHANISM, INVALID_CERT_EXTENSION }, |
|
445 { { siDEROID, NULL, 0 }, ECCurve_noName, |
|
446 "Unknown OID", CKM_INVALID_MECHANISM, INVALID_CERT_EXTENSION }, |
|
447 { { siDEROID, NULL, 0 }, ECCurve_noName, |
|
448 "Unknown OID", CKM_INVALID_MECHANISM, INVALID_CERT_EXTENSION }, |
|
449 OD( brainpoolP256r1, ECCurve_BrainpoolP256r1, |
|
450 "brainpoolP256r1 domain parameter set", |
|
451 CKM_INVALID_MECHANISM, |
|
452 INVALID_CERT_EXTENSION ), |
|
453 { { siDEROID, NULL, 0 }, ECCurve_noName, |
|
454 "Unknown OID", CKM_INVALID_MECHANISM, INVALID_CERT_EXTENSION }, |
|
455 OD( brainpoolP320r1, ECCurve_BrainpoolP320r1, |
|
456 "brainpoolP320r1 domain parameter set", |
|
457 CKM_INVALID_MECHANISM, |
|
458 INVALID_CERT_EXTENSION ), |
|
459 { { siDEROID, NULL, 0 }, ECCurve_noName, |
|
460 "Unknown OID", CKM_INVALID_MECHANISM, INVALID_CERT_EXTENSION }, |
|
461 OD( brainpoolP384r1, ECCurve_BrainpoolP384r1, |
|
462 "brainpoolP384r1 domain parameter set", |
|
463 CKM_INVALID_MECHANISM, |
|
464 INVALID_CERT_EXTENSION ), |
|
465 { { siDEROID, NULL, 0 }, ECCurve_noName, |
|
466 "Unknown OID", CKM_INVALID_MECHANISM, INVALID_CERT_EXTENSION }, |
|
467 OD( brainpoolP512r1, ECCurve_BrainpoolP512r1, |
|
468 "brainpoolP512r1 domain parameter set", |
|
469 CKM_INVALID_MECHANISM, |
|
470 INVALID_CERT_EXTENSION ), |
|
471 { { siDEROID, NULL, 0 }, ECCurve_noName, |
|
472 "Unknown OID", CKM_INVALID_MECHANISM, |
|
473 INVALID_CERT_EXTENSION } |
|
474 }; |
|
475 |
|
476 int |
|
477 oideql(unsigned char *reqoid, unsigned char *foundoid, size_t reqlen, size_t foundlen) |
|
478 { |
|
479 if (!reqoid || !foundoid) { |
|
480 return 0; |
|
481 } |
|
482 |
|
483 if (reqlen != foundlen) { |
|
484 return 0; |
|
485 } |
|
486 |
|
487 return memcmp(reqoid, foundoid, reqlen) == 0; |
|
488 } |
|
489 |
412 SECOidData * |
490 SECOidData * |
413 SECOID_FindOID(const SECItem *oid) |
491 SECOID_FindOID(const SECItem *oid) |
414 { |
492 { |
415 SECOidData *po; |
493 SECOidData *po; |
416 SECOidData *ret = NULL; |
494 SECOidData *ret = NULL; |
417 |
495 int reqlen = oid->len; |
418 if (oid->len == 8) { |
496 |
|
497 if (reqlen == 8) { |
419 if (oid->data[6] == 0x00) { |
498 if (oid->data[6] == 0x00) { |
420 /* XXX bounds check */ |
499 /* XXX bounds check */ |
421 po = &ANSI_oids[oid->data[7]]; |
500 po = &ANSI_oids[oid->data[7]]; |
422 if (memcmp(oid->data, po->oid.data, 8) == 0) |
501 if (oideql(oid->data, po->oid.data, reqlen, po->oid.len)) { |
423 ret = po; |
502 ret = po; |
|
503 } |
424 } |
504 } |
425 if (oid->data[6] == 0x01) { |
505 if (oid->data[6] == 0x01) { |
426 /* XXX bounds check */ |
506 /* XXX bounds check */ |
427 po = &ANSI_prime_oids[oid->data[7]]; |
507 po = &ANSI_prime_oids[oid->data[7]]; |
428 if (memcmp(oid->data, po->oid.data, 8) == 0) |
508 if (oideql(oid->data, po->oid.data, reqlen, po->oid.len)) { |
429 ret = po; |
509 ret = po; |
|
510 } |
430 } |
511 } |
431 } else if (oid->len == 5) { |
512 } else if (reqlen == 5) { |
432 /* XXX bounds check */ |
513 /* XXX bounds check */ |
433 po = &SECG_oids[oid->data[4]]; |
514 po = &SECG_oids[oid->data[4]]; |
434 if (memcmp(oid->data, po->oid.data, 5) == 0) |
515 if (oideql(oid->data, po->oid.data, reqlen, po->oid.len)) { |
435 ret = po; |
516 ret = po; |
|
517 } |
|
518 } else if (reqlen == 9) { |
|
519 /* XXX bounds check */ |
|
520 po = &BRAINPOOL_oids[oid->data[8]]; |
|
521 if (oideql(oid->data, po->oid.data, reqlen, po->oid.len)) { |
|
522 ret = po; |
|
523 } |
436 } |
524 } |
437 return(ret); |
525 return(ret); |
438 } |
526 } |
439 |
527 |
440 ECCurveName |
528 ECCurveName |