From ea7ca00c895c401af57a7201f3c41524333e7939 Mon Sep 17 00:00:00 2001 From: Divy Srivastava Date: Mon, 20 Feb 2023 22:22:28 +0530 Subject: perf: use ops for node:crypto ciphers (#17819) Towards #17809 --- ext/node/crypto/mod.rs | 79 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) (limited to 'ext/node/crypto') diff --git a/ext/node/crypto/mod.rs b/ext/node/crypto/mod.rs index be92dc7ef..597779328 100644 --- a/ext/node/crypto/mod.rs +++ b/ext/node/crypto/mod.rs @@ -4,9 +4,17 @@ use deno_core::error::AnyError; use deno_core::op; use deno_core::OpState; use deno_core::ResourceId; +use deno_core::StringOrBuffer; use deno_core::ZeroCopyBuf; use std::rc::Rc; +use rsa::padding::PaddingScheme; +use rsa::pkcs8::DecodePrivateKey; +use rsa::pkcs8::DecodePublicKey; +use rsa::PublicKey; +use rsa::RsaPrivateKey; +use rsa::RsaPublicKey; + mod digest; #[op] @@ -47,3 +55,74 @@ pub fn op_node_hash_clone( let context = state.resource_table.get::(rid)?; Ok(state.resource_table.add(context.as_ref().clone())) } + +#[op] +pub fn op_node_private_encrypt( + key: StringOrBuffer, + msg: StringOrBuffer, + padding: u32, +) -> Result { + let key = RsaPrivateKey::from_pkcs8_pem((&key).try_into()?)?; + + let mut rng = rand::thread_rng(); + match padding { + 1 => Ok( + key + .encrypt(&mut rng, PaddingScheme::new_pkcs1v15_encrypt(), &msg)? + .into(), + ), + 4 => Ok( + key + .encrypt(&mut rng, PaddingScheme::new_oaep::(), &msg)? + .into(), + ), + _ => Err(type_error("Unknown padding")), + } +} + +#[op] +pub fn op_node_private_decrypt( + key: StringOrBuffer, + msg: StringOrBuffer, + padding: u32, +) -> Result { + let key = RsaPrivateKey::from_pkcs8_pem((&key).try_into()?)?; + + match padding { + 1 => Ok( + key + .decrypt(PaddingScheme::new_pkcs1v15_encrypt(), &msg)? + .into(), + ), + 4 => Ok( + key + .decrypt(PaddingScheme::new_oaep::(), &msg)? + .into(), + ), + _ => Err(type_error("Unknown padding")), + } +} + +#[op] +pub fn op_node_public_encrypt( + key: StringOrBuffer, + msg: StringOrBuffer, + padding: u32, +) -> Result { + let key = RsaPublicKey::from_public_key_pem((&key).try_into()?)?; + + let mut rng = rand::thread_rng(); + match padding { + 1 => Ok( + key + .encrypt(&mut rng, PaddingScheme::new_pkcs1v15_encrypt(), &msg)? + .into(), + ), + 4 => Ok( + key + .encrypt(&mut rng, PaddingScheme::new_oaep::(), &msg)? + .into(), + ), + _ => Err(type_error("Unknown padding")), + } +} -- cgit v1.2.3