• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * This code is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 only, as
7  * published by the Free Software Foundation.  Oracle designates this
8  * particular file as subject to the "Classpath" exception as provided
9  * by Oracle in the LICENSE file that accompanied this code.
10  *
11  * This code is distributed in the hope that it will be useful, but WITHOUT
12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14  * version 2 for more details (a copy is included in the LICENSE file that
15  * accompanied this code).
16  *
17  * You should have received a copy of the GNU General Public License version
18  * 2 along with this work; if not, write to the Free Software Foundation,
19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20  *
21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22  * or visit www.oracle.com if you need additional information or have any
23  * questions.
24  */
25 
26 package sun.security.ec;
27 
28 import java.io.IOException;
29 import java.math.BigInteger;
30 import java.util.*;
31 import java.util.regex.Pattern;
32 
33 import java.security.spec.*;
34 
35 import sun.security.util.ObjectIdentifier;
36 import sun.security.util.DerOutputStream;
37 
38 /**
39  * Repository for well-known Elliptic Curve parameters. It is used by both
40  * the SunPKCS11 and SunJSSE code.
41  *
42  * @since   1.6
43  * @author  Andreas Sterbenz
44  */
45 public final class NamedCurve extends ECParameterSpec {
46 
47     // friendly name for toString() output
48     private final String name;
49 
50     // well known OID
51     private final ObjectIdentifier oid;
52 
53     // encoded form (as NamedCurve identified via OID)
54     private final byte[] encoded;
55 
NamedCurve(String name, ObjectIdentifier oid, EllipticCurve curve, ECPoint g, BigInteger n, int h)56     private NamedCurve(String name, ObjectIdentifier oid, EllipticCurve curve,
57             ECPoint g, BigInteger n, int h) throws IOException {
58         super(curve, g, n, h);
59         this.name = name;
60         this.oid = oid;
61 
62         DerOutputStream out = new DerOutputStream();
63         out.putOID(oid);
64         encoded = out.toByteArray();
65     }
66 
67     // Return a NamedCurve for the specified OID/name or null if unknown.
68     // Used by SunJSSE and SunPKCS11.
getECParameterSpec(String name)69     public static ECParameterSpec getECParameterSpec(String name) {
70         NamedCurve spec = oidMap.get(name);
71         return (spec != null) ? spec : nameMap.get(name);
72     }
73 
74     // Return a NamedCurve for the specified OID or null if unknown.
getECParameterSpec(ObjectIdentifier oid)75     static ECParameterSpec getECParameterSpec(ObjectIdentifier oid) {
76         return getECParameterSpec(oid.toString());
77     }
78 
79     // Return EC parameters for the specified field size. If there are known
80     // NIST recommended parameters for the given length, they are returned.
81     // Otherwise, if there are multiple matches for the given size, an
82     // arbitrary one is returns.
83     // If no parameters are known, the method returns null.
84     // NOTE that this method returns both prime and binary curves.
85     // Used by SunPKCS11.
getECParameterSpec(int length)86     public static ECParameterSpec getECParameterSpec(int length) {
87         return lengthMap.get(length);
88     }
89 
90     // Used by unit tests.
knownECParameterSpecs()91     public static Collection<? extends ECParameterSpec> knownECParameterSpecs() {
92         return Collections.unmodifiableCollection(oidMap.values());
93     }
94 
getEncoded()95     byte[] getEncoded() {
96         return encoded.clone();
97     }
98 
getObjectIdentifier()99     ObjectIdentifier getObjectIdentifier() {
100         return oid;
101     }
102 
toString()103     public String toString() {
104         return name + " (" + oid + ")";
105     }
106 
107     private static final Map<String,NamedCurve> oidMap =
108                                         new LinkedHashMap<String,NamedCurve>();
109     private static final Map<String,NamedCurve> nameMap =
110                                         new HashMap<String,NamedCurve>();
111     private static final Map<Integer,NamedCurve> lengthMap =
112                                         new HashMap<Integer,NamedCurve>();
113 
bi(String s)114     private static BigInteger bi(String s) {
115         return new BigInteger(s, 16);
116     }
117 
118     private static Pattern SPLIT_PATTERN = Pattern.compile(",|\\[|\\]");
119 
add(String name, String soid, int type, String sfield, String a, String b, String x, String y, String n, int h)120     private static void add(String name, String soid, int type, String sfield,
121             String a, String b, String x, String y, String n, int h) {
122         BigInteger p = bi(sfield);
123         ECField field;
124         if ((type == P) || (type == PD)) {
125             field = new ECFieldFp(p);
126         } else if ((type == B) || (type == BD)) {
127             field = new ECFieldF2m(p.bitLength() - 1, p);
128         } else {
129             throw new RuntimeException("Invalid type: " + type);
130         }
131 
132         EllipticCurve curve = new EllipticCurve(field, bi(a), bi(b));
133         ECPoint g = new ECPoint(bi(x), bi(y));
134 
135         try {
136             ObjectIdentifier oid = new ObjectIdentifier(soid);
137             NamedCurve params = new NamedCurve(name, oid, curve, g, bi(n), h);
138             if (oidMap.put(soid, params) != null) {
139                 throw new RuntimeException("Duplication oid: " + soid);
140             }
141             String[] commonNames = SPLIT_PATTERN.split(name);
142             for (String commonName : commonNames) {
143                 if (nameMap.put(commonName.trim(), params) != null) {
144                     throw new RuntimeException("Duplication name: " + commonName);
145                 }
146             }
147             int len = field.getFieldSize();
148             if ((type == PD) || (type == BD) || (lengthMap.get(len) == null)) {
149                 // add entry if none present for this field size or if
150                 // the curve is marked as a default curve.
151                 lengthMap.put(len, params);
152             }
153         } catch (IOException e) {
154             throw new RuntimeException("Internal error", e);
155         }
156     }
157 
158     private final static int P  = 1; // prime curve
159     private final static int B  = 2; // binary curve
160     private final static int PD = 5; // prime curve, mark as default
161     private final static int BD = 6; // binary curve, mark as default
162 
163     static {
164         /* SEC2 prime curves */
165         add("secp112r1", "1.3.132.0.6", P,
166             "DB7C2ABF62E35E668076BEAD208B",
167             "DB7C2ABF62E35E668076BEAD2088",
168             "659EF8BA043916EEDE8911702B22",
169             "09487239995A5EE76B55F9C2F098",
170             "A89CE5AF8724C0A23E0E0FF77500",
171             "DB7C2ABF62E35E7628DFAC6561C5",
172             1);
173 
174         add("secp112r2", "1.3.132.0.7", P,
175             "DB7C2ABF62E35E668076BEAD208B",
176             "6127C24C05F38A0AAAF65C0EF02C",
177             "51DEF1815DB5ED74FCC34C85D709",
178             "4BA30AB5E892B4E1649DD0928643",
179             "adcd46f5882e3747def36e956e97",
180             "36DF0AAFD8B8D7597CA10520D04B",
181             4);
182 
183         add("secp128r1", "1.3.132.0.28", P,
184             "FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFF",
185             "FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFC",
186             "E87579C11079F43DD824993C2CEE5ED3",
187             "161FF7528B899B2D0C28607CA52C5B86",
188             "CF5AC8395BAFEB13C02DA292DDED7A83",
189             "FFFFFFFE0000000075A30D1B9038A115",
190             1);
191 
192         add("secp128r2", "1.3.132.0.29", P,
193             "FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFF",
194             "D6031998D1B3BBFEBF59CC9BBFF9AEE1",
195             "5EEEFCA380D02919DC2C6558BB6D8A5D",
196             "7B6AA5D85E572983E6FB32A7CDEBC140",
197             "27B6916A894D3AEE7106FE805FC34B44",
198             "3FFFFFFF7FFFFFFFBE0024720613B5A3",
199             4);
200 
201         add("secp160k1", "1.3.132.0.9", P,
202             "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC73",
203             "0000000000000000000000000000000000000000",
204             "0000000000000000000000000000000000000007",
205             "3B4C382CE37AA192A4019E763036F4F5DD4D7EBB",
206             "938CF935318FDCED6BC28286531733C3F03C4FEE",
207             "0100000000000000000001B8FA16DFAB9ACA16B6B3",
208             1);
209 
210         add("secp160r1", "1.3.132.0.8", P,
211             "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFF",
212             "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFC",
213             "1C97BEFC54BD7A8B65ACF89F81D4D4ADC565FA45",
214             "4A96B5688EF573284664698968C38BB913CBFC82",
215             "23A628553168947D59DCC912042351377AC5FB32",
216             "0100000000000000000001F4C8F927AED3CA752257",
217             1);
218 
219         add("secp160r2", "1.3.132.0.30", P,
220             "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC73",
221             "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC70",
222             "B4E134D3FB59EB8BAB57274904664D5AF50388BA",
223             "52DCB034293A117E1F4FF11B30F7199D3144CE6D",
224             "FEAFFEF2E331F296E071FA0DF9982CFEA7D43F2E",
225             "0100000000000000000000351EE786A818F3A1A16B",
226             1);
227 
228         add("secp192k1", "1.3.132.0.31", P,
229             "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFEE37",
230             "000000000000000000000000000000000000000000000000",
231             "000000000000000000000000000000000000000000000003",
232             "DB4FF10EC057E9AE26B07D0280B7F4341DA5D1B1EAE06C7D",
233             "9B2F2F6D9C5628A7844163D015BE86344082AA88D95E2F9D",
234             "FFFFFFFFFFFFFFFFFFFFFFFE26F2FC170F69466A74DEFD8D",
235             1);
236 
237         add("secp192r1 [NIST P-192, X9.62 prime192v1]", "1.2.840.10045.3.1.1", PD,
238             "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF",
239             "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC",
240             "64210519E59C80E70FA7E9AB72243049FEB8DEECC146B9B1",
241             "188DA80EB03090F67CBF20EB43A18800F4FF0AFD82FF1012",
242             "07192B95FFC8DA78631011ED6B24CDD573F977A11E794811",
243             "FFFFFFFFFFFFFFFFFFFFFFFF99DEF836146BC9B1B4D22831",
244             1);
245 
246         add("secp224k1", "1.3.132.0.32", P,
247             "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFE56D",
248             "00000000000000000000000000000000000000000000000000000000",
249             "00000000000000000000000000000000000000000000000000000005",
250             "A1455B334DF099DF30FC28A169A467E9E47075A90F7E650EB6B7A45C",
251             "7E089FED7FBA344282CAFBD6F7E319F7C0B0BD59E2CA4BDB556D61A5",
252             "010000000000000000000000000001DCE8D2EC6184CAF0A971769FB1F7",
253             1);
254 
255         add("secp224r1 [NIST P-224]", "1.3.132.0.33", PD,
256             "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000001",
257             "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFE",
258             "B4050A850C04B3ABF54132565044B0B7D7BFD8BA270B39432355FFB4",
259             "B70E0CBD6BB4BF7F321390B94A03C1D356C21122343280D6115C1D21",
260             "BD376388B5F723FB4C22DFE6CD4375A05A07476444D5819985007E34",
261             "FFFFFFFFFFFFFFFFFFFFFFFFFFFF16A2E0B8F03E13DD29455C5C2A3D",
262             1);
263 
264         add("secp256k1", "1.3.132.0.10", P,
265             "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F",
266             "0000000000000000000000000000000000000000000000000000000000000000",
267             "0000000000000000000000000000000000000000000000000000000000000007",
268             "79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798",
269             "483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8",
270             "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141",
271             1);
272 
273         add("secp256r1 [NIST P-256, X9.62 prime256v1]", "1.2.840.10045.3.1.7", PD,
274             "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF",
275             "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC",
276             "5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B",
277             "6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296",
278             "4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5",
279             "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551",
280             1);
281 
282         add("secp384r1 [NIST P-384]", "1.3.132.0.34", PD,
283             "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFF",
284             "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFC",
285             "B3312FA7E23EE7E4988E056BE3F82D19181D9C6EFE8141120314088F5013875AC656398D8A2ED19D2A85C8EDD3EC2AEF",
286             "AA87CA22BE8B05378EB1C71EF320AD746E1D3B628BA79B9859F741E082542A385502F25DBF55296C3A545E3872760AB7",
287             "3617DE4A96262C6F5D9E98BF9292DC29F8F41DBD289A147CE9DA3113B5F0B8C00A60B1CE1D7E819D7A431D7C90EA0E5F",
288             "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7634D81F4372DDF581A0DB248B0A77AECEC196ACCC52973",
289             1);
290 
291         add("secp521r1 [NIST P-521]", "1.3.132.0.35", PD,
292             "01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
293             "01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC",
294             "0051953EB9618E1C9A1F929A21A0B68540EEA2DA725B99B315F3B8B489918EF109E156193951EC7E937B1652C0BD3BB1BF073573DF883D2C34F1EF451FD46B503F00",
295             "00C6858E06B70404E9CD9E3ECB662395B4429C648139053FB521F828AF606B4D3DBAA14B5E77EFE75928FE1DC127A2FFA8DE3348B3C1856A429BF97E7E31C2E5BD66",
296             "011839296A789A3BC0045C8A5FB42C7D1BD998F54449579B446817AFBD17273E662C97EE72995EF42640C550B9013FAD0761353C7086A272C24088BE94769FD16650",
297             "01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA51868783BF2F966B7FCC0148F709A5D03BB5C9B8899C47AEBB6FB71E91386409",
298             1);
299 
300         /* ANSI X9.62 prime curves */
301         add("X9.62 prime192v2", "1.2.840.10045.3.1.2", P,
302             "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF",
303             "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC",
304             "CC22D6DFB95C6B25E49C0D6364A4E5980C393AA21668D953",
305             "EEA2BAE7E1497842F2DE7769CFE9C989C072AD696F48034A",
306             "6574D11D69B6EC7A672BB82A083DF2F2B0847DE970B2DE15",
307             "FFFFFFFFFFFFFFFFFFFFFFFE5FB1A724DC80418648D8DD31",
308             1);
309 
310         add("X9.62 prime192v3", "1.2.840.10045.3.1.3", P,
311             "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF",
312             "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC",
313             "22123DC2395A05CAA7423DAECCC94760A7D462256BD56916",
314             "7D29778100C65A1DA1783716588DCE2B8B4AEE8E228F1896",
315             "38A90F22637337334B49DCB66A6DC8F9978ACA7648A943B0",
316             "FFFFFFFFFFFFFFFFFFFFFFFF7A62D031C83F4294F640EC13",
317             1);
318 
319         add("X9.62 prime239v1", "1.2.840.10045.3.1.4", P,
320             "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFF",
321             "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFC",
322             "6B016C3BDCF18941D0D654921475CA71A9DB2FB27D1D37796185C2942C0A",
323             "0FFA963CDCA8816CCC33B8642BEDF905C3D358573D3F27FBBD3B3CB9AAAF",
324             "7DEBE8E4E90A5DAE6E4054CA530BA04654B36818CE226B39FCCB7B02F1AE",
325             "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFF9E5E9A9F5D9071FBD1522688909D0B",
326             1);
327 
328         add("X9.62 prime239v2", "1.2.840.10045.3.1.5", P,
329             "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFF",
330             "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFC",
331             "617FAB6832576CBBFED50D99F0249C3FEE58B94BA0038C7AE84C8C832F2C",
332             "38AF09D98727705120C921BB5E9E26296A3CDCF2F35757A0EAFD87B830E7",
333             "5B0125E4DBEA0EC7206DA0FC01D9B081329FB555DE6EF460237DFF8BE4BA",
334             "7FFFFFFFFFFFFFFFFFFFFFFF800000CFA7E8594377D414C03821BC582063",
335             1);
336 
337         add("X9.62 prime239v3", "1.2.840.10045.3.1.6", P,
338             "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFF",
339             "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFC",
340             "255705FA2A306654B1F4CB03D6A750A30C250102D4988717D9BA15AB6D3E",
341             "6768AE8E18BB92CFCF005C949AA2C6D94853D0E660BBF854B1C9505FE95A",
342             "1607E6898F390C06BC1D552BAD226F3B6FCFE48B6E818499AF18E3ED6CF3",
343             "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFF975DEB41B3A6057C3C432146526551",
344             1);
345 
346         /* SEC2 binary curves */
347         add("sect113r1", "1.3.132.0.4", B,
348             "020000000000000000000000000201",
349             "003088250CA6E7C7FE649CE85820F7",
350             "00E8BEE4D3E2260744188BE0E9C723",
351             "009D73616F35F4AB1407D73562C10F",
352             "00A52830277958EE84D1315ED31886",
353             "0100000000000000D9CCEC8A39E56F",
354             2);
355 
356         add("sect113r2", "1.3.132.0.5", B,
357             "020000000000000000000000000201",
358             "00689918DBEC7E5A0DD6DFC0AA55C7",
359             "0095E9A9EC9B297BD4BF36E059184F",
360             "01A57A6A7B26CA5EF52FCDB8164797",
361             "00B3ADC94ED1FE674C06E695BABA1D",
362             "010000000000000108789B2496AF93",
363             2);
364 
365         add("sect131r1", "1.3.132.0.22", B,
366             "080000000000000000000000000000010D",
367             "07A11B09A76B562144418FF3FF8C2570B8",
368             "0217C05610884B63B9C6C7291678F9D341",
369             "0081BAF91FDF9833C40F9C181343638399",
370             "078C6E7EA38C001F73C8134B1B4EF9E150",
371             "0400000000000000023123953A9464B54D",
372             2);
373 
374         add("sect131r2", "1.3.132.0.23", B,
375             "080000000000000000000000000000010D",
376             "03E5A88919D7CAFCBF415F07C2176573B2",
377             "04B8266A46C55657AC734CE38F018F2192",
378             "0356DCD8F2F95031AD652D23951BB366A8",
379             "0648F06D867940A5366D9E265DE9EB240F",
380             "0400000000000000016954A233049BA98F",
381             2);
382 
383         add("sect163k1 [NIST K-163]", "1.3.132.0.1", BD,
384             "0800000000000000000000000000000000000000C9",
385             "000000000000000000000000000000000000000001",
386             "000000000000000000000000000000000000000001",
387             "02FE13C0537BBC11ACAA07D793DE4E6D5E5C94EEE8",
388             "0289070FB05D38FF58321F2E800536D538CCDAA3D9",
389             "04000000000000000000020108A2E0CC0D99F8A5EF",
390             2);
391 
392         add("sect163r1", "1.3.132.0.2", B,
393             "0800000000000000000000000000000000000000C9",
394             "07B6882CAAEFA84F9554FF8428BD88E246D2782AE2",
395             "0713612DCDDCB40AAB946BDA29CA91F73AF958AFD9",
396             "0369979697AB43897789566789567F787A7876A654",
397             "00435EDB42EFAFB2989D51FEFCE3C80988F41FF883",
398             "03FFFFFFFFFFFFFFFFFFFF48AAB689C29CA710279B",
399             2);
400 
401         add("sect163r2 [NIST B-163]", "1.3.132.0.15", BD,
402             "0800000000000000000000000000000000000000C9",
403             "000000000000000000000000000000000000000001",
404             "020A601907B8C953CA1481EB10512F78744A3205FD",
405             "03F0EBA16286A2D57EA0991168D4994637E8343E36",
406             "00D51FBC6C71A0094FA2CDD545B11C5C0C797324F1",
407             "040000000000000000000292FE77E70C12A4234C33",
408             2);
409 
410         add("sect193r1", "1.3.132.0.24", B,
411             "02000000000000000000000000000000000000000000008001",
412             "0017858FEB7A98975169E171F77B4087DE098AC8A911DF7B01",
413             "00FDFB49BFE6C3A89FACADAA7A1E5BBC7CC1C2E5D831478814",
414             "01F481BC5F0FF84A74AD6CDF6FDEF4BF6179625372D8C0C5E1",
415             "0025E399F2903712CCF3EA9E3A1AD17FB0B3201B6AF7CE1B05",
416             "01000000000000000000000000C7F34A778F443ACC920EBA49",
417             2);
418 
419         add("sect193r2", "1.3.132.0.25", B,
420             "02000000000000000000000000000000000000000000008001",
421             "0163F35A5137C2CE3EA6ED8667190B0BC43ECD69977702709B",
422             "00C9BB9E8927D4D64C377E2AB2856A5B16E3EFB7F61D4316AE",
423             "00D9B67D192E0367C803F39E1A7E82CA14A651350AAE617E8F",
424             "01CE94335607C304AC29E7DEFBD9CA01F596F927224CDECF6C",
425             "010000000000000000000000015AAB561B005413CCD4EE99D5",
426             2);
427 
428         add("sect233k1 [NIST K-233]", "1.3.132.0.26", BD,
429             "020000000000000000000000000000000000000004000000000000000001",
430             "000000000000000000000000000000000000000000000000000000000000",
431             "000000000000000000000000000000000000000000000000000000000001",
432             "017232BA853A7E731AF129F22FF4149563A419C26BF50A4C9D6EEFAD6126",
433             "01DB537DECE819B7F70F555A67C427A8CD9BF18AEB9B56E0C11056FAE6A3",
434             "008000000000000000000000000000069D5BB915BCD46EFB1AD5F173ABDF",
435             4);
436 
437         add("sect233r1 [NIST B-233]", "1.3.132.0.27", B,
438             "020000000000000000000000000000000000000004000000000000000001",
439             "000000000000000000000000000000000000000000000000000000000001",
440             "0066647EDE6C332C7F8C0923BB58213B333B20E9CE4281FE115F7D8F90AD",
441             "00FAC9DFCBAC8313BB2139F1BB755FEF65BC391F8B36F8F8EB7371FD558B",
442             "01006A08A41903350678E58528BEBF8A0BEFF867A7CA36716F7E01F81052",
443             "01000000000000000000000000000013E974E72F8A6922031D2603CFE0D7",
444             2);
445 
446         add("sect239k1", "1.3.132.0.3", B,
447             "800000000000000000004000000000000000000000000000000000000001",
448             "000000000000000000000000000000000000000000000000000000000000",
449             "000000000000000000000000000000000000000000000000000000000001",
450             "29A0B6A887A983E9730988A68727A8B2D126C44CC2CC7B2A6555193035DC",
451             "76310804F12E549BDB011C103089E73510ACB275FC312A5DC6B76553F0CA",
452             "2000000000000000000000000000005A79FEC67CB6E91F1C1DA800E478A5",
453             4);
454 
455         add("sect283k1 [NIST K-283]", "1.3.132.0.16", BD,
456             "0800000000000000000000000000000000000000000000000000000000000000000010A1",
457             "000000000000000000000000000000000000000000000000000000000000000000000000",
458             "000000000000000000000000000000000000000000000000000000000000000000000001",
459             "0503213F78CA44883F1A3B8162F188E553CD265F23C1567A16876913B0C2AC2458492836",
460             "01CCDA380F1C9E318D90F95D07E5426FE87E45C0E8184698E45962364E34116177DD2259",
461             "01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9AE2ED07577265DFF7F94451E061E163C61",
462             4);
463 
464         add("sect283r1 [NIST B-283]", "1.3.132.0.17", B,
465             "0800000000000000000000000000000000000000000000000000000000000000000010A1",
466             "000000000000000000000000000000000000000000000000000000000000000000000001",
467             "027B680AC8B8596DA5A4AF8A19A0303FCA97FD7645309FA2A581485AF6263E313B79A2F5",
468             "05F939258DB7DD90E1934F8C70B0DFEC2EED25B8557EAC9C80E2E198F8CDBECD86B12053",
469             "03676854FE24141CB98FE6D4B20D02B4516FF702350EDDB0826779C813F0DF45BE8112F4",
470             "03FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF90399660FC938A90165B042A7CEFADB307",
471             2);
472 
473         add("sect409k1 [NIST K-409]", "1.3.132.0.36", BD,
474             "02000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000001",
475             "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
476             "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
477             "0060F05F658F49C1AD3AB1890F7184210EFD0987E307C84C27ACCFB8F9F67CC2C460189EB5AAAA62EE222EB1B35540CFE9023746",
478             "01E369050B7C4E42ACBA1DACBF04299C3460782F918EA427E6325165E9EA10E3DA5F6C42E9C55215AA9CA27A5863EC48D8E0286B",
479             "007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5F83B2D4EA20400EC4557D5ED3E3E7CA5B4B5C83B8E01E5FCF",
480             4);
481 
482         add("sect409r1 [NIST B-409]", "1.3.132.0.37", B,
483             "02000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000001",
484             "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
485             "0021A5C2C8EE9FEB5C4B9A753B7B476B7FD6422EF1F3DD674761FA99D6AC27C8A9A197B272822F6CD57A55AA4F50AE317B13545F",
486             "015D4860D088DDB3496B0C6064756260441CDE4AF1771D4DB01FFE5B34E59703DC255A868A1180515603AEAB60794E54BB7996A7",
487             "0061B1CFAB6BE5F32BBFA78324ED106A7636B9C5A7BD198D0158AA4F5488D08F38514F1FDF4B4F40D2181B3681C364BA0273C706",
488             "010000000000000000000000000000000000000000000000000001E2AAD6A612F33307BE5FA47C3C9E052F838164CD37D9A21173",
489             2);
490 
491         add("sect571k1 [NIST K-571]", "1.3.132.0.38", BD,
492             "080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000425",
493             "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
494             "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
495             "026EB7A859923FBC82189631F8103FE4AC9CA2970012D5D46024804801841CA44370958493B205E647DA304DB4CEB08CBBD1BA39494776FB988B47174DCA88C7E2945283A01C8972",
496             "0349DC807F4FBF374F4AEADE3BCA95314DD58CEC9F307A54FFC61EFC006D8A2C9D4979C0AC44AEA74FBEBBB9F772AEDCB620B01A7BA7AF1B320430C8591984F601CD4C143EF1C7A3",
497             "020000000000000000000000000000000000000000000000000000000000000000000000131850E1F19A63E4B391A8DB917F4138B630D84BE5D639381E91DEB45CFE778F637C1001",
498             4);
499 
500         add("sect571r1 [NIST B-571]", "1.3.132.0.39", B,
501             "080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000425",
502             "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
503             "02F40E7E2221F295DE297117B7F3D62F5C6A97FFCB8CEFF1CD6BA8CE4A9A18AD84FFABBD8EFA59332BE7AD6756A66E294AFD185A78FF12AA520E4DE739BACA0C7FFEFF7F2955727A",
504             "0303001D34B856296C16C0D40D3CD7750A93D1D2955FA80AA5F40FC8DB7B2ABDBDE53950F4C0D293CDD711A35B67FB1499AE60038614F1394ABFA3B4C850D927E1E7769C8EEC2D19",
505             "037BF27342DA639B6DCCFFFEB73D69D78C6C27A6009CBBCA1980F8533921E8A684423E43BAB08A576291AF8F461BB2A8B3531D2F0485C19B16E2F1516E23DD3C1A4827AF1B8AC15B",
506             "03FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE661CE18FF55987308059B186823851EC7DD9CA1161DE93D5174D66E8382E9BB2FE84E47",
507             2);
508 
509         /* ANSI X9.62 binary curves */
510         add("X9.62 c2tnb191v1", "1.2.840.10045.3.0.5", B,
511             "800000000000000000000000000000000000000000000201",
512             "2866537B676752636A68F56554E12640276B649EF7526267",
513             "2E45EF571F00786F67B0081B9495A3D95462F5DE0AA185EC",
514             "36B3DAF8A23206F9C4F299D7B21A9C369137F2C84AE1AA0D",
515             "765BE73433B3F95E332932E70EA245CA2418EA0EF98018FB",
516             "40000000000000000000000004A20E90C39067C893BBB9A5",
517             2);
518 
519         add("X9.62 c2tnb191v2", "1.2.840.10045.3.0.6", B,
520             "800000000000000000000000000000000000000000000201",
521             "401028774D7777C7B7666D1366EA432071274F89FF01E718",
522             "0620048D28BCBD03B6249C99182B7C8CD19700C362C46A01",
523             "3809B2B7CC1B28CC5A87926AAD83FD28789E81E2C9E3BF10",
524             "17434386626D14F3DBF01760D9213A3E1CF37AEC437D668A",
525             "20000000000000000000000050508CB89F652824E06B8173",
526             4);
527 
528         add("X9.62 c2tnb191v3", "1.2.840.10045.3.0.7", B,
529             "800000000000000000000000000000000000000000000201",
530             "6C01074756099122221056911C77D77E77A777E7E7E77FCB",
531             "71FE1AF926CF847989EFEF8DB459F66394D90F32AD3F15E8",
532             "375D4CE24FDE434489DE8746E71786015009E66E38A926DD",
533             "545A39176196575D985999366E6AD34CE0A77CD7127B06BE",
534             "155555555555555555555555610C0B196812BFB6288A3EA3",
535             6);
536 
537         add("X9.62 c2tnb239v1", "1.2.840.10045.3.0.11", B,
538             "800000000000000000000000000000000000000000000000001000000001",
539             "32010857077C5431123A46B808906756F543423E8D27877578125778AC76",
540             "790408F2EEDAF392B012EDEFB3392F30F4327C0CA3F31FC383C422AA8C16",
541             "57927098FA932E7C0A96D3FD5B706EF7E5F5C156E16B7E7C86038552E91D",
542             "61D8EE5077C33FECF6F1A16B268DE469C3C7744EA9A971649FC7A9616305",
543             "2000000000000000000000000000000F4D42FFE1492A4993F1CAD666E447",
544             4);
545 
546         add("X9.62 c2tnb239v2", "1.2.840.10045.3.0.12", B,
547             "800000000000000000000000000000000000000000000000001000000001",
548             "4230017757A767FAE42398569B746325D45313AF0766266479B75654E65F",
549             "5037EA654196CFF0CD82B2C14A2FCF2E3FF8775285B545722F03EACDB74B",
550             "28F9D04E900069C8DC47A08534FE76D2B900B7D7EF31F5709F200C4CA205",
551             "5667334C45AFF3B5A03BAD9DD75E2C71A99362567D5453F7FA6E227EC833",
552             "1555555555555555555555555555553C6F2885259C31E3FCDF154624522D",
553             6);
554 
555         add("X9.62 c2tnb239v3", "1.2.840.10045.3.0.13", B,
556             "800000000000000000000000000000000000000000000000001000000001",
557             "01238774666A67766D6676F778E676B66999176666E687666D8766C66A9F",
558             "6A941977BA9F6A435199ACFC51067ED587F519C5ECB541B8E44111DE1D40",
559             "70F6E9D04D289C4E89913CE3530BFDE903977D42B146D539BF1BDE4E9C92",
560             "2E5A0EAF6E5E1305B9004DCE5C0ED7FE59A35608F33837C816D80B79F461",
561             "0CCCCCCCCCCCCCCCCCCCCCCCCCCCCCAC4912D2D9DF903EF9888B8A0E4CFF",
562             0xA);
563 
564         add("X9.62 c2tnb359v1", "1.2.840.10045.3.0.18", B,
565             "800000000000000000000000000000000000000000000000000000000000000000000000100000000000000001",
566             "5667676A654B20754F356EA92017D946567C46675556F19556A04616B567D223A5E05656FB549016A96656A557",
567             "2472E2D0197C49363F1FE7F5B6DB075D52B6947D135D8CA445805D39BC345626089687742B6329E70680231988",
568             "3C258EF3047767E7EDE0F1FDAA79DAEE3841366A132E163ACED4ED2401DF9C6BDCDE98E8E707C07A2239B1B097",
569             "53D7E08529547048121E9C95F3791DD804963948F34FAE7BF44EA82365DC7868FE57E4AE2DE211305A407104BD",
570             "01AF286BCA1AF286BCA1AF286BCA1AF286BCA1AF286BC9FB8F6B85C556892C20A7EB964FE7719E74F490758D3B",
571             0x4C);
572 
573         add("X9.62 c2tnb431r1", "1.2.840.10045.3.0.20", B,
574             "800000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000001",
575             "1A827EF00DD6FC0E234CAF046C6A5D8A85395B236CC4AD2CF32A0CADBDC9DDF620B0EB9906D0957F6C6FEACD615468DF104DE296CD8F",
576             "10D9B4A3D9047D8B154359ABFB1B7F5485B04CEB868237DDC9DEDA982A679A5A919B626D4E50A8DD731B107A9962381FB5D807BF2618",
577             "120FC05D3C67A99DE161D2F4092622FECA701BE4F50F4758714E8A87BBF2A658EF8C21E7C5EFE965361F6C2999C0C247B0DBD70CE6B7",
578             "20D0AF8903A96F8D5FA2C255745D3C451B302C9346D9B7E485E7BCE41F6B591F3E8F6ADDCBB0BC4C2F947A7DE1A89B625D6A598B3760",
579             "0340340340340340340340340340340340340340340340340340340323C313FAB50589703B5EC68D3587FEC60D161CC149C1AD4A91",
580             0x2760);
581 
582         /* ANSI X9.62 binary curves from the 1998 standard but forbidden
583          * in the 2005 version of the standard.
584          * We don't register them but leave them here for the time being in
585          * case we need to support them after all.
586          */
587 /*
588         add("X9.62 c2pnb163v1", "1.2.840.10045.3.0.1", B,
589             "080000000000000000000000000000000000000107",
590             "072546B5435234A422E0789675F432C89435DE5242",
591             "00C9517D06D5240D3CFF38C74B20B6CD4D6F9DD4D9",
592             "07AF69989546103D79329FCC3D74880F33BBE803CB",
593             "01EC23211B5966ADEA1D3F87F7EA5848AEF0B7CA9F",
594             "0400000000000000000001E60FC8821CC74DAEAFC1",
595             2);
596 
597         add("X9.62 c2pnb163v2", "1.2.840.10045.3.0.2", B,
598             "080000000000000000000000000000000000000107",
599             "0108B39E77C4B108BED981ED0E890E117C511CF072",
600             "0667ACEB38AF4E488C407433FFAE4F1C811638DF20",
601             "0024266E4EB5106D0A964D92C4860E2671DB9B6CC5",
602             "079F684DDF6684C5CD258B3890021B2386DFD19FC5",
603             "03FFFFFFFFFFFFFFFFFFFDF64DE1151ADBB78F10A7",
604             2);
605 
606         add("X9.62 c2pnb163v3", "1.2.840.10045.3.0.3", B,
607             "080000000000000000000000000000000000000107",
608             "07A526C63D3E25A256A007699F5447E32AE456B50E",
609             "03F7061798EB99E238FD6F1BF95B48FEEB4854252B",
610             "02F9F87B7C574D0BDECF8A22E6524775F98CDEBDCB",
611             "05B935590C155E17EA48EB3FF3718B893DF59A05D0",
612             "03FFFFFFFFFFFFFFFFFFFE1AEE140F110AFF961309",
613             2);
614 
615         add("X9.62 c2pnb176w1", "1.2.840.10045.3.0.4", B,
616             "0100000000000000000000000000000000080000000007",
617             "E4E6DB2995065C407D9D39B8D0967B96704BA8E9C90B",
618             "5DDA470ABE6414DE8EC133AE28E9BBD7FCEC0AE0FFF2",
619             "8D16C2866798B600F9F08BB4A8E860F3298CE04A5798",
620             "6FA4539C2DADDDD6BAB5167D61B436E1D92BB16A562C",
621             "00010092537397ECA4F6145799D62B0A19CE06FE26AD",
622             0xFF6E);
623 
624         add("X9.62 c2pnb208w1", "1.2.840.10045.3.0.10", B,
625             "010000000000000000000000000000000800000000000000000007",
626             "0000000000000000000000000000000000000000000000000000",
627             "C8619ED45A62E6212E1160349E2BFA844439FAFC2A3FD1638F9E",
628             "89FDFBE4ABE193DF9559ECF07AC0CE78554E2784EB8C1ED1A57A",
629             "0F55B51A06E78E9AC38A035FF520D8B01781BEB1A6BB08617DE3",
630             "000101BAF95C9723C57B6C21DA2EFF2D5ED588BDD5717E212F9D",
631             0xFE48);
632 
633         add("X9.62 c2pnb272w1", "1.2.840.10045.3.0.16", B,
634             "010000000000000000000000000000000000000000000000000000010000000000000B",
635             "91A091F03B5FBA4AB2CCF49C4EDD220FB028712D42BE752B2C40094DBACDB586FB20",
636             "7167EFC92BB2E3CE7C8AAAFF34E12A9C557003D7C73A6FAF003F99F6CC8482E540F7",
637             "6108BABB2CEEBCF787058A056CBE0CFE622D7723A289E08A07AE13EF0D10D171DD8D",
638             "10C7695716851EEF6BA7F6872E6142FBD241B830FF5EFCACECCAB05E02005DDE9D23",
639             "000100FAF51354E0E39E4892DF6E319C72C8161603FA45AA7B998A167B8F1E629521",
640             0xFF06);
641 
642         add("X9.62 c2pnb304w1", "1.2.840.10045.3.0.17", B,
643             "010000000000000000000000000000000000000000000000000000000000000000000000000807",
644             "FD0D693149A118F651E6DCE6802085377E5F882D1B510B44160074C1288078365A0396C8E681",
645             "BDDB97E555A50A908E43B01C798EA5DAA6788F1EA2794EFCF57166B8C14039601E55827340BE",
646             "197B07845E9BE2D96ADB0F5F3C7F2CFFBD7A3EB8B6FEC35C7FD67F26DDF6285A644F740A2614",
647             "E19FBEB76E0DA171517ECF401B50289BF014103288527A9B416A105E80260B549FDC1B92C03B",
648             "000101D556572AABAC800101D556572AABAC8001022D5C91DD173F8FB561DA6899164443051D",
649             0xFE2E);
650 
651         add("X9.62 c2pnb368w1", "1.2.840.10045.3.0.19", B,
652             "0100000000000000000000000000000000000000000000000000000000000000000000002000000000000000000007",
653             "E0D2EE25095206F5E2A4F9ED229F1F256E79A0E2B455970D8D0D865BD94778C576D62F0AB7519CCD2A1A906AE30D",
654             "FC1217D4320A90452C760A58EDCD30C8DD069B3C34453837A34ED50CB54917E1C2112D84D164F444F8F74786046A",
655             "1085E2755381DCCCE3C1557AFA10C2F0C0C2825646C5B34A394CBCFA8BC16B22E7E789E927BE216F02E1FB136A5F",
656             "7B3EB1BDDCBA62D5D8B2059B525797FC73822C59059C623A45FF3843CEE8F87CD1855ADAA81E2A0750B80FDA2310",
657             "00010090512DA9AF72B08349D98A5DD4C7B0532ECA51CE03E2D10F3B7AC579BD87E909AE40A6F131E9CFCE5BD967",
658             0xFF70);
659 */
660 
661         SPLIT_PATTERN = null;
662     }
663 
664 }
665