add support for md5 hash crypto function
This commit is contained in:
parent
13769a7fcb
commit
2045e7047a
|
@ -65,9 +65,14 @@ describe('NodeCrypto Function Service', () => {
|
|||
const unicode512Hash = '2b16a5561af8ad6fe414cc103fc8036492e1fc6d9aabe1b655497054f760fe0e34c5d100ac773d' +
|
||||
'9f3030438284f22dbfa20cb2e9b019f2c98dfe38ce1ef41bae';
|
||||
|
||||
const regularMd5 = '5eceffa53a5fd58c44134211e2c5f522';
|
||||
const utf8Md5 = '3abc9433c09551b939c80aa0aa3174e1';
|
||||
const unicodeMd5 = '85ae134072c8d81257933f7045ba17ca';
|
||||
|
||||
testHash('sha1', regular1Hash, utf81Hash, unicode1Hash);
|
||||
testHash('sha256', regular256Hash, utf8256Hash, unicode256Hash);
|
||||
testHash('sha512', regular512Hash, utf8512Hash, unicode512Hash);
|
||||
testHash('md5', regularMd5, utf8Md5, unicodeMd5);
|
||||
});
|
||||
|
||||
describe('hmac', () => {
|
||||
|
@ -229,7 +234,8 @@ function testPbkdf2(algorithm: 'sha256' | 'sha512', regularKey: string, utf8Key:
|
|||
});
|
||||
}
|
||||
|
||||
function testHash(algorithm: 'sha1' | 'sha256' | 'sha512', regularHash: string, utf8Hash: string, unicodeHash: string) {
|
||||
function testHash(algorithm: 'sha1' | 'sha256' | 'sha512' | 'md5', regularHash: string,
|
||||
utf8Hash: string, unicodeHash: string) {
|
||||
const regularValue = 'HashMe!!';
|
||||
const utf8Value = 'HǻshMe!!';
|
||||
const unicodeValue = '😀HashMe!!!🙏';
|
||||
|
|
|
@ -71,9 +71,14 @@ describe('WebCrypto Function Service', () => {
|
|||
const unicode512Hash = '2b16a5561af8ad6fe414cc103fc8036492e1fc6d9aabe1b655497054f760fe0e34c5d100ac773d' +
|
||||
'9f3030438284f22dbfa20cb2e9b019f2c98dfe38ce1ef41bae';
|
||||
|
||||
const regularMd5 = '5eceffa53a5fd58c44134211e2c5f522';
|
||||
const utf8Md5 = '3abc9433c09551b939c80aa0aa3174e1';
|
||||
const unicodeMd5 = '85ae134072c8d81257933f7045ba17ca';
|
||||
|
||||
testHash('sha1', regular1Hash, utf81Hash, unicode1Hash);
|
||||
testHash('sha256', regular256Hash, utf8256Hash, unicode256Hash);
|
||||
testHash('sha512', regular512Hash, utf8512Hash, unicode512Hash);
|
||||
testHash('md5', regularMd5, utf8Md5, unicodeMd5);
|
||||
});
|
||||
|
||||
describe('hmac', () => {
|
||||
|
@ -315,7 +320,7 @@ function testPbkdf2(algorithm: 'sha256' | 'sha512', regularKey: string,
|
|||
});
|
||||
}
|
||||
|
||||
function testHash(algorithm: 'sha1' | 'sha256' | 'sha512', regularHash: string,
|
||||
function testHash(algorithm: 'sha1' | 'sha256' | 'sha512' | 'md5', regularHash: string,
|
||||
utf8Hash: string, unicodeHash: string) {
|
||||
const regularValue = 'HashMe!!';
|
||||
const utf8Value = 'HǻshMe!!';
|
||||
|
|
|
@ -4,7 +4,7 @@ import { SymmetricCryptoKey } from '../models/domain/symmetricCryptoKey';
|
|||
export abstract class CryptoFunctionService {
|
||||
pbkdf2: (password: string | ArrayBuffer, salt: string | ArrayBuffer, algorithm: 'sha256' | 'sha512',
|
||||
iterations: number) => Promise<ArrayBuffer>;
|
||||
hash: (value: string | ArrayBuffer, algorithm: 'sha1' | 'sha256' | 'sha512') => Promise<ArrayBuffer>;
|
||||
hash: (value: string | ArrayBuffer, algorithm: 'sha1' | 'sha256' | 'sha512' | 'md5') => Promise<ArrayBuffer>;
|
||||
hmac: (value: ArrayBuffer, key: ArrayBuffer, algorithm: 'sha1' | 'sha256' | 'sha512') => Promise<ArrayBuffer>;
|
||||
compare: (a: ArrayBuffer, b: ArrayBuffer) => Promise<boolean>;
|
||||
hmacFast: (value: ArrayBuffer | string, key: ArrayBuffer | string, algorithm: 'sha1' | 'sha256' | 'sha512') =>
|
||||
|
|
|
@ -26,7 +26,7 @@ export class NodeCryptoFunctionService implements CryptoFunctionService {
|
|||
});
|
||||
}
|
||||
|
||||
hash(value: string | ArrayBuffer, algorithm: 'sha1' | 'sha256' | 'sha512'): Promise<ArrayBuffer> {
|
||||
hash(value: string | ArrayBuffer, algorithm: 'sha1' | 'sha256' | 'sha512' | 'md5'): Promise<ArrayBuffer> {
|
||||
const nodeValue = this.toNodeValue(value);
|
||||
const hash = crypto.createHash(algorithm);
|
||||
hash.update(nodeValue);
|
||||
|
|
|
@ -47,9 +47,9 @@ export class WebCryptoFunctionService implements CryptoFunctionService {
|
|||
return await this.subtle.deriveBits(pbkdf2Params, impKey, wcLen);
|
||||
}
|
||||
|
||||
async hash(value: string | ArrayBuffer, algorithm: 'sha1' | 'sha256' | 'sha512'): Promise<ArrayBuffer> {
|
||||
if ((this.isEdge || this.isIE) && algorithm === 'sha1') {
|
||||
const md = forge.md.sha1.create();
|
||||
async hash(value: string | ArrayBuffer, algorithm: 'sha1' | 'sha256' | 'sha512' | 'md5'): Promise<ArrayBuffer> {
|
||||
if (((this.isEdge || this.isIE) && algorithm === 'sha1') || algorithm === 'md5') {
|
||||
const md = algorithm === 'md5' ? forge.md.md5.create() : forge.md.sha1.create();
|
||||
const valueBytes = this.toByteString(value);
|
||||
md.update(valueBytes, 'raw');
|
||||
return Utils.fromByteStringToArray(md.digest().data).buffer;
|
||||
|
@ -263,7 +263,10 @@ export class WebCryptoFunctionService implements CryptoFunctionService {
|
|||
return bytes;
|
||||
}
|
||||
|
||||
private toWebCryptoAlgorithm(algorithm: 'sha1' | 'sha256' | 'sha512'): string {
|
||||
private toWebCryptoAlgorithm(algorithm: 'sha1' | 'sha256' | 'sha512' | 'md5'): string {
|
||||
if (algorithm === 'md5') {
|
||||
throw new Error('MD5 is not supported in WebCrypto.');
|
||||
}
|
||||
return algorithm === 'sha1' ? 'SHA-1' : algorithm === 'sha256' ? 'SHA-256' : 'SHA-512';
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue