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' +
|
const unicode512Hash = '2b16a5561af8ad6fe414cc103fc8036492e1fc6d9aabe1b655497054f760fe0e34c5d100ac773d' +
|
||||||
'9f3030438284f22dbfa20cb2e9b019f2c98dfe38ce1ef41bae';
|
'9f3030438284f22dbfa20cb2e9b019f2c98dfe38ce1ef41bae';
|
||||||
|
|
||||||
|
const regularMd5 = '5eceffa53a5fd58c44134211e2c5f522';
|
||||||
|
const utf8Md5 = '3abc9433c09551b939c80aa0aa3174e1';
|
||||||
|
const unicodeMd5 = '85ae134072c8d81257933f7045ba17ca';
|
||||||
|
|
||||||
testHash('sha1', regular1Hash, utf81Hash, unicode1Hash);
|
testHash('sha1', regular1Hash, utf81Hash, unicode1Hash);
|
||||||
testHash('sha256', regular256Hash, utf8256Hash, unicode256Hash);
|
testHash('sha256', regular256Hash, utf8256Hash, unicode256Hash);
|
||||||
testHash('sha512', regular512Hash, utf8512Hash, unicode512Hash);
|
testHash('sha512', regular512Hash, utf8512Hash, unicode512Hash);
|
||||||
|
testHash('md5', regularMd5, utf8Md5, unicodeMd5);
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('hmac', () => {
|
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 regularValue = 'HashMe!!';
|
||||||
const utf8Value = 'HǻshMe!!';
|
const utf8Value = 'HǻshMe!!';
|
||||||
const unicodeValue = '😀HashMe!!!🙏';
|
const unicodeValue = '😀HashMe!!!🙏';
|
||||||
|
|
|
@ -71,9 +71,14 @@ describe('WebCrypto Function Service', () => {
|
||||||
const unicode512Hash = '2b16a5561af8ad6fe414cc103fc8036492e1fc6d9aabe1b655497054f760fe0e34c5d100ac773d' +
|
const unicode512Hash = '2b16a5561af8ad6fe414cc103fc8036492e1fc6d9aabe1b655497054f760fe0e34c5d100ac773d' +
|
||||||
'9f3030438284f22dbfa20cb2e9b019f2c98dfe38ce1ef41bae';
|
'9f3030438284f22dbfa20cb2e9b019f2c98dfe38ce1ef41bae';
|
||||||
|
|
||||||
|
const regularMd5 = '5eceffa53a5fd58c44134211e2c5f522';
|
||||||
|
const utf8Md5 = '3abc9433c09551b939c80aa0aa3174e1';
|
||||||
|
const unicodeMd5 = '85ae134072c8d81257933f7045ba17ca';
|
||||||
|
|
||||||
testHash('sha1', regular1Hash, utf81Hash, unicode1Hash);
|
testHash('sha1', regular1Hash, utf81Hash, unicode1Hash);
|
||||||
testHash('sha256', regular256Hash, utf8256Hash, unicode256Hash);
|
testHash('sha256', regular256Hash, utf8256Hash, unicode256Hash);
|
||||||
testHash('sha512', regular512Hash, utf8512Hash, unicode512Hash);
|
testHash('sha512', regular512Hash, utf8512Hash, unicode512Hash);
|
||||||
|
testHash('md5', regularMd5, utf8Md5, unicodeMd5);
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('hmac', () => {
|
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) {
|
utf8Hash: string, unicodeHash: string) {
|
||||||
const regularValue = 'HashMe!!';
|
const regularValue = 'HashMe!!';
|
||||||
const utf8Value = 'HǻshMe!!';
|
const utf8Value = 'HǻshMe!!';
|
||||||
|
|
|
@ -4,7 +4,7 @@ import { SymmetricCryptoKey } from '../models/domain/symmetricCryptoKey';
|
||||||
export abstract class CryptoFunctionService {
|
export abstract class CryptoFunctionService {
|
||||||
pbkdf2: (password: string | ArrayBuffer, salt: string | ArrayBuffer, algorithm: 'sha256' | 'sha512',
|
pbkdf2: (password: string | ArrayBuffer, salt: string | ArrayBuffer, algorithm: 'sha256' | 'sha512',
|
||||||
iterations: number) => Promise<ArrayBuffer>;
|
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>;
|
hmac: (value: ArrayBuffer, key: ArrayBuffer, algorithm: 'sha1' | 'sha256' | 'sha512') => Promise<ArrayBuffer>;
|
||||||
compare: (a: ArrayBuffer, b: ArrayBuffer) => Promise<boolean>;
|
compare: (a: ArrayBuffer, b: ArrayBuffer) => Promise<boolean>;
|
||||||
hmacFast: (value: ArrayBuffer | string, key: ArrayBuffer | string, algorithm: 'sha1' | 'sha256' | 'sha512') =>
|
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 nodeValue = this.toNodeValue(value);
|
||||||
const hash = crypto.createHash(algorithm);
|
const hash = crypto.createHash(algorithm);
|
||||||
hash.update(nodeValue);
|
hash.update(nodeValue);
|
||||||
|
|
|
@ -47,9 +47,9 @@ export class WebCryptoFunctionService implements CryptoFunctionService {
|
||||||
return await this.subtle.deriveBits(pbkdf2Params, impKey, wcLen);
|
return await this.subtle.deriveBits(pbkdf2Params, impKey, wcLen);
|
||||||
}
|
}
|
||||||
|
|
||||||
async hash(value: string | ArrayBuffer, algorithm: 'sha1' | 'sha256' | 'sha512'): Promise<ArrayBuffer> {
|
async hash(value: string | ArrayBuffer, algorithm: 'sha1' | 'sha256' | 'sha512' | 'md5'): Promise<ArrayBuffer> {
|
||||||
if ((this.isEdge || this.isIE) && algorithm === 'sha1') {
|
if (((this.isEdge || this.isIE) && algorithm === 'sha1') || algorithm === 'md5') {
|
||||||
const md = forge.md.sha1.create();
|
const md = algorithm === 'md5' ? forge.md.md5.create() : forge.md.sha1.create();
|
||||||
const valueBytes = this.toByteString(value);
|
const valueBytes = this.toByteString(value);
|
||||||
md.update(valueBytes, 'raw');
|
md.update(valueBytes, 'raw');
|
||||||
return Utils.fromByteStringToArray(md.digest().data).buffer;
|
return Utils.fromByteStringToArray(md.digest().data).buffer;
|
||||||
|
@ -263,7 +263,10 @@ export class WebCryptoFunctionService implements CryptoFunctionService {
|
||||||
return bytes;
|
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';
|
return algorithm === 'sha1' ? 'SHA-1' : algorithm === 'sha256' ? 'SHA-256' : 'SHA-512';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue