Changeset e34b646


Ignore:
Timestamp:
Feb 19, 2019 7:11:34 PM (15 months ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
17270b15
Parents:
14ac8fe5
Message:

Crypto: New ChaCha20 wrapper around ChaChaCore?, for use with Encrypted LS2

Files:
1 added
2 edited

Legend:

Unmodified
Added
Removed
  • core/java/src/com/southernstorm/noise/crypto/chacha20/ChaChaCore.java

    r14ac8fe5 re34b646  
    170170                v[b] = leftRotate7(v[b] ^ v[c]);
    171171        }
     172
     173        /**
     174         * XOR's the output of ChaCha20 with a byte buffer.
     175         *
     176         * @param input The input byte buffer.
     177         * @param inputOffset The offset of the first input byte.
     178         * @param output The output byte buffer (can be the same as the input).
     179         * @param outputOffset The offset of the first output byte.
     180         * @param length The number of bytes to XOR between 1 and 64.
     181         * @param block The ChaCha20 output block.
     182         *
     183         * @since 0.9.39 moved from ChaChaPolyCipherState
     184         */
     185        public static void xorBlock(byte[] input, int inputOffset, byte[] output, int outputOffset, int length, int[] block)
     186        {
     187                int posn = 0;
     188                int value;
     189                while (length >= 4) {
     190                        value = block[posn++];
     191                        output[outputOffset] = (byte)(input[inputOffset] ^ value);
     192                        output[outputOffset + 1] = (byte)(input[inputOffset + 1] ^ (value >> 8));
     193                        output[outputOffset + 2] = (byte)(input[inputOffset + 2] ^ (value >> 16));
     194                        output[outputOffset + 3] = (byte)(input[inputOffset + 3] ^ (value >> 24));
     195                        inputOffset += 4;
     196                        outputOffset += 4;
     197                        length -= 4;
     198                }
     199                if (length == 3) {
     200                        value = block[posn];
     201                        output[outputOffset] = (byte)(input[inputOffset] ^ value);
     202                        output[outputOffset + 1] = (byte)(input[inputOffset + 1] ^ (value >> 8));
     203                        output[outputOffset + 2] = (byte)(input[inputOffset + 2] ^ (value >> 16));
     204                } else if (length == 2) {
     205                        value = block[posn];
     206                        output[outputOffset] = (byte)(input[inputOffset] ^ value);
     207                        output[outputOffset + 1] = (byte)(input[inputOffset + 1] ^ (value >> 8));
     208                } else if (length == 1) {
     209                        value = block[posn];
     210                        output[outputOffset] = (byte)(input[inputOffset] ^ value);
     211                }
     212        }
    172213}
  • router/java/src/com/southernstorm/noise/protocol/ChaChaPolyCipherState.java

    r14ac8fe5 re34b646  
    9090                return haskey;
    9191        }
    92 
    93         /**
    94          * XOR's the output of ChaCha20 with a byte buffer.
    95          *
    96          * @param input The input byte buffer.
    97          * @param inputOffset The offset of the first input byte.
    98          * @param output The output byte buffer (can be the same as the input).
    99          * @param outputOffset The offset of the first output byte.
    100          * @param length The number of bytes to XOR between 1 and 64.
    101          * @param block The ChaCha20 output block.
    102          */
    103         private static void xorBlock(byte[] input, int inputOffset, byte[] output, int outputOffset, int length, int[] block)
    104         {
    105                 int posn = 0;
    106                 int value;
    107                 while (length >= 4) {
    108                         value = block[posn++];
    109                         output[outputOffset] = (byte)(input[inputOffset] ^ value);
    110                         output[outputOffset + 1] = (byte)(input[inputOffset + 1] ^ (value >> 8));
    111                         output[outputOffset + 2] = (byte)(input[inputOffset + 2] ^ (value >> 16));
    112                         output[outputOffset + 3] = (byte)(input[inputOffset + 3] ^ (value >> 24));
    113                         inputOffset += 4;
    114                         outputOffset += 4;
    115                         length -= 4;
    116                 }
    117                 if (length == 3) {
    118                         value = block[posn];
    119                         output[outputOffset] = (byte)(input[inputOffset] ^ value);
    120                         output[outputOffset + 1] = (byte)(input[inputOffset + 1] ^ (value >> 8));
    121                         output[outputOffset + 2] = (byte)(input[inputOffset + 2] ^ (value >> 16));
    122                 } else if (length == 2) {
    123                         value = block[posn];
    124                         output[outputOffset] = (byte)(input[inputOffset] ^ value);
    125                         output[outputOffset + 1] = (byte)(input[inputOffset + 1] ^ (value >> 8));
    126                 } else if (length == 1) {
    127                         value = block[posn];
    128                         output[outputOffset] = (byte)(input[inputOffset] ^ value);
    129                 }
    130         }
    13192       
    13293        /**
     
    142103                ChaChaCore.hash(output, input);
    143104                Arrays.fill(polyKey, (byte)0);
    144                 xorBlock(polyKey, 0, polyKey, 0, 32, output);
     105                ChaChaCore.xorBlock(polyKey, 0, polyKey, 0, 32, output);
    145106                poly.reset(polyKey, 0);
    146107                if (ad != null) {
     
    202163                                tempLen = length;
    203164                        ChaChaCore.hash(output, input);
    204                         xorBlock(plaintext, plaintextOffset, ciphertext, ciphertextOffset, tempLen, output);
     165                        ChaChaCore.xorBlock(plaintext, plaintextOffset, ciphertext, ciphertextOffset, tempLen, output);
    205166                        if (++(input[12]) == 0)
    206167                                ++(input[13]);
Note: See TracChangeset for help on using the changeset viewer.