summaryrefslogtreecommitdiff
path: root/ext/crypto/lib.rs
diff options
context:
space:
mode:
authorLuca Casonato <hello@lcas.dev>2021-12-15 22:18:26 +0100
committerGitHub <noreply@github.com>2021-12-15 22:18:26 +0100
commitf0e1a6b84c282a37a5cfd278fc145ba645ee9073 (patch)
tree4231858e8745e34bda932829911e0c71433f132a /ext/crypto/lib.rs
parent5a3ded66113e7a2cacae3ffb8123038450c701e8 (diff)
refactor(ext/crypto): clean up encrypt rust code (#13094)
Diffstat (limited to 'ext/crypto/lib.rs')
-rw-r--r--ext/crypto/lib.rs110
1 files changed, 3 insertions, 107 deletions
diff --git a/ext/crypto/lib.rs b/ext/crypto/lib.rs
index a15f2d986..bb7ad5f32 100644
--- a/ext/crypto/lib.rs
+++ b/ext/crypto/lib.rs
@@ -54,12 +54,14 @@ use std::path::PathBuf;
pub use rand; // Re-export rand
+mod encrypt;
mod export_key;
mod generate_key;
mod import_key;
mod key;
mod shared;
+pub use crate::encrypt::op_crypto_encrypt;
pub use crate::export_key::op_crypto_export_key;
pub use crate::generate_key::op_crypto_generate_key;
pub use crate::import_key::op_crypto_import_key;
@@ -67,7 +69,6 @@ use crate::key::Algorithm;
use crate::key::CryptoHash;
use crate::key::CryptoNamedCurve;
use crate::key::HkdfOutput;
-
use crate::shared::ID_MFG1;
use crate::shared::ID_P_SPECIFIED;
use crate::shared::ID_SHA1_OID;
@@ -96,7 +97,7 @@ pub fn init(maybe_seed: Option<u64>) -> Extension {
("op_crypto_derive_bits", op_async(op_crypto_derive_bits)),
("op_crypto_import_key", op_sync(op_crypto_import_key)),
("op_crypto_export_key", op_sync(op_crypto_export_key)),
- ("op_crypto_encrypt_key", op_async(op_crypto_encrypt_key)),
+ ("op_crypto_encrypt", op_async(op_crypto_encrypt)),
("op_crypto_decrypt_key", op_async(op_crypto_decrypt_key)),
("op_crypto_subtle_digest", op_async(op_crypto_subtle_digest)),
("op_crypto_random_uuid", op_sync(op_crypto_random_uuid)),
@@ -561,19 +562,6 @@ pub async fn op_crypto_derive_bits(
}
}
-#[derive(Deserialize)]
-#[serde(rename_all = "camelCase")]
-pub struct EncryptArg {
- key: KeyData,
- algorithm: Algorithm,
- // RSA-OAEP
- hash: Option<CryptoHash>,
- label: Option<ZeroCopyBuf>,
- // AES-CBC
- iv: Option<ZeroCopyBuf>,
- length: Option<usize>,
-}
-
fn read_rsa_public_key(key_data: KeyData) -> Result<RsaPublicKey, AnyError> {
let public_key = match key_data.r#type {
KeyType::Private => {
@@ -585,98 +573,6 @@ fn read_rsa_public_key(key_data: KeyData) -> Result<RsaPublicKey, AnyError> {
Ok(public_key)
}
-pub async fn op_crypto_encrypt_key(
- _state: Rc<RefCell<OpState>>,
- args: EncryptArg,
- zero_copy: ZeroCopyBuf,
-) -> Result<ZeroCopyBuf, AnyError> {
- let data = &*zero_copy;
- let algorithm = args.algorithm;
-
- match algorithm {
- Algorithm::RsaOaep => {
- let public_key = read_rsa_public_key(args.key)?;
- let label = args.label.map(|l| String::from_utf8_lossy(&*l).to_string());
- let mut rng = OsRng;
- let padding = match args
- .hash
- .ok_or_else(|| type_error("Missing argument hash".to_string()))?
- {
- CryptoHash::Sha1 => PaddingScheme::OAEP {
- digest: Box::new(Sha1::new()),
- mgf_digest: Box::new(Sha1::new()),
- label,
- },
- CryptoHash::Sha256 => PaddingScheme::OAEP {
- digest: Box::new(Sha256::new()),
- mgf_digest: Box::new(Sha256::new()),
- label,
- },
- CryptoHash::Sha384 => PaddingScheme::OAEP {
- digest: Box::new(Sha384::new()),
- mgf_digest: Box::new(Sha384::new()),
- label,
- },
- CryptoHash::Sha512 => PaddingScheme::OAEP {
- digest: Box::new(Sha512::new()),
- mgf_digest: Box::new(Sha512::new()),
- label,
- },
- };
-
- Ok(
- public_key
- .encrypt(&mut rng, padding, data)
- .map_err(|e| {
- custom_error("DOMExceptionOperationError", e.to_string())
- })?
- .into(),
- )
- }
- Algorithm::AesCbc => {
- let key = &*args.key.data;
- let length = args
- .length
- .ok_or_else(|| type_error("Missing argument length".to_string()))?;
- let iv = args
- .iv
- .ok_or_else(|| type_error("Missing argument iv".to_string()))?;
-
- // 2-3.
- let ciphertext = match length {
- 128 => {
- // Section 10.3 Step 2 of RFC 2315 https://www.rfc-editor.org/rfc/rfc2315
- type Aes128Cbc =
- block_modes::Cbc<aes::Aes128, block_modes::block_padding::Pkcs7>;
-
- let cipher = Aes128Cbc::new_from_slices(key, &iv)?;
- cipher.encrypt_vec(data)
- }
- 192 => {
- // Section 10.3 Step 2 of RFC 2315 https://www.rfc-editor.org/rfc/rfc2315
- type Aes192Cbc =
- block_modes::Cbc<aes::Aes192, block_modes::block_padding::Pkcs7>;
-
- let cipher = Aes192Cbc::new_from_slices(key, &iv)?;
- cipher.encrypt_vec(data)
- }
- 256 => {
- // Section 10.3 Step 2 of RFC 2315 https://www.rfc-editor.org/rfc/rfc2315
- type Aes256Cbc =
- block_modes::Cbc<aes::Aes256, block_modes::block_padding::Pkcs7>;
-
- let cipher = Aes256Cbc::new_from_slices(key, &iv)?;
- cipher.encrypt_vec(data)
- }
- _ => unreachable!(),
- };
-
- Ok(ciphertext.into())
- }
- _ => Err(type_error("Unsupported algorithm".to_string())),
- }
-}
-
// The parameters field associated with OID id-RSASSA-PSS
// Defined in RFC 3447, section A.2.3
//