Skip to content

Commit d11eedf

Browse files
Support explicit EC parameters for Brainpool curves
ICAO Doc 9303 Part 12 Section 4.1.6.3 mandates that ECDSA keys in ePassport certificates use explicit EC domain parameters. PR #12916 added explicit-to-named-curve mapping for P-256, P-384, and P-521. This extends the same mapping to brainpoolP256r1, brainpoolP384r1, and brainpoolP512r1, which are already supported as named curves. Domain parameters are from RFC 5639 Section 3. Both with-seed and without-seed variants are supported, matching the NIST curve pattern. This enables loading of ePassport CSCA and Document Signer certificates from 30+ countries (Germany, Sweden, Finland, Switzerland, etc.) that use Brainpool curves with explicit parameters per the ICAO standard. Closes #5659 (Brainpool portion)
1 parent 2c3cfc4 commit d11eedf

15 files changed

Lines changed: 304 additions & 6 deletions

src/rust/cryptography-key-parsing/src/ec.rs

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -68,12 +68,9 @@ pub(crate) fn ec_params_to_group(
6868
}
6969
EcParameters::SpecifiedCurve(params) => {
7070
// We do not support arbitrary explicit curves. Instead we map values
71-
// to named curves. This currently supports only P256, P384,
72-
// and P521. No binary curves are supported. Everything must
73-
// match, except the seed may be omitted on NIST curves since OpenSSL
74-
// has supported a -no_seed option for over 20 years and I don't want to
75-
// figure out whether anyone uses that or not. No one should be using
76-
// explicit curve encoding anyway. Curves were meant to be named!
71+
// to named curves. No binary curves are supported. Everything must
72+
// match, except the seed may be omitted since OpenSSL has supported
73+
// a -no_seed option for over 20 years. Curves were meant to be named!
7774
let (curve_nid, oid) = match params {
7875
&ec_constants::P256_DOMAIN | &ec_constants::P256_DOMAIN_NO_SEED => (
7976
openssl::nid::Nid::X9_62_PRIME256V1,
@@ -87,6 +84,24 @@ pub(crate) fn ec_params_to_group(
8784
openssl::nid::Nid::SECP521R1,
8885
cryptography_x509::oid::EC_SECP521R1,
8986
),
87+
#[cfg(not(any(CRYPTOGRAPHY_IS_BORINGSSL, CRYPTOGRAPHY_IS_AWSLC)))]
88+
&ec_constants::BRAINPOOLP256R1_DOMAIN
89+
| &ec_constants::BRAINPOOLP256R1_DOMAIN_NO_SEED => (
90+
openssl::nid::Nid::BRAINPOOL_P256R1,
91+
cryptography_x509::oid::EC_BRAINPOOLP256R1,
92+
),
93+
#[cfg(not(any(CRYPTOGRAPHY_IS_BORINGSSL, CRYPTOGRAPHY_IS_AWSLC)))]
94+
&ec_constants::BRAINPOOLP384R1_DOMAIN
95+
| &ec_constants::BRAINPOOLP384R1_DOMAIN_NO_SEED => (
96+
openssl::nid::Nid::BRAINPOOL_P384R1,
97+
cryptography_x509::oid::EC_BRAINPOOLP384R1,
98+
),
99+
#[cfg(not(any(CRYPTOGRAPHY_IS_BORINGSSL, CRYPTOGRAPHY_IS_AWSLC)))]
100+
&ec_constants::BRAINPOOLP512R1_DOMAIN
101+
| &ec_constants::BRAINPOOLP512R1_DOMAIN_NO_SEED => (
102+
openssl::nid::Nid::BRAINPOOL_P512R1,
103+
cryptography_x509::oid::EC_BRAINPOOLP512R1,
104+
),
90105
_ => return Err(KeyParsingError::ExplicitCurveUnsupported),
91106
};
92107
Ok(openssl::ec::EcGroup::from_curve_name(curve_nid)

src/rust/cryptography-x509/src/ec_constants.rs

Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,3 +123,126 @@ pub const P521_DOMAIN_NO_SEED: SpecifiedECDomain<'static> = SpecifiedECDomain {
123123
order: P521_ORDER,
124124
cofactor: Some(1),
125125
};
126+
127+
// Brainpool curve domain parameters from RFC 5639, Section 3.
128+
// https://datatracker.ietf.org/doc/html/rfc5639#section-3
129+
130+
const BRAINPOOLP256R1_FIELD: FieldID<'static> = FieldID {
131+
field_type: asn1::DefinedByMarker::marker(),
132+
parameters: FieldParameters::PrimeField(asn1::BigUint::new(b"\x00\xa9\xfb\x57\xdb\xa1\xee\xa9\xbc\x3e\x66\x0a\x90\x9d\x83\x8d\x72\x6e\x3b\xf6\x23\xd5\x26\x20\x28\x20\x13\x48\x1d\x1f\x6e\x53\x77").unwrap()),
133+
};
134+
const BRAINPOOLP256R1_CURVE_A: &[u8; 32] = b"\x7d\x5a\x09\x75\xfc\x2c\x30\x57\xee\xf6\x75\x30\x41\x7a\xff\xe7\xfb\x80\x55\xc1\x26\xdc\x5c\x6c\xe9\x4a\x4b\x44\xf3\x30\xb5\xd9";
135+
const BRAINPOOLP256R1_CURVE_B: &[u8; 32] = b"\x26\xdc\x5c\x6c\xe9\x4a\x4b\x44\xf3\x30\xb5\xd9\xbb\xd7\x7c\xbf\x95\x84\x16\x29\x5c\xf7\xe1\xce\x6b\xcc\xdc\x18\xff\x8c\x07\xb6";
136+
const BRAINPOOLP256R1_SEED: asn1::BitString<'static> = asn1::BitString::new(
137+
b"\x75\x7f\x59\x58\x49\x0c\xfd\x47\xd7\xc1\x9b\xb4\x21\x58\xd9\x55\x4f\x7b\x46\xbc",
138+
0,
139+
)
140+
.unwrap();
141+
const BRAINPOOLP256R1_UNCOMPRESSED_BASE: &[u8; 65] = b"\x04\x8b\xd2\xae\xb9\xcb\x7e\x57\xcb\x2c\x4b\x48\x2f\xfc\x81\xb7\xaf\xb9\xde\x27\xe1\xe3\xbd\x23\xc2\x3a\x44\x53\xbd\x9a\xce\x32\x62\x54\x7e\xf8\x35\xc3\xda\xc4\xfd\x97\xf8\x46\x1a\x14\x61\x1d\xc9\xc2\x77\x45\x13\x2d\xed\x8e\x54\x5c\x1d\x54\xc7\x2f\x04\x69\x97";
142+
const BRAINPOOLP256R1_ORDER: asn1::BigUint<'static> = asn1::BigUint::new(b"\x00\xa9\xfb\x57\xdb\xa1\xee\xa9\xbc\x3e\x66\x0a\x90\x9d\x83\x8d\x71\x8c\x39\x7a\xa3\xb5\x61\xa6\xf7\x90\x1e\x0e\x82\x97\x48\x56\xa7").unwrap();
143+
144+
pub const BRAINPOOLP256R1_DOMAIN: SpecifiedECDomain<'static> = SpecifiedECDomain {
145+
version: 1,
146+
field_id: BRAINPOOLP256R1_FIELD,
147+
curve: Curve {
148+
a: BRAINPOOLP256R1_CURVE_A,
149+
b: BRAINPOOLP256R1_CURVE_B,
150+
seed: Some(BRAINPOOLP256R1_SEED),
151+
},
152+
base: BRAINPOOLP256R1_UNCOMPRESSED_BASE,
153+
order: BRAINPOOLP256R1_ORDER,
154+
cofactor: Some(1),
155+
};
156+
157+
pub const BRAINPOOLP256R1_DOMAIN_NO_SEED: SpecifiedECDomain<'static> = SpecifiedECDomain {
158+
version: 1,
159+
field_id: BRAINPOOLP256R1_FIELD,
160+
curve: Curve {
161+
a: BRAINPOOLP256R1_CURVE_A,
162+
b: BRAINPOOLP256R1_CURVE_B,
163+
seed: None,
164+
},
165+
base: BRAINPOOLP256R1_UNCOMPRESSED_BASE,
166+
order: BRAINPOOLP256R1_ORDER,
167+
cofactor: Some(1),
168+
};
169+
170+
const BRAINPOOLP384R1_FIELD: FieldID<'static> = FieldID {
171+
field_type: asn1::DefinedByMarker::marker(),
172+
parameters: FieldParameters::PrimeField(asn1::BigUint::new(b"\x00\x8c\xb9\x1e\x82\xa3\x38\x6d\x28\x0f\x5d\x6f\x7e\x50\xe6\x41\xdf\x15\x2f\x71\x09\xed\x54\x56\xb4\x12\xb1\xda\x19\x7f\xb7\x11\x23\xac\xd3\xa7\x29\x90\x1d\x1a\x71\x87\x47\x00\x13\x31\x07\xec\x53").unwrap()),
173+
};
174+
const BRAINPOOLP384R1_CURVE_A: &[u8; 48] = b"\x7b\xc3\x82\xc6\x3d\x8c\x15\x0c\x3c\x72\x08\x0a\xce\x05\xaf\xa0\xc2\xbe\xa2\x8e\x4f\xb2\x27\x87\x13\x91\x65\xef\xba\x91\xf9\x0f\x8a\xa5\x81\x4a\x50\x3a\xd4\xeb\x04\xa8\xc7\xdd\x22\xce\x28\x26";
175+
const BRAINPOOLP384R1_CURVE_B: &[u8; 48] = b"\x04\xa8\xc7\xdd\x22\xce\x28\x26\x8b\x39\xb5\x54\x16\xf0\x44\x7c\x2f\xb7\x7d\xe1\x07\xdc\xd2\xa6\x2e\x88\x0e\xa5\x3e\xeb\x62\xd5\x7c\xb4\x39\x02\x95\xdb\xc9\x94\x3a\xb7\x86\x96\xfa\x50\x4c\x11";
176+
const BRAINPOOLP384R1_SEED: asn1::BitString<'static> = asn1::BitString::new(
177+
b"\xbc\xfb\xfa\x1c\x87\x7c\x56\x28\x4d\xab\x79\xcd\x4c\x2b\x32\x93\xd2\x0e\x9e\x5e",
178+
0,
179+
)
180+
.unwrap();
181+
const BRAINPOOLP384R1_UNCOMPRESSED_BASE: &[u8; 97] = b"\x04\x1d\x1c\x64\xf0\x68\xcf\x45\xff\xa2\xa6\x3a\x81\xb7\xc1\x3f\x6b\x88\x47\xa3\xe7\x7e\xf1\x4f\xe3\xdb\x7f\xca\xfe\x0c\xbd\x10\xe8\xe8\x26\xe0\x34\x36\xd6\x46\xaa\xef\x87\xb2\xe2\x47\xd4\xaf\x1e\x8a\xbe\x1d\x75\x20\xf9\xc2\xa4\x5c\xb1\xeb\x8e\x95\xcf\xd5\x52\x62\xb7\x0b\x29\xfe\xec\x58\x64\xe1\x9c\x05\x4f\xf9\x91\x29\x28\x0e\x46\x46\x21\x77\x91\x81\x11\x42\x82\x03\x41\x26\x3c\x53\x15";
182+
const BRAINPOOLP384R1_ORDER: asn1::BigUint<'static> = asn1::BigUint::new(b"\x00\x8c\xb9\x1e\x82\xa3\x38\x6d\x28\x0f\x5d\x6f\x7e\x50\xe6\x41\xdf\x15\x2f\x71\x09\xed\x54\x56\xb3\x1f\x16\x6e\x6c\xac\x04\x25\xa7\xcf\x3a\xb6\xaf\x6b\x7f\xc3\x10\x3b\x88\x32\x02\xe9\x04\x65\x65").unwrap();
183+
184+
pub const BRAINPOOLP384R1_DOMAIN: SpecifiedECDomain<'static> = SpecifiedECDomain {
185+
version: 1,
186+
field_id: BRAINPOOLP384R1_FIELD,
187+
curve: Curve {
188+
a: BRAINPOOLP384R1_CURVE_A,
189+
b: BRAINPOOLP384R1_CURVE_B,
190+
seed: Some(BRAINPOOLP384R1_SEED),
191+
},
192+
base: BRAINPOOLP384R1_UNCOMPRESSED_BASE,
193+
order: BRAINPOOLP384R1_ORDER,
194+
cofactor: Some(1),
195+
};
196+
197+
pub const BRAINPOOLP384R1_DOMAIN_NO_SEED: SpecifiedECDomain<'static> = SpecifiedECDomain {
198+
version: 1,
199+
field_id: BRAINPOOLP384R1_FIELD,
200+
curve: Curve {
201+
a: BRAINPOOLP384R1_CURVE_A,
202+
b: BRAINPOOLP384R1_CURVE_B,
203+
seed: None,
204+
},
205+
base: BRAINPOOLP384R1_UNCOMPRESSED_BASE,
206+
order: BRAINPOOLP384R1_ORDER,
207+
cofactor: Some(1),
208+
};
209+
210+
const BRAINPOOLP512R1_FIELD: FieldID<'static> = FieldID {
211+
field_type: asn1::DefinedByMarker::marker(),
212+
parameters: FieldParameters::PrimeField(asn1::BigUint::new(b"\x00\xaa\xdd\x9d\xb8\xdb\xe9\xc4\x8b\x3f\xd4\xe6\xae\x33\xc9\xfc\x07\xcb\x30\x8d\xb3\xb3\xc9\xd2\x0e\xd6\x63\x9c\xca\x70\x33\x08\x71\x7d\x4d\x9b\x00\x9b\xc6\x68\x42\xae\xcd\xa1\x2a\xe6\xa3\x80\xe6\x28\x81\xff\x2f\x2d\x82\xc6\x85\x28\xaa\x60\x56\x58\x3a\x48\xf3").unwrap()),
213+
};
214+
const BRAINPOOLP512R1_CURVE_A: &[u8; 64] = b"\x78\x30\xa3\x31\x8b\x60\x3b\x89\xe2\x32\x71\x45\xac\x23\x4c\xc5\x94\xcb\xdd\x8d\x3d\xf9\x16\x10\xa8\x34\x41\xca\xea\x98\x63\xbc\x2d\xed\x5d\x5a\xa8\x25\x3a\xa1\x0a\x2e\xf1\xc9\x8b\x9a\xc8\xb5\x7f\x11\x17\xa7\x2b\xf2\xc7\xb9\xe7\xc1\xac\x4d\x77\xfc\x94\xca";
215+
const BRAINPOOLP512R1_CURVE_B: &[u8; 64] = b"\x3d\xf9\x16\x10\xa8\x34\x41\xca\xea\x98\x63\xbc\x2d\xed\x5d\x5a\xa8\x25\x3a\xa1\x0a\x2e\xf1\xc9\x8b\x9a\xc8\xb5\x7f\x11\x17\xa7\x2b\xf2\xc7\xb9\xe7\xc1\xac\x4d\x77\xfc\x94\xca\xdc\x08\x3e\x67\x98\x40\x50\xb7\x5e\xba\xe5\xdd\x28\x09\xbd\x63\x80\x16\xf7\x23";
216+
const BRAINPOOLP512R1_SEED: asn1::BitString<'static> = asn1::BitString::new(
217+
b"\xaf\x02\xac\x60\xac\xc9\x3e\xd8\x74\x42\x2a\x52\xec\xb2\x38\xfe\xee\x5a\xb6\xad",
218+
0,
219+
)
220+
.unwrap();
221+
const BRAINPOOLP512R1_UNCOMPRESSED_BASE: &[u8; 129] = b"\x04\x81\xae\xe4\xbd\xd8\x2e\xd9\x64\x5a\x21\x32\x2e\x9c\x4c\x6a\x93\x85\xed\x9f\x70\xb5\xd9\x16\xc1\xb4\x3b\x62\xee\xf4\xd0\x09\x8e\xff\x3b\x1f\x78\xe2\xd0\xd4\x8d\x50\xd1\x68\x7b\x93\xb9\x7d\x5f\x7c\x6d\x50\x47\x40\x6a\x5e\x68\x8b\x35\x22\x09\xbc\xb9\xf8\x22\x7d\xde\x38\x5d\x56\x63\x32\xec\xc0\xea\xbf\xa9\xcf\x78\x22\xfd\xf2\x09\xf7\x00\x24\xa5\x7b\x1a\xa0\x00\xc5\x5b\x88\x1f\x81\x11\xb2\xdc\xde\x49\x4a\x5f\x48\x5e\x5b\xca\x4b\xd8\x8a\x27\x63\xae\xd1\xca\x2b\x2f\xa8\xf0\x54\x06\x78\xcd\x1e\x0f\x3a\xd8\x08\x92";
222+
const BRAINPOOLP512R1_ORDER: asn1::BigUint<'static> = asn1::BigUint::new(b"\x00\xaa\xdd\x9d\xb8\xdb\xe9\xc4\x8b\x3f\xd4\xe6\xae\x33\xc9\xfc\x07\xcb\x30\x8d\xb3\xb3\xc9\xd2\x0e\xd6\x63\x9c\xca\x70\x33\x08\x70\x55\x3e\x5c\x41\x4c\xa9\x26\x19\x41\x86\x61\x19\x7f\xac\x10\x47\x1d\xb1\xd3\x81\x08\x5d\xda\xdd\xb5\x87\x96\x82\x9c\xa9\x00\x69").unwrap();
223+
224+
pub const BRAINPOOLP512R1_DOMAIN: SpecifiedECDomain<'static> = SpecifiedECDomain {
225+
version: 1,
226+
field_id: BRAINPOOLP512R1_FIELD,
227+
curve: Curve {
228+
a: BRAINPOOLP512R1_CURVE_A,
229+
b: BRAINPOOLP512R1_CURVE_B,
230+
seed: Some(BRAINPOOLP512R1_SEED),
231+
},
232+
base: BRAINPOOLP512R1_UNCOMPRESSED_BASE,
233+
order: BRAINPOOLP512R1_ORDER,
234+
cofactor: Some(1),
235+
};
236+
237+
pub const BRAINPOOLP512R1_DOMAIN_NO_SEED: SpecifiedECDomain<'static> = SpecifiedECDomain {
238+
version: 1,
239+
field_id: BRAINPOOLP512R1_FIELD,
240+
curve: Curve {
241+
a: BRAINPOOLP512R1_CURVE_A,
242+
b: BRAINPOOLP512R1_CURVE_B,
243+
seed: None,
244+
},
245+
base: BRAINPOOLP512R1_UNCOMPRESSED_BASE,
246+
order: BRAINPOOLP512R1_ORDER,
247+
cofactor: Some(1),
248+
};

tests/hazmat/primitives/test_ec.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1113,6 +1113,12 @@ def test_load_private_key_unsupported_explicit_parameters(self):
11131113
(ec.SECP384R1, "secp384r1-explicit-no-seed.pem"),
11141114
(ec.SECP521R1, "secp521r1-explicit-seed.pem"),
11151115
(ec.SECP521R1, "secp521r1-explicit-no-seed.pem"),
1116+
(ec.BrainpoolP256R1, "brainpoolP256r1-explicit-seed.pem"),
1117+
(ec.BrainpoolP256R1, "brainpoolP256r1-explicit-no-seed.pem"),
1118+
(ec.BrainpoolP384R1, "brainpoolP384r1-explicit-seed.pem"),
1119+
(ec.BrainpoolP384R1, "brainpoolP384r1-explicit-no-seed.pem"),
1120+
(ec.BrainpoolP512R1, "brainpoolP512r1-explicit-seed.pem"),
1121+
(ec.BrainpoolP512R1, "brainpoolP512r1-explicit-no-seed.pem"),
11161122
],
11171123
)
11181124
def test_load_private_key_explicit_parameters(self, curve, file, backend):
@@ -1136,6 +1142,12 @@ def test_load_private_key_explicit_parameters(self, curve, file, backend):
11361142
(ec.SECP384R1, "secp384r1-pub-explicit-no-seed.pem"),
11371143
(ec.SECP521R1, "secp521r1-pub-explicit-seed.pem"),
11381144
(ec.SECP521R1, "secp521r1-pub-explicit-no-seed.pem"),
1145+
(ec.BrainpoolP256R1, "brainpoolP256r1-pub-explicit-seed.pem"),
1146+
(ec.BrainpoolP256R1, "brainpoolP256r1-pub-explicit-no-seed.pem"),
1147+
(ec.BrainpoolP384R1, "brainpoolP384r1-pub-explicit-seed.pem"),
1148+
(ec.BrainpoolP384R1, "brainpoolP384r1-pub-explicit-no-seed.pem"),
1149+
(ec.BrainpoolP512R1, "brainpoolP512r1-pub-explicit-seed.pem"),
1150+
(ec.BrainpoolP512R1, "brainpoolP512r1-pub-explicit-no-seed.pem"),
11391151
],
11401152
)
11411153
def test_load_public_key_explicit_parameters(self, curve, file, backend):
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
-----BEGIN EC PRIVATE KEY-----
2+
MIIBUQIBAQQgQIuKIS3XSh3LbSZyJwNlTLCEP0Xh49GpLo1tU4QWklWggeMwgeAC
3+
AQEwLAYHKoZIzj0BAQIhAKn7V9uh7qm8PmYKkJ2DjXJuO/Yj1SYgKCATSB0fblN3
4+
MEQEIH1aCXX8LDBX7vZ1MEF6/+f7gFXBJtxcbOlKS0TzMLXZBCAm3Fxs6UpLRPMw
5+
tdm713y/lYQWKVz34c5rzNwY/4wHtgRBBIvSrrnLflfLLEtIL/yBt6+53ifh470j
6+
wjpEU72azjJiVH74NcPaxP2X+EYaFGEdycJ3RRMt7Y5UXB1Uxy8EaZcCIQCp+1fb
7+
oe6pvD5mCpCdg41xjDl6o7VhpveQHg6Cl0hWpwIBAaFEA0IABAKjsJab6Mea3N3J
8+
EXn1gRrd7ZBYB7eEMtr8IiO3Hc5FSq80qd5WASP/PhhhqJO4KEFpxAxtegDIIMzb
9+
QSrnzdA=
10+
-----END EC PRIVATE KEY-----
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
-----BEGIN EC PRIVATE KEY-----
2+
MIIBUQIBAQQgLFLS9xOBlvHyKu5a2hxvgbtXIPYUTeUgokrzEowmQ7OggeMwgeAC
3+
AQEwLAYHKoZIzj0BAQIhAKn7V9uh7qm8PmYKkJ2DjXJuO/Yj1SYgKCATSB0fblN3
4+
MEQEIH1aCXX8LDBX7vZ1MEF6/+f7gFXBJtxcbOlKS0TzMLXZBCAm3Fxs6UpLRPMw
5+
tdm713y/lYQWKVz34c5rzNwY/4wHtgRBBIvSrrnLflfLLEtIL/yBt6+53ifh470j
6+
wjpEU72azjJiVH74NcPaxP2X+EYaFGEdycJ3RRMt7Y5UXB1Uxy8EaZcCIQCp+1fb
7+
oe6pvD5mCpCdg41xjDl6o7VhpveQHg6Cl0hWpwIBAaFEA0IABJnq/wkF1qAxQ12G
8+
LAyAsIldx1At/lGew6rmIPCKyAElhBPUIXpQUKHYro2Bf/sAVs8ePoOnwnMPRk0D
9+
gARNiGM=
10+
-----END EC PRIVATE KEY-----
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
-----BEGIN PUBLIC KEY-----
2+
MIIBMzCB7AYHKoZIzj0CATCB4AIBATAsBgcqhkjOPQEBAiEAqftX26Huqbw+ZgqQ
3+
nYONcm479iPVJiAoIBNIHR9uU3cwRAQgfVoJdfwsMFfu9nUwQXr/5/uAVcEm3Fxs
4+
6UpLRPMwtdkEICbcXGzpSktE8zC12bvXfL+VhBYpXPfhzmvM3Bj/jAe2BEEEi9Ku
5+
uct+V8ssS0gv/IG3r7neJ+HjvSPCOkRTvZrOMmJUfvg1w9rE/Zf4RhoUYR3JwndF
6+
Ey3tjlRcHVTHLwRplwIhAKn7V9uh7qm8PmYKkJ2DjXGMOXqjtWGm95AeDoKXSFan
7+
AgEBA0IABAKjsJab6Mea3N3JEXn1gRrd7ZBYB7eEMtr8IiO3Hc5FSq80qd5WASP/
8+
PhhhqJO4KEFpxAxtegDIIMzbQSrnzdA=
9+
-----END PUBLIC KEY-----
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
-----BEGIN PUBLIC KEY-----
2+
MIIBMzCB7AYHKoZIzj0CATCB4AIBATAsBgcqhkjOPQEBAiEAqftX26Huqbw+ZgqQ
3+
nYONcm479iPVJiAoIBNIHR9uU3cwRAQgfVoJdfwsMFfu9nUwQXr/5/uAVcEm3Fxs
4+
6UpLRPMwtdkEICbcXGzpSktE8zC12bvXfL+VhBYpXPfhzmvM3Bj/jAe2BEEEi9Ku
5+
uct+V8ssS0gv/IG3r7neJ+HjvSPCOkRTvZrOMmJUfvg1w9rE/Zf4RhoUYR3JwndF
6+
Ey3tjlRcHVTHLwRplwIhAKn7V9uh7qm8PmYKkJ2DjXGMOXqjtWGm95AeDoKXSFan
7+
AgEBA0IABJnq/wkF1qAxQ12GLAyAsIldx1At/lGew6rmIPCKyAElhBPUIXpQUKHY
8+
ro2Bf/sAVs8ePoOnwnMPRk0DgARNiGM=
9+
-----END PUBLIC KEY-----
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
-----BEGIN EC PRIVATE KEY-----
2+
MIIB4wIBAQQwNefs2BwzJBzVfE3ipkq21O8ab0MOPjadrjbib/85i741FRPJMh/f
3+
No1s14K647OioIIBRDCCAUACAQEwPAYHKoZIzj0BAQIxAIy5HoKjOG0oD11vflDm
4+
Qd8VL3EJ7VRWtBKx2hl/txEjrNOnKZAdGnGHRwATMQfsUzBkBDB7w4LGPYwVDDxy
5+
CArOBa+gwr6ijk+yJ4cTkWXvupH5D4qlgUpQOtTrBKjH3SLOKCYEMASox90izigm
6+
izm1VBbwRHwvt33hB9zSpi6IDqU+62LVfLQ5ApXbyZQ6t4aW+lBMEQRhBB0cZPBo
7+
z0X/oqY6gbfBP2uIR6PnfvFP49t/yv4MvRDo6CbgNDbWRqrvh7LiR9SvHoq+HXUg
8+
+cKkXLHrjpXP1VJitwsp/uxYZOGcBU/5kSkoDkZGIXeRgRFCggNBJjxTFQIxAIy5
9+
HoKjOG0oD11vflDmQd8VL3EJ7VRWsx8WbmysBCWnzzq2r2t/wxA7iDIC6QRlZQIB
10+
AaFkA2IABIsGtby8X8ukJQ9EwJOY6bv/dUWXedcASC1mUbqndcDwxPD2DPZtkBU0
11+
SQ+EChvnhTBk0REd/GrSLubKzV1ryQ4ab3GBKj19xEWRAc100ZXXqyKElkmR21Ma
12+
pnMoY/XW7w==
13+
-----END EC PRIVATE KEY-----
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
-----BEGIN EC PRIVATE KEY-----
2+
MIIB4wIBAQQwU8d+mTTpGSqJBUtC4o51Jq2p+YTVktyElmBJwvjvJ/wN34c74S0g
3+
zHCNU27EeKy0oIIBRDCCAUACAQEwPAYHKoZIzj0BAQIxAIy5HoKjOG0oD11vflDm
4+
Qd8VL3EJ7VRWtBKx2hl/txEjrNOnKZAdGnGHRwATMQfsUzBkBDB7w4LGPYwVDDxy
5+
CArOBa+gwr6ijk+yJ4cTkWXvupH5D4qlgUpQOtTrBKjH3SLOKCYEMASox90izigm
6+
izm1VBbwRHwvt33hB9zSpi6IDqU+62LVfLQ5ApXbyZQ6t4aW+lBMEQRhBB0cZPBo
7+
z0X/oqY6gbfBP2uIR6PnfvFP49t/yv4MvRDo6CbgNDbWRqrvh7LiR9SvHoq+HXUg
8+
+cKkXLHrjpXP1VJitwsp/uxYZOGcBU/5kSkoDkZGIXeRgRFCggNBJjxTFQIxAIy5
9+
HoKjOG0oD11vflDmQd8VL3EJ7VRWsx8WbmysBCWnzzq2r2t/wxA7iDIC6QRlZQIB
10+
AaFkA2IABHWRQSOZrL2rqbm5Ujzr1BshU5kKiMIWxk4X+258KLvBofzAVbXYkZ9d
11+
g5S3/gf7IVOBj3zFQmlOIWyGO9gDR23ti+vdkxRAla6DOiMdrYs1y8T9DCv/9Z10
12+
JFsojEMNJw==
13+
-----END EC PRIVATE KEY-----
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
-----BEGIN PUBLIC KEY-----
2+
MIIBtTCCAU0GByqGSM49AgEwggFAAgEBMDwGByqGSM49AQECMQCMuR6CozhtKA9d
3+
b35Q5kHfFS9xCe1UVrQSsdoZf7cRI6zTpymQHRpxh0cAEzEH7FMwZAQwe8OCxj2M
4+
FQw8cggKzgWvoMK+oo5PsieHE5Fl77qR+Q+KpYFKUDrU6wSox90izigmBDAEqMfd
5+
Is4oJos5tVQW8ER8L7d94Qfc0qYuiA6lPuti1Xy0OQKV28mUOreGlvpQTBEEYQQd
6+
HGTwaM9F/6KmOoG3wT9riEej537xT+Pbf8r+DL0Q6Ogm4DQ21kaq74ey4kfUrx6K
7+
vh11IPnCpFyx646Vz9VSYrcLKf7sWGThnAVP+ZEpKA5GRiF3kYERQoIDQSY8UxUC
8+
MQCMuR6CozhtKA9db35Q5kHfFS9xCe1UVrMfFm5srAQlp886tq9rf8MQO4gyAukE
9+
ZWUCAQEDYgAEiwa1vLxfy6QlD0TAk5jpu/91RZd51wBILWZRuqd1wPDE8PYM9m2Q
10+
FTRJD4QKG+eFMGTRER38atIu5srNXWvJDhpvcYEqPX3ERZEBzXTRlderIoSWSZHb
11+
Uxqmcyhj9dbv
12+
-----END PUBLIC KEY-----

0 commit comments

Comments
 (0)