2022-07-02 08:09:45 +02:00
|
|
|
type Algorithm = {
|
|
|
|
name: string
|
|
|
|
alias: string
|
|
|
|
}
|
|
|
|
|
2022-08-05 17:31:11 +02:00
|
|
|
type Data = string | boolean | number | object | ArrayBufferView | ArrayBuffer
|
2022-07-02 08:09:45 +02:00
|
|
|
|
|
|
|
export const sha256 = async (data: Data) => {
|
|
|
|
const algorithm: Algorithm = { name: 'SHA-256', alias: 'sha256' }
|
|
|
|
const hash = await createHash(data, algorithm)
|
|
|
|
return hash
|
|
|
|
}
|
|
|
|
|
|
|
|
export const sha1 = async (data: Data) => {
|
|
|
|
const algorithm: Algorithm = { name: 'SHA-1', alias: 'sha1' }
|
|
|
|
const hash = await createHash(data, algorithm)
|
|
|
|
return hash
|
|
|
|
}
|
|
|
|
|
|
|
|
export const md5 = async (data: Data) => {
|
|
|
|
const algorithm: Algorithm = { name: 'MD5', alias: 'md5' }
|
|
|
|
const hash = await createHash(data, algorithm)
|
|
|
|
return hash
|
|
|
|
}
|
|
|
|
|
|
|
|
export const createHash = async (data: Data, algorithm: Algorithm): Promise<string | null> => {
|
2022-08-05 17:31:11 +02:00
|
|
|
let sourceBuffer: ArrayBufferView | ArrayBuffer
|
|
|
|
|
|
|
|
if (ArrayBuffer.isView(data) || data instanceof ArrayBuffer) {
|
|
|
|
sourceBuffer = data
|
|
|
|
} else {
|
|
|
|
if (typeof data === 'object') {
|
|
|
|
data = JSON.stringify(data)
|
|
|
|
}
|
|
|
|
sourceBuffer = new TextEncoder().encode(String(data))
|
|
|
|
}
|
|
|
|
|
2022-07-02 08:09:45 +02:00
|
|
|
if (crypto && crypto.subtle) {
|
|
|
|
const buffer = await crypto.subtle.digest(
|
|
|
|
{
|
|
|
|
name: algorithm.name,
|
|
|
|
},
|
2022-08-05 17:31:11 +02:00
|
|
|
sourceBuffer
|
2022-07-02 08:09:45 +02:00
|
|
|
)
|
|
|
|
const hash = Array.prototype.map
|
|
|
|
.call(new Uint8Array(buffer), (x) => ('00' + x.toString(16)).slice(-2))
|
|
|
|
.join('')
|
|
|
|
return hash
|
|
|
|
}
|
|
|
|
return null
|
|
|
|
}
|