Skip to content

Commit f3997fa

Browse files
goffrieConvex, Inc.
authored and
Convex, Inc.
committed
Switch from ring to aws-lc-rs for SubtleCrypto (#37069)
GitOrigin-RevId: e7c1ba31a601f9e31f7267dda348c692780cc1d7
1 parent f2ce5c0 commit f3997fa

File tree

8 files changed

+77
-106
lines changed

8 files changed

+77
-106
lines changed

Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ cbc = { version = "0.1.2" }
1818
csv-async = "1.2"
1919
atomic_refcell = "0.1.13"
2020
aws-config = { version = "1.6", default-features = false, features = [ "client-hyper", "default-https-client", "rustls", "rt-tokio" ] }
21+
aws-lc-rs = { version = "1.13", default-features = false, features = [ "aws-lc-sys", "prebuilt-nasm" ] }
2122
aws-sdk-s3 = { version = "1.83", default-features = false, features = [ "default-https-client", "rt-tokio", "sigv4a" ] }
2223
aws-smithy-http = "0.60.8"
2324
aws-smithy-types-convert = { version = "0.60", features = [ "convert-streams" ] }
@@ -130,7 +131,6 @@ ref-cast = "1.0.20"
130131
regex = "1"
131132
reqwest = { version = "0.12.7", features = [ "json", "stream", "gzip", "native-tls-vendored" ] }
132133
reqwest-middleware = "0.4.1"
133-
ring = "0.17.8"
134134
rsa = "0.9.6"
135135
rusqlite = { version = "0.32", features = [ "bundled" ] }
136136
saffron = { git = "https://github.com/get-convex/saffron", rev = "1d842379919fb5c1988ac127cebd6167b1eb9bec", features = [ "std" ] }

crates/isolate/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ async-broadcast = { workspace = true }
2121
async-channel = { workspace = true }
2222
async-recursion = { workspace = true }
2323
async-trait = { workspace = true }
24+
aws-lc-rs = { workspace = true }
2425
axum = { workspace = true }
2526
base64 = { workspace = true }
2627
bytes = { workspace = true }
@@ -65,7 +66,6 @@ proptest-http = { workspace = true, optional = true }
6566
rand = { workspace = true }
6667
rand_chacha = { workspace = true }
6768
regex = { workspace = true }
68-
ring = { workspace = true }
6969
runtime = { path = "../runtime" }
7070
search = { path = "../search" }
7171
semver = { workspace = true }

crates/isolate/src/environment/crypto_rng.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ impl CryptoRng {
99
CryptoRng(())
1010
}
1111

12-
/// Returns a `ring`-compatible random number generator
13-
pub fn ring(&self) -> ring::rand::SystemRandom {
14-
ring::rand::SystemRandom::new()
12+
/// Returns a `aws_lc_rs`-compatible random number generator
13+
pub fn aws_lc(&self) -> aws_lc_rs::rand::SystemRandom {
14+
aws_lc_rs::rand::SystemRandom::new()
1515
}
1616
}

crates/isolate/src/ops/crypto/ed25519.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license.
22
// https://github.com/denoland/deno/blob/main/ext/crypto/ed25519.rs
33

4-
use deno_core::ToJsBuffer;
5-
use elliptic_curve::pkcs8::PrivateKeyInfo;
6-
use ring::signature::{
4+
use aws_lc_rs::signature::{
75
Ed25519KeyPair,
86
KeyPair,
97
};
8+
use deno_core::ToJsBuffer;
9+
use elliptic_curve::pkcs8::PrivateKeyInfo;
1010
use spki::{
1111
der::{
1212
asn1::BitString,
@@ -40,7 +40,7 @@ impl CryptoOps {
4040
}
4141

4242
pub fn verify_ed25519(pubkey: &[u8], data: &[u8], signature: &[u8]) -> bool {
43-
ring::signature::UnparsedPublicKey::new(&ring::signature::ED25519, pubkey)
43+
aws_lc_rs::signature::UnparsedPublicKey::new(&aws_lc_rs::signature::ED25519, pubkey)
4444
.verify(data, signature)
4545
.is_ok()
4646
}

crates/isolate/src/ops/crypto/generate_key.rs

Lines changed: 26 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,18 @@
11
use anyhow::Context as _;
2-
use deno_core::ToJsBuffer;
3-
use openssl::{
4-
bn::BigNum,
5-
rsa::Rsa,
6-
};
7-
use ring::{
2+
use aws_lc_rs::{
3+
encoding::AsBigEndian as _,
84
rand::SecureRandom,
95
signature::{
106
EcdsaKeyPair,
117
Ed25519KeyPair,
128
KeyPair,
139
},
1410
};
11+
use deno_core::ToJsBuffer;
12+
use openssl::{
13+
bn::BigNum,
14+
rsa::Rsa,
15+
};
1516

1617
use super::{
1718
shared::RustRawKeyData,
@@ -26,7 +27,7 @@ use crate::environment::crypto_rng::CryptoRng;
2627

2728
impl CryptoOps {
2829
pub fn generate_keypair(
29-
rng: CryptoRng,
30+
_rng: CryptoRng,
3031
algorithm: GenerateKeypairAlgorithm,
3132
) -> anyhow::Result<GeneratedKeypair> {
3233
match algorithm {
@@ -53,21 +54,17 @@ impl CryptoOps {
5354
name: Algorithm::Ecdsa | Algorithm::Ecdh,
5455
named_curve,
5556
} => {
56-
let private_key_pkcs8 =
57-
EcdsaKeyPair::generate_pkcs8(named_curve.into(), &rng.ring())
58-
.ok()
59-
.context("failed to generate ecdsa keypair")?;
60-
let keypair = EcdsaKeyPair::from_pkcs8(
61-
named_curve.into(),
62-
private_key_pkcs8.as_ref(),
63-
&rng.ring(),
64-
)
65-
.ok()
66-
.context("failed to parse ecdsa pkcs8 that we just generated")?;
57+
let keypair = EcdsaKeyPair::generate(named_curve.into())
58+
.context("failed to generate ecdsa keypair")?;
6759
Ok(GeneratedKeypair {
6860
private_raw_data: GeneratedKey::KeyData(RustRawKeyData::Private(
6961
// private key is PKCS#8-encoded
70-
private_key_pkcs8.as_ref().to_vec().into(),
62+
keypair
63+
.to_pkcs8v1()
64+
.context("failed to serialize ecdsa keypair")?
65+
.as_ref()
66+
.to_vec()
67+
.into(),
7168
)),
7269
public_raw_data: GeneratedKey::KeyData(RustRawKeyData::Public(
7370
// public key is just the elliptic curve point
@@ -78,23 +75,16 @@ impl CryptoOps {
7875
GenerateKeypairAlgorithm::Curve25519 {
7976
name: Curve25519Algorithm::Ed25519,
8077
} => {
81-
let pkcs8_keypair = Ed25519KeyPair::generate_pkcs8(&rng.ring())
82-
.ok()
83-
.context("failed to generate ed25519 key")?;
84-
// ring is really annoying and needs to jump through hoops to get the public key
85-
// that we just generated
86-
let public_key = Ed25519KeyPair::from_pkcs8(pkcs8_keypair.as_ref())
87-
.ok()
88-
.context("failed to parse ed25519 pkcs8 that we just generated")?
89-
.public_key()
90-
.as_ref()
91-
.to_vec();
92-
// ring is really really annoying and doesn't export the raw
93-
// seed at all, so use RustCrypto instead
94-
let private_key = Self::import_pkcs8_ed25519(pkcs8_keypair.as_ref())
95-
.context("failed to import ed25519 pkcs8 that we just generated")?;
78+
let keypair =
79+
Ed25519KeyPair::generate().context("failed to generate ed25519 key")?;
80+
let public_key = keypair.public_key().as_ref().to_vec();
81+
let private_key = keypair
82+
.seed()
83+
.context("failed to get generated ed25519 seed")?
84+
.as_be_bytes()
85+
.context("failed to get generated ed25519 seed")?;
9686
Ok(GeneratedKeypair {
97-
private_raw_data: GeneratedKey::RawBytes(private_key),
87+
private_raw_data: GeneratedKey::RawBytes(private_key.as_ref().to_vec().into()),
9888
public_raw_data: GeneratedKey::RawBytes(public_key.into()),
9989
})
10090
},
@@ -112,7 +102,7 @@ impl CryptoOps {
112102
pub fn generate_key_bytes(rng: CryptoRng, length: usize) -> anyhow::Result<ToJsBuffer> {
113103
anyhow::ensure!(length <= 1024, "key too long");
114104
let mut buf = vec![0; length];
115-
rng.ring()
105+
rng.aws_lc()
116106
.fill(&mut buf)
117107
.ok()
118108
.context("failed to generate random bytes")?;

crates/isolate/src/ops/crypto/import_key.rs

Lines changed: 7 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@
22
// https://github.com/denoland/deno/blob/main/ext/crypto/import_key.rs
33

44
use anyhow::Context as _;
5+
use aws_lc_rs::signature::EcdsaKeyPair;
56
use deno_core::ToJsBuffer;
67
use elliptic_curve::pkcs8::PrivateKeyInfo;
78
use p256::pkcs8::EncodePrivateKey;
89
use pkcs1::UintRef;
9-
use ring::signature::EcdsaKeyPair;
1010
use serde::{
1111
Deserialize,
1212
Serialize,
@@ -549,32 +549,19 @@ fn import_key_ec_jwk(
549549
}
550550

551551
fn validate_ecdsa_pkcs8(
552-
key_alg: &'static ring::signature::EcdsaSigningAlgorithm,
552+
key_alg: &'static aws_lc_rs::signature::EcdsaSigningAlgorithm,
553553
pkcs8: &[u8],
554-
) -> Result<(), ring::error::KeyRejected> {
555-
EcdsaKeyPair::from_pkcs8(
556-
key_alg,
557-
pkcs8,
558-
// This randomness does not affect whether the key is accepted or rejected, and we throw
559-
// away the returned keypair
560-
&ring::rand::SystemRandom::new(),
561-
)?;
554+
) -> Result<(), aws_lc_rs::error::KeyRejected> {
555+
EcdsaKeyPair::from_pkcs8(key_alg, pkcs8)?;
562556
Ok(())
563557
}
564558

565559
fn validate_ecdsa_private_key(
566-
key_alg: &'static ring::signature::EcdsaSigningAlgorithm,
560+
key_alg: &'static aws_lc_rs::signature::EcdsaSigningAlgorithm,
567561
private_key: &[u8],
568562
public_key: &[u8],
569-
) -> Result<(), ring::error::KeyRejected> {
570-
EcdsaKeyPair::from_private_key_and_public_key(
571-
key_alg,
572-
private_key,
573-
public_key,
574-
// This randomness does not affect whether the key is accepted or rejected, and we throw
575-
// away the returned keypair
576-
&ring::rand::SystemRandom::new(),
577-
)?;
563+
) -> Result<(), aws_lc_rs::error::KeyRejected> {
564+
EcdsaKeyPair::from_private_key_and_public_key(key_alg, private_key, public_key)?;
578565
Ok(())
579566
}
580567

0 commit comments

Comments
 (0)