Skip to content

Commit e04c4c1

Browse files
authored
[DTLS] Add NamedCurve::P384 (#254)
1 parent 5614253 commit e04c4c1

File tree

4 files changed

+31
-7
lines changed

4 files changed

+31
-7
lines changed

dtls/Cargo.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,10 @@ hkdf = "~0.12.1"
2222
# required because elliptic-curve requires "3", but "3.0.0" does not compile.
2323
curve25519-dalek = "3.2"
2424
p256 = { version = "0.11.1", features = ["default", "ecdh", "ecdsa"] }
25-
#p384 = "0.4.1"
25+
p384 = "0.11.2"
2626
rand = "0.8.5"
2727
hmac = "0.10.1"
28+
sec1 = { version = "0.3.0", features = [ "std" ] }
2829
sha-1 = "0.9.1"
2930
sha2 = "0.9.1"
3031
aes = "0.6.0"

dtls/src/curve/named_curve.rs

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,13 @@ use rand_core::OsRng; // requires 'getrandom' feature
33
use crate::error::*;
44

55
// https://www.iana.org/assignments/tls-parameters/tls-parameters.xml#tls-parameters-8
6+
#[repr(u16)]
67
#[derive(Copy, Clone, PartialEq, Eq, Debug)]
78
pub enum NamedCurve {
9+
Unsupported = 0x0000,
810
P256 = 0x0017,
911
P384 = 0x0018,
1012
X25519 = 0x001d,
11-
Unsupported,
1213
}
1314

1415
impl From<u16> for NamedCurve {
@@ -24,6 +25,7 @@ impl From<u16> for NamedCurve {
2425

2526
pub(crate) enum NamedCurvePrivateKey {
2627
EphemeralSecretP256(p256::ecdh::EphemeralSecret),
28+
EphemeralSecretP384(p384::ecdh::EphemeralSecret),
2729
StaticSecretX25519(x25519_dalek::StaticSecret),
2830
}
2931

@@ -43,6 +45,14 @@ fn elliptic_curve_keypair(curve: NamedCurve) -> Result<NamedCurveKeypair> {
4345
NamedCurvePrivateKey::EphemeralSecretP256(secret_key),
4446
)
4547
}
48+
NamedCurve::P384 => {
49+
let secret_key = p384::ecdh::EphemeralSecret::random(&mut OsRng);
50+
let public_key = p384::EncodedPoint::from(secret_key.public_key());
51+
(
52+
public_key.as_bytes().to_vec(),
53+
NamedCurvePrivateKey::EphemeralSecretP384(secret_key),
54+
)
55+
}
4656
NamedCurve::X25519 => {
4757
let secret_key = x25519_dalek::StaticSecret::new(OsRng);
4858
let public_key = x25519_dalek::PublicKey::from(&secret_key);
@@ -51,7 +61,6 @@ fn elliptic_curve_keypair(curve: NamedCurve) -> Result<NamedCurveKeypair> {
5161
NamedCurvePrivateKey::StaticSecretX25519(secret_key),
5262
)
5363
}
54-
//TODO: add NamedCurve::p384
5564
_ => return Err(Error::ErrInvalidNamedCurve),
5665
};
5766

@@ -65,10 +74,9 @@ fn elliptic_curve_keypair(curve: NamedCurve) -> Result<NamedCurveKeypair> {
6574
impl NamedCurve {
6675
pub fn generate_keypair(&self) -> Result<NamedCurveKeypair> {
6776
match *self {
68-
//TODO: add P384
6977
NamedCurve::X25519 => elliptic_curve_keypair(NamedCurve::X25519),
7078
NamedCurve::P256 => elliptic_curve_keypair(NamedCurve::P256),
71-
//NamedCurve::P384 => elliptic_curve_keypair(NamedCurve::P384),
79+
NamedCurve::P384 => elliptic_curve_keypair(NamedCurve::P384),
7280
_ => Err(Error::ErrInvalidNamedCurve),
7381
}
7482
}

dtls/src/error.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,8 @@ pub enum Error {
156156
#[error("utf8: {0}")]
157157
Utf8(#[from] FromUtf8Error),
158158
#[error("{0}")]
159+
Sec1(#[source] sec1::Error),
160+
#[error("{0}")]
159161
P256(#[source] P256Error),
160162
#[error("{0}")]
161163
RcGen(#[from] RcgenError),
@@ -186,6 +188,12 @@ impl From<io::Error> for Error {
186188
}
187189
}
188190

191+
impl From<sec1::Error> for Error {
192+
fn from(e: sec1::Error) -> Self {
193+
Error::Sec1(e)
194+
}
195+
}
196+
189197
#[derive(Debug, Error)]
190198
#[error("{0}")]
191199
pub struct P256Error(#[source] p256::elliptic_curve::Error);

dtls/src/prf/mod.rs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ pub(crate) fn prf_pre_master_secret(
7676
) -> Result<Vec<u8>> {
7777
match curve {
7878
NamedCurve::P256 => elliptic_curve_pre_master_secret(public_key, private_key, curve),
79+
NamedCurve::P384 => elliptic_curve_pre_master_secret(public_key, private_key, curve),
7980
NamedCurve::X25519 => elliptic_curve_pre_master_secret(public_key, private_key, curve),
8081
_ => Err(Error::ErrInvalidNamedCurve),
8182
}
@@ -88,13 +89,19 @@ fn elliptic_curve_pre_master_secret(
8889
) -> Result<Vec<u8>> {
8990
match curve {
9091
NamedCurve::P256 => {
91-
let pub_key =
92-
p256::EncodedPoint::from_bytes(public_key).map_err(elliptic_curve::Error::from)?;
92+
let pub_key = p256::EncodedPoint::from_bytes(public_key)?;
9393
let public = p256::PublicKey::from_sec1_bytes(pub_key.as_ref())?;
9494
if let NamedCurvePrivateKey::EphemeralSecretP256(secret) = private_key {
9595
return Ok(secret.diffie_hellman(&public).raw_secret_bytes().to_vec());
9696
}
9797
}
98+
NamedCurve::P384 => {
99+
let pub_key = p384::EncodedPoint::from_bytes(public_key)?;
100+
let public = p384::PublicKey::from_sec1_bytes(pub_key.as_ref())?;
101+
if let NamedCurvePrivateKey::EphemeralSecretP384(secret) = private_key {
102+
return Ok(secret.diffie_hellman(&public).raw_secret_bytes().to_vec());
103+
}
104+
}
98105
NamedCurve::X25519 => {
99106
if public_key.len() != 32 {
100107
return Err(Error::Other("Public key is not 32 len".into()));

0 commit comments

Comments
 (0)