|
1 | 1 | use std::str::FromStr;
|
2 | 2 |
|
3 | 3 | use bitwarden_core::key_management::{KeyIds, SymmetricKeyId};
|
| 4 | +#[allow(deprecated)] |
| 5 | +use bitwarden_crypto::dangerous_derive_kdf_material; |
4 | 6 | use bitwarden_crypto::{
|
5 | 7 | AsymmetricCryptoKey, AsymmetricPublicCryptoKey, BitwardenLegacyKeyBytes, CoseKeyBytes,
|
6 | 8 | CoseSerializable, CoseSign1Bytes, CryptoError, Decryptable, EncString, Kdf, KeyDecryptable,
|
@@ -312,6 +314,16 @@ impl PureCrypto {
|
312 | 314 | .map(|public_key| public_key.to_der())?
|
313 | 315 | .map(|pk| pk.to_vec())
|
314 | 316 | }
|
| 317 | + |
| 318 | + /// Derive output of the KDF for a [bitwarden_crypto::Kdf] configuration. |
| 319 | + pub fn derive_kdf_material( |
| 320 | + password: &[u8], |
| 321 | + salt: &[u8], |
| 322 | + kdf: Kdf, |
| 323 | + ) -> Result<Vec<u8>, CryptoError> { |
| 324 | + #[allow(deprecated)] |
| 325 | + dangerous_derive_kdf_material(password, salt, &kdf) |
| 326 | + } |
315 | 327 | }
|
316 | 328 |
|
317 | 329 | #[cfg(test)]
|
@@ -427,6 +439,16 @@ DnqOsltgPomWZ7xVfMkm9niL2OA=
|
427 | 439 | 73, 4, 134, 242, 24, 56, 54, 38, 178, 59, 11, 118, 230, 159, 87, 91, 20, 237, 188, 186,
|
428 | 440 | 216, 86, 189, 50, 46, 173, 117, 36, 54, 105, 216, 9,
|
429 | 441 | ];
|
| 442 | + |
| 443 | + const DERIVED_KDF_MATERIAL_PBKDF2: &[u8] = &[ |
| 444 | + 129, 57, 137, 140, 156, 220, 110, 212, 201, 255, 52, 182, 22, 206, 221, 66, 136, 199, 181, |
| 445 | + 89, 252, 175, 82, 168, 79, 204, 88, 174, 166, 60, 52, 79, |
| 446 | + ]; |
| 447 | + const DERIVED_KDF_MATERIAL_ARGON2ID: &[u8] = &[ |
| 448 | + 221, 57, 158, 206, 27, 154, 188, 170, 33, 198, 250, 144, 191, 231, 29, 74, 201, 102, 253, |
| 449 | + 77, 8, 128, 173, 111, 217, 41, 125, 9, 156, 52, 112, 140, |
| 450 | + ]; |
| 451 | + |
430 | 452 | #[test]
|
431 | 453 | fn test_symmetric_decrypt() {
|
432 | 454 | let enc_string = EncString::from_str(ENCRYPTED).unwrap();
|
@@ -620,4 +642,28 @@ DnqOsltgPomWZ7xVfMkm9niL2OA=
|
620 | 642 | .unwrap();
|
621 | 643 | assert_eq!(public_key, PUBLIC_KEY);
|
622 | 644 | }
|
| 645 | + |
| 646 | + #[test] |
| 647 | + fn test_derive_pbkdf2_output() { |
| 648 | + let password = "test_password".as_bytes(); |
| 649 | + let email = "[email protected]".as_bytes(); |
| 650 | + let kdf = Kdf::PBKDF2 { |
| 651 | + iterations: NonZero::try_from(600000).unwrap(), |
| 652 | + }; |
| 653 | + let derived_key = PureCrypto::derive_kdf_material(password, email, kdf).unwrap(); |
| 654 | + assert_eq!(derived_key, DERIVED_KDF_MATERIAL_PBKDF2); |
| 655 | + } |
| 656 | + |
| 657 | + #[test] |
| 658 | + fn test_derived_argon2_output() { |
| 659 | + let password = "test_password".as_bytes(); |
| 660 | + let email = "[email protected]".as_bytes(); |
| 661 | + let kdf = Kdf::Argon2id { |
| 662 | + iterations: NonZero::try_from(3).unwrap(), |
| 663 | + memory: NonZero::try_from(64).unwrap(), |
| 664 | + parallelism: NonZero::try_from(4).unwrap(), |
| 665 | + }; |
| 666 | + let derived_key = PureCrypto::derive_kdf_material(password, email, kdf).unwrap(); |
| 667 | + assert_eq!(derived_key, DERIVED_KDF_MATERIAL_ARGON2ID); |
| 668 | + } |
623 | 669 | }
|
0 commit comments