summaryrefslogtreecommitdiff
path: root/ext/crypto
diff options
context:
space:
mode:
authorBartek IwaƄczuk <biwanczuk@gmail.com>2023-06-22 23:37:56 +0200
committerGitHub <noreply@github.com>2023-06-22 23:37:56 +0200
commitdda0f1c343bfb3196ce6a7c7e8c2acccfd5c2e5b (patch)
tree10fc273a620949ccf63826363499f8f39056896d /ext/crypto
parentb319fa7f4965af3d3d576ea528248a31c96a4053 (diff)
refactor(serde_v8): split ZeroCopyBuf into JsBuffer and ToJsBuffer (#19566)
`ZeroCopyBuf` was convenient to use, but sometimes it did hide details that some copies were necessary in certain cases. Also it made it way to easy for the caller to pass around and convert into different values. This commit splits `ZeroCopyBuf` into `JsBuffer` (an array buffer coming from V8) and `ToJsBuffer` (a Rust buffer that will be converted into a V8 array buffer). As a result some magical conversions were removed (they were never used) limiting the API surface and preparing for changes in #19534.
Diffstat (limited to 'ext/crypto')
-rw-r--r--ext/crypto/decrypt.rs17
-rw-r--r--ext/crypto/ed25519.rs6
-rw-r--r--ext/crypto/encrypt.rs17
-rw-r--r--ext/crypto/export_key.rs16
-rw-r--r--ext/crypto/generate_key.rs4
-rw-r--r--ext/crypto/import_key.rs49
-rw-r--r--ext/crypto/lib.rs39
-rw-r--r--ext/crypto/shared.rs45
-rw-r--r--ext/crypto/x25519.rs6
9 files changed, 106 insertions, 93 deletions
diff --git a/ext/crypto/decrypt.rs b/ext/crypto/decrypt.rs
index fc54fe818..59679614f 100644
--- a/ext/crypto/decrypt.rs
+++ b/ext/crypto/decrypt.rs
@@ -21,7 +21,8 @@ use deno_core::error::type_error;
use deno_core::error::AnyError;
use deno_core::op;
use deno_core::task::spawn_blocking;
-use deno_core::ZeroCopyBuf;
+use deno_core::JsBuffer;
+use deno_core::ToJsBuffer;
use rsa::pkcs1::DecodeRsaPrivateKey;
use rsa::PaddingScheme;
use serde::Deserialize;
@@ -36,7 +37,7 @@ use crate::shared::*;
#[derive(Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct DecryptOptions {
- key: RawKeyData,
+ key: V8RawKeyData,
#[serde(flatten)]
algorithm: DecryptAlgorithm,
}
@@ -77,8 +78,8 @@ pub enum DecryptAlgorithm {
#[op]
pub async fn op_crypto_decrypt(
opts: DecryptOptions,
- data: ZeroCopyBuf,
-) -> Result<ZeroCopyBuf, AnyError> {
+ data: JsBuffer,
+) -> Result<ToJsBuffer, AnyError> {
let key = opts.key;
let fun = move || match opts.algorithm {
DecryptAlgorithm::RsaOaep { hash, label } => {
@@ -104,7 +105,7 @@ pub async fn op_crypto_decrypt(
}
fn decrypt_rsa_oaep(
- key: RawKeyData,
+ key: V8RawKeyData,
hash: ShaHash,
label: Vec<u8>,
data: &[u8],
@@ -143,7 +144,7 @@ fn decrypt_rsa_oaep(
}
fn decrypt_aes_cbc(
- key: RawKeyData,
+ key: V8RawKeyData,
length: usize,
iv: Vec<u8>,
data: &[u8],
@@ -281,7 +282,7 @@ fn decrypt_aes_gcm_gen<N: ArrayLength<u8>>(
}
fn decrypt_aes_ctr(
- key: RawKeyData,
+ key: V8RawKeyData,
key_length: usize,
counter: &[u8],
ctr_length: usize,
@@ -315,7 +316,7 @@ fn decrypt_aes_ctr(
}
fn decrypt_aes_gcm(
- key: RawKeyData,
+ key: V8RawKeyData,
length: usize,
tag_length: usize,
iv: Vec<u8>,
diff --git a/ext/crypto/ed25519.rs b/ext/crypto/ed25519.rs
index 784583c6b..98eabbd59 100644
--- a/ext/crypto/ed25519.rs
+++ b/ext/crypto/ed25519.rs
@@ -2,7 +2,7 @@
use deno_core::error::AnyError;
use deno_core::op;
-use deno_core::ZeroCopyBuf;
+use deno_core::ToJsBuffer;
use elliptic_curve::pkcs8::PrivateKeyInfo;
use rand::rngs::OsRng;
use rand::RngCore;
@@ -105,7 +105,7 @@ pub fn op_crypto_import_pkcs8_ed25519(key_data: &[u8], out: &mut [u8]) -> bool {
#[op]
pub fn op_crypto_export_spki_ed25519(
pubkey: &[u8],
-) -> Result<ZeroCopyBuf, AnyError> {
+) -> Result<ToJsBuffer, AnyError> {
let key_info = spki::SubjectPublicKeyInfo {
algorithm: spki::AlgorithmIdentifier {
// id-Ed25519
@@ -120,7 +120,7 @@ pub fn op_crypto_export_spki_ed25519(
#[op]
pub fn op_crypto_export_pkcs8_ed25519(
pkey: &[u8],
-) -> Result<ZeroCopyBuf, AnyError> {
+) -> Result<ToJsBuffer, AnyError> {
// This should probably use OneAsymmetricKey instead
let pk_info = rsa::pkcs8::PrivateKeyInfo {
public_key: None,
diff --git a/ext/crypto/encrypt.rs b/ext/crypto/encrypt.rs
index 2831ca0f4..0dc300538 100644
--- a/ext/crypto/encrypt.rs
+++ b/ext/crypto/encrypt.rs
@@ -20,7 +20,8 @@ use deno_core::error::type_error;
use deno_core::error::AnyError;
use deno_core::op;
use deno_core::task::spawn_blocking;
-use deno_core::ZeroCopyBuf;
+use deno_core::JsBuffer;
+use deno_core::ToJsBuffer;
use rand::rngs::OsRng;
use rsa::pkcs1::DecodeRsaPublicKey;
use rsa::PaddingScheme;
@@ -37,7 +38,7 @@ use crate::shared::*;
#[derive(Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct EncryptOptions {
- key: RawKeyData,
+ key: V8RawKeyData,
#[serde(flatten)]
algorithm: EncryptAlgorithm,
}
@@ -78,8 +79,8 @@ pub enum EncryptAlgorithm {
#[op]
pub async fn op_crypto_encrypt(
opts: EncryptOptions,
- data: ZeroCopyBuf,
-) -> Result<ZeroCopyBuf, AnyError> {
+ data: JsBuffer,
+) -> Result<ToJsBuffer, AnyError> {
let key = opts.key;
let fun = move || match opts.algorithm {
EncryptAlgorithm::RsaOaep { hash, label } => {
@@ -105,7 +106,7 @@ pub async fn op_crypto_encrypt(
}
fn encrypt_rsa_oaep(
- key: RawKeyData,
+ key: V8RawKeyData,
hash: ShaHash,
label: Vec<u8>,
data: &[u8],
@@ -145,7 +146,7 @@ fn encrypt_rsa_oaep(
}
fn encrypt_aes_cbc(
- key: RawKeyData,
+ key: V8RawKeyData,
length: usize,
iv: Vec<u8>,
data: &[u8],
@@ -218,7 +219,7 @@ fn encrypt_aes_gcm_general<N: ArrayLength<u8>>(
}
fn encrypt_aes_gcm(
- key: RawKeyData,
+ key: V8RawKeyData,
length: usize,
tag_length: usize,
iv: Vec<u8>,
@@ -277,7 +278,7 @@ where
}
fn encrypt_aes_ctr(
- key: RawKeyData,
+ key: V8RawKeyData,
key_length: usize,
counter: &[u8],
ctr_length: usize,
diff --git a/ext/crypto/export_key.rs b/ext/crypto/export_key.rs
index ec76bac92..13f7357fa 100644
--- a/ext/crypto/export_key.rs
+++ b/ext/crypto/export_key.rs
@@ -5,7 +5,7 @@ use const_oid::ObjectIdentifier;
use deno_core::error::custom_error;
use deno_core::error::AnyError;
use deno_core::op;
-use deno_core::ZeroCopyBuf;
+use deno_core::ToJsBuffer;
use elliptic_curve::sec1::ToEncodedPoint;
use p256::pkcs8::DecodePrivateKey;
use rsa::pkcs1::UIntRef;
@@ -59,9 +59,9 @@ pub enum ExportKeyAlgorithm {
#[derive(Serialize)]
#[serde(untagged)]
pub enum ExportKeyResult {
- Raw(ZeroCopyBuf),
- Pkcs8(ZeroCopyBuf),
- Spki(ZeroCopyBuf),
+ Raw(ToJsBuffer),
+ Pkcs8(ToJsBuffer),
+ Spki(ToJsBuffer),
JwkSecret {
k: String,
},
@@ -93,7 +93,7 @@ pub enum ExportKeyResult {
#[op]
pub fn op_crypto_export_key(
opts: ExportKeyOptions,
- key_data: RawKeyData,
+ key_data: V8RawKeyData,
) -> Result<ExportKeyResult, AnyError> {
match opts.algorithm {
ExportKeyAlgorithm::RsassaPkcs1v15 {}
@@ -119,7 +119,7 @@ fn bytes_to_b64(bytes: &[u8]) -> String {
fn export_key_rsa(
format: ExportKeyFormat,
- key_data: RawKeyData,
+ key_data: V8RawKeyData,
) -> Result<ExportKeyResult, deno_core::anyhow::Error> {
match format {
ExportKeyFormat::Spki => {
@@ -212,7 +212,7 @@ fn export_key_rsa(
fn export_key_symmetric(
format: ExportKeyFormat,
- key_data: RawKeyData,
+ key_data: V8RawKeyData,
) -> Result<ExportKeyResult, deno_core::anyhow::Error> {
match format {
ExportKeyFormat::JwkSecret => {
@@ -228,7 +228,7 @@ fn export_key_symmetric(
fn export_key_ec(
format: ExportKeyFormat,
- key_data: RawKeyData,
+ key_data: V8RawKeyData,
algorithm: ExportKeyAlgorithm,
named_curve: EcNamedCurve,
) -> Result<ExportKeyResult, deno_core::anyhow::Error> {
diff --git a/ext/crypto/generate_key.rs b/ext/crypto/generate_key.rs
index 426c61376..9e2d14ea7 100644
--- a/ext/crypto/generate_key.rs
+++ b/ext/crypto/generate_key.rs
@@ -3,7 +3,7 @@
use deno_core::error::AnyError;
use deno_core::op;
use deno_core::task::spawn_blocking;
-use deno_core::ZeroCopyBuf;
+use deno_core::ToJsBuffer;
use elliptic_curve::rand_core::OsRng;
use num_traits::FromPrimitive;
use once_cell::sync::Lazy;
@@ -45,7 +45,7 @@ pub enum GenerateKeyOptions {
#[op]
pub async fn op_crypto_generate_key(
opts: GenerateKeyOptions,
-) -> Result<ZeroCopyBuf, AnyError> {
+) -> Result<ToJsBuffer, AnyError> {
let fun = || match opts {
GenerateKeyOptions::Rsa {
modulus_length,
diff --git a/ext/crypto/import_key.rs b/ext/crypto/import_key.rs
index 42eab0e6c..c3d60101c 100644
--- a/ext/crypto/import_key.rs
+++ b/ext/crypto/import_key.rs
@@ -2,7 +2,8 @@
use deno_core::error::AnyError;
use deno_core::op;
-use deno_core::ZeroCopyBuf;
+use deno_core::JsBuffer;
+use deno_core::ToJsBuffer;
use elliptic_curve::pkcs8::PrivateKeyInfo;
use p256::pkcs8::EncodePrivateKey;
use ring::signature::EcdsaKeyPair;
@@ -18,9 +19,9 @@ use crate::shared::*;
#[derive(Deserialize)]
#[serde(rename_all = "camelCase")]
pub enum KeyData {
- Spki(ZeroCopyBuf),
- Pkcs8(ZeroCopyBuf),
- Raw(ZeroCopyBuf),
+ Spki(JsBuffer),
+ Pkcs8(JsBuffer),
+ Raw(JsBuffer),
JwkSecret {
k: String,
},
@@ -73,17 +74,17 @@ pub enum ImportKeyOptions {
pub enum ImportKeyResult {
#[serde(rename_all = "camelCase")]
Rsa {
- raw_data: RawKeyData,
+ raw_data: RustRawKeyData,
modulus_length: usize,
- public_exponent: ZeroCopyBuf,
+ public_exponent: ToJsBuffer,
},
#[serde(rename_all = "camelCase")]
- Ec { raw_data: RawKeyData },
+ Ec { raw_data: RustRawKeyData },
#[serde(rename_all = "camelCase")]
#[allow(dead_code)]
- Aes { raw_data: RawKeyData },
+ Aes { raw_data: RustRawKeyData },
#[serde(rename_all = "camelCase")]
- Hmac { raw_data: RawKeyData },
+ Hmac { raw_data: RustRawKeyData },
}
#[op]
@@ -136,7 +137,7 @@ fn import_key_rsa_jwk(
let modulus_length = public_key.modulus.as_bytes().len() * 8;
Ok(ImportKeyResult::Rsa {
- raw_data: RawKeyData::Public(data.into()),
+ raw_data: RustRawKeyData::Public(data.into()),
modulus_length,
public_exponent,
})
@@ -181,7 +182,7 @@ fn import_key_rsa_jwk(
let modulus_length = private_key.modulus.as_bytes().len() * 8;
Ok(ImportKeyResult::Rsa {
- raw_data: RawKeyData::Private(data.into()),
+ raw_data: RustRawKeyData::Private(data.into()),
modulus_length,
public_exponent,
})
@@ -228,7 +229,7 @@ fn import_key_rsassa(
let modulus_length = public_key.modulus.as_bytes().len() * 8;
Ok(ImportKeyResult::Rsa {
- raw_data: RawKeyData::Public(data),
+ raw_data: RustRawKeyData::Public(data),
modulus_length,
public_exponent,
})
@@ -267,7 +268,7 @@ fn import_key_rsassa(
let modulus_length = private_key.modulus.as_bytes().len() * 8;
Ok(ImportKeyResult::Rsa {
- raw_data: RawKeyData::Private(data),
+ raw_data: RustRawKeyData::Private(data),
modulus_length,
public_exponent,
})
@@ -317,7 +318,7 @@ fn import_key_rsapss(
let modulus_length = public_key.modulus.as_bytes().len() * 8;
Ok(ImportKeyResult::Rsa {
- raw_data: RawKeyData::Public(data),
+ raw_data: RustRawKeyData::Public(data),
modulus_length,
public_exponent,
})
@@ -356,7 +357,7 @@ fn import_key_rsapss(
let modulus_length = private_key.modulus.as_bytes().len() * 8;
Ok(ImportKeyResult::Rsa {
- raw_data: RawKeyData::Private(data),
+ raw_data: RustRawKeyData::Private(data),
modulus_length,
public_exponent,
})
@@ -406,7 +407,7 @@ fn import_key_rsaoaep(
let modulus_length = public_key.modulus.as_bytes().len() * 8;
Ok(ImportKeyResult::Rsa {
- raw_data: RawKeyData::Public(data),
+ raw_data: RustRawKeyData::Public(data),
modulus_length,
public_exponent,
})
@@ -445,7 +446,7 @@ fn import_key_rsaoaep(
let modulus_length = private_key.modulus.as_bytes().len() * 8;
Ok(ImportKeyResult::Rsa {
- raw_data: RawKeyData::Private(data),
+ raw_data: RustRawKeyData::Private(data),
modulus_length,
public_exponent,
})
@@ -513,7 +514,7 @@ fn import_key_ec_jwk(
let point_bytes = import_key_ec_jwk_to_point(x, y, named_curve)?;
Ok(ImportKeyResult::Ec {
- raw_data: RawKeyData::Public(point_bytes.into()),
+ raw_data: RustRawKeyData::Public(point_bytes.into()),
})
}
KeyData::JwkPrivateEc { d, x, y } => {
@@ -553,7 +554,7 @@ fn import_key_ec_jwk(
);
Ok(ImportKeyResult::Ec {
- raw_data: RawKeyData::Private(pkcs8_der.as_bytes().to_vec().into()),
+ raw_data: RustRawKeyData::Private(pkcs8_der.as_bytes().to_vec().into()),
})
}
_ => unreachable!(),
@@ -606,7 +607,7 @@ fn import_key_ec(
_ => return Err(not_supported_error("Unsupported named curve")),
};
Ok(ImportKeyResult::Ec {
- raw_data: RawKeyData::Public(data),
+ raw_data: RustRawKeyData::Public(data.to_vec().into()),
})
}
KeyData::Pkcs8(data) => {
@@ -660,7 +661,7 @@ fn import_key_ec(
}
Ok(ImportKeyResult::Ec {
- raw_data: RawKeyData::Private(data),
+ raw_data: RustRawKeyData::Private(data.to_vec().into()),
})
}
KeyData::Spki(data) => {
@@ -744,7 +745,7 @@ fn import_key_ec(
}
Ok(ImportKeyResult::Ec {
- raw_data: RawKeyData::Public(encoded_key.into()),
+ raw_data: RustRawKeyData::Public(encoded_key.into()),
})
}
KeyData::JwkPublicEc { .. } | KeyData::JwkPrivateEc { .. } => {
@@ -760,7 +761,7 @@ fn import_key_aes(key_data: KeyData) -> Result<ImportKeyResult, AnyError> {
let data = base64::decode_config(k, URL_SAFE_FORGIVING)
.map_err(|_| data_error("invalid key data"))?;
ImportKeyResult::Hmac {
- raw_data: RawKeyData::Secret(data.into()),
+ raw_data: RustRawKeyData::Secret(data.into()),
}
}
_ => return Err(unsupported_format()),
@@ -773,7 +774,7 @@ fn import_key_hmac(key_data: KeyData) -> Result<ImportKeyResult, AnyError> {
let data = base64::decode_config(k, URL_SAFE_FORGIVING)
.map_err(|_| data_error("invalid key data"))?;
ImportKeyResult::Hmac {
- raw_data: RawKeyData::Secret(data.into()),
+ raw_data: RustRawKeyData::Secret(data.into()),
}
}
_ => return Err(unsupported_format()),
diff --git a/ext/crypto/lib.rs b/ext/crypto/lib.rs
index dc5faf5e7..1765697c6 100644
--- a/ext/crypto/lib.rs
+++ b/ext/crypto/lib.rs
@@ -9,10 +9,11 @@ use deno_core::error::not_supported;
use deno_core::error::type_error;
use deno_core::error::AnyError;
use deno_core::op;
+use deno_core::ToJsBuffer;
use deno_core::task::spawn_blocking;
+use deno_core::JsBuffer;
use deno_core::OpState;
-use deno_core::ZeroCopyBuf;
use serde::Deserialize;
use shared::operation_error;
@@ -69,7 +70,7 @@ use crate::key::Algorithm;
use crate::key::CryptoHash;
use crate::key::CryptoNamedCurve;
use crate::key::HkdfOutput;
-use crate::shared::RawKeyData;
+use crate::shared::V8RawKeyData;
deno_core::extension!(deno_crypto,
deps = [ deno_webidl, deno_web ],
@@ -118,13 +119,13 @@ deno_core::extension!(deno_crypto,
#[op]
pub fn op_crypto_base64url_decode(
data: String,
-) -> Result<ZeroCopyBuf, AnyError> {
+) -> Result<ToJsBuffer, AnyError> {
let data: Vec<u8> = base64::decode_config(data, base64::URL_SAFE_NO_PAD)?;
Ok(data.into())
}
#[op]
-pub fn op_crypto_base64url_encode(data: ZeroCopyBuf) -> String {
+pub fn op_crypto_base64url_encode(data: JsBuffer) -> String {
let data: String = base64::encode_config(data, base64::URL_SAFE_NO_PAD);
data
}
@@ -172,7 +173,7 @@ pub enum KeyType {
#[serde(rename_all = "lowercase")]
pub struct KeyData {
r#type: KeyType,
- data: ZeroCopyBuf,
+ data: JsBuffer,
}
#[derive(Deserialize)]
@@ -188,8 +189,8 @@ pub struct SignArg {
#[op]
pub async fn op_crypto_sign_key(
args: SignArg,
- zero_copy: ZeroCopyBuf,
-) -> Result<ZeroCopyBuf, AnyError> {
+ zero_copy: JsBuffer,
+) -> Result<ToJsBuffer, AnyError> {
let data = &*zero_copy;
let algorithm = args.algorithm;
@@ -297,14 +298,14 @@ pub struct VerifyArg {
key: KeyData,
algorithm: Algorithm,
hash: Option<CryptoHash>,
- signature: ZeroCopyBuf,
+ signature: JsBuffer,
named_curve: Option<CryptoNamedCurve>,
}
#[op]
pub async fn op_crypto_verify_key(
args: VerifyArg,
- zero_copy: ZeroCopyBuf,
+ zero_copy: JsBuffer,
) -> Result<bool, AnyError> {
let data = &*zero_copy;
let algorithm = args.algorithm;
@@ -414,14 +415,14 @@ pub struct DeriveKeyArg {
public_key: Option<KeyData>,
named_curve: Option<CryptoNamedCurve>,
// HKDF
- info: Option<ZeroCopyBuf>,
+ info: Option<JsBuffer>,
}
#[op]
pub async fn op_crypto_derive_bits(
args: DeriveKeyArg,
- zero_copy: Option<ZeroCopyBuf>,
-) -> Result<ZeroCopyBuf, AnyError> {
+ zero_copy: Option<JsBuffer>,
+) -> Result<ToJsBuffer, AnyError> {
let algorithm = args.algorithm;
match algorithm {
Algorithm::Pbkdf2 => {
@@ -601,8 +602,8 @@ pub fn op_crypto_random_uuid(state: &mut OpState) -> Result<String, AnyError> {
#[op]
pub async fn op_crypto_subtle_digest(
algorithm: CryptoHash,
- data: ZeroCopyBuf,
-) -> Result<ZeroCopyBuf, AnyError> {
+ data: JsBuffer,
+) -> Result<ToJsBuffer, AnyError> {
let output = spawn_blocking(move || {
digest::digest(algorithm.into(), &data)
.as_ref()
@@ -617,15 +618,15 @@ pub async fn op_crypto_subtle_digest(
#[derive(Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct WrapUnwrapKeyArg {
- key: RawKeyData,
+ key: V8RawKeyData,
algorithm: Algorithm,
}
#[op]
pub fn op_crypto_wrap_key(
args: WrapUnwrapKeyArg,
- data: ZeroCopyBuf,
-) -> Result<ZeroCopyBuf, AnyError> {
+ data: JsBuffer,
+) -> Result<ToJsBuffer, AnyError> {
let algorithm = args.algorithm;
match algorithm {
@@ -653,8 +654,8 @@ pub fn op_crypto_wrap_key(
#[op]
pub fn op_crypto_unwrap_key(
args: WrapUnwrapKeyArg,
- data: ZeroCopyBuf,
-) -> Result<ZeroCopyBuf, AnyError> {
+ data: JsBuffer,
+) -> Result<ToJsBuffer, AnyError> {
let algorithm = args.algorithm;
match algorithm {
Algorithm::AesKw => {
diff --git a/ext/crypto/shared.rs b/ext/crypto/shared.rs
index 4ecb35dc2..109f51fa1 100644
--- a/ext/crypto/shared.rs
+++ b/ext/crypto/shared.rs
@@ -5,7 +5,8 @@ use std::borrow::Cow;
use deno_core::error::custom_error;
use deno_core::error::type_error;
use deno_core::error::AnyError;
-use deno_core::ZeroCopyBuf;
+use deno_core::JsBuffer;
+use deno_core::ToJsBuffer;
use elliptic_curve::sec1::ToEncodedPoint;
use rsa::pkcs1::DecodeRsaPrivateKey;
use rsa::pkcs1::EncodeRsaPublicKey;
@@ -46,19 +47,27 @@ pub enum EcNamedCurve {
P521,
}
-#[derive(Serialize, Deserialize)]
+#[derive(Deserialize)]
#[serde(rename_all = "lowercase", tag = "type", content = "data")]
-pub enum RawKeyData {
- Secret(ZeroCopyBuf),
- Private(ZeroCopyBuf),
- Public(ZeroCopyBuf),
+pub enum V8RawKeyData {
+ Secret(JsBuffer),
+ Private(JsBuffer),
+ Public(JsBuffer),
}
-impl RawKeyData {
+#[derive(Serialize)]
+#[serde(rename_all = "lowercase", tag = "type", content = "data")]
+pub enum RustRawKeyData {
+ Secret(ToJsBuffer),
+ Private(ToJsBuffer),
+ Public(ToJsBuffer),
+}
+
+impl V8RawKeyData {
pub fn as_rsa_public_key(&self) -> Result<Cow<'_, [u8]>, AnyError> {
match self {
- RawKeyData::Public(data) => Ok(Cow::Borrowed(data)),
- RawKeyData::Private(data) => {
+ V8RawKeyData::Public(data) => Ok(Cow::Borrowed(data)),
+ V8RawKeyData::Private(data) => {
let private_key = RsaPrivateKey::from_pkcs1_der(data)
.map_err(|_| type_error("expected valid private key"))?;
@@ -75,55 +84,55 @@ impl RawKeyData {
pub fn as_rsa_private_key(&self) -> Result<&[u8], AnyError> {
match self {
- RawKeyData::Private(data) => Ok(data),
+ V8RawKeyData::Private(data) => Ok(data),
_ => Err(type_error("expected private key")),
}
}
pub fn as_secret_key(&self) -> Result<&[u8], AnyError> {
match self {
- RawKeyData::Secret(data) => Ok(data),
+ V8RawKeyData::Secret(data) => Ok(data),
_ => Err(type_error("expected secret key")),
}
}
pub fn as_ec_public_key_p256(&self) -> Result<p256::EncodedPoint, AnyError> {
match self {
- RawKeyData::Public(data) => {
+ V8RawKeyData::Public(data) => {
// public_key is a serialized EncodedPoint
p256::EncodedPoint::from_bytes(data)
.map_err(|_| type_error("expected valid public EC key"))
}
- RawKeyData::Private(data) => {
+ V8RawKeyData::Private(data) => {
let signing_key = p256::SecretKey::from_pkcs8_der(data)
.map_err(|_| type_error("expected valid private EC key"))?;
Ok(signing_key.public_key().to_encoded_point(false))
}
// Should never reach here.
- RawKeyData::Secret(_) => unreachable!(),
+ V8RawKeyData::Secret(_) => unreachable!(),
}
}
pub fn as_ec_public_key_p384(&self) -> Result<p384::EncodedPoint, AnyError> {
match self {
- RawKeyData::Public(data) => {
+ V8RawKeyData::Public(data) => {
// public_key is a serialized EncodedPoint
p384::EncodedPoint::from_bytes(data)
.map_err(|_| type_error("expected valid public EC key"))
}
- RawKeyData::Private(data) => {
+ V8RawKeyData::Private(data) => {
let signing_key = p384::SecretKey::from_pkcs8_der(data)
.map_err(|_| type_error("expected valid private EC key"))?;
Ok(signing_key.public_key().to_encoded_point(false))
}
// Should never reach here.
- RawKeyData::Secret(_) => unreachable!(),
+ V8RawKeyData::Secret(_) => unreachable!(),
}
}
pub fn as_ec_private_key(&self) -> Result<&[u8], AnyError> {
match self {
- RawKeyData::Private(data) => Ok(data),
+ V8RawKeyData::Private(data) => Ok(data),
_ => Err(type_error("expected private key")),
}
}
diff --git a/ext/crypto/x25519.rs b/ext/crypto/x25519.rs
index 99914e14e..77554129e 100644
--- a/ext/crypto/x25519.rs
+++ b/ext/crypto/x25519.rs
@@ -3,7 +3,7 @@
use curve25519_dalek::montgomery::MontgomeryPoint;
use deno_core::error::AnyError;
use deno_core::op;
-use deno_core::ZeroCopyBuf;
+use deno_core::ToJsBuffer;
use elliptic_curve::pkcs8::PrivateKeyInfo;
use elliptic_curve::subtle::ConstantTimeEq;
use rand::rngs::OsRng;
@@ -101,7 +101,7 @@ pub fn op_crypto_import_pkcs8_x25519(key_data: &[u8], out: &mut [u8]) -> bool {
#[op]
pub fn op_crypto_export_spki_x25519(
pubkey: &[u8],
-) -> Result<ZeroCopyBuf, AnyError> {
+) -> Result<ToJsBuffer, AnyError> {
let key_info = spki::SubjectPublicKeyInfo {
algorithm: spki::AlgorithmIdentifier {
// id-X25519
@@ -116,7 +116,7 @@ pub fn op_crypto_export_spki_x25519(
#[op]
pub fn op_crypto_export_pkcs8_x25519(
pkey: &[u8],
-) -> Result<ZeroCopyBuf, AnyError> {
+) -> Result<ToJsBuffer, AnyError> {
// This should probably use OneAsymmetricKey instead
let pk_info = rsa::pkcs8::PrivateKeyInfo {
public_key: None,