| import { encrypt as eceEncrypt } from "./ece.js" |
| |
| export async function encrypt(data, p256dhKey, authKey) { |
| if (!(data instanceof Uint8Array)) { |
| throw new Error("Expecting Uint8Array for `data` parameter"); |
| } |
| |
| const salt = crypto.getRandomValues(new Uint8Array(16)); |
| |
| const keyPair = await crypto.subtle.generateKey({ name: 'ECDH', namedCurve: 'P-256' }, true, ["deriveBits"]); |
| const publicKey = new Uint8Array(await crypto.subtle.exportKey("raw", keyPair.publicKey)); |
| |
| const body = await eceEncrypt(data, { |
| userAgentPublicKey: new Uint8Array(p256dhKey), |
| appServer: { |
| privateKey: keyPair.privateKey, |
| publicKey, |
| }, |
| salt, |
| authSecret: authKey, |
| }); |
| |
| const headers = { |
| // https://datatracker.ietf.org/doc/html/rfc8291#section-4 |
| // The Content-Encoding header field therefore has exactly one value, which is "aes128gcm". |
| 'Content-Encoding': "aes128gcm", |
| // https://datatracker.ietf.org/doc/html/rfc8030#section-5.2 |
| // An application server MUST include the TTL (Time-To-Live) header |
| // field in its request for push message delivery. The TTL header field |
| // contains a value in seconds that suggests how long a push message is |
| // retained by the push service. |
| TTL: 15, |
| }; |
| |
| return { |
| body, |
| headers, |
| } |
| } |