diff --git a/README.org b/README.org index 033c0b4..e2bf7eb 100644 --- a/README.org +++ b/README.org @@ -230,25 +230,25 @@ The strings generated by this library are meant to be pretty, not secure. It is not a secure way of representing a hash as many collisions are possible. *** Digest algorithm - The kana algorithm is a 16-bit block digest that works as follows: - - The most and least significant 8 bits are each seperated into /Stage 0/ and /Stage 1/ each operating on the first and second byte respectively. - - Stage 0: - 1. The byte is sign tested (bitwise ~AND~ =0x80=), store this as a boolean in /sign0/. - 2. The valid first character range is looked up using the result of the sign test (either 0 or 1), store the range in /range/, and the slice ~KANA~ taken from the range in /kana/. - 3. The first index is calculated as the unsigned first byte modulo the size (exclusive) of /range/. Store this as /index0/. - 4. The swap table is checked to see if /index0/ has an entry. Then each following step is checked in order: - + If the swap entry exists and the first byte bitwise ~AND~ =0x2= is not 0, set the first character of the output to the value found in the swap table. - + If the swap entry exists and the first byte bitwise ~AND~ =0x8= is not 0 and the index has an entry in the 2nd swap table, set the first character of the output to the value found in the 2nd swap table. - + In any other case, set the first character of the output to the value found in the /kana/ slice at the /index/. - - Stage 1: - 1. Compute a sub table for /index/ plus the start of /range/ using the ranges defined in ~KANA_SUB_VALID_FOR~ and store it in /sub/. If there is no sub table possible, skip to step 3. - 2. If there is an entry in /sub/ for the index of the 2nd byte modulo the size of ~KANA_SUB~, set the second output character to be that character. - 3. If there was no value set from the sub table, the 2nd output character becomes the first output character from inputting the 2nd byte back through /Stage 0/ as the first byte. - - Concatenate both characters and move to the next 16-bit block. - - Notes: - - It is valid for a single iterator to produce between 0 and 2 characters but no more. - - If an input given to the algorithm that cannot be divided exactly into 16-bit blocks (i.e. one byte is left over), a padding byte of 0 is added as the 2nd byte to make it fit. - For more information see [[file:./src/mnemonic.rs][mnemonic.rs]]. +The kana algorithm is a 16-bit block digest that works as follows: + - The most and least significant 8 bits are each seperated into /Stage 0/ and /Stage 1/ each operating on the first and second byte respectively. + - Stage 0: + 1. The byte is sign tested (bitwise ~AND~ =0x80=), store this as a boolean in /sign0/. + 2. The valid first character range is looked up using the result of the sign test (either 0 or 1), store the range in /range/, and the slice ~KANA~ taken from the range in /kana/. + 3. The first index is calculated as the unsigned first byte modulo the size (exclusive) of /range/. Store this as /index0/. + 4. The swap table is checked to see if /index0/ has an entry. Then each following step is checked in order: + + If the swap entry exists and the first byte bitwise ~AND~ =0x2= is not 0, set the first character of the output to the value found in the swap table. + + If the swap entry exists and the first byte bitwise ~AND~ =0x8= is not 0 and the index has an entry in the 2nd swap table, set the first character of the output to the value found in the 2nd swap table. + + In any other case, set the first character of the output to the value found in the /kana/ slice at the /index/. + - Stage 1: + 1. Compute a sub table for /index/ plus the start of /range/ using the ranges defined in ~KANA_SUB_VALID_FOR~ and store it in /sub/. If there is no sub table possible, skip to step 3. + 2. If there is an entry in /sub/ for the index of the 2nd byte modulo the size of ~KANA_SUB~, set the second output character to be that character. + 3. If there was no value set from the sub table, the 2nd output character becomes the first output character from inputting the 2nd byte back through /Stage 0/ as the first byte. + - Concatenate both characters and move to the next 16-bit block. + +Notes: + - It is valid for a single iterator to produce between 0 and 2 characters but no more. + - If an input given to the algorithm that cannot be divided exactly into 16-bit blocks (i.e. one byte is left over), a padding byte of 0 is added as the 2nd byte to make it fit. +For more information see [[file:./src/mnemonic.rs][mnemonic.rs]]. ** License GPL'd with love <3