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 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.13",
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
  },
@@ -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
+ });