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
+ }
0 commit comments