@@ -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
@@ -81,10 +82,11 @@ export default class Decrypter {
8182 data : Uint8Array | ArrayBuffer ,
8283 key : ArrayBuffer ,
8384 iv : ArrayBuffer ,
85+ aesMode : DecrypterAesMode ,
8486 ) : Promise < ArrayBuffer > {
8587 if ( this . useSoftware ) {
8688 return new Promise ( ( resolve , reject ) => {
87- this . softwareDecrypt ( new Uint8Array ( data ) , key , iv ) ;
89+ this . softwareDecrypt ( new Uint8Array ( data ) , key , iv , aesMode ) ;
8890 const decryptResult = this . flush ( ) ;
8991 if ( decryptResult ) {
9092 resolve ( decryptResult . buffer ) ;
@@ -93,7 +95,7 @@ export default class Decrypter {
9395 }
9496 } ) ;
9597 }
96- return this . webCryptoDecrypt ( new Uint8Array ( data ) , key , iv ) ;
98+ return this . webCryptoDecrypt ( new Uint8Array ( data ) , key , iv , aesMode ) ;
9799 }
98100
99101 // Software decryption is progressive. Progressive decryption may not return a result on each call. Any cached
@@ -102,8 +104,13 @@ export default class Decrypter {
102104 data : Uint8Array ,
103105 key : ArrayBuffer ,
104106 iv : ArrayBuffer ,
107+ aesMode : DecrypterAesMode ,
105108 ) : ArrayBuffer | null {
106109 const { currentIV, currentResult, remainderData } = this ;
110+ if ( aesMode !== DecrypterAesMode . cbc || key . byteLength !== 16 ) {
111+ logger . warn ( 'SoftwareDecrypt: can only handle AES-128-CBC' ) ;
112+ return null ;
113+ }
107114 this . logOnce ( 'JS AES decrypt' ) ;
108115 // The output is staggered during progressive parsing - the current result is cached, and emitted on the next call
109116 // This is done in order to strip PKCS7 padding, which is found at the end of each segment. We only know we've reached
@@ -146,38 +153,39 @@ export default class Decrypter {
146153 data : Uint8Array ,
147154 key : ArrayBuffer ,
148155 iv : ArrayBuffer ,
156+ aesMode : DecrypterAesMode ,
149157 ) : Promise < ArrayBuffer > {
150158 const subtle = this . subtle ;
151159 if ( this . key !== key || ! this . fastAesKey ) {
152160 this . key = key ;
153- this . fastAesKey = new FastAESKey ( subtle , key ) ;
161+ this . fastAesKey = new FastAESKey ( subtle , key , aesMode ) ;
154162 }
155163 return this . fastAesKey
156164 . expandKey ( )
157- . then ( ( aesKey ) => {
165+ . then ( ( aesKey : CryptoKey ) => {
158166 // decrypt using web crypto
159167 if ( ! subtle ) {
160168 return Promise . reject ( new Error ( 'web crypto not initialized' ) ) ;
161169 }
162170 this . logOnce ( 'WebCrypto AES decrypt' ) ;
163- const crypto = new AESCrypto ( subtle , new Uint8Array ( iv ) ) ;
171+ const crypto = new AESCrypto ( subtle , new Uint8Array ( iv ) , aesMode ) ;
164172 return crypto . decrypt ( data . buffer , aesKey ) ;
165173 } )
166174 . catch ( ( err ) => {
167175 logger . warn (
168176 `[decrypter]: WebCrypto Error, disable WebCrypto API, ${ err . name } : ${ err . message } ` ,
169177 ) ;
170178
171- return this . onWebCryptoError ( data , key , iv ) ;
179+ return this . onWebCryptoError ( data , key , iv , aesMode ) ;
172180 } ) ;
173181 }
174182
175- private onWebCryptoError ( data , key , iv ) : ArrayBuffer | never {
183+ private onWebCryptoError ( data , key , iv , aesMode ) : ArrayBuffer | never {
176184 const enableSoftwareAES = this . enableSoftwareAES ;
177185 if ( enableSoftwareAES ) {
178186 this . useSoftware = true ;
179187 this . logEnabled = true ;
180- this . softwareDecrypt ( data , key , iv ) ;
188+ this . softwareDecrypt ( data , key , iv , aesMode ) ;
181189 const decryptResult = this . flush ( ) ;
182190 if ( decryptResult ) {
183191 return decryptResult . buffer ;
0 commit comments