-
Notifications
You must be signed in to change notification settings - Fork 9
/
chacha20Poly1305.ts
102 lines (93 loc) · 2.47 KB
/
chacha20Poly1305.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
import { chacha20poly1305 } from "@noble/ciphers/chacha";
import type { AeadEncryptionContext, AeadInterface } from "@hpke/core";
import { AeadId } from "@hpke/core";
export class Chacha20Poly1305Context implements AeadEncryptionContext {
private _key: Uint8Array;
public constructor(key: ArrayBuffer) {
this._key = new Uint8Array(key);
}
public async seal(
iv: ArrayBuffer,
data: ArrayBuffer,
aad: ArrayBuffer,
): Promise<ArrayBuffer> {
return await this._seal(iv, data, aad);
}
public async open(
iv: ArrayBuffer,
data: ArrayBuffer,
aad: ArrayBuffer,
): Promise<ArrayBuffer> {
return await this._open(iv, data, aad);
}
private _seal(
iv: ArrayBuffer,
data: ArrayBuffer,
aad: ArrayBuffer,
): Promise<ArrayBuffer> {
return new Promise((resolve) => {
const ret = chacha20poly1305(
this._key,
new Uint8Array(iv),
new Uint8Array(aad),
).encrypt(new Uint8Array(data));
resolve(ret.buffer);
});
}
private _open(
iv: ArrayBuffer,
data: ArrayBuffer,
aad: ArrayBuffer,
): Promise<ArrayBuffer> {
return new Promise((resolve) => {
const ret = chacha20poly1305(
this._key,
new Uint8Array(iv),
new Uint8Array(aad),
).decrypt(new Uint8Array(data));
resolve(ret.buffer);
});
}
}
/**
* The ChaCha20Poly1305 for HPKE AEAD implementing {@link AeadInterface}.
*
* When using `@hpke/core`, the instance of this class can be specified
* to the `aead` parameter of {@link CipherSuiteParams} instead of `AeadId.Chacha20Poly1305`
* as follows:
*
* @example
*
* ```ts
* import {
* CipherSuite,
* DhkemP256HkdfSha256,
* HkdfSha256,
* } from "@hpke/core";
* import {
* Chacha20Poly1305,
* } from "@hpke/chacha20poly1305";
*
* const suite = new CipherSuite({
* kem: new DhkemP256HkdfSha256(),
* kdf: new HkdfSha256(),
* aead: new Chacha20Poly1305(),
* });
* ```
*
* This class is implemented using
* {@link https://github.com/paulmillr/noble-ciphers | @noble/ciphers}.
*/
export class Chacha20Poly1305 implements AeadInterface {
/** AeadId.Chacha20Poly1305 (0x0003) */
public readonly id: AeadId = AeadId.Chacha20Poly1305;
/** 32 */
public readonly keySize: number = 32;
/** 12 */
public readonly nonceSize: number = 12;
/** 16 */
public readonly tagSize: number = 16;
public createEncryptionContext(key: ArrayBuffer): AeadEncryptionContext {
return new Chacha20Poly1305Context(key);
}
}