@@ -7,12 +7,14 @@ import {
77 parsePrivateJwk ,
88 extractPrivateJwk ,
99 webPushDecryptPrep ,
10+ removePadding ,
1011} from "./crypto" ;
1112import {
1213 CsprngArray ,
1314 ECKeyPair ,
1415 EncodedSymmetricKey ,
1516 EncodedUncompressedPublicKey ,
17+ UncompressedPublicKey ,
1618} from "./crypto-types" ;
1719import { EventManager , ListenerId } from "./event-manager" ;
1820import { 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
4145const 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