diff options
author | skdltmxn <supershop@naver.com> | 2020-06-17 06:12:50 +0900 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-06-16 17:12:50 -0400 |
commit | b3c72d1e4554b5fd58cbf3ba2fbf56275446447b (patch) | |
tree | 613f42672a715b8fa9422a86af09abec66e4fcef /std/hash/_wasm/hash.ts | |
parent | b8872cd303584b28c0d6250184e4a1205bf2ad9b (diff) |
feat(std/hash): reimplement all hashes in WASM (#6292)
Diffstat (limited to 'std/hash/_wasm/hash.ts')
-rw-r--r-- | std/hash/_wasm/hash.ts | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/std/hash/_wasm/hash.ts b/std/hash/_wasm/hash.ts new file mode 100644 index 000000000..d04a4d4a0 --- /dev/null +++ b/std/hash/_wasm/hash.ts @@ -0,0 +1,76 @@ +// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license. + +import init, { + source, + create_hash as createHash, + update_hash as updateHash, + digest_hash as digestHash, + DenoHash, +} from "./wasm.js"; + +import * as hex from "../../encoding/hex.ts"; +import * as base64 from "../../encoding/base64.ts"; +import { Hasher, Message, OutputFormat } from "../hasher.ts"; + +await init(source); + +const TYPE_ERROR_MSG = "hash: `data` is invalid type"; + +export class Hash implements Hasher { + #hash: DenoHash; + #digested: boolean; + + constructor(algorithm: string) { + this.#hash = createHash(algorithm); + this.#digested = false; + } + + /** + * Update internal state + * @param data data to update + */ + update(data: Message): this { + let msg: Uint8Array; + + if (typeof data === "string") { + msg = new TextEncoder().encode(data as string); + } else if (typeof data === "object") { + if (data instanceof ArrayBuffer || ArrayBuffer.isView(data)) { + msg = new Uint8Array(data); + } else { + throw new Error(TYPE_ERROR_MSG); + } + } else { + throw new Error(TYPE_ERROR_MSG); + } + + updateHash(this.#hash, msg); + + return this; + } + + /** Returns final hash */ + digest(): ArrayBuffer { + if (this.#digested) throw new Error("hash: already digested"); + + this.#digested = true; + return digestHash(this.#hash); + } + + /** + * Returns hash as a string of given format + * @param format format of output string (hex or base64). Default is hex + */ + toString(format: OutputFormat = "hex"): string { + const finalized = new Uint8Array(this.digest()); + + switch (format) { + case "hex": + return hex.encodeToString(finalized); + case "base64": + return base64.encode(finalized); + default: + throw new Error("hash: invalid format"); + } + } +} |