cas-typescript-sdk 1.0.15 → 1.0.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/main-pr-linux.yml +28 -0
- package/.github/workflows/main-pr-windows.yml +28 -0
- package/.github/workflows/main-publish.yml +32 -0
- package/Cargo.toml +8 -1
- package/README.md +2 -0
- package/build.rs +5 -5
- package/docs/EXAMPLES.md +39 -0
- package/index.d.ts +19 -0
- package/index.node +0 -0
- package/lib/digital-signature/digital-siganture-sha-512.d.ts +6 -0
- package/lib/digital-signature/digital-siganture-sha-512.js +28 -0
- package/lib/digital-signature/digital-signature-base.d.ts +5 -0
- package/lib/digital-signature/digital-signature-base.js +2 -0
- package/lib/digital-signature/digital-signature-factory.d.ts +8 -0
- package/lib/digital-signature/digital-signature-factory.js +22 -0
- package/lib/digital-signature/digital-signaturte-sha-256.d.ts +6 -0
- package/lib/digital-signature/digital-signaturte-sha-256.js +28 -0
- package/lib/digital-signature/index.d.ts +4 -0
- package/lib/digital-signature/index.js +8 -0
- package/package.json +41 -41
- package/src/asymmetric/cas_asymmetric_encryption.rs +15 -15
- package/src/asymmetric/cas_rsa.rs +88 -80
- package/src/digital_signature/cas_digital_signature_rsa.rs +27 -0
- package/src/digital_signature/sha_256_rsa.rs +96 -0
- package/src/digital_signature/sha_512_ed25519.rs +75 -0
- package/src/digital_signature/sha_512_rsa.rs +93 -0
- package/src/hashers/blake2.rs +37 -39
- package/src/hashers/cas_hasher.rs +8 -8
- package/src/hashers/sha.rs +102 -103
- package/src/key_exchange/cas_key_exchange.rs +6 -6
- package/src/key_exchange/x25519.rs +57 -57
- package/src/lib.rs +34 -27
- package/src/password_hashers/argon2.rs +65 -64
- package/src/password_hashers/bcrypt.rs +50 -51
- package/src/password_hashers/cas_password_hasher.rs +4 -4
- package/src/password_hashers/scrypt.rs +61 -56
- package/src/symmetric/aes.rs +155 -151
- package/src/symmetric/cas_symmetric_encryption.rs +14 -14
- package/src-ts/asymmetric/RSAWrapper.ts +53 -53
- package/src-ts/asymmetric/index.ts +3 -3
- package/src-ts/digital-signature/digital-siganture-sha-512.ts +28 -0
- package/src-ts/digital-signature/digital-signature-base.ts +6 -0
- package/src-ts/digital-signature/digital-signature-factory.ts +19 -0
- package/src-ts/digital-signature/digital-signaturte-sha-256.ts +28 -0
- package/src-ts/digital-signature/index.ts +4 -0
- package/src-ts/global.d.ts +1 -1
- package/src-ts/hashers/hasher-base.ts +5 -5
- package/src-ts/hashers/hasher-factory.ts +11 -11
- package/src-ts/hashers/hasher-type.ts +2 -2
- package/src-ts/hashers/index.ts +5 -5
- package/src-ts/hashers/sha-wrapper.ts +37 -37
- package/src-ts/helpers/nonce-generator.ts +8 -8
- package/src-ts/hybrid/hybrid-encryption-wrapper.ts +64 -64
- package/src-ts/hybrid/index.ts +9 -9
- package/src-ts/hybrid/types/aes-rsa-hybird-encrypt-result.ts +12 -12
- package/src-ts/hybrid/types/aes-rsa-hybrid-initializer.ts +23 -23
- package/src-ts/index.ts +34 -34
- package/src-ts/key_exchange/index.ts +3 -3
- package/src-ts/key_exchange/x25519.ts +10 -10
- package/src-ts/password-hashers/argon2-wrapper.ts +18 -18
- package/src-ts/password-hashers/bcrypt-wrapper.ts +23 -23
- package/src-ts/password-hashers/index.ts +14 -14
- package/src-ts/password-hashers/password-hasher-base.ts +3 -3
- package/src-ts/password-hashers/password-hasher-factory.ts +20 -20
- package/src-ts/password-hashers/password-hasher-type.ts +4 -4
- package/src-ts/password-hashers/scrypt-wrapper.ts +19 -19
- package/src-ts/symmetric/aes-wrapper.ts +50 -50
- package/src-ts/symmetric/index.ts +3 -3
- package/test-ts/asymmetric.test.spec.ts +27 -27
- package/test-ts/digital-signature.test.spec.ts +49 -0
- package/test-ts/hasher.test.spec.ts +70 -70
- package/test-ts/helpers/array.ts +9 -9
- package/test-ts/hybrid.test.spec.ts +33 -33
- package/test-ts/insecure-channel.test.spec.ts +50 -50
- package/test-ts/key-exchange-test.spec.ts +23 -23
- package/test-ts/password-hasher-test.spec.ts +102 -102
- package/test-ts/symmetric.test.spec.ts +31 -31
- package/tsconfig.json +21 -21
- package/build-node.sh +0 -2
|
@@ -1,57 +1,57 @@
|
|
|
1
|
-
use napi::bindgen_prelude::ClassInstance;
|
|
2
|
-
use napi_derive::napi;
|
|
3
|
-
use rand::rngs::OsRng;
|
|
4
|
-
use x25519_dalek::{PublicKey, StaticSecret};
|
|
5
|
-
|
|
6
|
-
use super::cas_key_exchange::CASKeyExchange;
|
|
7
|
-
|
|
8
|
-
#[napi(constructor)]
|
|
9
|
-
pub struct x25519SecretPublicKeyResult {
|
|
10
|
-
pub public_key: Vec<u8>,
|
|
11
|
-
pub secret_key: Vec<u8
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
pub struct X25519;
|
|
15
|
-
|
|
16
|
-
impl CASKeyExchange for X25519 {
|
|
17
|
-
fn generate_secret_and_public_key() -> x25519SecretPublicKeyResult {
|
|
18
|
-
let secret_key = StaticSecret::random_from_rng(OsRng);
|
|
19
|
-
let public_key = PublicKey::from(&secret_key);
|
|
20
|
-
let result = x25519SecretPublicKeyResult {
|
|
21
|
-
secret_key: secret_key.as_bytes().to_vec(),
|
|
22
|
-
public_key: public_key.as_bytes().to_vec()
|
|
23
|
-
};
|
|
24
|
-
result
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
fn diffie_hellman(my_secret_key: Vec<u8>, users_public_key: Vec<u8>) -> Vec<u8> {
|
|
28
|
-
let mut secret_key_array: [u8; 32] = Default::default();
|
|
29
|
-
secret_key_array.copy_from_slice(&my_secret_key);
|
|
30
|
-
let mut users_public_key_array: [u8; 32] = Default::default();
|
|
31
|
-
users_public_key_array.copy_from_slice(&users_public_key);
|
|
32
|
-
|
|
33
|
-
let secret_key = StaticSecret::from(secret_key_array);
|
|
34
|
-
let public_key = PublicKey::from(users_public_key_array);
|
|
35
|
-
return secret_key.diffie_hellman(&public_key).as_bytes().to_vec();
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
#[napi]
|
|
40
|
-
pub fn x25519_generate_secret_and_public_key() -> x25519SecretPublicKeyResult {
|
|
41
|
-
return <X25519 as CASKeyExchange>::generate_secret_and_public_key();
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
#[napi]
|
|
45
|
-
pub fn x25519_diffie_hellman(my_secret_key: Vec<u8>, users_public_key: Vec<u8>) -> Vec<u8> {
|
|
46
|
-
return <X25519 as CASKeyExchange>::diffie_hellman(my_secret_key, users_public_key);
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
#[test]
|
|
50
|
-
pub fn x25519_diffie_hellman_test() {
|
|
51
|
-
let alice = x25519_generate_secret_and_public_key();
|
|
52
|
-
let bob = x25519_generate_secret_and_public_key();
|
|
53
|
-
|
|
54
|
-
let alice_shared_secret = x25519_diffie_hellman(alice.secret_key, bob.public_key);
|
|
55
|
-
let bob_shared_secret = x25519_diffie_hellman(bob.secret_key, alice.public_key);
|
|
56
|
-
assert_eq!(true, alice_shared_secret.eq(&bob_shared_secret));
|
|
57
|
-
}
|
|
1
|
+
use napi::bindgen_prelude::ClassInstance;
|
|
2
|
+
use napi_derive::napi;
|
|
3
|
+
use rand::rngs::OsRng;
|
|
4
|
+
use x25519_dalek::{PublicKey, StaticSecret};
|
|
5
|
+
|
|
6
|
+
use super::cas_key_exchange::CASKeyExchange;
|
|
7
|
+
|
|
8
|
+
#[napi(constructor)]
|
|
9
|
+
pub struct x25519SecretPublicKeyResult {
|
|
10
|
+
pub public_key: Vec<u8>,
|
|
11
|
+
pub secret_key: Vec<u8>,
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
pub struct X25519;
|
|
15
|
+
|
|
16
|
+
impl CASKeyExchange for X25519 {
|
|
17
|
+
fn generate_secret_and_public_key() -> x25519SecretPublicKeyResult {
|
|
18
|
+
let secret_key = StaticSecret::random_from_rng(OsRng);
|
|
19
|
+
let public_key = PublicKey::from(&secret_key);
|
|
20
|
+
let result = x25519SecretPublicKeyResult {
|
|
21
|
+
secret_key: secret_key.as_bytes().to_vec(),
|
|
22
|
+
public_key: public_key.as_bytes().to_vec(),
|
|
23
|
+
};
|
|
24
|
+
result
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
fn diffie_hellman(my_secret_key: Vec<u8>, users_public_key: Vec<u8>) -> Vec<u8> {
|
|
28
|
+
let mut secret_key_array: [u8; 32] = Default::default();
|
|
29
|
+
secret_key_array.copy_from_slice(&my_secret_key);
|
|
30
|
+
let mut users_public_key_array: [u8; 32] = Default::default();
|
|
31
|
+
users_public_key_array.copy_from_slice(&users_public_key);
|
|
32
|
+
|
|
33
|
+
let secret_key = StaticSecret::from(secret_key_array);
|
|
34
|
+
let public_key = PublicKey::from(users_public_key_array);
|
|
35
|
+
return secret_key.diffie_hellman(&public_key).as_bytes().to_vec();
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
#[napi]
|
|
40
|
+
pub fn x25519_generate_secret_and_public_key() -> x25519SecretPublicKeyResult {
|
|
41
|
+
return <X25519 as CASKeyExchange>::generate_secret_and_public_key();
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
#[napi]
|
|
45
|
+
pub fn x25519_diffie_hellman(my_secret_key: Vec<u8>, users_public_key: Vec<u8>) -> Vec<u8> {
|
|
46
|
+
return <X25519 as CASKeyExchange>::diffie_hellman(my_secret_key, users_public_key);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
#[test]
|
|
50
|
+
pub fn x25519_diffie_hellman_test() {
|
|
51
|
+
let alice = x25519_generate_secret_and_public_key();
|
|
52
|
+
let bob = x25519_generate_secret_and_public_key();
|
|
53
|
+
|
|
54
|
+
let alice_shared_secret = x25519_diffie_hellman(alice.secret_key, bob.public_key);
|
|
55
|
+
let bob_shared_secret = x25519_diffie_hellman(bob.secret_key, alice.public_key);
|
|
56
|
+
assert_eq!(true, alice_shared_secret.eq(&bob_shared_secret));
|
|
57
|
+
}
|
package/src/lib.rs
CHANGED
|
@@ -1,27 +1,34 @@
|
|
|
1
|
-
mod password_hashers {
|
|
2
|
-
pub mod argon2;
|
|
3
|
-
pub mod bcrypt;
|
|
4
|
-
pub mod
|
|
5
|
-
pub mod
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
mod hashers {
|
|
9
|
-
pub mod
|
|
10
|
-
pub mod cas_hasher;
|
|
11
|
-
pub mod
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
mod key_exchange {
|
|
15
|
-
pub mod
|
|
16
|
-
pub mod
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
mod symmetric {
|
|
20
|
-
pub mod aes;
|
|
21
|
-
pub mod cas_symmetric_encryption;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
mod asymmetric {
|
|
25
|
-
pub mod cas_asymmetric_encryption;
|
|
26
|
-
pub mod cas_rsa;
|
|
27
|
-
}
|
|
1
|
+
mod password_hashers {
|
|
2
|
+
pub mod argon2;
|
|
3
|
+
pub mod bcrypt;
|
|
4
|
+
pub mod cas_password_hasher;
|
|
5
|
+
pub mod scrypt;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
mod hashers {
|
|
9
|
+
pub mod blake2;
|
|
10
|
+
pub mod cas_hasher;
|
|
11
|
+
pub mod sha;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
mod key_exchange {
|
|
15
|
+
pub mod cas_key_exchange;
|
|
16
|
+
pub mod x25519;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
mod symmetric {
|
|
20
|
+
pub mod aes;
|
|
21
|
+
pub mod cas_symmetric_encryption;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
mod asymmetric {
|
|
25
|
+
pub mod cas_asymmetric_encryption;
|
|
26
|
+
pub mod cas_rsa;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
mod digital_signature {
|
|
30
|
+
pub mod cas_digital_signature_rsa;
|
|
31
|
+
pub mod sha_512_rsa;
|
|
32
|
+
pub mod sha_256_rsa;
|
|
33
|
+
pub mod sha_512_ed25519;
|
|
34
|
+
}
|
|
@@ -1,64 +1,65 @@
|
|
|
1
|
-
use std::net::ToSocketAddrs;
|
|
2
|
-
|
|
3
|
-
use napi_derive::napi;
|
|
4
|
-
|
|
5
|
-
use argon2::{
|
|
6
|
-
password_hash::{rand_core::OsRng, SaltString},
|
|
7
|
-
Argon2,
|
|
8
|
-
};
|
|
9
|
-
|
|
10
|
-
use super::cas_password_hasher::CASPasswordHasher;
|
|
11
|
-
|
|
12
|
-
pub struct CASArgon;
|
|
13
|
-
|
|
14
|
-
impl CASPasswordHasher for CASArgon {
|
|
15
|
-
fn hash_password(password_to_hash: String) -> String {
|
|
16
|
-
let salt = SaltString::generate(&mut OsRng);
|
|
17
|
-
let argon2 = Argon2::default();
|
|
18
|
-
let hashed_password = argon2
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
return hashed_password;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
fn verify_password(hashed_password: String, password_to_verify: String) -> bool {
|
|
26
|
-
let hashed_password = PasswordHash::new(&hashed_password).unwrap();
|
|
27
|
-
return Argon2::default()
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
let
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
let
|
|
53
|
-
let
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
let
|
|
61
|
-
let
|
|
62
|
-
let verified =
|
|
63
|
-
|
|
64
|
-
|
|
1
|
+
use std::net::ToSocketAddrs;
|
|
2
|
+
|
|
3
|
+
use napi_derive::napi;
|
|
4
|
+
|
|
5
|
+
use argon2::{
|
|
6
|
+
password_hash::{rand_core::OsRng, SaltString},
|
|
7
|
+
Argon2, PasswordHash, PasswordHasher, PasswordVerifier,
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
use super::cas_password_hasher::CASPasswordHasher;
|
|
11
|
+
|
|
12
|
+
pub struct CASArgon;
|
|
13
|
+
|
|
14
|
+
impl CASPasswordHasher for CASArgon {
|
|
15
|
+
fn hash_password(password_to_hash: String) -> String {
|
|
16
|
+
let salt = SaltString::generate(&mut OsRng);
|
|
17
|
+
let argon2 = Argon2::default();
|
|
18
|
+
let hashed_password = argon2
|
|
19
|
+
.hash_password(password_to_hash.as_bytes(), &salt)
|
|
20
|
+
.unwrap()
|
|
21
|
+
.to_string();
|
|
22
|
+
return hashed_password;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
fn verify_password(hashed_password: String, password_to_verify: String) -> bool {
|
|
26
|
+
let hashed_password = PasswordHash::new(&hashed_password).unwrap();
|
|
27
|
+
return Argon2::default()
|
|
28
|
+
.verify_password(password_to_verify.as_bytes(), &hashed_password)
|
|
29
|
+
.is_ok();
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
#[napi]
|
|
34
|
+
pub fn argon2_hash(password: String) -> String {
|
|
35
|
+
return <CASArgon as CASPasswordHasher>::hash_password(password);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
#[napi]
|
|
39
|
+
pub fn argon2_verify(hashed_password: String, password_to_verify: String) -> bool {
|
|
40
|
+
return <CASArgon as CASPasswordHasher>::verify_password(hashed_password, password_to_verify);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
#[test]
|
|
44
|
+
pub fn argon2_hash_test() {
|
|
45
|
+
let password = "ThisIsNotMyPasswolrd".to_string();
|
|
46
|
+
let hashed = argon2_hash(password.clone());
|
|
47
|
+
assert_ne!(password, hashed);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
#[test]
|
|
51
|
+
pub fn argon2_verify_test() {
|
|
52
|
+
let password = "ThisIsNotMyPasswolrd".to_string();
|
|
53
|
+
let hashed = argon2_hash(password.clone());
|
|
54
|
+
let verified = argon2_verify(hashed, password);
|
|
55
|
+
assert_eq!(true, verified);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
#[test]
|
|
59
|
+
pub fn argon2_verify_fail_test() {
|
|
60
|
+
let password = "ThisIsNotMyPasswolrd".to_string();
|
|
61
|
+
let hashed = argon2_hash(password.clone());
|
|
62
|
+
let verified = "Nope".to_string();
|
|
63
|
+
let verified = argon2_verify(hashed, verified);
|
|
64
|
+
assert_eq!(false, verified);
|
|
65
|
+
}
|
|
@@ -1,51 +1,50 @@
|
|
|
1
|
-
use
|
|
2
|
-
use
|
|
3
|
-
|
|
4
|
-
use super::cas_password_hasher::CASPasswordHasher;
|
|
5
|
-
|
|
6
|
-
pub struct CASBCrypt;
|
|
7
|
-
|
|
8
|
-
impl CASPasswordHasher for CASBCrypt {
|
|
9
|
-
fn hash_password(password_to_hash: String) -> String {
|
|
10
|
-
return hash(password_to_hash, DEFAULT_COST).unwrap();
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
fn verify_password(hashed_password: String, password_to_verify: String) -> bool {
|
|
14
|
-
return verify(password_to_verify, &hashed_password).unwrap();
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
let
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
let
|
|
39
|
-
let
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
let
|
|
47
|
-
let
|
|
48
|
-
let verified =
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
}
|
|
1
|
+
use bcrypt::{hash, verify, DEFAULT_COST};
|
|
2
|
+
use napi_derive::napi;
|
|
3
|
+
|
|
4
|
+
use super::cas_password_hasher::CASPasswordHasher;
|
|
5
|
+
|
|
6
|
+
pub struct CASBCrypt;
|
|
7
|
+
|
|
8
|
+
impl CASPasswordHasher for CASBCrypt {
|
|
9
|
+
fn hash_password(password_to_hash: String) -> String {
|
|
10
|
+
return hash(password_to_hash, DEFAULT_COST).unwrap();
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
fn verify_password(hashed_password: String, password_to_verify: String) -> bool {
|
|
14
|
+
return verify(password_to_verify, &hashed_password).unwrap();
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
#[napi]
|
|
19
|
+
pub fn bcrypt_hash(password_to_hash: String) -> String {
|
|
20
|
+
return <CASBCrypt as CASPasswordHasher>::hash_password(password_to_hash);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
#[napi]
|
|
24
|
+
pub fn bcrypt_verify(hashed_password: String, password_to_verify: String) -> bool {
|
|
25
|
+
return <CASBCrypt as CASPasswordHasher>::verify_password(hashed_password, password_to_verify);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
#[test]
|
|
29
|
+
pub fn bcrypt_hash_test() {
|
|
30
|
+
let password = "ThisIsNotMyPasswolrd".to_string();
|
|
31
|
+
let hashed = bcrypt_hash(password.clone());
|
|
32
|
+
assert_ne!(password, hashed);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
#[test]
|
|
36
|
+
pub fn bcrypt_verify_test() {
|
|
37
|
+
let password = "ThisIsNotMyPasswolrd".to_string();
|
|
38
|
+
let hashed = bcrypt_hash(password.clone());
|
|
39
|
+
let verified = bcrypt_verify(hashed, password);
|
|
40
|
+
assert_eq!(true, verified);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
#[test]
|
|
44
|
+
pub fn bcrypt_verify_fail_test() {
|
|
45
|
+
let password = "ThisIsNotMyPasswolrd".to_string();
|
|
46
|
+
let hashed = bcrypt_hash(password.clone());
|
|
47
|
+
let verified = "nope".to_string();
|
|
48
|
+
let verified = bcrypt_verify(hashed, verified);
|
|
49
|
+
assert_eq!(false, verified);
|
|
50
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
pub trait CASPasswordHasher {
|
|
2
|
-
fn hash_password(password_to_hash: String) -> String;
|
|
3
|
-
fn verify_password(hashed_password: String, password_to_verify: String) -> bool;
|
|
4
|
-
}
|
|
1
|
+
pub trait CASPasswordHasher {
|
|
2
|
+
fn hash_password(password_to_hash: String) -> String;
|
|
3
|
+
fn verify_password(hashed_password: String, password_to_verify: String) -> bool;
|
|
4
|
+
}
|
|
@@ -1,56 +1,61 @@
|
|
|
1
|
-
use napi_derive::napi;
|
|
2
|
-
|
|
3
|
-
use scrypt::{
|
|
4
|
-
password_hash::{rand_core::OsRng, PasswordHash, PasswordHasher, PasswordVerifier, SaltString},
|
|
5
|
-
Scrypt,
|
|
6
|
-
};
|
|
7
|
-
|
|
8
|
-
use super::cas_password_hasher::CASPasswordHasher;
|
|
9
|
-
|
|
10
|
-
pub struct CASScrypt;
|
|
11
|
-
|
|
12
|
-
impl CASPasswordHasher for CASScrypt {
|
|
13
|
-
fn hash_password(password_to_hash: String) -> String {
|
|
14
|
-
let salt = SaltString::generate(&mut OsRng);
|
|
15
|
-
return Scrypt
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
#[napi]
|
|
30
|
-
pub fn
|
|
31
|
-
return <CASScrypt as CASPasswordHasher>::
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
#[
|
|
35
|
-
pub fn
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
1
|
+
use napi_derive::napi;
|
|
2
|
+
|
|
3
|
+
use scrypt::{
|
|
4
|
+
password_hash::{rand_core::OsRng, PasswordHash, PasswordHasher, PasswordVerifier, SaltString},
|
|
5
|
+
Scrypt,
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
use super::cas_password_hasher::CASPasswordHasher;
|
|
9
|
+
|
|
10
|
+
pub struct CASScrypt;
|
|
11
|
+
|
|
12
|
+
impl CASPasswordHasher for CASScrypt {
|
|
13
|
+
fn hash_password(password_to_hash: String) -> String {
|
|
14
|
+
let salt = SaltString::generate(&mut OsRng);
|
|
15
|
+
return Scrypt
|
|
16
|
+
.hash_password(password_to_hash.as_bytes(), &salt)
|
|
17
|
+
.unwrap()
|
|
18
|
+
.to_string();
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
fn verify_password(hashed_password: String, password_to_verify: String) -> bool {
|
|
22
|
+
let parsed_hash = PasswordHash::new(&hashed_password).unwrap();
|
|
23
|
+
return Scrypt
|
|
24
|
+
.verify_password(password_to_verify.as_bytes(), &parsed_hash)
|
|
25
|
+
.is_ok();
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
#[napi]
|
|
30
|
+
pub fn scrypt_hash(password_to_hash: String) -> String {
|
|
31
|
+
return <CASScrypt as CASPasswordHasher>::hash_password(password_to_hash);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
#[napi]
|
|
35
|
+
pub fn scrypt_verify(hashed_password: String, password_to_verify: String) -> bool {
|
|
36
|
+
return <CASScrypt as CASPasswordHasher>::verify_password(hashed_password, password_to_verify);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
#[test]
|
|
40
|
+
pub fn scrypt_hash_test() {
|
|
41
|
+
let password = "BadPassword".to_string();
|
|
42
|
+
let hashed_password = scrypt_hash(password.clone());
|
|
43
|
+
assert_ne!(password, hashed_password);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
#[test]
|
|
47
|
+
pub fn scrypt_verify_test() {
|
|
48
|
+
let password = "BadPassword".to_string();
|
|
49
|
+
let hashed_password = scrypt_hash(password.clone());
|
|
50
|
+
let verified = scrypt_verify(hashed_password, password);
|
|
51
|
+
assert_eq!(true, verified);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
#[test]
|
|
55
|
+
pub fn scrypt_verify_fail_test() {
|
|
56
|
+
let password = "BadPassword".to_string();
|
|
57
|
+
let hashed_password = scrypt_hash(password.clone());
|
|
58
|
+
let verified = "Nope".to_string();
|
|
59
|
+
let verified = scrypt_verify(hashed_password, verified);
|
|
60
|
+
assert_eq!(false, verified);
|
|
61
|
+
}
|