diff options
author | 2022-08-03 17:16:03 +0200 | |
---|---|---|
committer | 2022-08-03 17:16:03 +0200 | |
commit | 422b6eb05a2fb5e7eec816a6bd2d37b53e4a6bdc (patch) | |
tree | 0f9eddd75c22e2d4a26647c0e227f3ac1090bb9e /src | |
parent | fad4833ca25d26fee7cca17ed2b3b8fcae112b6a (diff) | |
download | it-tools-422b6eb05a2fb5e7eec816a6bd2d37b53e4a6bdc.tar.gz it-tools-422b6eb05a2fb5e7eec816a6bd2d37b53e4a6bdc.tar.zst it-tools-422b6eb05a2fb5e7eec816a6bd2d37b53e4a6bdc.zip |
feat(hash-text): digest base selector (#254)
Diffstat (limited to 'src')
-rw-r--r-- | src/tools/hash-text/hash-text.service.test.ts | 15 | ||||
-rw-r--r-- | src/tools/hash-text/hash-text.service.ts | 7 | ||||
-rw-r--r-- | src/tools/hash-text/hash-text.vue | 47 |
3 files changed, 62 insertions, 7 deletions
diff --git a/src/tools/hash-text/hash-text.service.test.ts b/src/tools/hash-text/hash-text.service.test.ts new file mode 100644 index 0000000..b0e9c79 --- /dev/null +++ b/src/tools/hash-text/hash-text.service.test.ts @@ -0,0 +1,15 @@ +import { describe, expect, it } from 'vitest'; +import { convertHexToBin } from './hash-text.service'; + +describe('hash text', () => { + describe('convertHexToBin', () => { + it('convert hex to bin', () => { + expect(convertHexToBin('')).toEqual(''); + expect(convertHexToBin('FF')).toEqual('11111111'); + expect(convertHexToBin('F'.repeat(200))).toEqual('1111'.repeat(200)); + expect(convertHexToBin('2123006AD00F694CE120')).toEqual( + '00100001001000110000000001101010110100000000111101101001010011001110000100100000', + ); + }); + }); +}); diff --git a/src/tools/hash-text/hash-text.service.ts b/src/tools/hash-text/hash-text.service.ts new file mode 100644 index 0000000..f1241d1 --- /dev/null +++ b/src/tools/hash-text/hash-text.service.ts @@ -0,0 +1,7 @@ +export function convertHexToBin(hex: string) { + return hex + .trim() + .split('') + .map((byte) => parseInt(byte, 16).toString(2).padStart(4, '0')) + .join(''); +} diff --git a/src/tools/hash-text/hash-text.vue b/src/tools/hash-text/hash-text.vue index 9d9332f..4b7bcf1 100644 --- a/src/tools/hash-text/hash-text.vue +++ b/src/tools/hash-text/hash-text.vue @@ -1,10 +1,34 @@ <template> <div> <n-card> - <n-input v-model:value="clearText" type="textarea" placeholder="Your string..." :autosize="{ minRows: 3 }" /> + <n-input v-model:value="clearText" type="textarea" placeholder="Your string to hash..." rows="3" /> <n-divider /> + <n-form-item label="Digest encoding"> + <n-select + v-model:value="encoding" + :options="[ + { + label: 'Binary (base 2)', + value: 'Bin', + }, + { + label: 'Hexadecimal (base 16)', + value: 'Hex', + }, + { + label: 'Base64 (base 64)', + value: 'Base64', + }, + { + label: 'Base64url (base 64 with url safe chars)', + value: 'Base64url', + }, + ]" + /> + </n-form-item> + <div v-for="algo in algoNames" :key="algo" style="margin: 5px 0"> <n-input-group> <n-input-group-label style="flex: 0 0 120px"> {{ algo }} </n-input-group-label> @@ -16,9 +40,10 @@ </template> <script setup lang="ts"> -import InputCopyable from '../../components/InputCopyable.vue'; +import { enc, lib, MD5, RIPEMD160, SHA1, SHA224, SHA256, SHA3, SHA384, SHA512 } from 'crypto-js'; import { ref } from 'vue'; -import { MD5, SHA1, SHA256, SHA224, SHA512, SHA384, SHA3, RIPEMD160 } from 'crypto-js'; +import InputCopyable from '../../components/InputCopyable.vue'; +import { convertHexToBin } from './hash-text.service'; const algos = { MD5, @@ -32,10 +57,18 @@ const algos = { } as const; type AlgoNames = keyof typeof algos; +type Encoding = keyof typeof enc | 'Bin'; const algoNames = Object.keys(algos) as AlgoNames[]; +const encoding = ref<Encoding>('Hex'); +const clearText = ref(''); + +function formatWithEncoding(words: lib.WordArray, encoding: Encoding) { + if (encoding === 'Bin') { + return convertHexToBin(words.toString(enc.Hex)); + } + + return words.toString(enc[encoding]); +} -const clearText = ref( - 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lacus metus blandit dolor lacus natoque ad fusce aliquam velit.', -); -const hashText = (algo: AlgoNames, value: string) => algos[algo](value).toString(); +const hashText = (algo: AlgoNames, value: string) => formatWithEncoding(algos[algo](value), encoding.value); </script> |