src/jdk.crypto.ec/share/native/libsunec/impl/oid.c
changeset 50731 ed322b4cfe49
parent 47216 71c04702a3d5
equal deleted inserted replaced
50729:7755c93d3923 50731:ed322b4cfe49
     1 /*
     1 /*
     2  * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved.
     2  * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved.
     3  * Use is subject to license terms.
     3  * Use is subject to license terms.
     4  *
     4  *
     5  * This library is free software; you can redistribute it and/or
     5  * This library is free software; you can redistribute it and/or
     6  * modify it under the terms of the GNU Lesser General Public
     6  * modify it under the terms of the GNU Lesser General Public
     7  * License as published by the Free Software Foundation; either
     7  * License as published by the Free Software Foundation; either
    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