Skip to content

Commit d594468

Browse files
committed
Merge branch 'main' of github.com:Cryptographic-API-Services/cas-typescript-sdk
2 parents c3219cf + 4684c97 commit d594468

12 files changed

+188
-5
lines changed

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ scrypt = "0.11.0"
2121
sha3 = "0.10.8"
2222
x25519-dalek = {version = "2.0.0", features = ["static_secrets"]}
2323
rand_07 = { package = "rand", version = "0.7.0" }
24+
ascon-aead = "0.4.2"
2425

2526
[profile.dev.package.num-bigint-dig]
2627
opt-level = 3

index.d.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,10 @@ export function sha512Ed25519DigitalSignature(dataToSign: Array<number>): Shaed2
3737
export function sha512Ed25519DigitalSignatureVerify(publicKey: Array<number>, dataToVerify: Array<number>, signature: Array<number>): boolean
3838
export function sha256Ed25519DigitalSignature(dataToSign: Array<number>): Shaed25519DalekDigitalSignatureResult
3939
export function sha256Ed25519DigitalSignatureVerify(publicKey: Array<number>, dataToVerify: Array<number>, signature: Array<number>): boolean
40+
export function ascon128KeyGenerate(): Array<number>
41+
export function ascon128NonceGenerate(): Array<number>
42+
export function ascon128Encrypt(key: Array<number>, nonce: Array<number>, plaintext: Array<number>): Array<number>
43+
export function ascon128Decrypt(key: Array<number>, nonce: Array<number>, ciphertext: Array<number>): Array<number>
4044
export type x25519SecretPublicKeyResult = X25519SecretPublicKeyResult
4145
export class X25519SecretPublicKeyResult {
4246
publicKey: Array<number>

index.node

11.5 KB
Binary file not shown.

src-ts/index.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,19 @@ import {
2020
DigitalSignatureSHA512Wrapper,
2121
DigitalSignatureType,
2222
} from "./digital-signature";
23+
import { AsconWrapper } from "./sponges/index";
2324

2425
export {
2526
AesRsaHybridEncryptResult,
2627
AESRSAHybridInitializer,
2728
AESWrapper,
2829
Argon2Wrapper,
30+
AsconWrapper,
2931
BCryptWrapper,
32+
DigitalSignatureFactory,
33+
DigitalSignatureSHA256Wrapper,
34+
DigitalSignatureSHA512Wrapper,
35+
DigitalSignatureType,
3036
HasherFactory,
3137
HasherType,
3238
HybridEncryptionWrapper,
@@ -37,8 +43,4 @@ export {
3743
ScryptWrapper,
3844
SHAWrapper,
3945
X25519Wrapper,
40-
DigitalSignatureFactory,
41-
DigitalSignatureSHA256Wrapper,
42-
DigitalSignatureSHA512Wrapper,
43-
DigitalSignatureType,
4446
};

src-ts/sponges/ascon-wrapper.ts

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
import {
2+
ascon128Decrypt,
3+
ascon128Encrypt,
4+
ascon128KeyGenerate,
5+
ascon128NonceGenerate,
6+
} from "../../index";
7+
8+
export class AsconWrapper {
9+
ascon128Key(): Array<number> {
10+
return ascon128KeyGenerate();
11+
}
12+
13+
ascon128Nonce(): Array<number> {
14+
return ascon128NonceGenerate();
15+
}
16+
17+
ascon128Encrypt(
18+
key: Array<number>,
19+
nonce: Array<number>,
20+
plaintext: Array<number>,
21+
): Array<number> {
22+
if (!key || key.length === 0) {
23+
throw new Error("Key is required");
24+
}
25+
if (!nonce || nonce.length === 0) {
26+
throw new Error("Nonce is required");
27+
}
28+
if (!plaintext || plaintext.length === 0) {
29+
throw new Error("Plaintext is required");
30+
}
31+
return ascon128Encrypt(key, nonce, plaintext);
32+
}
33+
34+
ascon128Decrypt(
35+
key: Array<number>,
36+
nonce: Array<number>,
37+
ciphertext: Array<number>,
38+
): Array<number> {
39+
if (!key || key.length === 0) {
40+
throw new Error("Key is required");
41+
}
42+
if (!nonce || nonce.length === 0) {
43+
throw new Error("Nonce is required");
44+
}
45+
if (!ciphertext || ciphertext.length === 0) {
46+
throw new Error("Ciphertext is required");
47+
}
48+
return ascon128Decrypt(key, nonce, ciphertext);
49+
}
50+
}

src-ts/sponges/index.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import { AsconWrapper } from "./ascon-wrapper";
2+
3+
export {AsconWrapper}

src/lib.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,3 +33,8 @@ mod digital_signature {
3333
pub mod sha_512_ed25519;
3434
pub mod sha_256_ed25519;
3535
}
36+
37+
mod sponges {
38+
pub mod cas_ascon_aead;
39+
pub mod ascon_aead;
40+
}

src/sponges/ascon_aead.rs

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
2+
use aes_gcm::AeadCore;
3+
use ascon_aead::{aead::{generic_array::GenericArray, Aead, KeyInit, OsRng}, Ascon128};
4+
use napi_derive::napi;
5+
6+
use super::cas_ascon_aead::{CASAsconAead};
7+
pub struct AsconAead;
8+
9+
impl CASAsconAead for AsconAead {
10+
fn encrypt(key: Vec<u8>, nonce: Vec<u8>, plaintext: Vec<u8>) -> Vec<u8> {
11+
let key_generic_array = GenericArray::from_slice(&key);
12+
let nonce_generic_array = GenericArray::from_slice(&nonce);
13+
let cipher = Ascon128::new(key_generic_array);
14+
let ciphertext = cipher.encrypt(&nonce_generic_array, plaintext.as_ref()).unwrap();
15+
ciphertext
16+
}
17+
18+
fn decrypt(key: Vec<u8>, nonce: Vec<u8>, ciphertext: Vec<u8>) -> Vec<u8> {
19+
let key_generic_array = GenericArray::from_slice(&key);
20+
let nonce_generic_array = GenericArray::from_slice(&nonce);
21+
let cipher = Ascon128::new(key_generic_array);
22+
let plaintext = cipher.decrypt(&nonce_generic_array, ciphertext.as_ref()).unwrap();
23+
plaintext
24+
}
25+
26+
fn generate_key() -> Vec<u8> {
27+
return Ascon128::generate_key(&mut OsRng).to_vec();
28+
}
29+
30+
fn generate_nonce() -> Vec<u8> {
31+
return Ascon128::generate_nonce(&mut OsRng).to_vec();
32+
}
33+
}
34+
35+
#[napi]
36+
pub fn ascon128_key_generate() -> Vec<u8> {
37+
return AsconAead::generate_key();
38+
}
39+
40+
#[test]
41+
fn test_ascon128_key_generate() {
42+
let key = ascon128_key_generate();
43+
assert_eq!(key.len(), 16);
44+
}
45+
46+
#[napi]
47+
pub fn ascon128_nonce_generate() -> Vec<u8> {
48+
return AsconAead::generate_nonce();
49+
}
50+
51+
#[test]
52+
pub fn test_ascon128_nonce_generate() {
53+
let nonce = ascon128_nonce_generate();
54+
assert_eq!(nonce.len(), 16);
55+
}
56+
57+
#[napi]
58+
pub fn ascon128_encrypt(key: Vec<u8>, nonce: Vec<u8>, plaintext: Vec<u8>) -> Vec<u8> {
59+
return AsconAead::encrypt(key, nonce, plaintext);
60+
}
61+
62+
#[test]
63+
pub fn test_ascon128_encrypt() {
64+
let key = AsconAead::generate_key();
65+
let nonce = AsconAead::generate_nonce();
66+
let plaintext = b"Hello, World!".to_vec();
67+
let ciphertext = ascon128_encrypt(key.clone(), nonce.clone(), plaintext.clone());
68+
assert_ne!(ciphertext, plaintext);
69+
}
70+
71+
#[napi]
72+
pub fn ascon128_decrypt(key: Vec<u8>, nonce: Vec<u8>, ciphertext: Vec<u8>) -> Vec<u8> {
73+
return AsconAead::decrypt(key, nonce, ciphertext);
74+
}
75+
76+
#[test]
77+
pub fn test_ascon128_decrypt() {
78+
let key = AsconAead::generate_key();
79+
let nonce = AsconAead::generate_nonce();
80+
let plaintext = b"Hello, World!".to_vec();
81+
let ciphertext = ascon128_encrypt(key.clone(), nonce.clone(), plaintext.clone());
82+
let decrypted = ascon128_decrypt(key.clone(), nonce.clone(), ciphertext.clone());
83+
assert_eq!(decrypted, plaintext);
84+
}

src/sponges/cas_ascon_aead.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
pub trait CASAsconAead {
2+
fn generate_key() -> Vec<u8>;
3+
fn generate_nonce() -> Vec<u8>;
4+
fn encrypt(key: Vec<u8>, nonce: Vec<u8>, plaintext: Vec<u8>) -> Vec<u8>;
5+
fn decrypt(key: Vec<u8>, nonce: Vec<u8>, ciphertext: Vec<u8>) -> Vec<u8>;
6+
}
File renamed without changes.

test-ts/password-hasher-test.spec.ts renamed to test-ts/password-hasher.test.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { ScryptWrapper } from "../src-ts/password-hashers/index";
44
import {
55
PasswordHasherFactory,
66
PasswordHasherType,
7-
} from "../src-ts/password-hashers/";
7+
} from "../src-ts/password-hashers";
88

99
describe("Bcrypt Tests", () => {
1010
it("hash", () => {

test-ts/sponges.test.spec.ts

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import { AsconWrapper } from "../src-ts/sponges/ascon-wrapper";
2+
import { assert } from "chai";
3+
import { areEqual } from "./helpers/array";
4+
5+
describe("Sponges Tests", () => {
6+
it("Ascon 128 Encrypt", () => {
7+
const wrapper: AsconWrapper = new AsconWrapper();
8+
const key: Array<number> = wrapper.ascon128Key();
9+
const nonce: Array<number> = wrapper.ascon128Nonce();
10+
const tohashed: string = "This is my array to encrypt";
11+
const encoder = new TextEncoder();
12+
const tohashBytes: Array<number> = Array.from(encoder.encode(tohashed));
13+
const ciphertext = wrapper.ascon128Encrypt(key, nonce, tohashBytes);
14+
assert.isNotTrue(areEqual(tohashBytes, ciphertext));
15+
});
16+
17+
it ("Ascon 128 Decrypt", () => {
18+
const wrapper: AsconWrapper = new AsconWrapper();
19+
const key: Array<number> = wrapper.ascon128Key();
20+
const nonce: Array<number> = wrapper.ascon128Nonce();
21+
const tohashed: string = "This is my array to encrypt";
22+
const encoder = new TextEncoder();
23+
const tohashBytes: Array<number> = Array.from(encoder.encode(tohashed));
24+
const ciphertext = wrapper.ascon128Encrypt(key, nonce, tohashBytes);
25+
const plaintext = wrapper.ascon128Decrypt(key, nonce, ciphertext);
26+
assert.equal(areEqual(plaintext, tohashBytes), true);
27+
});
28+
});

0 commit comments

Comments
 (0)