Skip to content

Commit dbef8b8

Browse files
committed
Remove padding from aes128gcm
1 parent 87e1535 commit dbef8b8

1 file changed

Lines changed: 21 additions & 10 deletions

File tree

‎src/push-subscription.ts‎

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,14 @@ import {
77
parsePrivateJwk,
88
extractPrivateJwk,
99
webPushDecryptPrep,
10+
removePadding,
1011
} from "./crypto";
1112
import {
1213
CsprngArray,
1314
ECKeyPair,
1415
EncodedSymmetricKey,
1516
EncodedUncompressedPublicKey,
17+
UncompressedPublicKey,
1618
} from "./crypto-types";
1719
import { EventManager, ListenerId } from "./event-manager";
1820
import { NamespacedLogger } from "./logger";
@@ -34,9 +36,11 @@ type SubscriptionKeys = {
3436
ecKeys: ECKeyPair;
3537
};
3638

37-
type TKey<T extends "auth" | "p256dh"> = T extends "auth"
39+
type TKey<T extends "auth" | "p256dh" | "p256dhBuffer"> = T extends "auth"
3840
? EncodedSymmetricKey
39-
: EncodedUncompressedPublicKey;
41+
: T extends "p256dh"
42+
? EncodedUncompressedPublicKey
43+
: UncompressedPublicKey;
4044

4145
const STORAGE_KEYS = Object.freeze({
4246
endpoint: "endpoint",
@@ -79,6 +83,7 @@ export class PushSubscription<
7983
{
8084
private readonly eventManager: EventManager<PushSubscriptionEvents>;
8185
constructor(
86+
readonly channelID: TChannelId,
8287
private readonly storage: Storage<TNamespace>,
8388
private readonly endpoint: URL,
8489
private readonly keys: SubscriptionKeys,
@@ -136,16 +141,17 @@ export class PushSubscription<
136141
throw ClientAckCodes.DECRYPT_FAIL;
137142
}
138143

139-
let decryptedContent: ArrayBuffer;
144+
let decryptedContent: Uint8Array;
140145
try {
141146
const { contentEncryptionKey, nonce, encryptedContent } = await webPushDecryptPrep(
142147
{ keys: this.keys.ecKeys, secret: this.keys.auth },
143148
fromUrlB64ToBuffer(message.data),
144149
);
145150

146-
// TODO Remove padding
151+
const decrypted = await aesGcmDecrypt(encryptedContent, contentEncryptionKey, nonce);
147152

148-
decryptedContent = await aesGcmDecrypt(encryptedContent, contentEncryptionKey, nonce);
153+
// Remove padding
154+
decryptedContent = removePadding(new Uint8Array(decrypted), true); // always last record: only one supported
149155
} catch (e) {
150156
this.logger.error("Error decrypting notification", e);
151157
throw ClientAckCodes.DECRYPT_FAIL;
@@ -179,6 +185,7 @@ export class PushSubscription<
179185

180186
const keys = await PushSubscription.generateKeys(subscriptionStorage);
181187
return new PushSubscription(
188+
channelID,
182189
subscriptionStorage,
183190
urlEndpoint,
184191
keys,
@@ -213,6 +220,7 @@ export class PushSubscription<
213220
const urlEndpoint = new URL(endpoint);
214221

215222
return new PushSubscription(
223+
channelID,
216224
subscriptionStorage,
217225
urlEndpoint,
218226
keys,
@@ -281,11 +289,14 @@ export class PushSubscription<
281289
};
282290
}
283291

284-
getKey<const T extends "auth" | "p256dh">(name: T): TKey<T> {
285-
if (name === "auth") {
286-
return fromBufferToUrlB64<TKey<T>>(this.keys.auth);
287-
} else {
288-
return fromBufferToUrlB64<TKey<T>>(this.keys.ecKeys.uncompressedPublicKey);
292+
getKey<const T extends "auth" | "p256dh" | "p256dhBuffer">(name: T): TKey<T> {
293+
switch (name) {
294+
case "auth":
295+
return fromBufferToUrlB64(this.keys.auth) as TKey<T>;
296+
case "p256dh":
297+
return fromBufferToUrlB64(this.keys.ecKeys.uncompressedPublicKey) as TKey<T>;
298+
default:
299+
return this.keys.ecKeys.uncompressedPublicKey as TKey<T>;
289300
}
290301
}
291302

0 commit comments

Comments
 (0)