Path: blob/aarch64-shenandoah-jdk8u272-b10/jdk/src/share/native/sun/security/ec/impl/oid.c
38918 views
/*1* Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved.2* Use is subject to license terms.3*4* This library is free software; you can redistribute it and/or5* modify it under the terms of the GNU Lesser General Public6* License as published by the Free Software Foundation; either7* version 2.1 of the License, or (at your option) any later version.8*9* This library is distributed in the hope that it will be useful,10* but WITHOUT ANY WARRANTY; without even the implied warranty of11* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU12* Lesser General Public License for more details.13*14* You should have received a copy of the GNU Lesser General Public License15* along with this library; if not, write to the Free Software Foundation,16* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.17*18* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA19* or visit www.oracle.com if you need additional information or have any20* questions.21*/2223/* *********************************************************************24*25* The Original Code is the Netscape security libraries.26*27* The Initial Developer of the Original Code is28* Netscape Communications Corporation.29* Portions created by the Initial Developer are Copyright (C) 1994-200030* the Initial Developer. All Rights Reserved.31*32* Contributor(s):33* Dr Vipul Gupta <[email protected]>, Sun Microsystems Laboratories34*35* Last Modified Date from the Original Code: March 201236*********************************************************************** */3738#include <sys/types.h>3940#ifndef _WIN3241#if !defined(__linux__) && !defined(_ALLBSD_SOURCE)42#include <sys/systm.h>43#endif /* __linux__ || _ALLBSD_SOURCE */44#include <sys/param.h>45#endif /* _WIN32 */4647#ifdef _KERNEL48#include <sys/kmem.h>49#else50#include <string.h>51#endif52#include "ec.h"53#include "ecl-curve.h"54#include "ecc_impl.h"55#include "secoidt.h"5657#define CERTICOM_OID 0x2b, 0x81, 0x0458#define SECG_OID CERTICOM_OID, 0x005960#define ANSI_X962_OID 0x2a, 0x86, 0x48, 0xce, 0x3d61#define ANSI_X962_CURVE_OID ANSI_X962_OID, 0x0362#define ANSI_X962_GF2m_OID ANSI_X962_CURVE_OID, 0x0063#define ANSI_X962_GFp_OID ANSI_X962_CURVE_OID, 0x016465#define CONST_OID static const unsigned char6667/* ANSI X9.62 prime curve OIDs */68/* NOTE: prime192v1 is the same as secp192r1, prime256v1 is the69* same as secp256r170*/71CONST_OID ansiX962prime192v1[] = { ANSI_X962_GFp_OID, 0x01 };72CONST_OID ansiX962prime192v2[] = { ANSI_X962_GFp_OID, 0x02 };73CONST_OID ansiX962prime192v3[] = { ANSI_X962_GFp_OID, 0x03 };74CONST_OID ansiX962prime239v1[] = { ANSI_X962_GFp_OID, 0x04 };75CONST_OID ansiX962prime239v2[] = { ANSI_X962_GFp_OID, 0x05 };76CONST_OID ansiX962prime239v3[] = { ANSI_X962_GFp_OID, 0x06 };77CONST_OID ansiX962prime256v1[] = { ANSI_X962_GFp_OID, 0x07 };7879/* SECG prime curve OIDs */80CONST_OID secgECsecp112r1[] = { SECG_OID, 0x06 };81CONST_OID secgECsecp112r2[] = { SECG_OID, 0x07 };82CONST_OID secgECsecp128r1[] = { SECG_OID, 0x1c };83CONST_OID secgECsecp128r2[] = { SECG_OID, 0x1d };84CONST_OID secgECsecp160k1[] = { SECG_OID, 0x09 };85CONST_OID secgECsecp160r1[] = { SECG_OID, 0x08 };86CONST_OID secgECsecp160r2[] = { SECG_OID, 0x1e };87CONST_OID secgECsecp192k1[] = { SECG_OID, 0x1f };88CONST_OID secgECsecp224k1[] = { SECG_OID, 0x20 };89CONST_OID secgECsecp224r1[] = { SECG_OID, 0x21 };90CONST_OID secgECsecp256k1[] = { SECG_OID, 0x0a };91CONST_OID secgECsecp384r1[] = { SECG_OID, 0x22 };92CONST_OID secgECsecp521r1[] = { SECG_OID, 0x23 };9394/* SECG characterisitic two curve OIDs */95CONST_OID secgECsect113r1[] = {SECG_OID, 0x04 };96CONST_OID secgECsect113r2[] = {SECG_OID, 0x05 };97CONST_OID secgECsect131r1[] = {SECG_OID, 0x16 };98CONST_OID secgECsect131r2[] = {SECG_OID, 0x17 };99CONST_OID secgECsect163k1[] = {SECG_OID, 0x01 };100CONST_OID secgECsect163r1[] = {SECG_OID, 0x02 };101CONST_OID secgECsect163r2[] = {SECG_OID, 0x0f };102CONST_OID secgECsect193r1[] = {SECG_OID, 0x18 };103CONST_OID secgECsect193r2[] = {SECG_OID, 0x19 };104CONST_OID secgECsect233k1[] = {SECG_OID, 0x1a };105CONST_OID secgECsect233r1[] = {SECG_OID, 0x1b };106CONST_OID secgECsect239k1[] = {SECG_OID, 0x03 };107CONST_OID secgECsect283k1[] = {SECG_OID, 0x10 };108CONST_OID secgECsect283r1[] = {SECG_OID, 0x11 };109CONST_OID secgECsect409k1[] = {SECG_OID, 0x24 };110CONST_OID secgECsect409r1[] = {SECG_OID, 0x25 };111CONST_OID secgECsect571k1[] = {SECG_OID, 0x26 };112CONST_OID secgECsect571r1[] = {SECG_OID, 0x27 };113114/* ANSI X9.62 characteristic two curve OIDs */115CONST_OID ansiX962c2pnb163v1[] = { ANSI_X962_GF2m_OID, 0x01 };116CONST_OID ansiX962c2pnb163v2[] = { ANSI_X962_GF2m_OID, 0x02 };117CONST_OID ansiX962c2pnb163v3[] = { ANSI_X962_GF2m_OID, 0x03 };118CONST_OID ansiX962c2pnb176v1[] = { ANSI_X962_GF2m_OID, 0x04 };119CONST_OID ansiX962c2tnb191v1[] = { ANSI_X962_GF2m_OID, 0x05 };120CONST_OID ansiX962c2tnb191v2[] = { ANSI_X962_GF2m_OID, 0x06 };121CONST_OID ansiX962c2tnb191v3[] = { ANSI_X962_GF2m_OID, 0x07 };122CONST_OID ansiX962c2onb191v4[] = { ANSI_X962_GF2m_OID, 0x08 };123CONST_OID ansiX962c2onb191v5[] = { ANSI_X962_GF2m_OID, 0x09 };124CONST_OID ansiX962c2pnb208w1[] = { ANSI_X962_GF2m_OID, 0x0a };125CONST_OID ansiX962c2tnb239v1[] = { ANSI_X962_GF2m_OID, 0x0b };126CONST_OID ansiX962c2tnb239v2[] = { ANSI_X962_GF2m_OID, 0x0c };127CONST_OID ansiX962c2tnb239v3[] = { ANSI_X962_GF2m_OID, 0x0d };128CONST_OID ansiX962c2onb239v4[] = { ANSI_X962_GF2m_OID, 0x0e };129CONST_OID ansiX962c2onb239v5[] = { ANSI_X962_GF2m_OID, 0x0f };130CONST_OID ansiX962c2pnb272w1[] = { ANSI_X962_GF2m_OID, 0x10 };131CONST_OID ansiX962c2pnb304w1[] = { ANSI_X962_GF2m_OID, 0x11 };132CONST_OID ansiX962c2tnb359v1[] = { ANSI_X962_GF2m_OID, 0x12 };133CONST_OID ansiX962c2pnb368w1[] = { ANSI_X962_GF2m_OID, 0x13 };134CONST_OID ansiX962c2tnb431r1[] = { ANSI_X962_GF2m_OID, 0x14 };135136#define OI(x) { siDEROID, (unsigned char *)x, sizeof x }137#ifndef SECOID_NO_STRINGS138#define OD(oid,tag,desc,mech,ext) { OI(oid), tag, desc, mech, ext }139#else140#define OD(oid,tag,desc,mech,ext) { OI(oid), tag, 0, mech, ext }141#endif142143#define CKM_INVALID_MECHANISM 0xffffffffUL144145/* XXX this is incorrect */146#define INVALID_CERT_EXTENSION 1147148#define CKM_ECDSA 0x00001041149#define CKM_ECDSA_SHA1 0x00001042150#define CKM_ECDH1_DERIVE 0x00001050151152static SECOidData ANSI_prime_oids[] = {153{ { siDEROID, NULL, 0 }, ECCurve_noName,154"Unknown OID", CKM_INVALID_MECHANISM, INVALID_CERT_EXTENSION },155156OD( ansiX962prime192v1, ECCurve_NIST_P192,157"ANSI X9.62 elliptic curve prime192v1 (aka secp192r1, NIST P-192)",158CKM_INVALID_MECHANISM,159INVALID_CERT_EXTENSION ),160OD( ansiX962prime192v2, ECCurve_X9_62_PRIME_192V2,161"ANSI X9.62 elliptic curve prime192v2",162CKM_INVALID_MECHANISM,163INVALID_CERT_EXTENSION ),164OD( ansiX962prime192v3, ECCurve_X9_62_PRIME_192V3,165"ANSI X9.62 elliptic curve prime192v3",166CKM_INVALID_MECHANISM,167INVALID_CERT_EXTENSION ),168OD( ansiX962prime239v1, ECCurve_X9_62_PRIME_239V1,169"ANSI X9.62 elliptic curve prime239v1",170CKM_INVALID_MECHANISM,171INVALID_CERT_EXTENSION ),172OD( ansiX962prime239v2, ECCurve_X9_62_PRIME_239V2,173"ANSI X9.62 elliptic curve prime239v2",174CKM_INVALID_MECHANISM,175INVALID_CERT_EXTENSION ),176OD( ansiX962prime239v3, ECCurve_X9_62_PRIME_239V3,177"ANSI X9.62 elliptic curve prime239v3",178CKM_INVALID_MECHANISM,179INVALID_CERT_EXTENSION ),180OD( ansiX962prime256v1, ECCurve_NIST_P256,181"ANSI X9.62 elliptic curve prime256v1 (aka secp256r1, NIST P-256)",182CKM_INVALID_MECHANISM,183INVALID_CERT_EXTENSION )184};185186static SECOidData SECG_oids[] = {187{ { siDEROID, NULL, 0 }, ECCurve_noName,188"Unknown OID", CKM_INVALID_MECHANISM, INVALID_CERT_EXTENSION },189190OD( secgECsect163k1, ECCurve_NIST_K163,191"SECG elliptic curve sect163k1 (aka NIST K-163)",192CKM_INVALID_MECHANISM,193INVALID_CERT_EXTENSION ),194OD( secgECsect163r1, ECCurve_SECG_CHAR2_163R1,195"SECG elliptic curve sect163r1",196CKM_INVALID_MECHANISM,197INVALID_CERT_EXTENSION ),198OD( secgECsect239k1, ECCurve_SECG_CHAR2_239K1,199"SECG elliptic curve sect239k1",200CKM_INVALID_MECHANISM,201INVALID_CERT_EXTENSION ),202OD( secgECsect113r1, ECCurve_SECG_CHAR2_113R1,203"SECG elliptic curve sect113r1",204CKM_INVALID_MECHANISM,205INVALID_CERT_EXTENSION ),206OD( secgECsect113r2, ECCurve_SECG_CHAR2_113R2,207"SECG elliptic curve sect113r2",208CKM_INVALID_MECHANISM,209INVALID_CERT_EXTENSION ),210OD( secgECsecp112r1, ECCurve_SECG_PRIME_112R1,211"SECG elliptic curve secp112r1",212CKM_INVALID_MECHANISM,213INVALID_CERT_EXTENSION ),214OD( secgECsecp112r2, ECCurve_SECG_PRIME_112R2,215"SECG elliptic curve secp112r2",216CKM_INVALID_MECHANISM,217INVALID_CERT_EXTENSION ),218OD( secgECsecp160r1, ECCurve_SECG_PRIME_160R1,219"SECG elliptic curve secp160r1",220CKM_INVALID_MECHANISM,221INVALID_CERT_EXTENSION ),222OD( secgECsecp160k1, ECCurve_SECG_PRIME_160K1,223"SECG elliptic curve secp160k1",224CKM_INVALID_MECHANISM,225INVALID_CERT_EXTENSION ),226OD( secgECsecp256k1, ECCurve_SECG_PRIME_256K1,227"SECG elliptic curve secp256k1",228CKM_INVALID_MECHANISM,229INVALID_CERT_EXTENSION ),230{ { siDEROID, NULL, 0 }, ECCurve_noName,231"Unknown OID", CKM_INVALID_MECHANISM, INVALID_CERT_EXTENSION },232{ { siDEROID, NULL, 0 }, ECCurve_noName,233"Unknown OID", CKM_INVALID_MECHANISM, INVALID_CERT_EXTENSION },234{ { siDEROID, NULL, 0 }, ECCurve_noName,235"Unknown OID", CKM_INVALID_MECHANISM, INVALID_CERT_EXTENSION },236{ { siDEROID, NULL, 0 }, ECCurve_noName,237"Unknown OID", CKM_INVALID_MECHANISM, INVALID_CERT_EXTENSION },238OD( secgECsect163r2, ECCurve_NIST_B163,239"SECG elliptic curve sect163r2 (aka NIST B-163)",240CKM_INVALID_MECHANISM,241INVALID_CERT_EXTENSION ),242OD( secgECsect283k1, ECCurve_NIST_K283,243"SECG elliptic curve sect283k1 (aka NIST K-283)",244CKM_INVALID_MECHANISM,245INVALID_CERT_EXTENSION ),246OD( secgECsect283r1, ECCurve_NIST_B283,247"SECG elliptic curve sect283r1 (aka NIST B-283)",248CKM_INVALID_MECHANISM,249INVALID_CERT_EXTENSION ),250{ { siDEROID, NULL, 0 }, ECCurve_noName,251"Unknown OID", CKM_INVALID_MECHANISM, INVALID_CERT_EXTENSION },252{ { siDEROID, NULL, 0 }, ECCurve_noName,253"Unknown OID", CKM_INVALID_MECHANISM, INVALID_CERT_EXTENSION },254{ { siDEROID, NULL, 0 }, ECCurve_noName,255"Unknown OID", CKM_INVALID_MECHANISM, INVALID_CERT_EXTENSION },256{ { siDEROID, NULL, 0 }, ECCurve_noName,257"Unknown OID", CKM_INVALID_MECHANISM, INVALID_CERT_EXTENSION },258OD( secgECsect131r1, ECCurve_SECG_CHAR2_131R1,259"SECG elliptic curve sect131r1",260CKM_INVALID_MECHANISM,261INVALID_CERT_EXTENSION ),262OD( secgECsect131r2, ECCurve_SECG_CHAR2_131R2,263"SECG elliptic curve sect131r2",264CKM_INVALID_MECHANISM,265INVALID_CERT_EXTENSION ),266OD( secgECsect193r1, ECCurve_SECG_CHAR2_193R1,267"SECG elliptic curve sect193r1",268CKM_INVALID_MECHANISM,269INVALID_CERT_EXTENSION ),270OD( secgECsect193r2, ECCurve_SECG_CHAR2_193R2,271"SECG elliptic curve sect193r2",272CKM_INVALID_MECHANISM,273INVALID_CERT_EXTENSION ),274OD( secgECsect233k1, ECCurve_NIST_K233,275"SECG elliptic curve sect233k1 (aka NIST K-233)",276CKM_INVALID_MECHANISM,277INVALID_CERT_EXTENSION ),278OD( secgECsect233r1, ECCurve_NIST_B233,279"SECG elliptic curve sect233r1 (aka NIST B-233)",280CKM_INVALID_MECHANISM,281INVALID_CERT_EXTENSION ),282OD( secgECsecp128r1, ECCurve_SECG_PRIME_128R1,283"SECG elliptic curve secp128r1",284CKM_INVALID_MECHANISM,285INVALID_CERT_EXTENSION ),286OD( secgECsecp128r2, ECCurve_SECG_PRIME_128R2,287"SECG elliptic curve secp128r2",288CKM_INVALID_MECHANISM,289INVALID_CERT_EXTENSION ),290OD( secgECsecp160r2, ECCurve_SECG_PRIME_160R2,291"SECG elliptic curve secp160r2",292CKM_INVALID_MECHANISM,293INVALID_CERT_EXTENSION ),294OD( secgECsecp192k1, ECCurve_SECG_PRIME_192K1,295"SECG elliptic curve secp192k1",296CKM_INVALID_MECHANISM,297INVALID_CERT_EXTENSION ),298OD( secgECsecp224k1, ECCurve_SECG_PRIME_224K1,299"SECG elliptic curve secp224k1",300CKM_INVALID_MECHANISM,301INVALID_CERT_EXTENSION ),302OD( secgECsecp224r1, ECCurve_NIST_P224,303"SECG elliptic curve secp224r1 (aka NIST P-224)",304CKM_INVALID_MECHANISM,305INVALID_CERT_EXTENSION ),306OD( secgECsecp384r1, ECCurve_NIST_P384,307"SECG elliptic curve secp384r1 (aka NIST P-384)",308CKM_INVALID_MECHANISM,309INVALID_CERT_EXTENSION ),310OD( secgECsecp521r1, ECCurve_NIST_P521,311"SECG elliptic curve secp521r1 (aka NIST P-521)",312CKM_INVALID_MECHANISM,313INVALID_CERT_EXTENSION ),314OD( secgECsect409k1, ECCurve_NIST_K409,315"SECG elliptic curve sect409k1 (aka NIST K-409)",316CKM_INVALID_MECHANISM,317INVALID_CERT_EXTENSION ),318OD( secgECsect409r1, ECCurve_NIST_B409,319"SECG elliptic curve sect409r1 (aka NIST B-409)",320CKM_INVALID_MECHANISM,321INVALID_CERT_EXTENSION ),322OD( secgECsect571k1, ECCurve_NIST_K571,323"SECG elliptic curve sect571k1 (aka NIST K-571)",324CKM_INVALID_MECHANISM,325INVALID_CERT_EXTENSION ),326OD( secgECsect571r1, ECCurve_NIST_B571,327"SECG elliptic curve sect571r1 (aka NIST B-571)",328CKM_INVALID_MECHANISM,329INVALID_CERT_EXTENSION )330};331332static SECOidData ANSI_oids[] = {333{ { siDEROID, NULL, 0 }, ECCurve_noName,334"Unknown OID", CKM_INVALID_MECHANISM, INVALID_CERT_EXTENSION },335336/* ANSI X9.62 named elliptic curves (characteristic two field) */337OD( ansiX962c2pnb163v1, ECCurve_X9_62_CHAR2_PNB163V1,338"ANSI X9.62 elliptic curve c2pnb163v1",339CKM_INVALID_MECHANISM,340INVALID_CERT_EXTENSION ),341OD( ansiX962c2pnb163v2, ECCurve_X9_62_CHAR2_PNB163V2,342"ANSI X9.62 elliptic curve c2pnb163v2",343CKM_INVALID_MECHANISM,344INVALID_CERT_EXTENSION ),345OD( ansiX962c2pnb163v3, ECCurve_X9_62_CHAR2_PNB163V3,346"ANSI X9.62 elliptic curve c2pnb163v3",347CKM_INVALID_MECHANISM,348INVALID_CERT_EXTENSION ),349OD( ansiX962c2pnb176v1, ECCurve_X9_62_CHAR2_PNB176V1,350"ANSI X9.62 elliptic curve c2pnb176v1",351CKM_INVALID_MECHANISM,352INVALID_CERT_EXTENSION ),353OD( ansiX962c2tnb191v1, ECCurve_X9_62_CHAR2_TNB191V1,354"ANSI X9.62 elliptic curve c2tnb191v1",355CKM_INVALID_MECHANISM,356INVALID_CERT_EXTENSION ),357OD( ansiX962c2tnb191v2, ECCurve_X9_62_CHAR2_TNB191V2,358"ANSI X9.62 elliptic curve c2tnb191v2",359CKM_INVALID_MECHANISM,360INVALID_CERT_EXTENSION ),361OD( ansiX962c2tnb191v3, ECCurve_X9_62_CHAR2_TNB191V3,362"ANSI X9.62 elliptic curve c2tnb191v3",363CKM_INVALID_MECHANISM,364INVALID_CERT_EXTENSION ),365{ { siDEROID, NULL, 0 }, ECCurve_noName,366"Unknown OID", CKM_INVALID_MECHANISM, INVALID_CERT_EXTENSION },367{ { siDEROID, NULL, 0 }, ECCurve_noName,368"Unknown OID", CKM_INVALID_MECHANISM, INVALID_CERT_EXTENSION },369OD( ansiX962c2pnb208w1, ECCurve_X9_62_CHAR2_PNB208W1,370"ANSI X9.62 elliptic curve c2pnb208w1",371CKM_INVALID_MECHANISM,372INVALID_CERT_EXTENSION ),373OD( ansiX962c2tnb239v1, ECCurve_X9_62_CHAR2_TNB239V1,374"ANSI X9.62 elliptic curve c2tnb239v1",375CKM_INVALID_MECHANISM,376INVALID_CERT_EXTENSION ),377OD( ansiX962c2tnb239v2, ECCurve_X9_62_CHAR2_TNB239V2,378"ANSI X9.62 elliptic curve c2tnb239v2",379CKM_INVALID_MECHANISM,380INVALID_CERT_EXTENSION ),381OD( ansiX962c2tnb239v3, ECCurve_X9_62_CHAR2_TNB239V3,382"ANSI X9.62 elliptic curve c2tnb239v3",383CKM_INVALID_MECHANISM,384INVALID_CERT_EXTENSION ),385{ { siDEROID, NULL, 0 }, ECCurve_noName,386"Unknown OID", CKM_INVALID_MECHANISM, INVALID_CERT_EXTENSION },387{ { siDEROID, NULL, 0 }, ECCurve_noName,388"Unknown OID", CKM_INVALID_MECHANISM, INVALID_CERT_EXTENSION },389OD( ansiX962c2pnb272w1, ECCurve_X9_62_CHAR2_PNB272W1,390"ANSI X9.62 elliptic curve c2pnb272w1",391CKM_INVALID_MECHANISM,392INVALID_CERT_EXTENSION ),393OD( ansiX962c2pnb304w1, ECCurve_X9_62_CHAR2_PNB304W1,394"ANSI X9.62 elliptic curve c2pnb304w1",395CKM_INVALID_MECHANISM,396INVALID_CERT_EXTENSION ),397OD( ansiX962c2tnb359v1, ECCurve_X9_62_CHAR2_TNB359V1,398"ANSI X9.62 elliptic curve c2tnb359v1",399CKM_INVALID_MECHANISM,400INVALID_CERT_EXTENSION ),401OD( ansiX962c2pnb368w1, ECCurve_X9_62_CHAR2_PNB368W1,402"ANSI X9.62 elliptic curve c2pnb368w1",403CKM_INVALID_MECHANISM,404INVALID_CERT_EXTENSION ),405OD( ansiX962c2tnb431r1, ECCurve_X9_62_CHAR2_TNB431R1,406"ANSI X9.62 elliptic curve c2tnb431r1",407CKM_INVALID_MECHANISM,408INVALID_CERT_EXTENSION )409};410411SECOidData *412SECOID_FindOID(const SECItem *oid)413{414SECOidData *po;415SECOidData *ret = NULL;416417if (oid->len == 8) {418if (oid->data[6] == 0x00) {419/* XXX bounds check */420po = &ANSI_oids[oid->data[7]];421if (memcmp(oid->data, po->oid.data, 8) == 0)422ret = po;423}424if (oid->data[6] == 0x01) {425/* XXX bounds check */426po = &ANSI_prime_oids[oid->data[7]];427if (memcmp(oid->data, po->oid.data, 8) == 0)428ret = po;429}430} else if (oid->len == 5) {431/* XXX bounds check */432po = &SECG_oids[oid->data[4]];433if (memcmp(oid->data, po->oid.data, 5) == 0)434ret = po;435}436return(ret);437}438439ECCurveName440SECOID_FindOIDTag(const SECItem *oid)441{442SECOidData *oiddata;443444oiddata = SECOID_FindOID (oid);445if (oiddata == NULL)446return ECCurve_noName;447448return oiddata->offset;449}450451452