1 /*
2  * Copyright (c) 2006, 2016, 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.util;
27 
28 import java.math.BigInteger;
29 
30 import java.security.spec.*;
31 
32 import java.util.*;
33 import java.util.regex.Pattern;
34 
35 /**
36  * Repository for well-known Elliptic Curve parameters. It is used by both
37  * the SunPKCS11 and SunJSSE code.
38  *
39  * @since   1.6
40  * @author  Andreas Sterbenz
41  */
42 public class CurveDB {
43     private static final int P  = 1; // prime curve
44     private static final int B  = 2; // binary curve
45     private static final int PD = 5; // prime curve, mark as default
46     private static final int BD = 6; // binary curve, mark as default
47 
48     private static final Map<String,NamedCurve> oidMap =
49         new LinkedHashMap<String,NamedCurve>();
50     private static final Map<String,NamedCurve> nameMap =
51         new HashMap<String,NamedCurve>();
52     private static final Map<Integer,NamedCurve> lengthMap =
53         new HashMap<Integer,NamedCurve>();
54 
55     private static Collection<? extends NamedCurve> specCollection;
56 
57     public static final String SPLIT_PATTERN = ",|\\[|\\]";
58 
59     // Used by SunECEntries
getSupportedCurves()60     public static Collection<? extends NamedCurve>getSupportedCurves() {
61         return specCollection;
62     }
63 
64     // Return a NamedCurve for the specified OID/name or null if unknown.
lookup(String name)65     static NamedCurve lookup(String name) {
66         NamedCurve spec = oidMap.get(name);
67         if (spec != null) {
68             return spec;
69         }
70 
71         return nameMap.get(name);
72     }
73 
74     // Return EC parameters for the specified field size. If there are known
75     // NIST recommended parameters for the given length, they are returned.
76     // Otherwise, if there are multiple matches for the given size, an
77     // arbitrary one is returns.
78     // If no parameters are known, the method returns null.
79     // NOTE that this method returns both prime and binary curves.
lookup(int length)80     static NamedCurve lookup(int length) {
81         return lengthMap.get(length);
82     }
83 
84     // Convert the given ECParameterSpec object to a NamedCurve object.
85     // If params does not represent a known named curve, return null.
lookup(ECParameterSpec params)86     static NamedCurve lookup(ECParameterSpec params) {
87         if ((params instanceof NamedCurve) || (params == null)) {
88             return (NamedCurve)params;
89         }
90 
91         // This is a hack to allow SunJSSE to work with 3rd party crypto
92         // providers for ECC and not just SunPKCS11.
93         // This can go away once we decide how to expose curve names in the
94         // public API.
95         // Note that it assumes that the 3rd party provider encodes named
96         // curves using the short form, not explicitly. If it did that, then
97         // the SunJSSE TLS ECC extensions are wrong, which could lead to
98         // interoperability problems.
99         int fieldSize = params.getCurve().getField().getFieldSize();
100         for (NamedCurve namedCurve : specCollection) {
101             // ECParameterSpec does not define equals, so check all the
102             // components ourselves.
103             // Quick field size check first
104             if (namedCurve.getCurve().getField().getFieldSize() != fieldSize) {
105                 continue;
106             }
107             if (namedCurve.getCurve().equals(params.getCurve()) == false) {
108                 continue;
109             }
110             if (namedCurve.getGenerator().equals(params.getGenerator()) ==
111                     false) {
112                 continue;
113             }
114             if (namedCurve.getOrder().equals(params.getOrder()) == false) {
115                 continue;
116             }
117             if (namedCurve.getCofactor() != params.getCofactor()) {
118                 continue;
119             }
120             // everything matches our named curve, return it
121             return namedCurve;
122         }
123         // no match found
124         return null;
125     }
126 
bi(String s)127     private static BigInteger bi(String s) {
128         return new BigInteger(s, 16);
129     }
130 
add(String name, String soid, int type, String sfield, String a, String b, String x, String y, String n, int h, Pattern nameSplitPattern)131     private static void add(String name, String soid, int type, String sfield,
132             String a, String b, String x, String y, String n, int h,
133             Pattern nameSplitPattern) {
134         BigInteger p = bi(sfield);
135         ECField field;
136         if ((type == P) || (type == PD)) {
137             field = new ECFieldFp(p);
138         } else if ((type == B) || (type == BD)) {
139             field = new ECFieldF2m(p.bitLength() - 1, p);
140         } else {
141             throw new RuntimeException("Invalid type: " + type);
142         }
143 
144         EllipticCurve curve = new EllipticCurve(field, bi(a), bi(b));
145         ECPoint g = new ECPoint(bi(x), bi(y));
146 
147         NamedCurve params = new NamedCurve(name, soid, curve, g, bi(n), h);
148         if (oidMap.put(soid, params) != null) {
149             throw new RuntimeException("Duplication oid: " + soid);
150         }
151 
152         String[] commonNames = nameSplitPattern.split(name);
153         for (String commonName : commonNames) {
154             if (nameMap.put(commonName.trim(), params) != null) {
155                 throw new RuntimeException("Duplication name: " + commonName);
156             }
157         }
158 
159         int len = field.getFieldSize();
160         if ((type == PD) || (type == BD) || (lengthMap.get(len) == null)) {
161             // add entry if none present for this field size or if
162             // the curve is marked as a default curve.
163             lengthMap.put(len, params);
164         }
165     }
166 
167     static {
168         Pattern nameSplitPattern = Pattern.compile(SPLIT_PATTERN);
169 
170         /* SEC2 prime curves */
171         add("secp112r1", "1.3.132.0.6", P,
172             "DB7C2ABF62E35E668076BEAD208B",
173             "DB7C2ABF62E35E668076BEAD2088",
174             "659EF8BA043916EEDE8911702B22",
175             "09487239995A5EE76B55F9C2F098",
176             "A89CE5AF8724C0A23E0E0FF77500",
177             "DB7C2ABF62E35E7628DFAC6561C5",
178             1, nameSplitPattern);
179 
180         add("secp112r2", "1.3.132.0.7", P,
181             "DB7C2ABF62E35E668076BEAD208B",
182             "6127C24C05F38A0AAAF65C0EF02C",
183             "51DEF1815DB5ED74FCC34C85D709",
184             "4BA30AB5E892B4E1649DD0928643",
185             "adcd46f5882e3747def36e956e97",
186             "36DF0AAFD8B8D7597CA10520D04B",
187             4, nameSplitPattern);
188 
189         add("secp128r1", "1.3.132.0.28", P,
190             "FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFF",
191             "FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFC",
192             "E87579C11079F43DD824993C2CEE5ED3",
193             "161FF7528B899B2D0C28607CA52C5B86",
194             "CF5AC8395BAFEB13C02DA292DDED7A83",
195             "FFFFFFFE0000000075A30D1B9038A115",
196             1, nameSplitPattern);
197 
198         add("secp128r2", "1.3.132.0.29", P,
199             "FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFF",
200             "D6031998D1B3BBFEBF59CC9BBFF9AEE1",
201             "5EEEFCA380D02919DC2C6558BB6D8A5D",
202             "7B6AA5D85E572983E6FB32A7CDEBC140",
203             "27B6916A894D3AEE7106FE805FC34B44",
204             "3FFFFFFF7FFFFFFFBE0024720613B5A3",
205             4, nameSplitPattern);
206 
207         add("secp160k1", "1.3.132.0.9", P,
208             "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC73",
209             "0000000000000000000000000000000000000000",
210             "0000000000000000000000000000000000000007",
211             "3B4C382CE37AA192A4019E763036F4F5DD4D7EBB",
212             "938CF935318FDCED6BC28286531733C3F03C4FEE",
213             "0100000000000000000001B8FA16DFAB9ACA16B6B3",
214             1, nameSplitPattern);
215 
216         add("secp160r1", "1.3.132.0.8", P,
217             "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFF",
218             "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFC",
219             "1C97BEFC54BD7A8B65ACF89F81D4D4ADC565FA45",
220             "4A96B5688EF573284664698968C38BB913CBFC82",
221             "23A628553168947D59DCC912042351377AC5FB32",
222             "0100000000000000000001F4C8F927AED3CA752257",
223             1, nameSplitPattern);
224 
225         add("secp160r2", "1.3.132.0.30", P,
226             "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC73",
227             "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC70",
228             "B4E134D3FB59EB8BAB57274904664D5AF50388BA",
229             "52DCB034293A117E1F4FF11B30F7199D3144CE6D",
230             "FEAFFEF2E331F296E071FA0DF9982CFEA7D43F2E",
231             "0100000000000000000000351EE786A818F3A1A16B",
232             1, nameSplitPattern);
233 
234         add("secp192k1", "1.3.132.0.31", P,
235             "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFEE37",
236             "000000000000000000000000000000000000000000000000",
237             "000000000000000000000000000000000000000000000003",
238             "DB4FF10EC057E9AE26B07D0280B7F4341DA5D1B1EAE06C7D",
239             "9B2F2F6D9C5628A7844163D015BE86344082AA88D95E2F9D",
240             "FFFFFFFFFFFFFFFFFFFFFFFE26F2FC170F69466A74DEFD8D",
241             1, nameSplitPattern);
242 
243         add("secp192r1 [NIST P-192, X9.62 prime192v1]", "1.2.840.10045.3.1.1", PD,
244             "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF",
245             "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC",
246             "64210519E59C80E70FA7E9AB72243049FEB8DEECC146B9B1",
247             "188DA80EB03090F67CBF20EB43A18800F4FF0AFD82FF1012",
248             "07192B95FFC8DA78631011ED6B24CDD573F977A11E794811",
249             "FFFFFFFFFFFFFFFFFFFFFFFF99DEF836146BC9B1B4D22831",
250             1, nameSplitPattern);
251 
252         add("secp224k1", "1.3.132.0.32", P,
253             "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFE56D",
254             "00000000000000000000000000000000000000000000000000000000",
255             "00000000000000000000000000000000000000000000000000000005",
256             "A1455B334DF099DF30FC28A169A467E9E47075A90F7E650EB6B7A45C",
257             "7E089FED7FBA344282CAFBD6F7E319F7C0B0BD59E2CA4BDB556D61A5",
258             "010000000000000000000000000001DCE8D2EC6184CAF0A971769FB1F7",
259             1, nameSplitPattern);
260 
261         add("secp224r1 [NIST P-224]", "1.3.132.0.33", PD,
262             "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000001",
263             "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFE",
264             "B4050A850C04B3ABF54132565044B0B7D7BFD8BA270B39432355FFB4",
265             "B70E0CBD6BB4BF7F321390B94A03C1D356C21122343280D6115C1D21",
266             "BD376388B5F723FB4C22DFE6CD4375A05A07476444D5819985007E34",
267             "FFFFFFFFFFFFFFFFFFFFFFFFFFFF16A2E0B8F03E13DD29455C5C2A3D",
268             1, nameSplitPattern);
269 
270         add("secp256k1", "1.3.132.0.10", P,
271             "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F",
272             "0000000000000000000000000000000000000000000000000000000000000000",
273             "0000000000000000000000000000000000000000000000000000000000000007",
274             "79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798",
275             "483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8",
276             "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141",
277             1, nameSplitPattern);
278 
279         add("secp256r1 [NIST P-256, X9.62 prime256v1]", "1.2.840.10045.3.1.7", PD,
280             "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF",
281             "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC",
282             "5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B",
283             "6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296",
284             "4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5",
285             "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551",
286             1, nameSplitPattern);
287 
288         add("secp384r1 [NIST P-384]", "1.3.132.0.34", PD,
289             "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFF",
290             "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFC",
291             "B3312FA7E23EE7E4988E056BE3F82D19181D9C6EFE8141120314088F5013875AC656398D8A2ED19D2A85C8EDD3EC2AEF",
292             "AA87CA22BE8B05378EB1C71EF320AD746E1D3B628BA79B9859F741E082542A385502F25DBF55296C3A545E3872760AB7",
293             "3617DE4A96262C6F5D9E98BF9292DC29F8F41DBD289A147CE9DA3113B5F0B8C00A60B1CE1D7E819D7A431D7C90EA0E5F",
294             "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7634D81F4372DDF581A0DB248B0A77AECEC196ACCC52973",
295             1, nameSplitPattern);
296 
297         add("secp521r1 [NIST P-521]", "1.3.132.0.35", PD,
298             "01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
299             "01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC",
300             "0051953EB9618E1C9A1F929A21A0B68540EEA2DA725B99B315F3B8B489918EF109E156193951EC7E937B1652C0BD3BB1BF073573DF883D2C34F1EF451FD46B503F00",
301             "00C6858E06B70404E9CD9E3ECB662395B4429C648139053FB521F828AF606B4D3DBAA14B5E77EFE75928FE1DC127A2FFA8DE3348B3C1856A429BF97E7E31C2E5BD66",
302             "011839296A789A3BC0045C8A5FB42C7D1BD998F54449579B446817AFBD17273E662C97EE72995EF42640C550B9013FAD0761353C7086A272C24088BE94769FD16650",
303             "01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA51868783BF2F966B7FCC0148F709A5D03BB5C9B8899C47AEBB6FB71E91386409",
304             1, nameSplitPattern);
305 
306         /* ANSI X9.62 prime curves */
307         add("X9.62 prime192v2", "1.2.840.10045.3.1.2", P,
308             "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF",
309             "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC",
310             "CC22D6DFB95C6B25E49C0D6364A4E5980C393AA21668D953",
311             "EEA2BAE7E1497842F2DE7769CFE9C989C072AD696F48034A",
312             "6574D11D69B6EC7A672BB82A083DF2F2B0847DE970B2DE15",
313             "FFFFFFFFFFFFFFFFFFFFFFFE5FB1A724DC80418648D8DD31",
314             1, nameSplitPattern);
315 
316         add("X9.62 prime192v3", "1.2.840.10045.3.1.3", P,
317             "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF",
318             "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC",
319             "22123DC2395A05CAA7423DAECCC94760A7D462256BD56916",
320             "7D29778100C65A1DA1783716588DCE2B8B4AEE8E228F1896",
321             "38A90F22637337334B49DCB66A6DC8F9978ACA7648A943B0",
322             "FFFFFFFFFFFFFFFFFFFFFFFF7A62D031C83F4294F640EC13",
323             1, nameSplitPattern);
324 
325         add("X9.62 prime239v1", "1.2.840.10045.3.1.4", P,
326             "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFF",
327             "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFC",
328             "6B016C3BDCF18941D0D654921475CA71A9DB2FB27D1D37796185C2942C0A",
329             "0FFA963CDCA8816CCC33B8642BEDF905C3D358573D3F27FBBD3B3CB9AAAF",
330             "7DEBE8E4E90A5DAE6E4054CA530BA04654B36818CE226B39FCCB7B02F1AE",
331             "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFF9E5E9A9F5D9071FBD1522688909D0B",
332             1, nameSplitPattern);
333 
334         add("X9.62 prime239v2", "1.2.840.10045.3.1.5", P,
335             "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFF",
336             "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFC",
337             "617FAB6832576CBBFED50D99F0249C3FEE58B94BA0038C7AE84C8C832F2C",
338             "38AF09D98727705120C921BB5E9E26296A3CDCF2F35757A0EAFD87B830E7",
339             "5B0125E4DBEA0EC7206DA0FC01D9B081329FB555DE6EF460237DFF8BE4BA",
340             "7FFFFFFFFFFFFFFFFFFFFFFF800000CFA7E8594377D414C03821BC582063",
341             1, nameSplitPattern);
342 
343         add("X9.62 prime239v3", "1.2.840.10045.3.1.6", P,
344             "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFF",
345             "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFC",
346             "255705FA2A306654B1F4CB03D6A750A30C250102D4988717D9BA15AB6D3E",
347             "6768AE8E18BB92CFCF005C949AA2C6D94853D0E660BBF854B1C9505FE95A",
348             "1607E6898F390C06BC1D552BAD226F3B6FCFE48B6E818499AF18E3ED6CF3",
349             "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFF975DEB41B3A6057C3C432146526551",
350             1, nameSplitPattern);
351 
352         /* SEC2 binary curves */
353         add("sect113r1", "1.3.132.0.4", B,
354             "020000000000000000000000000201",
355             "003088250CA6E7C7FE649CE85820F7",
356             "00E8BEE4D3E2260744188BE0E9C723",
357             "009D73616F35F4AB1407D73562C10F",
358             "00A52830277958EE84D1315ED31886",
359             "0100000000000000D9CCEC8A39E56F",
360             2, nameSplitPattern);
361 
362         add("sect113r2", "1.3.132.0.5", B,
363             "020000000000000000000000000201",
364             "00689918DBEC7E5A0DD6DFC0AA55C7",
365             "0095E9A9EC9B297BD4BF36E059184F",
366             "01A57A6A7B26CA5EF52FCDB8164797",
367             "00B3ADC94ED1FE674C06E695BABA1D",
368             "010000000000000108789B2496AF93",
369             2, nameSplitPattern);
370 
371         add("sect131r1", "1.3.132.0.22", B,
372             "080000000000000000000000000000010D",
373             "07A11B09A76B562144418FF3FF8C2570B8",
374             "0217C05610884B63B9C6C7291678F9D341",
375             "0081BAF91FDF9833C40F9C181343638399",
376             "078C6E7EA38C001F73C8134B1B4EF9E150",
377             "0400000000000000023123953A9464B54D",
378             2, nameSplitPattern);
379 
380         add("sect131r2", "1.3.132.0.23", B,
381             "080000000000000000000000000000010D",
382             "03E5A88919D7CAFCBF415F07C2176573B2",
383             "04B8266A46C55657AC734CE38F018F2192",
384             "0356DCD8F2F95031AD652D23951BB366A8",
385             "0648F06D867940A5366D9E265DE9EB240F",
386             "0400000000000000016954A233049BA98F",
387             2, nameSplitPattern);
388 
389         add("sect163k1 [NIST K-163]", "1.3.132.0.1", BD,
390             "0800000000000000000000000000000000000000C9",
391             "000000000000000000000000000000000000000001",
392             "000000000000000000000000000000000000000001",
393             "02FE13C0537BBC11ACAA07D793DE4E6D5E5C94EEE8",
394             "0289070FB05D38FF58321F2E800536D538CCDAA3D9",
395             "04000000000000000000020108A2E0CC0D99F8A5EF",
396             2, nameSplitPattern);
397 
398         add("sect163r1", "1.3.132.0.2", B,
399             "0800000000000000000000000000000000000000C9",
400             "07B6882CAAEFA84F9554FF8428BD88E246D2782AE2",
401             "0713612DCDDCB40AAB946BDA29CA91F73AF958AFD9",
402             "0369979697AB43897789566789567F787A7876A654",
403             "00435EDB42EFAFB2989D51FEFCE3C80988F41FF883",
404             "03FFFFFFFFFFFFFFFFFFFF48AAB689C29CA710279B",
405             2, nameSplitPattern);
406 
407         add("sect163r2 [NIST B-163]", "1.3.132.0.15", BD,
408             "0800000000000000000000000000000000000000C9",
409             "000000000000000000000000000000000000000001",
410             "020A601907B8C953CA1481EB10512F78744A3205FD",
411             "03F0EBA16286A2D57EA0991168D4994637E8343E36",
412             "00D51FBC6C71A0094FA2CDD545B11C5C0C797324F1",
413             "040000000000000000000292FE77E70C12A4234C33",
414             2, nameSplitPattern);
415 
416         add("sect193r1", "1.3.132.0.24", B,
417             "02000000000000000000000000000000000000000000008001",
418             "0017858FEB7A98975169E171F77B4087DE098AC8A911DF7B01",
419             "00FDFB49BFE6C3A89FACADAA7A1E5BBC7CC1C2E5D831478814",
420             "01F481BC5F0FF84A74AD6CDF6FDEF4BF6179625372D8C0C5E1",
421             "0025E399F2903712CCF3EA9E3A1AD17FB0B3201B6AF7CE1B05",
422             "01000000000000000000000000C7F34A778F443ACC920EBA49",
423             2, nameSplitPattern);
424 
425         add("sect193r2", "1.3.132.0.25", B,
426             "02000000000000000000000000000000000000000000008001",
427             "0163F35A5137C2CE3EA6ED8667190B0BC43ECD69977702709B",
428             "00C9BB9E8927D4D64C377E2AB2856A5B16E3EFB7F61D4316AE",
429             "00D9B67D192E0367C803F39E1A7E82CA14A651350AAE617E8F",
430             "01CE94335607C304AC29E7DEFBD9CA01F596F927224CDECF6C",
431             "010000000000000000000000015AAB561B005413CCD4EE99D5",
432             2, nameSplitPattern);
433 
434         add("sect233k1 [NIST K-233]", "1.3.132.0.26", BD,
435             "020000000000000000000000000000000000000004000000000000000001",
436             "000000000000000000000000000000000000000000000000000000000000",
437             "000000000000000000000000000000000000000000000000000000000001",
438             "017232BA853A7E731AF129F22FF4149563A419C26BF50A4C9D6EEFAD6126",
439             "01DB537DECE819B7F70F555A67C427A8CD9BF18AEB9B56E0C11056FAE6A3",
440             "008000000000000000000000000000069D5BB915BCD46EFB1AD5F173ABDF",
441             4, nameSplitPattern);
442 
443         add("sect233r1 [NIST B-233]", "1.3.132.0.27", B,
444             "020000000000000000000000000000000000000004000000000000000001",
445             "000000000000000000000000000000000000000000000000000000000001",
446             "0066647EDE6C332C7F8C0923BB58213B333B20E9CE4281FE115F7D8F90AD",
447             "00FAC9DFCBAC8313BB2139F1BB755FEF65BC391F8B36F8F8EB7371FD558B",
448             "01006A08A41903350678E58528BEBF8A0BEFF867A7CA36716F7E01F81052",
449             "01000000000000000000000000000013E974E72F8A6922031D2603CFE0D7",
450             2, nameSplitPattern);
451 
452         add("sect239k1", "1.3.132.0.3", B,
453             "800000000000000000004000000000000000000000000000000000000001",
454             "000000000000000000000000000000000000000000000000000000000000",
455             "000000000000000000000000000000000000000000000000000000000001",
456             "29A0B6A887A983E9730988A68727A8B2D126C44CC2CC7B2A6555193035DC",
457             "76310804F12E549BDB011C103089E73510ACB275FC312A5DC6B76553F0CA",
458             "2000000000000000000000000000005A79FEC67CB6E91F1C1DA800E478A5",
459             4, nameSplitPattern);
460 
461         add("sect283k1 [NIST K-283]", "1.3.132.0.16", BD,
462             "0800000000000000000000000000000000000000000000000000000000000000000010A1",
463             "000000000000000000000000000000000000000000000000000000000000000000000000",
464             "000000000000000000000000000000000000000000000000000000000000000000000001",
465             "0503213F78CA44883F1A3B8162F188E553CD265F23C1567A16876913B0C2AC2458492836",
466             "01CCDA380F1C9E318D90F95D07E5426FE87E45C0E8184698E45962364E34116177DD2259",
467             "01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9AE2ED07577265DFF7F94451E061E163C61",
468             4, nameSplitPattern);
469 
470         add("sect283r1 [NIST B-283]", "1.3.132.0.17", B,
471             "0800000000000000000000000000000000000000000000000000000000000000000010A1",
472             "000000000000000000000000000000000000000000000000000000000000000000000001",
473             "027B680AC8B8596DA5A4AF8A19A0303FCA97FD7645309FA2A581485AF6263E313B79A2F5",
474             "05F939258DB7DD90E1934F8C70B0DFEC2EED25B8557EAC9C80E2E198F8CDBECD86B12053",
475             "03676854FE24141CB98FE6D4B20D02B4516FF702350EDDB0826779C813F0DF45BE8112F4",
476             "03FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF90399660FC938A90165B042A7CEFADB307",
477             2, nameSplitPattern);
478 
479         add("sect409k1 [NIST K-409]", "1.3.132.0.36", BD,
480             "02000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000001",
481             "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
482             "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
483             "0060F05F658F49C1AD3AB1890F7184210EFD0987E307C84C27ACCFB8F9F67CC2C460189EB5AAAA62EE222EB1B35540CFE9023746",
484             "01E369050B7C4E42ACBA1DACBF04299C3460782F918EA427E6325165E9EA10E3DA5F6C42E9C55215AA9CA27A5863EC48D8E0286B",
485             "007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5F83B2D4EA20400EC4557D5ED3E3E7CA5B4B5C83B8E01E5FCF",
486             4, nameSplitPattern);
487 
488         add("sect409r1 [NIST B-409]", "1.3.132.0.37", B,
489             "02000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000001",
490             "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
491             "0021A5C2C8EE9FEB5C4B9A753B7B476B7FD6422EF1F3DD674761FA99D6AC27C8A9A197B272822F6CD57A55AA4F50AE317B13545F",
492             "015D4860D088DDB3496B0C6064756260441CDE4AF1771D4DB01FFE5B34E59703DC255A868A1180515603AEAB60794E54BB7996A7",
493             "0061B1CFAB6BE5F32BBFA78324ED106A7636B9C5A7BD198D0158AA4F5488D08F38514F1FDF4B4F40D2181B3681C364BA0273C706",
494             "010000000000000000000000000000000000000000000000000001E2AAD6A612F33307BE5FA47C3C9E052F838164CD37D9A21173",
495             2, nameSplitPattern);
496 
497         add("sect571k1 [NIST K-571]", "1.3.132.0.38", BD,
498             "080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000425",
499             "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
500             "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
501             "026EB7A859923FBC82189631F8103FE4AC9CA2970012D5D46024804801841CA44370958493B205E647DA304DB4CEB08CBBD1BA39494776FB988B47174DCA88C7E2945283A01C8972",
502             "0349DC807F4FBF374F4AEADE3BCA95314DD58CEC9F307A54FFC61EFC006D8A2C9D4979C0AC44AEA74FBEBBB9F772AEDCB620B01A7BA7AF1B320430C8591984F601CD4C143EF1C7A3",
503             "020000000000000000000000000000000000000000000000000000000000000000000000131850E1F19A63E4B391A8DB917F4138B630D84BE5D639381E91DEB45CFE778F637C1001",
504             4, nameSplitPattern);
505 
506         add("sect571r1 [NIST B-571]", "1.3.132.0.39", B,
507             "080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000425",
508             "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
509             "02F40E7E2221F295DE297117B7F3D62F5C6A97FFCB8CEFF1CD6BA8CE4A9A18AD84FFABBD8EFA59332BE7AD6756A66E294AFD185A78FF12AA520E4DE739BACA0C7FFEFF7F2955727A",
510             "0303001D34B856296C16C0D40D3CD7750A93D1D2955FA80AA5F40FC8DB7B2ABDBDE53950F4C0D293CDD711A35B67FB1499AE60038614F1394ABFA3B4C850D927E1E7769C8EEC2D19",
511             "037BF27342DA639B6DCCFFFEB73D69D78C6C27A6009CBBCA1980F8533921E8A684423E43BAB08A576291AF8F461BB2A8B3531D2F0485C19B16E2F1516E23DD3C1A4827AF1B8AC15B",
512             "03FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE661CE18FF55987308059B186823851EC7DD9CA1161DE93D5174D66E8382E9BB2FE84E47",
513             2, nameSplitPattern);
514 
515         /* ANSI X9.62 binary curves */
516         add("X9.62 c2tnb191v1", "1.2.840.10045.3.0.5", B,
517             "800000000000000000000000000000000000000000000201",
518             "2866537B676752636A68F56554E12640276B649EF7526267",
519             "2E45EF571F00786F67B0081B9495A3D95462F5DE0AA185EC",
520             "36B3DAF8A23206F9C4F299D7B21A9C369137F2C84AE1AA0D",
521             "765BE73433B3F95E332932E70EA245CA2418EA0EF98018FB",
522             "40000000000000000000000004A20E90C39067C893BBB9A5",
523             2, nameSplitPattern);
524 
525         add("X9.62 c2tnb191v2", "1.2.840.10045.3.0.6", B,
526             "800000000000000000000000000000000000000000000201",
527             "401028774D7777C7B7666D1366EA432071274F89FF01E718",
528             "0620048D28BCBD03B6249C99182B7C8CD19700C362C46A01",
529             "3809B2B7CC1B28CC5A87926AAD83FD28789E81E2C9E3BF10",
530             "17434386626D14F3DBF01760D9213A3E1CF37AEC437D668A",
531             "20000000000000000000000050508CB89F652824E06B8173",
532             4, nameSplitPattern);
533 
534         add("X9.62 c2tnb191v3", "1.2.840.10045.3.0.7", B,
535             "800000000000000000000000000000000000000000000201",
536             "6C01074756099122221056911C77D77E77A777E7E7E77FCB",
537             "71FE1AF926CF847989EFEF8DB459F66394D90F32AD3F15E8",
538             "375D4CE24FDE434489DE8746E71786015009E66E38A926DD",
539             "545A39176196575D985999366E6AD34CE0A77CD7127B06BE",
540             "155555555555555555555555610C0B196812BFB6288A3EA3",
541             6, nameSplitPattern);
542 
543         add("X9.62 c2tnb239v1", "1.2.840.10045.3.0.11", B,
544             "800000000000000000000000000000000000000000000000001000000001",
545             "32010857077C5431123A46B808906756F543423E8D27877578125778AC76",
546             "790408F2EEDAF392B012EDEFB3392F30F4327C0CA3F31FC383C422AA8C16",
547             "57927098FA932E7C0A96D3FD5B706EF7E5F5C156E16B7E7C86038552E91D",
548             "61D8EE5077C33FECF6F1A16B268DE469C3C7744EA9A971649FC7A9616305",
549             "2000000000000000000000000000000F4D42FFE1492A4993F1CAD666E447",
550             4, nameSplitPattern);
551 
552         add("X9.62 c2tnb239v2", "1.2.840.10045.3.0.12", B,
553             "800000000000000000000000000000000000000000000000001000000001",
554             "4230017757A767FAE42398569B746325D45313AF0766266479B75654E65F",
555             "5037EA654196CFF0CD82B2C14A2FCF2E3FF8775285B545722F03EACDB74B",
556             "28F9D04E900069C8DC47A08534FE76D2B900B7D7EF31F5709F200C4CA205",
557             "5667334C45AFF3B5A03BAD9DD75E2C71A99362567D5453F7FA6E227EC833",
558             "1555555555555555555555555555553C6F2885259C31E3FCDF154624522D",
559             6, nameSplitPattern);
560 
561         add("X9.62 c2tnb239v3", "1.2.840.10045.3.0.13", B,
562             "800000000000000000000000000000000000000000000000001000000001",
563             "01238774666A67766D6676F778E676B66999176666E687666D8766C66A9F",
564             "6A941977BA9F6A435199ACFC51067ED587F519C5ECB541B8E44111DE1D40",
565             "70F6E9D04D289C4E89913CE3530BFDE903977D42B146D539BF1BDE4E9C92",
566             "2E5A0EAF6E5E1305B9004DCE5C0ED7FE59A35608F33837C816D80B79F461",
567             "0CCCCCCCCCCCCCCCCCCCCCCCCCCCCCAC4912D2D9DF903EF9888B8A0E4CFF",
568             0xA, nameSplitPattern);
569 
570         add("X9.62 c2tnb359v1", "1.2.840.10045.3.0.18", B,
571             "800000000000000000000000000000000000000000000000000000000000000000000000100000000000000001",
572             "5667676A654B20754F356EA92017D946567C46675556F19556A04616B567D223A5E05656FB549016A96656A557",
573             "2472E2D0197C49363F1FE7F5B6DB075D52B6947D135D8CA445805D39BC345626089687742B6329E70680231988",
574             "3C258EF3047767E7EDE0F1FDAA79DAEE3841366A132E163ACED4ED2401DF9C6BDCDE98E8E707C07A2239B1B097",
575             "53D7E08529547048121E9C95F3791DD804963948F34FAE7BF44EA82365DC7868FE57E4AE2DE211305A407104BD",
576             "01AF286BCA1AF286BCA1AF286BCA1AF286BCA1AF286BC9FB8F6B85C556892C20A7EB964FE7719E74F490758D3B",
577             0x4C, nameSplitPattern);
578 
579         add("X9.62 c2tnb431r1", "1.2.840.10045.3.0.20", B,
580             "800000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000001",
581             "1A827EF00DD6FC0E234CAF046C6A5D8A85395B236CC4AD2CF32A0CADBDC9DDF620B0EB9906D0957F6C6FEACD615468DF104DE296CD8F",
582             "10D9B4A3D9047D8B154359ABFB1B7F5485B04CEB868237DDC9DEDA982A679A5A919B626D4E50A8DD731B107A9962381FB5D807BF2618",
583             "120FC05D3C67A99DE161D2F4092622FECA701BE4F50F4758714E8A87BBF2A658EF8C21E7C5EFE965361F6C2999C0C247B0DBD70CE6B7",
584             "20D0AF8903A96F8D5FA2C255745D3C451B302C9346D9B7E485E7BCE41F6B591F3E8F6ADDCBB0BC4C2F947A7DE1A89B625D6A598B3760",
585             "0340340340340340340340340340340340340340340340340340340323C313FAB50589703B5EC68D3587FEC60D161CC149C1AD4A91",
586             0x2760, nameSplitPattern);
587 
588         /* ANSI X9.62 binary curves from the 1998 standard but forbidden
589          * in the 2005 version of the standard.
590          * We don't register them but leave them here for the time being in
591          * case we need to support them after all.
592          */
593 /*
594         add("X9.62 c2pnb163v1", "1.2.840.10045.3.0.1", B,
595             "080000000000000000000000000000000000000107",
596             "072546B5435234A422E0789675F432C89435DE5242",
597             "00C9517D06D5240D3CFF38C74B20B6CD4D6F9DD4D9",
598             "07AF69989546103D79329FCC3D74880F33BBE803CB",
599             "01EC23211B5966ADEA1D3F87F7EA5848AEF0B7CA9F",
600             "0400000000000000000001E60FC8821CC74DAEAFC1",
601             2, nameSplitPattern);
602 
603         add("X9.62 c2pnb163v2", "1.2.840.10045.3.0.2", B,
604             "080000000000000000000000000000000000000107",
605             "0108B39E77C4B108BED981ED0E890E117C511CF072",
606             "0667ACEB38AF4E488C407433FFAE4F1C811638DF20",
607             "0024266E4EB5106D0A964D92C4860E2671DB9B6CC5",
608             "079F684DDF6684C5CD258B3890021B2386DFD19FC5",
609             "03FFFFFFFFFFFFFFFFFFFDF64DE1151ADBB78F10A7",
610             2, nameSplitPattern);
611 
612         add("X9.62 c2pnb163v3", "1.2.840.10045.3.0.3", B,
613             "080000000000000000000000000000000000000107",
614             "07A526C63D3E25A256A007699F5447E32AE456B50E",
615             "03F7061798EB99E238FD6F1BF95B48FEEB4854252B",
616             "02F9F87B7C574D0BDECF8A22E6524775F98CDEBDCB",
617             "05B935590C155E17EA48EB3FF3718B893DF59A05D0",
618             "03FFFFFFFFFFFFFFFFFFFE1AEE140F110AFF961309",
619             2, nameSplitPattern);
620 
621         add("X9.62 c2pnb176w1", "1.2.840.10045.3.0.4", B,
622             "0100000000000000000000000000000000080000000007",
623             "E4E6DB2995065C407D9D39B8D0967B96704BA8E9C90B",
624             "5DDA470ABE6414DE8EC133AE28E9BBD7FCEC0AE0FFF2",
625             "8D16C2866798B600F9F08BB4A8E860F3298CE04A5798",
626             "6FA4539C2DADDDD6BAB5167D61B436E1D92BB16A562C",
627             "00010092537397ECA4F6145799D62B0A19CE06FE26AD",
628             0xFF6E, nameSplitPattern);
629 
630         add("X9.62 c2pnb208w1", "1.2.840.10045.3.0.10", B,
631             "010000000000000000000000000000000800000000000000000007",
632             "0000000000000000000000000000000000000000000000000000",
633             "C8619ED45A62E6212E1160349E2BFA844439FAFC2A3FD1638F9E",
634             "89FDFBE4ABE193DF9559ECF07AC0CE78554E2784EB8C1ED1A57A",
635             "0F55B51A06E78E9AC38A035FF520D8B01781BEB1A6BB08617DE3",
636             "000101BAF95C9723C57B6C21DA2EFF2D5ED588BDD5717E212F9D",
637             0xFE48, nameSplitPattern);
638 
639         add("X9.62 c2pnb272w1", "1.2.840.10045.3.0.16", B,
640             "010000000000000000000000000000000000000000000000000000010000000000000B",
641             "91A091F03B5FBA4AB2CCF49C4EDD220FB028712D42BE752B2C40094DBACDB586FB20",
642             "7167EFC92BB2E3CE7C8AAAFF34E12A9C557003D7C73A6FAF003F99F6CC8482E540F7",
643             "6108BABB2CEEBCF787058A056CBE0CFE622D7723A289E08A07AE13EF0D10D171DD8D",
644             "10C7695716851EEF6BA7F6872E6142FBD241B830FF5EFCACECCAB05E02005DDE9D23",
645             "000100FAF51354E0E39E4892DF6E319C72C8161603FA45AA7B998A167B8F1E629521",
646             0xFF06, nameSplitPattern);
647 
648         add("X9.62 c2pnb304w1", "1.2.840.10045.3.0.17", B,
649             "010000000000000000000000000000000000000000000000000000000000000000000000000807",
650             "FD0D693149A118F651E6DCE6802085377E5F882D1B510B44160074C1288078365A0396C8E681",
651             "BDDB97E555A50A908E43B01C798EA5DAA6788F1EA2794EFCF57166B8C14039601E55827340BE",
652             "197B07845E9BE2D96ADB0F5F3C7F2CFFBD7A3EB8B6FEC35C7FD67F26DDF6285A644F740A2614",
653             "E19FBEB76E0DA171517ECF401B50289BF014103288527A9B416A105E80260B549FDC1B92C03B",
654             "000101D556572AABAC800101D556572AABAC8001022D5C91DD173F8FB561DA6899164443051D",
655             0xFE2E, nameSplitPattern);
656 
657         add("X9.62 c2pnb368w1", "1.2.840.10045.3.0.19", B,
658             "0100000000000000000000000000000000000000000000000000000000000000000000002000000000000000000007",
659             "E0D2EE25095206F5E2A4F9ED229F1F256E79A0E2B455970D8D0D865BD94778C576D62F0AB7519CCD2A1A906AE30D",
660             "FC1217D4320A90452C760A58EDCD30C8DD069B3C34453837A34ED50CB54917E1C2112D84D164F444F8F74786046A",
661             "1085E2755381DCCCE3C1557AFA10C2F0C0C2825646C5B34A394CBCFA8BC16B22E7E789E927BE216F02E1FB136A5F",
662             "7B3EB1BDDCBA62D5D8B2059B525797FC73822C59059C623A45FF3843CEE8F87CD1855ADAA81E2A0750B80FDA2310",
663             "00010090512DA9AF72B08349D98A5DD4C7B0532ECA51CE03E2D10F3B7AC579BD87E909AE40A6F131E9CFCE5BD967",
664             0xFF70, nameSplitPattern);
665 */
666 
667         /*
668          * Brainpool curves (RFC 5639)
669          * (Twisted curves are not included)
670          */
671 
672         add("brainpoolP160r1", "1.3.36.3.3.2.8.1.1.1", P,
673             "E95E4A5F737059DC60DFC7AD95B3D8139515620F",
674             "340E7BE2A280EB74E2BE61BADA745D97E8F7C300",
675             "1E589A8595423412134FAA2DBDEC95C8D8675E58",
676             "BED5AF16EA3F6A4F62938C4631EB5AF7BDBCDBC3",
677             "1667CB477A1A8EC338F94741669C976316DA6321",
678             "E95E4A5F737059DC60DF5991D45029409E60FC09",
679             1, nameSplitPattern);
680 
681         add("brainpoolP192r1", "1.3.36.3.3.2.8.1.1.3", P,
682             "C302F41D932A36CDA7A3463093D18DB78FCE476DE1A86297",
683             "6A91174076B1E0E19C39C031FE8685C1CAE040E5C69A28EF",
684             "469A28EF7C28CCA3DC721D044F4496BCCA7EF4146FBF25C9",
685             "C0A0647EAAB6A48753B033C56CB0F0900A2F5C4853375FD6",
686             "14B690866ABD5BB88B5F4828C1490002E6773FA2FA299B8F",
687             "C302F41D932A36CDA7A3462F9E9E916B5BE8F1029AC4ACC1",
688             1, nameSplitPattern);
689 
690         add("brainpoolP224r1", "1.3.36.3.3.2.8.1.1.5", P,
691             "D7C134AA264366862A18302575D1D787B09F075797DA89F57EC8C0FF",
692             "68A5E62CA9CE6C1C299803A6C1530B514E182AD8B0042A59CAD29F43",
693             "2580F63CCFE44138870713B1A92369E33E2135D266DBB372386C400B",
694             "0D9029AD2C7E5CF4340823B2A87DC68C9E4CE3174C1E6EFDEE12C07D",
695             "58AA56F772C0726F24C6B89E4ECDAC24354B9E99CAA3F6D3761402CD",
696             "D7C134AA264366862A18302575D0FB98D116BC4B6DDEBCA3A5A7939F",
697             1, nameSplitPattern);
698 
699         add("brainpoolP256r1", "1.3.36.3.3.2.8.1.1.7", P,
700             "A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5377",
701             "7D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9",
702             "26DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B6",
703             "8BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262",
704             "547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F046997",
705             "A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7",
706             1, nameSplitPattern);
707 
708         add("brainpoolP320r1", "1.3.36.3.3.2.8.1.1.9", P,
709             "D35E472036BC4FB7E13C785ED201E065F98FCFA6F6F40DEF4F92B9EC7893EC28FCD412B1F1B32E27",
710             "3EE30B568FBAB0F883CCEBD46D3F3BB8A2A73513F5EB79DA66190EB085FFA9F492F375A97D860EB4",
711             "520883949DFDBC42D3AD198640688A6FE13F41349554B49ACC31DCCD884539816F5EB4AC8FB1F1A6",
712             "43BD7E9AFB53D8B85289BCC48EE5BFE6F20137D10A087EB6E7871E2A10A599C710AF8D0D39E20611",
713             "14FDD05545EC1CC8AB4093247F77275E0743FFED117182EAA9C77877AAAC6AC7D35245D1692E8EE1",
714             "D35E472036BC4FB7E13C785ED201E065F98FCFA5B68F12A32D482EC7EE8658E98691555B44C59311",
715             1, nameSplitPattern);
716 
717         add("brainpoolP384r1", "1.3.36.3.3.2.8.1.1.11", P,
718             "8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B412B1DA197FB71123ACD3A729901D1A71874700133107EC53",
719             "7BC382C63D8C150C3C72080ACE05AFA0C2BEA28E4FB22787139165EFBA91F90F8AA5814A503AD4EB04A8C7DD22CE2826",
720             "04A8C7DD22CE28268B39B55416F0447C2FB77DE107DCD2A62E880EA53EEB62D57CB4390295DBC9943AB78696FA504C11",
721             "1D1C64F068CF45FFA2A63A81B7C13F6B8847A3E77EF14FE3DB7FCAFE0CBD10E8E826E03436D646AAEF87B2E247D4AF1E",
722             "8ABE1D7520F9C2A45CB1EB8E95CFD55262B70B29FEEC5864E19C054FF99129280E4646217791811142820341263C5315",
723             "8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B31F166E6CAC0425A7CF3AB6AF6B7FC3103B883202E9046565",
724             1, nameSplitPattern);
725 
726         add("brainpoolP512r1", "1.3.36.3.3.2.8.1.1.13", P,
727             "AADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA703308717D4D9B009BC66842AECDA12AE6A380E62881FF2F2D82C68528AA6056583A48F3",
728             "7830A3318B603B89E2327145AC234CC594CBDD8D3DF91610A83441CAEA9863BC2DED5D5AA8253AA10A2EF1C98B9AC8B57F1117A72BF2C7B9E7C1AC4D77FC94CA",
729             "3DF91610A83441CAEA9863BC2DED5D5AA8253AA10A2EF1C98B9AC8B57F1117A72BF2C7B9E7C1AC4D77FC94CADC083E67984050B75EBAE5DD2809BD638016F723",
730             "81AEE4BDD82ED9645A21322E9C4C6A9385ED9F70B5D916C1B43B62EEF4D0098EFF3B1F78E2D0D48D50D1687B93B97D5F7C6D5047406A5E688B352209BCB9F822",
731             "7DDE385D566332ECC0EABFA9CF7822FDF209F70024A57B1AA000C55B881F8111B2DCDE494A5F485E5BCA4BD88A2763AED1CA2B2FA8F0540678CD1E0F3AD80892",
732             "AADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA70330870553E5C414CA92619418661197FAC10471DB1D381085DDADDB58796829CA90069",
733             1, nameSplitPattern);
734 
735         specCollection = Collections.unmodifiableCollection(oidMap.values());
736     }
737 }
738