@@ -4,6 +4,7 @@ import AESDecryptor, { removePadding } from './aes-decryptor';
44import { logger } from '../utils/logger' ;
55import { appendUint8Array } from '../utils/mp4-tools' ;
66import { sliceUint8 } from '../utils/typed-array' ;
7+ import { DecrypterAesMode } from './decrypter-aes-mode' ;
78import type { HlsConfig } from '../config' ;
89
910const CHUNK_SIZE = 16 ; // 16 bytes, 128 bits
@@ -82,10 +83,11 @@ export default class Decrypter {
8283 data : Uint8Array | ArrayBuffer ,
8384 key : ArrayBuffer ,
8485 iv : ArrayBuffer ,
86+ aesMode : DecrypterAesMode ,
8587 ) : Promise < ArrayBuffer > {
8688 if ( this . useSoftware ) {
8789 return new Promise ( ( resolve , reject ) => {
88- this . softwareDecrypt ( new Uint8Array ( data ) , key , iv ) ;
90+ this . softwareDecrypt ( new Uint8Array ( data ) , key , iv , aesMode ) ;
8991 const decryptResult = this . flush ( ) ;
9092 if ( decryptResult ) {
9193 resolve ( decryptResult . buffer ) ;
@@ -94,7 +96,7 @@ export default class Decrypter {
9496 }
9597 } ) ;
9698 }
97- return this . webCryptoDecrypt ( new Uint8Array ( data ) , key , iv ) ;
99+ return this . webCryptoDecrypt ( new Uint8Array ( data ) , key , iv , aesMode ) ;
98100 }
99101
100102 // Software decryption is progressive. Progressive decryption may not return a result on each call. Any cached
@@ -103,8 +105,13 @@ export default class Decrypter {
103105 data : Uint8Array ,
104106 key : ArrayBuffer ,
105107 iv : ArrayBuffer ,
108+ aesMode : DecrypterAesMode ,
106109 ) : ArrayBuffer | null {
107110 const { currentIV, currentResult, remainderData } = this ;
111+ if ( aesMode !== DecrypterAesMode . cbc || key . byteLength !== 16 ) {
112+ logger . warn ( 'SoftwareDecrypt: can only handle AES-128-CBC' ) ;
113+ return null ;
114+ }
108115 this . logOnce ( 'JS AES decrypt' ) ;
109116 // The output is staggered during progressive parsing - the current result is cached, and emitted on the next call
110117 // This is done in order to strip PKCS7 padding, which is found at the end of each segment. We only know we've reached
@@ -147,36 +154,37 @@ export default class Decrypter {
147154 data : Uint8Array ,
148155 key : ArrayBuffer ,
149156 iv : ArrayBuffer ,
157+ aesMode : DecrypterAesMode ,
150158 ) : Promise < ArrayBuffer > {
151159 const subtle = this . subtle ;
152160 if ( this . key !== key || ! this . fastAesKey ) {
153161 this . key = key ;
154- this . fastAesKey = new FastAESKey ( subtle , key ) ;
162+ this . fastAesKey = new FastAESKey ( subtle , key , aesMode ) ;
155163 }
156164 return this . fastAesKey
157165 . expandKey ( )
158- . then ( ( aesKey ) => {
166+ . then ( ( aesKey : CryptoKey ) => {
159167 // decrypt using web crypto
160168 if ( ! subtle ) {
161169 return Promise . reject ( new Error ( 'web crypto not initialized' ) ) ;
162170 }
163171 this . logOnce ( 'WebCrypto AES decrypt' ) ;
164- const crypto = new AESCrypto ( subtle , new Uint8Array ( iv ) ) ;
172+ const crypto = new AESCrypto ( subtle , new Uint8Array ( iv ) , aesMode ) ;
165173 return crypto . decrypt ( data . buffer , aesKey ) ;
166174 } )
167175 . catch ( ( err ) => {
168176 logger . warn (
169177 `[decrypter]: WebCrypto Error, disable WebCrypto API, ${ err . name } : ${ err . message } ` ,
170178 ) ;
171179
172- return this . onWebCryptoError ( data , key , iv ) ;
180+ return this . onWebCryptoError ( data , key , iv , aesMode ) ;
173181 } ) ;
174182 }
175183
176- private onWebCryptoError ( data , key , iv ) : ArrayBuffer | never {
184+ private onWebCryptoError ( data , key , iv , aesMode ) : ArrayBuffer | never {
177185 this . useSoftware = true ;
178186 this . logEnabled = true ;
179- this . softwareDecrypt ( data , key , iv ) ;
187+ this . softwareDecrypt ( data , key , iv , aesMode ) ;
180188 const decryptResult = this . flush ( ) ;
181189 if ( decryptResult ) {
182190 return decryptResult . buffer ;
0 commit comments