-
Notifications
You must be signed in to change notification settings - Fork 2.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Adding AES-256 and AES-256-CTR encryption modes
- Loading branch information
root
committed
Jan 23, 2024
1 parent
de29d91
commit 7dcc65c
Showing
16 changed files
with
320 additions
and
35 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,13 +1,32 @@ | ||
import { DecrypterAesMode } from './decrypter-aes-mode'; | ||
|
||
export default class AESCrypto { | ||
private subtle: SubtleCrypto; | ||
private aesIV: Uint8Array; | ||
private aesMode: DecrypterAesMode; | ||
|
||
constructor(subtle: SubtleCrypto, iv: Uint8Array) { | ||
constructor(subtle: SubtleCrypto, iv: Uint8Array, aesMode: DecrypterAesMode) { | ||
this.subtle = subtle; | ||
this.aesIV = iv; | ||
this.aesMode = aesMode; | ||
} | ||
|
||
decrypt(data: ArrayBuffer, key: CryptoKey) { | ||
return this.subtle.decrypt({ name: 'AES-CBC', iv: this.aesIV }, key, data); | ||
switch (this.aesMode) { | ||
case DecrypterAesMode.cbc: | ||
return this.subtle.decrypt( | ||
{ name: 'AES-CBC', iv: this.aesIV }, | ||
key, | ||
data, | ||
); | ||
case DecrypterAesMode.ctr: | ||
return this.subtle.decrypt( | ||
{ name: 'AES-CTR', counter: this.aesIV, length: 64 }, //64 : NIST SP800-38A standard suggests that the counter should occupy half of the counter block | ||
key, | ||
data, | ||
); | ||
default: | ||
throw new Error(`[AESCrypto] invalid aes mode ${this.aesMode}`); | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
export const enum DecrypterAesMode { | ||
cbc = 0, | ||
ctr = 1, | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,16 +1,35 @@ | ||
import { DecrypterAesMode } from './decrypter-aes-mode'; | ||
|
||
export default class FastAESKey { | ||
private subtle: any; | ||
private key: ArrayBuffer; | ||
private aesMode: DecrypterAesMode; | ||
|
||
constructor(subtle, key) { | ||
constructor(subtle, key, aesMode: DecrypterAesMode) { | ||
this.subtle = subtle; | ||
this.key = key; | ||
this.aesMode = aesMode; | ||
} | ||
|
||
expandKey() { | ||
return this.subtle.importKey('raw', this.key, { name: 'AES-CBC' }, false, [ | ||
'encrypt', | ||
'decrypt', | ||
]); | ||
const subtleAlgoName = getSubtleAlgoName(this.aesMode); | ||
return this.subtle.importKey( | ||
'raw', | ||
this.key, | ||
{ name: subtleAlgoName }, | ||
false, | ||
['encrypt', 'decrypt'], | ||
); | ||
} | ||
} | ||
|
||
function getSubtleAlgoName(aesMode: DecrypterAesMode) { | ||
switch (aesMode) { | ||
case DecrypterAesMode.cbc: | ||
return 'AES-CBC'; | ||
case DecrypterAesMode.ctr: | ||
return 'AES-CTR'; | ||
default: | ||
throw new Error(`[FastAESKey] invalid aes mode ${aesMode}`); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
import { DecrypterAesMode } from '../crypt/decrypter-aes-mode'; | ||
|
||
export function isFullSegmentEncryption(method: string): boolean { | ||
return ( | ||
method === 'AES-128' || method === 'AES-256' || method === 'AES-256-CTR' | ||
); | ||
} | ||
|
||
export function getAesModeFromFullSegmentMethod( | ||
method: string, | ||
): DecrypterAesMode { | ||
switch (method) { | ||
case 'AES-128': | ||
case 'AES-256': | ||
return DecrypterAesMode.cbc; | ||
case 'AES-256-CTR': | ||
return DecrypterAesMode.ctr; | ||
default: | ||
throw new Error(`invalid full segment method ${method}`); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.