diff --git a/src/content.js b/src/content.js new file mode 100644 index 0000000..0ad3c99 --- /dev/null +++ b/src/content.js @@ -0,0 +1,18 @@ +const suffixCharset = [ + "0123456789", + "abcdefghijklmnopqrstuvwxyz", + "ABCDEFGHIJKLMNOPQRSTUVWXYZ", + "+-", +].flatMap(set => set.split("")); +const suffixCharsetBits = 6; + +export function makeSuffix(index) { + let result = ""; + + while (index > 0) { + result += suffixCharset[index & ((1 << suffixCharsetBits) - 1)]; + index >>= suffixCharsetBits; + } + + return result; +} \ No newline at end of file diff --git a/src/hash.js b/src/hash.js new file mode 100644 index 0000000..bd7f2fb --- /dev/null +++ b/src/hash.js @@ -0,0 +1,23 @@ +const hexCharset = "0123456789abcdef".split(""); + +export const sha256 = "SHA-256"; + +Uint8Array.prototype.toHex = function() { + return [...this].map(c => hexCharset[c >> 4] + hexCharset[c & 15]).join(""); +}; + +Uint8Array.prototype.hasPrefix = function(array, bits) { + for(let i = 0; i < array.length && i * 8 < bits; i++) { + const bitsForByte = Math.min(8, bits - i * 8); + const bitMask = ((1 << bitsForByte) - 1) << (8 - bitsForByte); + + if ((this[i] & bitMask) != (array[i] & bitMask)) { + return false; + } + } + return true; +}; + +export async function digest(algo, input) { + return new Uint8Array(await crypto.subtle.digest(algo, new TextEncoder().encode(input))); +} \ No newline at end of file diff --git a/src/main.js b/src/main.js index 37c57c1..c3364a7 100644 --- a/src/main.js +++ b/src/main.js @@ -1,44 +1,5 @@ -const hexCharset = "0123456789abcdef".split(""); -const suffixCharset = [ - "0123456789", - "abcdefghijklmnopqrstuvwxyz", - "ABCDEFGHIJKLMNOPQRSTUVWXYZ", - "+-", -].flatMap(set => set.split("")); -const suffixCharsetBits = 6; - -const sha256 = "SHA-256"; - -Uint8Array.prototype.toHex = function() { - return [...this].map(c => hexCharset[c >> 4] + hexCharset[c & 15]).join(""); -}; - -Uint8Array.prototype.hasPrefix = function(array, bits) { - for(let i = 0; i < array.length && i * 8 < bits; i++) { - const bitsForByte = Math.min(8, bits - i * 8); - const bitMask = ((1 << bitsForByte) - 1) << (8 - bitsForByte); - - if ((this[i] & bitMask) != (array[i] & bitMask)) { - return false; - } - } - return true; -}; - -async function digest(algo, input) { - return new Uint8Array(await crypto.subtle.digest(algo, new TextEncoder().encode(input))); -} - -function makeSuffix(index) { - let result = ""; - - while (index > 0) { - result += suffixCharset[index & ((1 << suffixCharsetBits) - 1)]; - index >>= suffixCharsetBits; - } - - return result; -} +import {makeSuffix} from "./content"; +import {digest, sha256} from "./hash"; async function findHashWithPrefix(hashPrefixBits, inputPrefix) { const hashPrefix = new Uint8Array(Array(Math.ceil(hashPrefixBits / 8)).map(c => 0));