Skip to content

Commit 3a1108d

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 9039e49 commit 3a1108d

15 files changed

Lines changed: 306 additions & 6 deletions

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

Lines changed: 23 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,26 @@ pub(crate) fn ec_params_to_group(
8784
openssl::nid::Nid::SECP521R1,
8885
cryptography_x509::oid::EC_SECP521R1,
8986
),
87+
// NO-COVERAGE-START
88+
#[cfg(not(any(CRYPTOGRAPHY_IS_BORINGSSL, CRYPTOGRAPHY_IS_AWSLC)))]
89+
&ec_constants::BRAINPOOLP256R1_DOMAIN
90+
| &ec_constants::BRAINPOOLP256R1_DOMAIN_NO_SEED => (
91+
openssl::nid::Nid::BRAINPOOL_P256R1,
92+
cryptography_x509::oid::EC_BRAINPOOLP256R1,
93+
),
94+
#[cfg(not(any(CRYPTOGRAPHY_IS_BORINGSSL, CRYPTOGRAPHY_IS_AWSLC)))]
95+
&ec_constants::BRAINPOOLP384R1_DOMAIN
96+
| &ec_constants::BRAINPOOLP384R1_DOMAIN_NO_SEED => (
97+
openssl::nid::Nid::BRAINPOOL_P384R1,
98+
cryptography_x509::oid::EC_BRAINPOOLP384R1,
99+
),
100+
#[cfg(not(any(CRYPTOGRAPHY_IS_BORINGSSL, CRYPTOGRAPHY_IS_AWSLC)))]
101+
&ec_constants::BRAINPOOLP512R1_DOMAIN
102+
| &ec_constants::BRAINPOOLP512R1_DOMAIN_NO_SEED => (
103+
openssl::nid::Nid::BRAINPOOL_P512R1,
104+
cryptography_x509::oid::EC_BRAINPOOLP512R1,
105+
),
106+
// NO-COVERAGE-END
90107
_ => return Err(KeyParsingError::ExplicitCurveUnsupported),
91108
};
92109
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
@@ -1116,6 +1116,12 @@ def test_load_private_key_unsupported_explicit_parameters(self):
11161116
(ec.SECP384R1, "secp384r1-explicit-no-seed.pem"),
11171117
(ec.SECP521R1, "secp521r1-explicit-seed.pem"),
11181118
(ec.SECP521R1, "secp521r1-explicit-no-seed.pem"),
1119+
(ec.BrainpoolP256R1, "brainpoolP256r1-explicit-seed.pem"),
1120+
(ec.BrainpoolP256R1, "brainpoolP256r1-explicit-no-seed.pem"),
1121+
(ec.BrainpoolP384R1, "brainpoolP384r1-explicit-seed.pem"),
1122+
(ec.BrainpoolP384R1, "brainpoolP384r1-explicit-no-seed.pem"),
1123+
(ec.BrainpoolP512R1, "brainpoolP512r1-explicit-seed.pem"),
1124+
(ec.BrainpoolP512R1, "brainpoolP512r1-explicit-no-seed.pem"),
11191125
],
11201126
)
11211127
def test_load_private_key_explicit_parameters(self, curve, file, backend):
@@ -1139,6 +1145,12 @@ def test_load_private_key_explicit_parameters(self, curve, file, backend):
11391145
(ec.SECP384R1, "secp384r1-pub-explicit-no-seed.pem"),
11401146
(ec.SECP521R1, "secp521r1-pub-explicit-seed.pem"),
11411147
(ec.SECP521R1, "secp521r1-pub-explicit-no-seed.pem"),
1148+
(ec.BrainpoolP256R1, "brainpoolP256r1-pub-explicit-seed.pem"),
1149+
(ec.BrainpoolP256R1, "brainpoolP256r1-pub-explicit-no-seed.pem"),
1150+
(ec.BrainpoolP384R1, "brainpoolP384r1-pub-explicit-seed.pem"),
1151+
(ec.BrainpoolP384R1, "brainpoolP384r1-pub-explicit-no-seed.pem"),
1152+
(ec.BrainpoolP512R1, "brainpoolP512r1-pub-explicit-seed.pem"),
1153+
(ec.BrainpoolP512R1, "brainpoolP512r1-pub-explicit-no-seed.pem"),
11421154
],
11431155
)
11441156
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 PRIVATE KEY-----
2+
MIIBYQIBADCB7AYHKoZIzj0CATCB4AIBATAsBgcqhkjOPQEBAiEAqftX26Huqbw+
3+
ZgqQnYONcm479iPVJiAoIBNIHR9uU3cwRAQgfVoJdfwsMFfu9nUwQXr/5/uAVcEm
4+
3Fxs6UpLRPMwtdkEICbcXGzpSktE8zC12bvXfL+VhBYpXPfhzmvM3Bj/jAe2BEEE
5+
i9Kuuct+V8ssS0gv/IG3r7neJ+HjvSPCOkRTvZrOMmJUfvg1w9rE/Zf4RhoUYR3J
6+
wndFEy3tjlRcHVTHLwRplwIhAKn7V9uh7qm8PmYKkJ2DjXGMOXqjtWGm95AeDoKX
7+
SFanAgEBBG0wawIBAQQgIArH6Tf260XKWyhAuvWNhPlsO6n5Wo7zEv/Wg8fFCqSh
8+
RANCAAQm0s+dHjmTrko1Z6AQEFy0/bryKGVFZJn65LGWAXw8VmR/77uzNnUF+eqM
9+
w3GUumMwW4iWfLU9R2jZY5uJIRtG
10+
-----END PRIVATE KEY-----
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
-----BEGIN PRIVATE KEY-----
2+
MIIBYQIBADCB7AYHKoZIzj0CATCB4AIBATAsBgcqhkjOPQEBAiEAqftX26Huqbw+
3+
ZgqQnYONcm479iPVJiAoIBNIHR9uU3cwRAQgfVoJdfwsMFfu9nUwQXr/5/uAVcEm
4+
3Fxs6UpLRPMwtdkEICbcXGzpSktE8zC12bvXfL+VhBYpXPfhzmvM3Bj/jAe2BEEE
5+
i9Kuuct+V8ssS0gv/IG3r7neJ+HjvSPCOkRTvZrOMmJUfvg1w9rE/Zf4RhoUYR3J
6+
wndFEy3tjlRcHVTHLwRplwIhAKn7V9uh7qm8PmYKkJ2DjXGMOXqjtWGm95AeDoKX
7+
SFanAgEBBG0wawIBAQQgUBF0Zoq6LOZ3w7xAsTcoFHlOF7ZqEChtX+0FxMln0Ieh
8+
RANCAASP9jjhRE17lQ6ofJJnPF+VtIs+H9H0bxSLdT8Lu3QOQgm9qH4/5zxWxjKh
9+
YgmSBIVON9pDNwNoPR7Ab5FIdmwJ
10+
-----END 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+
AgEBA0IABCbSz50eOZOuSjVnoBAQXLT9uvIoZUVkmfrksZYBfDxWZH/vu7M2dQX5
8+
6ozDcZS6YzBbiJZ8tT1HaNljm4khG0Y=
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+
AgEBA0IABI/2OOFETXuVDqh8kmc8X5W0iz4f0fRvFIt1Pwu7dA5CCb2ofj/nPFbG
8+
MqFiCZIEhU432kM3A2g9HsBvkUh2bAk=
9+
-----END PUBLIC KEY-----
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
-----BEGIN PRIVATE KEY-----
2+
MIIB9QIBADCCAU0GByqGSM49AgEwggFAAgEBMDwGByqGSM49AQECMQCMuR6Cozht
3+
KA9db35Q5kHfFS9xCe1UVrQSsdoZf7cRI6zTpymQHRpxh0cAEzEH7FMwZAQwe8OC
4+
xj2MFQw8cggKzgWvoMK+oo5PsieHE5Fl77qR+Q+KpYFKUDrU6wSox90izigmBDAE
5+
qMfdIs4oJos5tVQW8ER8L7d94Qfc0qYuiA6lPuti1Xy0OQKV28mUOreGlvpQTBEE
6+
YQQdHGTwaM9F/6KmOoG3wT9riEej537xT+Pbf8r+DL0Q6Ogm4DQ21kaq74ey4kfU
7+
rx6Kvh11IPnCpFyx646Vz9VSYrcLKf7sWGThnAVP+ZEpKA5GRiF3kYERQoIDQSY8
8+
UxUCMQCMuR6CozhtKA9db35Q5kHfFS9xCe1UVrMfFm5srAQlp886tq9rf8MQO4gy
9+
AukEZWUCAQEEgZ4wgZsCAQEEMD0I41D1e05v2YTvpnZqBluszAa3D2YRrA8wJqcz
10+
nQ9CftHci/1wMAC524GMaHwu26FkA2IABHeJNJXgZFVuYnyNlsMptJ9S0oJiwtUy
11+
Y38oAasc9GcEnq7E1SapB+6cHUA+nOmV+1hqjAN8kEwsVDeye4Wvv4snvEC7hxYY
12+
XDlQOyiHdq5C9/UUJxqZWTKWCQoDx0zQWw==
13+
-----END PRIVATE KEY-----
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
-----BEGIN PRIVATE KEY-----
2+
MIIB9QIBADCCAU0GByqGSM49AgEwggFAAgEBMDwGByqGSM49AQECMQCMuR6Cozht
3+
KA9db35Q5kHfFS9xCe1UVrQSsdoZf7cRI6zTpymQHRpxh0cAEzEH7FMwZAQwe8OC
4+
xj2MFQw8cggKzgWvoMK+oo5PsieHE5Fl77qR+Q+KpYFKUDrU6wSox90izigmBDAE
5+
qMfdIs4oJos5tVQW8ER8L7d94Qfc0qYuiA6lPuti1Xy0OQKV28mUOreGlvpQTBEE
6+
YQQdHGTwaM9F/6KmOoG3wT9riEej537xT+Pbf8r+DL0Q6Ogm4DQ21kaq74ey4kfU
7+
rx6Kvh11IPnCpFyx646Vz9VSYrcLKf7sWGThnAVP+ZEpKA5GRiF3kYERQoIDQSY8
8+
UxUCMQCMuR6CozhtKA9db35Q5kHfFS9xCe1UVrMfFm5srAQlp886tq9rf8MQO4gy
9+
AukEZWUCAQEEgZ4wgZsCAQEEMGiTZq5cC0+JR9IjfXiYGqkJ12g7Ty0k716Hqo1F
10+
OgErqyJ10wlS/UqHyznjZWHY+qFkA2IABIZB2azDjNjcGcEHt3d+XrVqa5vmTyDw
11+
+6MG1NpOvEdn80WXZr/ODPoS1vbWnFm28XftbDQsq4UAoJMbNMS9nWyE7d+IipCs
12+
2Y6PM+CEH2Q7/CQ9MqG6HlfzdSUAtpmXsA==
13+
-----END 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+
ZWUCAQEDYgAEd4k0leBkVW5ifI2Wwym0n1LSgmLC1TJjfygBqxz0ZwSersTVJqkH
10+
7pwdQD6c6ZX7WGqMA3yQTCxUN7J7ha+/iye8QLuHFhhcOVA7KId2rkL39RQnGplZ
11+
MpYJCgPHTNBb
12+
-----END PUBLIC KEY-----

0 commit comments

Comments
 (0)