Changeset e34b646 for core


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

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

Location:
core/java/src
Files:
1 added
1 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}
Note: See TracChangeset for help on using the changeset viewer.