Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 23 additions & 6 deletions src/rust/cryptography-key-parsing/src/ec.rs
Original file line number Diff line number Diff line change
Expand Up @@ -68,12 +68,9 @@ pub(crate) fn ec_params_to_group(
}
EcParameters::SpecifiedCurve(params) => {
// We do not support arbitrary explicit curves. Instead we map values
// to named curves. This currently supports only P256, P384,
// and P521. No binary curves are supported. Everything must
// match, except the seed may be omitted on NIST curves since OpenSSL
// has supported a -no_seed option for over 20 years and I don't want to
// figure out whether anyone uses that or not. No one should be using
// explicit curve encoding anyway. Curves were meant to be named!
// to named curves. No binary curves are supported. Everything must
// match, except the seed may be omitted since OpenSSL has supported
// a -no_seed option for over 20 years. Curves were meant to be named!
let (curve_nid, oid) = match params {
&ec_constants::P256_DOMAIN | &ec_constants::P256_DOMAIN_NO_SEED => (
openssl::nid::Nid::X9_62_PRIME256V1,
Expand All @@ -87,6 +84,26 @@ pub(crate) fn ec_params_to_group(
openssl::nid::Nid::SECP521R1,
cryptography_x509::oid::EC_SECP521R1,
),
// NO-COVERAGE-START
#[cfg(not(any(CRYPTOGRAPHY_IS_BORINGSSL, CRYPTOGRAPHY_IS_AWSLC)))]
&ec_constants::BRAINPOOLP256R1_DOMAIN
| &ec_constants::BRAINPOOLP256R1_DOMAIN_NO_SEED => (
openssl::nid::Nid::BRAINPOOL_P256R1,
cryptography_x509::oid::EC_BRAINPOOLP256R1,
),
#[cfg(not(any(CRYPTOGRAPHY_IS_BORINGSSL, CRYPTOGRAPHY_IS_AWSLC)))]
&ec_constants::BRAINPOOLP384R1_DOMAIN
| &ec_constants::BRAINPOOLP384R1_DOMAIN_NO_SEED => (
openssl::nid::Nid::BRAINPOOL_P384R1,
cryptography_x509::oid::EC_BRAINPOOLP384R1,
),
#[cfg(not(any(CRYPTOGRAPHY_IS_BORINGSSL, CRYPTOGRAPHY_IS_AWSLC)))]
&ec_constants::BRAINPOOLP512R1_DOMAIN
| &ec_constants::BRAINPOOLP512R1_DOMAIN_NO_SEED => (
openssl::nid::Nid::BRAINPOOL_P512R1,
cryptography_x509::oid::EC_BRAINPOOLP512R1,
),
// NO-COVERAGE-END
_ => return Err(KeyParsingError::ExplicitCurveUnsupported),
};
Ok(openssl::ec::EcGroup::from_curve_name(curve_nid)
Expand Down
123 changes: 123 additions & 0 deletions src/rust/cryptography-x509/src/ec_constants.rs
Original file line number Diff line number Diff line change
Expand Up @@ -123,3 +123,126 @@ pub const P521_DOMAIN_NO_SEED: SpecifiedECDomain<'static> = SpecifiedECDomain {
order: P521_ORDER,
cofactor: Some(1),
};

// Brainpool curve domain parameters from RFC 5639, Section 3.
// https://datatracker.ietf.org/doc/html/rfc5639#section-3

const BRAINPOOLP256R1_FIELD: FieldID<'static> = FieldID {
field_type: asn1::DefinedByMarker::marker(),
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()),
};
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";
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";
const BRAINPOOLP256R1_SEED: asn1::BitString<'static> = asn1::BitString::new(
b"\x75\x7f\x59\x58\x49\x0c\xfd\x47\xd7\xc1\x9b\xb4\x21\x58\xd9\x55\x4f\x7b\x46\xbc",
0,
)
.unwrap();
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";
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();

pub const BRAINPOOLP256R1_DOMAIN: SpecifiedECDomain<'static> = SpecifiedECDomain {
version: 1,
field_id: BRAINPOOLP256R1_FIELD,
curve: Curve {
a: BRAINPOOLP256R1_CURVE_A,
b: BRAINPOOLP256R1_CURVE_B,
seed: Some(BRAINPOOLP256R1_SEED),
},
base: BRAINPOOLP256R1_UNCOMPRESSED_BASE,
order: BRAINPOOLP256R1_ORDER,
cofactor: Some(1),
};

pub const BRAINPOOLP256R1_DOMAIN_NO_SEED: SpecifiedECDomain<'static> = SpecifiedECDomain {
version: 1,
field_id: BRAINPOOLP256R1_FIELD,
curve: Curve {
a: BRAINPOOLP256R1_CURVE_A,
b: BRAINPOOLP256R1_CURVE_B,
seed: None,
},
base: BRAINPOOLP256R1_UNCOMPRESSED_BASE,
order: BRAINPOOLP256R1_ORDER,
cofactor: Some(1),
};

const BRAINPOOLP384R1_FIELD: FieldID<'static> = FieldID {
field_type: asn1::DefinedByMarker::marker(),
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()),
};
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";
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";
const BRAINPOOLP384R1_SEED: asn1::BitString<'static> = asn1::BitString::new(
b"\xbc\xfb\xfa\x1c\x87\x7c\x56\x28\x4d\xab\x79\xcd\x4c\x2b\x32\x93\xd2\x0e\x9e\x5e",
0,
)
.unwrap();
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";
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();

pub const BRAINPOOLP384R1_DOMAIN: SpecifiedECDomain<'static> = SpecifiedECDomain {
version: 1,
field_id: BRAINPOOLP384R1_FIELD,
curve: Curve {
a: BRAINPOOLP384R1_CURVE_A,
b: BRAINPOOLP384R1_CURVE_B,
seed: Some(BRAINPOOLP384R1_SEED),
},
base: BRAINPOOLP384R1_UNCOMPRESSED_BASE,
order: BRAINPOOLP384R1_ORDER,
cofactor: Some(1),
};

pub const BRAINPOOLP384R1_DOMAIN_NO_SEED: SpecifiedECDomain<'static> = SpecifiedECDomain {
version: 1,
field_id: BRAINPOOLP384R1_FIELD,
curve: Curve {
a: BRAINPOOLP384R1_CURVE_A,
b: BRAINPOOLP384R1_CURVE_B,
seed: None,
},
base: BRAINPOOLP384R1_UNCOMPRESSED_BASE,
order: BRAINPOOLP384R1_ORDER,
cofactor: Some(1),
};

const BRAINPOOLP512R1_FIELD: FieldID<'static> = FieldID {
field_type: asn1::DefinedByMarker::marker(),
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()),
};
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";
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";
const BRAINPOOLP512R1_SEED: asn1::BitString<'static> = asn1::BitString::new(
b"\xaf\x02\xac\x60\xac\xc9\x3e\xd8\x74\x42\x2a\x52\xec\xb2\x38\xfe\xee\x5a\xb6\xad",
0,
)
.unwrap();
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";
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();

pub const BRAINPOOLP512R1_DOMAIN: SpecifiedECDomain<'static> = SpecifiedECDomain {
version: 1,
field_id: BRAINPOOLP512R1_FIELD,
curve: Curve {
a: BRAINPOOLP512R1_CURVE_A,
b: BRAINPOOLP512R1_CURVE_B,
seed: Some(BRAINPOOLP512R1_SEED),
},
base: BRAINPOOLP512R1_UNCOMPRESSED_BASE,
order: BRAINPOOLP512R1_ORDER,
cofactor: Some(1),
};

pub const BRAINPOOLP512R1_DOMAIN_NO_SEED: SpecifiedECDomain<'static> = SpecifiedECDomain {
version: 1,
field_id: BRAINPOOLP512R1_FIELD,
curve: Curve {
a: BRAINPOOLP512R1_CURVE_A,
b: BRAINPOOLP512R1_CURVE_B,
seed: None,
},
base: BRAINPOOLP512R1_UNCOMPRESSED_BASE,
order: BRAINPOOLP512R1_ORDER,
cofactor: Some(1),
};
12 changes: 12 additions & 0 deletions tests/hazmat/primitives/test_ec.py
Original file line number Diff line number Diff line change
Expand Up @@ -1113,6 +1113,12 @@ def test_load_private_key_unsupported_explicit_parameters(self):
(ec.SECP384R1, "secp384r1-explicit-no-seed.pem"),
(ec.SECP521R1, "secp521r1-explicit-seed.pem"),
(ec.SECP521R1, "secp521r1-explicit-no-seed.pem"),
(ec.BrainpoolP256R1, "brainpoolP256r1-explicit-seed.pem"),
(ec.BrainpoolP256R1, "brainpoolP256r1-explicit-no-seed.pem"),
(ec.BrainpoolP384R1, "brainpoolP384r1-explicit-seed.pem"),
(ec.BrainpoolP384R1, "brainpoolP384r1-explicit-no-seed.pem"),
(ec.BrainpoolP512R1, "brainpoolP512r1-explicit-seed.pem"),
(ec.BrainpoolP512R1, "brainpoolP512r1-explicit-no-seed.pem"),
],
)
def test_load_private_key_explicit_parameters(self, curve, file, backend):
Expand All @@ -1136,6 +1142,12 @@ def test_load_private_key_explicit_parameters(self, curve, file, backend):
(ec.SECP384R1, "secp384r1-pub-explicit-no-seed.pem"),
(ec.SECP521R1, "secp521r1-pub-explicit-seed.pem"),
(ec.SECP521R1, "secp521r1-pub-explicit-no-seed.pem"),
(ec.BrainpoolP256R1, "brainpoolP256r1-pub-explicit-seed.pem"),
(ec.BrainpoolP256R1, "brainpoolP256r1-pub-explicit-no-seed.pem"),
(ec.BrainpoolP384R1, "brainpoolP384r1-pub-explicit-seed.pem"),
(ec.BrainpoolP384R1, "brainpoolP384r1-pub-explicit-no-seed.pem"),
(ec.BrainpoolP512R1, "brainpoolP512r1-pub-explicit-seed.pem"),
(ec.BrainpoolP512R1, "brainpoolP512r1-pub-explicit-no-seed.pem"),
],
)
def test_load_public_key_explicit_parameters(self, curve, file, backend):
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
-----BEGIN PRIVATE KEY-----
MIIBYQIBADCB7AYHKoZIzj0CATCB4AIBATAsBgcqhkjOPQEBAiEAqftX26Huqbw+
ZgqQnYONcm479iPVJiAoIBNIHR9uU3cwRAQgfVoJdfwsMFfu9nUwQXr/5/uAVcEm
3Fxs6UpLRPMwtdkEICbcXGzpSktE8zC12bvXfL+VhBYpXPfhzmvM3Bj/jAe2BEEE
i9Kuuct+V8ssS0gv/IG3r7neJ+HjvSPCOkRTvZrOMmJUfvg1w9rE/Zf4RhoUYR3J
wndFEy3tjlRcHVTHLwRplwIhAKn7V9uh7qm8PmYKkJ2DjXGMOXqjtWGm95AeDoKX
SFanAgEBBG0wawIBAQQgIArH6Tf260XKWyhAuvWNhPlsO6n5Wo7zEv/Wg8fFCqSh
RANCAAQm0s+dHjmTrko1Z6AQEFy0/bryKGVFZJn65LGWAXw8VmR/77uzNnUF+eqM
w3GUumMwW4iWfLU9R2jZY5uJIRtG
-----END PRIVATE KEY-----
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
-----BEGIN PRIVATE KEY-----
MIIBYQIBADCB7AYHKoZIzj0CATCB4AIBATAsBgcqhkjOPQEBAiEAqftX26Huqbw+
ZgqQnYONcm479iPVJiAoIBNIHR9uU3cwRAQgfVoJdfwsMFfu9nUwQXr/5/uAVcEm
3Fxs6UpLRPMwtdkEICbcXGzpSktE8zC12bvXfL+VhBYpXPfhzmvM3Bj/jAe2BEEE
i9Kuuct+V8ssS0gv/IG3r7neJ+HjvSPCOkRTvZrOMmJUfvg1w9rE/Zf4RhoUYR3J
wndFEy3tjlRcHVTHLwRplwIhAKn7V9uh7qm8PmYKkJ2DjXGMOXqjtWGm95AeDoKX
SFanAgEBBG0wawIBAQQgUBF0Zoq6LOZ3w7xAsTcoFHlOF7ZqEChtX+0FxMln0Ieh
RANCAASP9jjhRE17lQ6ofJJnPF+VtIs+H9H0bxSLdT8Lu3QOQgm9qH4/5zxWxjKh
YgmSBIVON9pDNwNoPR7Ab5FIdmwJ
-----END PRIVATE KEY-----
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
-----BEGIN PUBLIC KEY-----
MIIBMzCB7AYHKoZIzj0CATCB4AIBATAsBgcqhkjOPQEBAiEAqftX26Huqbw+ZgqQ
nYONcm479iPVJiAoIBNIHR9uU3cwRAQgfVoJdfwsMFfu9nUwQXr/5/uAVcEm3Fxs
6UpLRPMwtdkEICbcXGzpSktE8zC12bvXfL+VhBYpXPfhzmvM3Bj/jAe2BEEEi9Ku
uct+V8ssS0gv/IG3r7neJ+HjvSPCOkRTvZrOMmJUfvg1w9rE/Zf4RhoUYR3JwndF
Ey3tjlRcHVTHLwRplwIhAKn7V9uh7qm8PmYKkJ2DjXGMOXqjtWGm95AeDoKXSFan
AgEBA0IABCbSz50eOZOuSjVnoBAQXLT9uvIoZUVkmfrksZYBfDxWZH/vu7M2dQX5
6ozDcZS6YzBbiJZ8tT1HaNljm4khG0Y=
-----END PUBLIC KEY-----
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
-----BEGIN PUBLIC KEY-----
MIIBMzCB7AYHKoZIzj0CATCB4AIBATAsBgcqhkjOPQEBAiEAqftX26Huqbw+ZgqQ
nYONcm479iPVJiAoIBNIHR9uU3cwRAQgfVoJdfwsMFfu9nUwQXr/5/uAVcEm3Fxs
6UpLRPMwtdkEICbcXGzpSktE8zC12bvXfL+VhBYpXPfhzmvM3Bj/jAe2BEEEi9Ku
uct+V8ssS0gv/IG3r7neJ+HjvSPCOkRTvZrOMmJUfvg1w9rE/Zf4RhoUYR3JwndF
Ey3tjlRcHVTHLwRplwIhAKn7V9uh7qm8PmYKkJ2DjXGMOXqjtWGm95AeDoKXSFan
AgEBA0IABI/2OOFETXuVDqh8kmc8X5W0iz4f0fRvFIt1Pwu7dA5CCb2ofj/nPFbG
MqFiCZIEhU432kM3A2g9HsBvkUh2bAk=
-----END PUBLIC KEY-----
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
-----BEGIN PRIVATE KEY-----
MIIB9QIBADCCAU0GByqGSM49AgEwggFAAgEBMDwGByqGSM49AQECMQCMuR6Cozht
KA9db35Q5kHfFS9xCe1UVrQSsdoZf7cRI6zTpymQHRpxh0cAEzEH7FMwZAQwe8OC
xj2MFQw8cggKzgWvoMK+oo5PsieHE5Fl77qR+Q+KpYFKUDrU6wSox90izigmBDAE
qMfdIs4oJos5tVQW8ER8L7d94Qfc0qYuiA6lPuti1Xy0OQKV28mUOreGlvpQTBEE
YQQdHGTwaM9F/6KmOoG3wT9riEej537xT+Pbf8r+DL0Q6Ogm4DQ21kaq74ey4kfU
rx6Kvh11IPnCpFyx646Vz9VSYrcLKf7sWGThnAVP+ZEpKA5GRiF3kYERQoIDQSY8
UxUCMQCMuR6CozhtKA9db35Q5kHfFS9xCe1UVrMfFm5srAQlp886tq9rf8MQO4gy
AukEZWUCAQEEgZ4wgZsCAQEEMD0I41D1e05v2YTvpnZqBluszAa3D2YRrA8wJqcz
nQ9CftHci/1wMAC524GMaHwu26FkA2IABHeJNJXgZFVuYnyNlsMptJ9S0oJiwtUy
Y38oAasc9GcEnq7E1SapB+6cHUA+nOmV+1hqjAN8kEwsVDeye4Wvv4snvEC7hxYY
XDlQOyiHdq5C9/UUJxqZWTKWCQoDx0zQWw==
-----END PRIVATE KEY-----
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
-----BEGIN PRIVATE KEY-----
MIIB9QIBADCCAU0GByqGSM49AgEwggFAAgEBMDwGByqGSM49AQECMQCMuR6Cozht
KA9db35Q5kHfFS9xCe1UVrQSsdoZf7cRI6zTpymQHRpxh0cAEzEH7FMwZAQwe8OC
xj2MFQw8cggKzgWvoMK+oo5PsieHE5Fl77qR+Q+KpYFKUDrU6wSox90izigmBDAE
qMfdIs4oJos5tVQW8ER8L7d94Qfc0qYuiA6lPuti1Xy0OQKV28mUOreGlvpQTBEE
YQQdHGTwaM9F/6KmOoG3wT9riEej537xT+Pbf8r+DL0Q6Ogm4DQ21kaq74ey4kfU
rx6Kvh11IPnCpFyx646Vz9VSYrcLKf7sWGThnAVP+ZEpKA5GRiF3kYERQoIDQSY8
UxUCMQCMuR6CozhtKA9db35Q5kHfFS9xCe1UVrMfFm5srAQlp886tq9rf8MQO4gy
AukEZWUCAQEEgZ4wgZsCAQEEMGiTZq5cC0+JR9IjfXiYGqkJ12g7Ty0k716Hqo1F
OgErqyJ10wlS/UqHyznjZWHY+qFkA2IABIZB2azDjNjcGcEHt3d+XrVqa5vmTyDw
+6MG1NpOvEdn80WXZr/ODPoS1vbWnFm28XftbDQsq4UAoJMbNMS9nWyE7d+IipCs
2Y6PM+CEH2Q7/CQ9MqG6HlfzdSUAtpmXsA==
-----END PRIVATE KEY-----
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
-----BEGIN PUBLIC KEY-----
MIIBtTCCAU0GByqGSM49AgEwggFAAgEBMDwGByqGSM49AQECMQCMuR6CozhtKA9d
b35Q5kHfFS9xCe1UVrQSsdoZf7cRI6zTpymQHRpxh0cAEzEH7FMwZAQwe8OCxj2M
FQw8cggKzgWvoMK+oo5PsieHE5Fl77qR+Q+KpYFKUDrU6wSox90izigmBDAEqMfd
Is4oJos5tVQW8ER8L7d94Qfc0qYuiA6lPuti1Xy0OQKV28mUOreGlvpQTBEEYQQd
HGTwaM9F/6KmOoG3wT9riEej537xT+Pbf8r+DL0Q6Ogm4DQ21kaq74ey4kfUrx6K
vh11IPnCpFyx646Vz9VSYrcLKf7sWGThnAVP+ZEpKA5GRiF3kYERQoIDQSY8UxUC
MQCMuR6CozhtKA9db35Q5kHfFS9xCe1UVrMfFm5srAQlp886tq9rf8MQO4gyAukE
ZWUCAQEDYgAEd4k0leBkVW5ifI2Wwym0n1LSgmLC1TJjfygBqxz0ZwSersTVJqkH
7pwdQD6c6ZX7WGqMA3yQTCxUN7J7ha+/iye8QLuHFhhcOVA7KId2rkL39RQnGplZ
MpYJCgPHTNBb
-----END PUBLIC KEY-----
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
-----BEGIN PUBLIC KEY-----
MIIBtTCCAU0GByqGSM49AgEwggFAAgEBMDwGByqGSM49AQECMQCMuR6CozhtKA9d
b35Q5kHfFS9xCe1UVrQSsdoZf7cRI6zTpymQHRpxh0cAEzEH7FMwZAQwe8OCxj2M
FQw8cggKzgWvoMK+oo5PsieHE5Fl77qR+Q+KpYFKUDrU6wSox90izigmBDAEqMfd
Is4oJos5tVQW8ER8L7d94Qfc0qYuiA6lPuti1Xy0OQKV28mUOreGlvpQTBEEYQQd
HGTwaM9F/6KmOoG3wT9riEej537xT+Pbf8r+DL0Q6Ogm4DQ21kaq74ey4kfUrx6K
vh11IPnCpFyx646Vz9VSYrcLKf7sWGThnAVP+ZEpKA5GRiF3kYERQoIDQSY8UxUC
MQCMuR6CozhtKA9db35Q5kHfFS9xCe1UVrMfFm5srAQlp886tq9rf8MQO4gyAukE
ZWUCAQEDYgAEhkHZrMOM2NwZwQe3d35etWprm+ZPIPD7owbU2k68R2fzRZdmv84M
+hLW9tacWbbxd+1sNCyrhQCgkxs0xL2dbITt34iKkKzZjo8z4IQfZDv8JD0yoboe
V/N1JQC2mZew
-----END PUBLIC KEY-----
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
-----BEGIN PRIVATE KEY-----
MIICiQIBADCCAa8GByqGSM49AgEwggGiAgEBMEwGByqGSM49AQECQQCq3Z242+nE
iz/U5q4zyfwHyzCNs7PJ0g7WY5zKcDMIcX1NmwCbxmhCrs2hKuajgOYogf8vLYLG
hSiqYFZYOkjzMIGEBEB4MKMxi2A7ieIycUWsI0zFlMvdjT35FhCoNEHK6phjvC3t
XVqoJTqhCi7xyYuayLV/ERenK/LHuefBrE13/JTKBEA9+RYQqDRByuqYY7wt7V1a
qCU6oQou8cmLmsi1fxEXpyvyx7nnwaxNd/yUytwIPmeYQFC3Xrrl3SgJvWOAFvcj
BIGBBIGu5L3YLtlkWiEyLpxMapOF7Z9wtdkWwbQ7Yu700AmO/zsfeOLQ1I1Q0Wh7
k7l9X3xtUEdAal5oizUiCby5+CJ93jhdVmMy7MDqv6nPeCL98gn3ACSlexqgAMVb
iB+BEbLc3klKX0heW8pL2IonY67RyisvqPBUBnjNHg862AiSAkEAqt2duNvpxIs/
1OauM8n8B8swjbOzydIO1mOcynAzCHBVPlxBTKkmGUGGYRl/rBBHHbHTgQhd2t21
h5aCnKkAaQIBAQSB0DCBzQIBAQRAF2ldwiV2QIkPtpuRqVljBSWhen3gxGzmDOq/
WWye7ZZYBgaQ/Lawtbar4H399RPiyps+5o/nj65AD/TnNCFEbKGBhQOBggAEY8nf
hvDBbxhFicGyb2wjyw5wYqrv2lH46k9p4JMDdVYYezaRcEwQSa9xiOBl1pZ37jek
nlfur4bA1YcCxXFnF5a3r0Xx+67cqF3Qe3K9/pCCChhnq2/hiKFeMf+uRTASkeSW
5N02YWH4nhjxAKkc5CmWYlsCOtb6PSay3YM3jVc=
-----END PRIVATE KEY-----
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
-----BEGIN PRIVATE KEY-----
MIICiQIBADCCAa8GByqGSM49AgEwggGiAgEBMEwGByqGSM49AQECQQCq3Z242+nE
iz/U5q4zyfwHyzCNs7PJ0g7WY5zKcDMIcX1NmwCbxmhCrs2hKuajgOYogf8vLYLG
hSiqYFZYOkjzMIGEBEB4MKMxi2A7ieIycUWsI0zFlMvdjT35FhCoNEHK6phjvC3t
XVqoJTqhCi7xyYuayLV/ERenK/LHuefBrE13/JTKBEA9+RYQqDRByuqYY7wt7V1a
qCU6oQou8cmLmsi1fxEXpyvyx7nnwaxNd/yUytwIPmeYQFC3Xrrl3SgJvWOAFvcj
BIGBBIGu5L3YLtlkWiEyLpxMapOF7Z9wtdkWwbQ7Yu700AmO/zsfeOLQ1I1Q0Wh7
k7l9X3xtUEdAal5oizUiCby5+CJ93jhdVmMy7MDqv6nPeCL98gn3ACSlexqgAMVb
iB+BEbLc3klKX0heW8pL2IonY67RyisvqPBUBnjNHg862AiSAkEAqt2duNvpxIs/
1OauM8n8B8swjbOzydIO1mOcynAzCHBVPlxBTKkmGUGGYRl/rBBHHbHTgQhd2t21
h5aCnKkAaQIBAQSB0DCBzQIBAQRAAwDm0oPXzHxErdV/Vdp6D0CfjNhV2aKumzQ9
/iLPKI1W2KYuFt//eyo6KlsDKVdOluFUw+KoKm7dyPXGnkTKkKGBhQOBggAEj/3a
DNfPMGT7HTW6YiZvV8danAo5fGEHi6LBjCBEIEIqZOFYbS3FWkPn1GX7f7FjMVkt
LW6jzu9vOUj/w9w+3GlyS9G9JbXKz416mmMfmKwFVr8/k6VNqZotzYfgo8L+fFgY
OZAI042jiKMjIoKuZN+RnZSGf2vwA+Xg6uVUSrQ=
-----END PRIVATE KEY-----
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
-----BEGIN PUBLIC KEY-----
MIICODCCAa8GByqGSM49AgEwggGiAgEBMEwGByqGSM49AQECQQCq3Z242+nEiz/U
5q4zyfwHyzCNs7PJ0g7WY5zKcDMIcX1NmwCbxmhCrs2hKuajgOYogf8vLYLGhSiq
YFZYOkjzMIGEBEB4MKMxi2A7ieIycUWsI0zFlMvdjT35FhCoNEHK6phjvC3tXVqo
JTqhCi7xyYuayLV/ERenK/LHuefBrE13/JTKBEA9+RYQqDRByuqYY7wt7V1aqCU6
oQou8cmLmsi1fxEXpyvyx7nnwaxNd/yUytwIPmeYQFC3Xrrl3SgJvWOAFvcjBIGB
BIGu5L3YLtlkWiEyLpxMapOF7Z9wtdkWwbQ7Yu700AmO/zsfeOLQ1I1Q0Wh7k7l9
X3xtUEdAal5oizUiCby5+CJ93jhdVmMy7MDqv6nPeCL98gn3ACSlexqgAMVbiB+B
EbLc3klKX0heW8pL2IonY67RyisvqPBUBnjNHg862AiSAkEAqt2duNvpxIs/1Oau
M8n8B8swjbOzydIO1mOcynAzCHBVPlxBTKkmGUGGYRl/rBBHHbHTgQhd2t21h5aC
nKkAaQIBAQOBggAEY8nfhvDBbxhFicGyb2wjyw5wYqrv2lH46k9p4JMDdVYYezaR
cEwQSa9xiOBl1pZ37jeknlfur4bA1YcCxXFnF5a3r0Xx+67cqF3Qe3K9/pCCChhn
q2/hiKFeMf+uRTASkeSW5N02YWH4nhjxAKkc5CmWYlsCOtb6PSay3YM3jVc=
-----END PUBLIC KEY-----
Loading
Loading