cas-typescript-sdk 1.0.13 → 1.0.14
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/index.d.ts +7 -0
- package/index.node +0 -0
- package/lib/symmetric/aes-wrapper.d.ts +3 -0
- package/lib/symmetric/aes-wrapper.js +6 -0
- package/package.json +3 -1
- package/src/symmetric/aes.rs +36 -1
- package/src/symmetric/cas_symmetric_encryption.rs +9 -0
- package/src-ts/symmetric/aes-wrapper.ts +11 -0
- package/test-ts/insecure-channel.test.spec.ts +51 -0
package/index.d.ts
CHANGED
|
@@ -22,6 +22,8 @@ export function aes128Encrypt(aesKey: Array<number>, nonce: Array<number>, plain
|
|
|
22
22
|
export function aes128Decrypt(aesKey: Array<number>, nonce: Array<number>, ciphertext: Array<number>): Array<number>
|
|
23
23
|
export function aes256Encrypt(aesKey: Array<number>, nonce: Array<number>, plaintext: Array<number>): Array<number>
|
|
24
24
|
export function aes256Decrypt(aesKey: Array<number>, nonce: Array<number>, ciphertext: Array<number>): Array<number>
|
|
25
|
+
export function aes256KeyFromX25519SharedSecret(sharedSecret: Array<number>): AesKeyFromX25519SharedSecret
|
|
26
|
+
export function aes128KeyFromX25519SharedSecret(sharedSecret: Array<number>): AesKeyFromX25519SharedSecret
|
|
25
27
|
export function generateRsaKeys(keySize: number): RsaKeyPairResult
|
|
26
28
|
export function encryptPlaintextRsa(publicKey: string, plaintext: Array<number>): Array<number>
|
|
27
29
|
export function decryptCiphertextRsa(privateKey: string, ciphertext: Array<number>): Array<number>
|
|
@@ -33,6 +35,11 @@ export class X25519SecretPublicKeyResult {
|
|
|
33
35
|
secretKey: Array<number>
|
|
34
36
|
constructor(publicKey: Array<number>, secretKey: Array<number>)
|
|
35
37
|
}
|
|
38
|
+
export class AesKeyFromX25519SharedSecret {
|
|
39
|
+
aesKey: Array<number>
|
|
40
|
+
aesNonce: Array<number>
|
|
41
|
+
constructor(aesKey: Array<number>, aesNonce: Array<number>)
|
|
42
|
+
}
|
|
36
43
|
export type RSAKeyPairResult = RsaKeyPairResult
|
|
37
44
|
export class RsaKeyPairResult {
|
|
38
45
|
privateKey: string
|
package/index.node
CHANGED
|
Binary file
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { AesKeyFromX25519SharedSecret } from "../../index";
|
|
1
2
|
export declare class AESWrapper {
|
|
2
3
|
aes128Key(): Array<number>;
|
|
3
4
|
aes256Key(): Array<number>;
|
|
@@ -6,4 +7,6 @@ export declare class AESWrapper {
|
|
|
6
7
|
aes128Decrypt(aesKey: Array<number>, nonce: Array<number>, ciphertext: Array<number>): Array<number>;
|
|
7
8
|
aes256Encrypt(aesKey: Array<number>, nonce: Array<number>, plaintext: Array<number>): Array<number>;
|
|
8
9
|
aes256Decrypt(aesKey: Array<number>, nonce: Array<number>, ciphertext: Array<number>): Array<number>;
|
|
10
|
+
aes256KeyFromX25519SharedSecret(shared_secret: Array<number>): AesKeyFromX25519SharedSecret;
|
|
11
|
+
aes128KeyFromX25519SharedSecret(shared_secret: Array<number>): AesKeyFromX25519SharedSecret;
|
|
9
12
|
}
|
|
@@ -24,5 +24,11 @@ class AESWrapper {
|
|
|
24
24
|
aes256Decrypt(aesKey, nonce, ciphertext) {
|
|
25
25
|
return (0, index_1.aes256Decrypt)(aesKey, nonce, ciphertext);
|
|
26
26
|
}
|
|
27
|
+
aes256KeyFromX25519SharedSecret(shared_secret) {
|
|
28
|
+
return (0, index_1.aes256KeyFromX25519SharedSecret)(shared_secret);
|
|
29
|
+
}
|
|
30
|
+
aes128KeyFromX25519SharedSecret(shared_secret) {
|
|
31
|
+
return (0, index_1.aes128KeyFromX25519SharedSecret)(shared_secret);
|
|
32
|
+
}
|
|
27
33
|
}
|
|
28
34
|
exports.AESWrapper = AESWrapper;
|
package/package.json
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cas-typescript-sdk",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.14",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "lib/index.js",
|
|
6
6
|
"types": "lib/index.d.ts",
|
|
7
7
|
"scripts": {
|
|
8
8
|
"test": "cargo test && npm run build && mocha -r ts-node/register ./test-ts/**/*.ts --timeout 20000 --recursive",
|
|
9
|
+
"node:test": "mocha -r ts-node/register ./test-ts/**/*.ts --timeout 20000 --recursive",
|
|
10
|
+
"rust:test": "cargo test",
|
|
9
11
|
"build": "napi build --release && tsc",
|
|
10
12
|
"prepare": "npm run build"
|
|
11
13
|
},
|
package/src/symmetric/aes.rs
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
use aes_gcm::Key;
|
|
1
2
|
use napi_derive::napi;
|
|
2
3
|
use rand::rngs::OsRng;
|
|
3
4
|
use rand::{RngCore, SeedableRng};
|
|
@@ -8,7 +9,7 @@ use aes_gcm::{
|
|
|
8
9
|
Aes256Gcm, Aes128Gcm, KeyInit, Nonce
|
|
9
10
|
};
|
|
10
11
|
|
|
11
|
-
use super::cas_symmetric_encryption::CASAESEncryption;
|
|
12
|
+
use super::cas_symmetric_encryption::{AesKeyFromX25519SharedSecret, CASAESEncryption};
|
|
12
13
|
pub struct CASAES128;
|
|
13
14
|
pub struct CASAES256;
|
|
14
15
|
|
|
@@ -32,6 +33,17 @@ impl CASAESEncryption for CASAES256 {
|
|
|
32
33
|
let plaintext = cipher.decrypt(nonce, ciphertext.as_ref()).unwrap();
|
|
33
34
|
plaintext
|
|
34
35
|
}
|
|
36
|
+
|
|
37
|
+
fn key_from_x25519_shared_secret(shared_secret: Vec<u8>) -> AesKeyFromX25519SharedSecret {
|
|
38
|
+
let aes_key = Key::<Aes256Gcm>::from_slice(&shared_secret);
|
|
39
|
+
let mut aes_nonce: [u8; 12] = Default::default();
|
|
40
|
+
aes_nonce.copy_from_slice(&shared_secret[..12]);
|
|
41
|
+
let result = AesKeyFromX25519SharedSecret {
|
|
42
|
+
aes_key: aes_key.to_vec(),
|
|
43
|
+
aes_nonce: aes_nonce.to_vec()
|
|
44
|
+
};
|
|
45
|
+
result
|
|
46
|
+
}
|
|
35
47
|
}
|
|
36
48
|
|
|
37
49
|
impl CASAESEncryption for CASAES128 {
|
|
@@ -54,6 +66,19 @@ impl CASAESEncryption for CASAES128 {
|
|
|
54
66
|
let plaintext = cipher.decrypt(nonce, ciphertext.as_ref()).unwrap();
|
|
55
67
|
plaintext
|
|
56
68
|
}
|
|
69
|
+
|
|
70
|
+
fn key_from_x25519_shared_secret(shared_secret: Vec<u8>) -> AesKeyFromX25519SharedSecret {
|
|
71
|
+
let mut aes_key: [u8; 16] = Default::default();
|
|
72
|
+
aes_key.copy_from_slice(&shared_secret[..16]);
|
|
73
|
+
let aes_key_slice = Key::<Aes128Gcm>::from_slice(&aes_key);
|
|
74
|
+
let mut aes_nonce: [u8; 12] = Default::default();
|
|
75
|
+
aes_nonce.copy_from_slice(&shared_secret[..12]);
|
|
76
|
+
let result = AesKeyFromX25519SharedSecret {
|
|
77
|
+
aes_key: aes_key_slice.to_vec(),
|
|
78
|
+
aes_nonce: aes_nonce.to_vec()
|
|
79
|
+
};
|
|
80
|
+
result
|
|
81
|
+
}
|
|
57
82
|
}
|
|
58
83
|
|
|
59
84
|
#[napi]
|
|
@@ -95,6 +120,16 @@ pub fn aes256_decrypt(aes_key: Vec<u8>, nonce: Vec<u8>, ciphertext: Vec<u8>) ->
|
|
|
95
120
|
return CASAES256::decrypt_ciphertext(aes_key, nonce, ciphertext);
|
|
96
121
|
}
|
|
97
122
|
|
|
123
|
+
#[napi]
|
|
124
|
+
pub fn aes_256_key_from_x25519_shared_secret(shared_secret: Vec<u8>) -> AesKeyFromX25519SharedSecret {
|
|
125
|
+
return CASAES256::key_from_x25519_shared_secret(shared_secret);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
#[napi]
|
|
129
|
+
pub fn aes_128_key_from_x25519_shared_secret(shared_secret: Vec<u8>) -> AesKeyFromX25519SharedSecret {
|
|
130
|
+
return CASAES128::key_from_x25519_shared_secret(shared_secret);
|
|
131
|
+
}
|
|
132
|
+
|
|
98
133
|
#[test]
|
|
99
134
|
fn aes128_encrypt_decrypt_test() {
|
|
100
135
|
let aes_key = aes128_key();
|
|
@@ -1,5 +1,14 @@
|
|
|
1
|
+
use napi_derive::napi;
|
|
2
|
+
|
|
3
|
+
#[napi(constructor)]
|
|
4
|
+
pub struct AesKeyFromX25519SharedSecret {
|
|
5
|
+
pub aes_key: Vec<u8>,
|
|
6
|
+
pub aes_nonce: Vec<u8>
|
|
7
|
+
}
|
|
8
|
+
|
|
1
9
|
pub trait CASAESEncryption {
|
|
2
10
|
fn generate_key() -> Vec<u8>;
|
|
3
11
|
fn encrypt_plaintext(aes_key: Vec<u8>, nonce: Vec<u8>, plaintext: Vec<u8>) -> Vec<u8>;
|
|
4
12
|
fn decrypt_ciphertext(aes_key: Vec<u8>, nonce: Vec<u8>, ciphertext: Vec<u8>) -> Vec<u8>;
|
|
13
|
+
fn key_from_x25519_shared_secret(shared_secret: Vec<u8>) -> AesKeyFromX25519SharedSecret;
|
|
5
14
|
}
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
import {
|
|
2
|
+
AesKeyFromX25519SharedSecret,
|
|
2
3
|
aes128Decrypt,
|
|
3
4
|
aes128Encrypt,
|
|
4
5
|
aes128Key,
|
|
6
|
+
aes128KeyFromX25519SharedSecret,
|
|
5
7
|
aes256Decrypt,
|
|
6
8
|
aes256Encrypt,
|
|
7
9
|
aes256Key,
|
|
10
|
+
aes256KeyFromX25519SharedSecret,
|
|
8
11
|
aesNonce,
|
|
9
12
|
} from "../../index";
|
|
10
13
|
|
|
@@ -36,4 +39,12 @@ export class AESWrapper {
|
|
|
36
39
|
public aes256Decrypt(aesKey: Array<number>, nonce: Array<number>, ciphertext: Array<number>): Array<number> {
|
|
37
40
|
return aes256Decrypt(aesKey, nonce, ciphertext);
|
|
38
41
|
}
|
|
42
|
+
|
|
43
|
+
public aes256KeyFromX25519SharedSecret(shared_secret: Array<number>): AesKeyFromX25519SharedSecret {
|
|
44
|
+
return aes256KeyFromX25519SharedSecret(shared_secret);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
public aes128KeyFromX25519SharedSecret(shared_secret: Array<number>): AesKeyFromX25519SharedSecret {
|
|
48
|
+
return aes128KeyFromX25519SharedSecret(shared_secret);
|
|
49
|
+
}
|
|
39
50
|
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import {AESWrapper} from "../src-ts/symmetric/index";
|
|
2
|
+
import {X25519Wrapper} from "../src-ts/key_exchange/index";
|
|
3
|
+
import {X25519SecretPublicKeyResult} from "../index";
|
|
4
|
+
import { areEqual } from "./helpers/array";
|
|
5
|
+
import { assert } from "chai";
|
|
6
|
+
|
|
7
|
+
describe("Insecure Channel Tests", () => {
|
|
8
|
+
it("AES256-GBC Diffie Hellman X25519", () => {
|
|
9
|
+
const aesWrapper = new AESWrapper();
|
|
10
|
+
const x25519Wrapper = new X25519Wrapper();
|
|
11
|
+
const alice_keys: X25519SecretPublicKeyResult = x25519Wrapper.generateSecretAndPublicKey();
|
|
12
|
+
const bob_keys: X25519SecretPublicKeyResult = x25519Wrapper.generateSecretAndPublicKey();
|
|
13
|
+
|
|
14
|
+
const alice_shared_secret = x25519Wrapper.diffieHellman(alice_keys.secretKey, bob_keys.publicKey);
|
|
15
|
+
const bob_shared_secret = x25519Wrapper.diffieHellman(bob_keys.secretKey, alice_keys.publicKey);
|
|
16
|
+
|
|
17
|
+
const alice_aes_key = aesWrapper.aes256KeyFromX25519SharedSecret(alice_shared_secret);
|
|
18
|
+
const bob_aes_key = aesWrapper.aes256KeyFromX25519SharedSecret(bob_shared_secret);
|
|
19
|
+
|
|
20
|
+
const tohashed: string = "This is my encrypt text";
|
|
21
|
+
const encoder = new TextEncoder();
|
|
22
|
+
const toEncrypt: Array<number> = Array.from(encoder.encode(tohashed));
|
|
23
|
+
|
|
24
|
+
const encrypted = aesWrapper.aes256Encrypt(alice_aes_key?.aesKey, alice_aes_key?.aesNonce, toEncrypt);
|
|
25
|
+
const decrypted = aesWrapper.aes256Decrypt(bob_aes_key?.aesKey, bob_aes_key?.aesNonce, encrypted);
|
|
26
|
+
let result = areEqual(decrypted, toEncrypt);
|
|
27
|
+
assert.isTrue(result);
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
it("AES128-GBC Diffie Hellman X25519", () => {
|
|
31
|
+
const aesWrapper = new AESWrapper();
|
|
32
|
+
const x25519Wrapper = new X25519Wrapper();
|
|
33
|
+
const alice_keys: X25519SecretPublicKeyResult = x25519Wrapper.generateSecretAndPublicKey();
|
|
34
|
+
const bob_keys: X25519SecretPublicKeyResult = x25519Wrapper.generateSecretAndPublicKey();
|
|
35
|
+
|
|
36
|
+
const alice_shared_secret = x25519Wrapper.diffieHellman(alice_keys.secretKey, bob_keys.publicKey);
|
|
37
|
+
const bob_shared_secret = x25519Wrapper.diffieHellman(bob_keys.secretKey, alice_keys.publicKey);
|
|
38
|
+
|
|
39
|
+
const alice_aes_key = aesWrapper.aes128KeyFromX25519SharedSecret(alice_shared_secret);
|
|
40
|
+
const bob_aes_key = aesWrapper.aes128KeyFromX25519SharedSecret(bob_shared_secret);
|
|
41
|
+
|
|
42
|
+
const tohashed: string = "This is my encrypt text";
|
|
43
|
+
const encoder = new TextEncoder();
|
|
44
|
+
const toEncrypt: Array<number> = Array.from(encoder.encode(tohashed));
|
|
45
|
+
|
|
46
|
+
const encrypted = aesWrapper.aes128Encrypt(alice_aes_key?.aesKey, alice_aes_key?.aesNonce, toEncrypt);
|
|
47
|
+
const decrypted = aesWrapper.aes128Decrypt(bob_aes_key?.aesKey, bob_aes_key?.aesNonce, encrypted);
|
|
48
|
+
let result = areEqual(decrypted, toEncrypt);
|
|
49
|
+
assert.isTrue(result);
|
|
50
|
+
});
|
|
51
|
+
});
|