jdk/src/java.base/share/classes/com/sun/crypto/provider/RC2Crypt.java
author martin
Tue, 15 Sep 2015 21:56:04 -0700
changeset 32649 2ee9017c7597
parent 25859 3317bb8137f4
permissions -rw-r--r--
8136583: Core libraries should use blessed modifier order Summary: Run blessed-modifier-order script (see bug) Reviewed-by: psandoz, chegar, alanb, plevart
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
     1
/*
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 2
diff changeset
     2
 * Copyright (c) 2003, 2007, Oracle and/or its affiliates. All rights reserved.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
90ce3da70b43 Initial load
duke
parents:
diff changeset
     4
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
90ce3da70b43 Initial load
duke
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 2
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 2
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    10
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
90ce3da70b43 Initial load
duke
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
90ce3da70b43 Initial load
duke
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
90ce3da70b43 Initial load
duke
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
90ce3da70b43 Initial load
duke
parents:
diff changeset
    15
 * accompanied this code).
90ce3da70b43 Initial load
duke
parents:
diff changeset
    16
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
90ce3da70b43 Initial load
duke
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
90ce3da70b43 Initial load
duke
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    20
 *
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 2
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 2
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 2
diff changeset
    23
 * questions.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    24
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    25
90ce3da70b43 Initial load
duke
parents:
diff changeset
    26
package com.sun.crypto.provider;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    27
90ce3da70b43 Initial load
duke
parents:
diff changeset
    28
import java.security.InvalidKeyException;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    29
90ce3da70b43 Initial load
duke
parents:
diff changeset
    30
/**
90ce3da70b43 Initial load
duke
parents:
diff changeset
    31
 * Implementation of the RC2(tm) algorithm as described in RFC 2268.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    32
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    33
 * RC2 is a 16-bit based algorithm and not particularly fast on 32/64 bit
90ce3da70b43 Initial load
duke
parents:
diff changeset
    34
 * architectures. Also, note that although the JVM has a 16-bit integer
90ce3da70b43 Initial load
duke
parents:
diff changeset
    35
 * type (short), all expressions are evaluated either in 32 or 64 bit
90ce3da70b43 Initial load
duke
parents:
diff changeset
    36
 * (int or long). Expression such as "s1 = s2 + s3" are implemented by
90ce3da70b43 Initial load
duke
parents:
diff changeset
    37
 * first promoting s2 and s3 to int, performing an int addition, and
90ce3da70b43 Initial load
duke
parents:
diff changeset
    38
 * then demoting the result back to short to store in s1. To avoid this
90ce3da70b43 Initial load
duke
parents:
diff changeset
    39
 * fairly slow process, we use the int type throughout and manually insert
90ce3da70b43 Initial load
duke
parents:
diff changeset
    40
 * "& 0xffff" where necessary.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    41
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    42
 * @since   1.5
90ce3da70b43 Initial load
duke
parents:
diff changeset
    43
 * @author  Andreas Sterbenz
90ce3da70b43 Initial load
duke
parents:
diff changeset
    44
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    45
final class RC2Crypt extends SymmetricCipher {
90ce3da70b43 Initial load
duke
parents:
diff changeset
    46
90ce3da70b43 Initial load
duke
parents:
diff changeset
    47
    // PITABLE from the RFC, used in key setup
32649
2ee9017c7597 8136583: Core libraries should use blessed modifier order
martin
parents: 25859
diff changeset
    48
    private static final int[] PI_TABLE = new int[] {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    49
        0xd9, 0x78, 0xf9, 0xc4, 0x19, 0xdd, 0xb5, 0xed,
90ce3da70b43 Initial load
duke
parents:
diff changeset
    50
        0x28, 0xe9, 0xfd, 0x79, 0x4a, 0xa0, 0xd8, 0x9d,
90ce3da70b43 Initial load
duke
parents:
diff changeset
    51
        0xc6, 0x7e, 0x37, 0x83, 0x2b, 0x76, 0x53, 0x8e,
90ce3da70b43 Initial load
duke
parents:
diff changeset
    52
        0x62, 0x4c, 0x64, 0x88, 0x44, 0x8b, 0xfb, 0xa2,
90ce3da70b43 Initial load
duke
parents:
diff changeset
    53
        0x17, 0x9a, 0x59, 0xf5, 0x87, 0xb3, 0x4f, 0x13,
90ce3da70b43 Initial load
duke
parents:
diff changeset
    54
        0x61, 0x45, 0x6d, 0x8d, 0x09, 0x81, 0x7d, 0x32,
90ce3da70b43 Initial load
duke
parents:
diff changeset
    55
        0xbd, 0x8f, 0x40, 0xeb, 0x86, 0xb7, 0x7b, 0x0b,
90ce3da70b43 Initial load
duke
parents:
diff changeset
    56
        0xf0, 0x95, 0x21, 0x22, 0x5c, 0x6b, 0x4e, 0x82,
90ce3da70b43 Initial load
duke
parents:
diff changeset
    57
        0x54, 0xd6, 0x65, 0x93, 0xce, 0x60, 0xb2, 0x1c,
90ce3da70b43 Initial load
duke
parents:
diff changeset
    58
        0x73, 0x56, 0xc0, 0x14, 0xa7, 0x8c, 0xf1, 0xdc,
90ce3da70b43 Initial load
duke
parents:
diff changeset
    59
        0x12, 0x75, 0xca, 0x1f, 0x3b, 0xbe, 0xe4, 0xd1,
90ce3da70b43 Initial load
duke
parents:
diff changeset
    60
        0x42, 0x3d, 0xd4, 0x30, 0xa3, 0x3c, 0xb6, 0x26,
90ce3da70b43 Initial load
duke
parents:
diff changeset
    61
        0x6f, 0xbf, 0x0e, 0xda, 0x46, 0x69, 0x07, 0x57,
90ce3da70b43 Initial load
duke
parents:
diff changeset
    62
        0x27, 0xf2, 0x1d, 0x9b, 0xbc, 0x94, 0x43, 0x03,
90ce3da70b43 Initial load
duke
parents:
diff changeset
    63
        0xf8, 0x11, 0xc7, 0xf6, 0x90, 0xef, 0x3e, 0xe7,
90ce3da70b43 Initial load
duke
parents:
diff changeset
    64
        0x06, 0xc3, 0xd5, 0x2f, 0xc8, 0x66, 0x1e, 0xd7,
90ce3da70b43 Initial load
duke
parents:
diff changeset
    65
        0x08, 0xe8, 0xea, 0xde, 0x80, 0x52, 0xee, 0xf7,
90ce3da70b43 Initial load
duke
parents:
diff changeset
    66
        0x84, 0xaa, 0x72, 0xac, 0x35, 0x4d, 0x6a, 0x2a,
90ce3da70b43 Initial load
duke
parents:
diff changeset
    67
        0x96, 0x1a, 0xd2, 0x71, 0x5a, 0x15, 0x49, 0x74,
90ce3da70b43 Initial load
duke
parents:
diff changeset
    68
        0x4b, 0x9f, 0xd0, 0x5e, 0x04, 0x18, 0xa4, 0xec,
90ce3da70b43 Initial load
duke
parents:
diff changeset
    69
        0xc2, 0xe0, 0x41, 0x6e, 0x0f, 0x51, 0xcb, 0xcc,
90ce3da70b43 Initial load
duke
parents:
diff changeset
    70
        0x24, 0x91, 0xaf, 0x50, 0xa1, 0xf4, 0x70, 0x39,
90ce3da70b43 Initial load
duke
parents:
diff changeset
    71
        0x99, 0x7c, 0x3a, 0x85, 0x23, 0xb8, 0xb4, 0x7a,
90ce3da70b43 Initial load
duke
parents:
diff changeset
    72
        0xfc, 0x02, 0x36, 0x5b, 0x25, 0x55, 0x97, 0x31,
90ce3da70b43 Initial load
duke
parents:
diff changeset
    73
        0x2d, 0x5d, 0xfa, 0x98, 0xe3, 0x8a, 0x92, 0xae,
90ce3da70b43 Initial load
duke
parents:
diff changeset
    74
        0x05, 0xdf, 0x29, 0x10, 0x67, 0x6c, 0xba, 0xc9,
90ce3da70b43 Initial load
duke
parents:
diff changeset
    75
        0xd3, 0x00, 0xe6, 0xcf, 0xe1, 0x9e, 0xa8, 0x2c,
90ce3da70b43 Initial load
duke
parents:
diff changeset
    76
        0x63, 0x16, 0x01, 0x3f, 0x58, 0xe2, 0x89, 0xa9,
90ce3da70b43 Initial load
duke
parents:
diff changeset
    77
        0x0d, 0x38, 0x34, 0x1b, 0xab, 0x33, 0xff, 0xb0,
90ce3da70b43 Initial load
duke
parents:
diff changeset
    78
        0xbb, 0x48, 0x0c, 0x5f, 0xb9, 0xb1, 0xcd, 0x2e,
90ce3da70b43 Initial load
duke
parents:
diff changeset
    79
        0xc5, 0xf3, 0xdb, 0x47, 0xe5, 0xa5, 0x9c, 0x77,
90ce3da70b43 Initial load
duke
parents:
diff changeset
    80
        0x0a, 0xa6, 0x20, 0x68, 0xfe, 0x7f, 0xc1, 0xad,
90ce3da70b43 Initial load
duke
parents:
diff changeset
    81
    };
90ce3da70b43 Initial load
duke
parents:
diff changeset
    82
90ce3da70b43 Initial load
duke
parents:
diff changeset
    83
    // expanded key, 64 times 16-bit words
90ce3da70b43 Initial load
duke
parents:
diff changeset
    84
    private final int[] expandedKey;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    85
90ce3da70b43 Initial load
duke
parents:
diff changeset
    86
    // effective key bits
90ce3da70b43 Initial load
duke
parents:
diff changeset
    87
    private int effectiveKeyBits;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    88
90ce3da70b43 Initial load
duke
parents:
diff changeset
    89
    RC2Crypt() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
    90
        expandedKey = new int[64];
90ce3da70b43 Initial load
duke
parents:
diff changeset
    91
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
    92
90ce3da70b43 Initial load
duke
parents:
diff changeset
    93
    int getBlockSize() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
    94
        return 8;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    95
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
    96
90ce3da70b43 Initial load
duke
parents:
diff changeset
    97
    int getEffectiveKeyBits() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
    98
        return effectiveKeyBits;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    99
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   100
90ce3da70b43 Initial load
duke
parents:
diff changeset
   101
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   102
     * Initializes the effective key bit size. This method is a hook to
90ce3da70b43 Initial load
duke
parents:
diff changeset
   103
     * allow RC2Cipher to initialize the effective key size.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   104
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   105
    void initEffectiveKeyBits(int effectiveKeyBits) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   106
        this.effectiveKeyBits = effectiveKeyBits;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   107
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   108
90ce3da70b43 Initial load
duke
parents:
diff changeset
   109
    static void checkKey(String algorithm, int keyLength)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   110
            throws InvalidKeyException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   111
        if (algorithm.equals("RC2") == false) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   112
            throw new InvalidKeyException("Key algorithm must be RC2");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   113
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   114
        if ((keyLength < 5) || (keyLength > 128)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   115
            throw new InvalidKeyException
90ce3da70b43 Initial load
duke
parents:
diff changeset
   116
                ("RC2 key length must be between 40 and 1024 bit");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   117
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   118
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   119
90ce3da70b43 Initial load
duke
parents:
diff changeset
   120
    void init(boolean decrypting, String algorithm, byte[] key)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   121
            throws InvalidKeyException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   122
        int keyLength = key.length;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   123
        if (effectiveKeyBits == 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   124
            effectiveKeyBits = keyLength << 3;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   125
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   126
90ce3da70b43 Initial load
duke
parents:
diff changeset
   127
        checkKey(algorithm, keyLength);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   128
90ce3da70b43 Initial load
duke
parents:
diff changeset
   129
        // key buffer, the L[] byte array from the spec
90ce3da70b43 Initial load
duke
parents:
diff changeset
   130
        byte[] expandedKeyBytes = new byte[128];
90ce3da70b43 Initial load
duke
parents:
diff changeset
   131
90ce3da70b43 Initial load
duke
parents:
diff changeset
   132
        // place key into key buffer
90ce3da70b43 Initial load
duke
parents:
diff changeset
   133
        System.arraycopy(key, 0, expandedKeyBytes, 0, keyLength);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   134
90ce3da70b43 Initial load
duke
parents:
diff changeset
   135
        // first loop
90ce3da70b43 Initial load
duke
parents:
diff changeset
   136
        int t = expandedKeyBytes[keyLength - 1];
90ce3da70b43 Initial load
duke
parents:
diff changeset
   137
        for (int i = keyLength; i < 128; i++) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   138
            t = PI_TABLE[(t + expandedKeyBytes[i - keyLength]) & 0xff];
90ce3da70b43 Initial load
duke
parents:
diff changeset
   139
            expandedKeyBytes[i] = (byte)t;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   140
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   141
90ce3da70b43 Initial load
duke
parents:
diff changeset
   142
        int t8 = (effectiveKeyBits + 7) >> 3;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   143
        int tm = 0xff >> (-effectiveKeyBits & 7);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   144
90ce3da70b43 Initial load
duke
parents:
diff changeset
   145
        // second loop, reduce search space to effective key bits
90ce3da70b43 Initial load
duke
parents:
diff changeset
   146
        t = PI_TABLE[expandedKeyBytes[128 - t8] & tm];
90ce3da70b43 Initial load
duke
parents:
diff changeset
   147
        expandedKeyBytes[128 - t8] = (byte)t;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   148
        for (int i = 127 - t8; i >= 0; i--) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   149
            t = PI_TABLE[t ^ (expandedKeyBytes[i + t8] & 0xff)];
90ce3da70b43 Initial load
duke
parents:
diff changeset
   150
            expandedKeyBytes[i] = (byte)t;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   151
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   152
90ce3da70b43 Initial load
duke
parents:
diff changeset
   153
        // byte to short conversion, little endian (copy into K[])
90ce3da70b43 Initial load
duke
parents:
diff changeset
   154
        for (int i = 0, j = 0; i < 64; i++, j += 2) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   155
            t =  (expandedKeyBytes[j    ] & 0xff)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   156
              + ((expandedKeyBytes[j + 1] & 0xff) << 8);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   157
            expandedKey[i] = t;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   158
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   159
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   160
90ce3da70b43 Initial load
duke
parents:
diff changeset
   161
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   162
     * Encrypt a single block. Note that in a few places we omit a "& 0xffff"
90ce3da70b43 Initial load
duke
parents:
diff changeset
   163
     * and allow variables to become larger than 16 bit. This still works
90ce3da70b43 Initial load
duke
parents:
diff changeset
   164
     * because there is never a 32 bit overflow.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   165
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   166
    void encryptBlock(byte[] in, int inOfs, byte[] out, int outOfs) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   167
        int R0 =  (in[inOfs    ] & 0xff)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   168
               + ((in[inOfs + 1] & 0xff) << 8);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   169
        int R1 =  (in[inOfs + 2] & 0xff)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   170
               + ((in[inOfs + 3] & 0xff) << 8);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   171
        int R2 =  (in[inOfs + 4] & 0xff)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   172
               + ((in[inOfs + 5] & 0xff) << 8);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   173
        int R3 =  (in[inOfs + 6] & 0xff)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   174
               + ((in[inOfs + 7] & 0xff) << 8);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   175
90ce3da70b43 Initial load
duke
parents:
diff changeset
   176
        // 5 mixing rounds
90ce3da70b43 Initial load
duke
parents:
diff changeset
   177
        for (int i = 0; i < 20; i += 4) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   178
            R0 = (R0 + expandedKey[i    ] + (R3 & R2) + (~R3 & R1)) & 0xffff;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   179
            R0 = (R0 << 1) | (R0 >>> 15);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   180
90ce3da70b43 Initial load
duke
parents:
diff changeset
   181
            R1 = (R1 + expandedKey[i + 1] + (R0 & R3) + (~R0 & R2)) & 0xffff;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   182
            R1 = (R1 << 2) | (R1 >>> 14);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   183
90ce3da70b43 Initial load
duke
parents:
diff changeset
   184
            R2 = (R2 + expandedKey[i + 2] + (R1 & R0) + (~R1 & R3)) & 0xffff;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   185
            R2 = (R2 << 3) | (R2 >>> 13);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   186
90ce3da70b43 Initial load
duke
parents:
diff changeset
   187
            R3 = (R3 + expandedKey[i + 3] + (R2 & R1) + (~R2 & R0)) & 0xffff;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   188
            R3 = (R3 << 5) | (R3 >>> 11);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   189
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   190
90ce3da70b43 Initial load
duke
parents:
diff changeset
   191
        // 1 mashing round
90ce3da70b43 Initial load
duke
parents:
diff changeset
   192
        R0 += expandedKey[R3 & 0x3f];
90ce3da70b43 Initial load
duke
parents:
diff changeset
   193
        R1 += expandedKey[R0 & 0x3f];
90ce3da70b43 Initial load
duke
parents:
diff changeset
   194
        R2 += expandedKey[R1 & 0x3f];
90ce3da70b43 Initial load
duke
parents:
diff changeset
   195
        R3 += expandedKey[R2 & 0x3f];
90ce3da70b43 Initial load
duke
parents:
diff changeset
   196
90ce3da70b43 Initial load
duke
parents:
diff changeset
   197
        // 6 mixing rounds
90ce3da70b43 Initial load
duke
parents:
diff changeset
   198
        for (int i = 20; i < 44; i += 4) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   199
            R0 = (R0 + expandedKey[i    ] + (R3 & R2) + (~R3 & R1)) & 0xffff;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   200
            R0 = (R0 << 1) | (R0 >>> 15);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   201
90ce3da70b43 Initial load
duke
parents:
diff changeset
   202
            R1 = (R1 + expandedKey[i + 1] + (R0 & R3) + (~R0 & R2)) & 0xffff;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   203
            R1 = (R1 << 2) | (R1 >>> 14);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   204
90ce3da70b43 Initial load
duke
parents:
diff changeset
   205
            R2 = (R2 + expandedKey[i + 2] + (R1 & R0) + (~R1 & R3)) & 0xffff;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   206
            R2 = (R2 << 3) | (R2 >>> 13);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   207
90ce3da70b43 Initial load
duke
parents:
diff changeset
   208
            R3 = (R3 + expandedKey[i + 3] + (R2 & R1) + (~R2 & R0)) & 0xffff;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   209
            R3 = (R3 << 5) | (R3 >>> 11);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   210
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   211
90ce3da70b43 Initial load
duke
parents:
diff changeset
   212
        // 1 mashing round
90ce3da70b43 Initial load
duke
parents:
diff changeset
   213
        R0 += expandedKey[R3 & 0x3f];
90ce3da70b43 Initial load
duke
parents:
diff changeset
   214
        R1 += expandedKey[R0 & 0x3f];
90ce3da70b43 Initial load
duke
parents:
diff changeset
   215
        R2 += expandedKey[R1 & 0x3f];
90ce3da70b43 Initial load
duke
parents:
diff changeset
   216
        R3 += expandedKey[R2 & 0x3f];
90ce3da70b43 Initial load
duke
parents:
diff changeset
   217
90ce3da70b43 Initial load
duke
parents:
diff changeset
   218
        // 5 mixing rounds
90ce3da70b43 Initial load
duke
parents:
diff changeset
   219
        for (int i = 44; i < 64; i += 4) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   220
            R0 = (R0 + expandedKey[i    ] + (R3 & R2) + (~R3 & R1)) & 0xffff;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   221
            R0 = (R0 << 1) | (R0 >>> 15);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   222
90ce3da70b43 Initial load
duke
parents:
diff changeset
   223
            R1 = (R1 + expandedKey[i + 1] + (R0 & R3) + (~R0 & R2)) & 0xffff;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   224
            R1 = (R1 << 2) | (R1 >>> 14);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   225
90ce3da70b43 Initial load
duke
parents:
diff changeset
   226
            R2 = (R2 + expandedKey[i + 2] + (R1 & R0) + (~R1 & R3)) & 0xffff;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   227
            R2 = (R2 << 3) | (R2 >>> 13);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   228
90ce3da70b43 Initial load
duke
parents:
diff changeset
   229
            R3 = (R3 + expandedKey[i + 3] + (R2 & R1) + (~R2 & R0)) & 0xffff;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   230
            R3 = (R3 << 5) | (R3 >>> 11);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   231
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   232
90ce3da70b43 Initial load
duke
parents:
diff changeset
   233
        out[outOfs    ] = (byte)R0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   234
        out[outOfs + 1] = (byte)(R0 >> 8);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   235
        out[outOfs + 2] = (byte)R1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   236
        out[outOfs + 3] = (byte)(R1 >> 8);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   237
        out[outOfs + 4] = (byte)R2;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   238
        out[outOfs + 5] = (byte)(R2 >> 8);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   239
        out[outOfs + 6] = (byte)R3;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   240
        out[outOfs + 7] = (byte)(R3 >> 8);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   241
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   242
90ce3da70b43 Initial load
duke
parents:
diff changeset
   243
    void decryptBlock(byte[] in, int inOfs, byte[] out, int outOfs) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   244
        int R0 =  (in[inOfs    ] & 0xff)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   245
               + ((in[inOfs + 1] & 0xff) << 8);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   246
        int R1 =  (in[inOfs + 2] & 0xff)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   247
               + ((in[inOfs + 3] & 0xff) << 8);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   248
        int R2 =  (in[inOfs + 4] & 0xff)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   249
               + ((in[inOfs + 5] & 0xff) << 8);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   250
        int R3 =  (in[inOfs + 6] & 0xff)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   251
               + ((in[inOfs + 7] & 0xff) << 8);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   252
90ce3da70b43 Initial load
duke
parents:
diff changeset
   253
        // 5 r-mixing rounds
90ce3da70b43 Initial load
duke
parents:
diff changeset
   254
        for(int i = 64; i > 44; i -= 4) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   255
            R3 = ((R3 << 11) | (R3 >>> 5)) & 0xffff;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   256
            R3 = (R3 - expandedKey[i - 1] - (R2 & R1) - (~R2 & R0)) & 0xffff;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   257
90ce3da70b43 Initial load
duke
parents:
diff changeset
   258
            R2 = ((R2 << 13) | (R2 >>> 3)) & 0xffff;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   259
            R2 = (R2 - expandedKey[i - 2] - (R1 & R0) - (~R1 & R3)) & 0xffff;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   260
90ce3da70b43 Initial load
duke
parents:
diff changeset
   261
            R1 = ((R1 << 14) | (R1 >>> 2)) & 0xffff;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   262
            R1 = (R1 - expandedKey[i - 3] - (R0 & R3) - (~R0 & R2)) & 0xffff;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   263
90ce3da70b43 Initial load
duke
parents:
diff changeset
   264
            R0 = ((R0 << 15) | (R0 >>> 1)) & 0xffff;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   265
            R0 = (R0 - expandedKey[i - 4] - (R3 & R2) - (~R3 & R1)) & 0xffff;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   266
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   267
90ce3da70b43 Initial load
duke
parents:
diff changeset
   268
        // 1 r-mashing round
90ce3da70b43 Initial load
duke
parents:
diff changeset
   269
        R3 = (R3 - expandedKey[R2 & 0x3f]) & 0xffff;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   270
        R2 = (R2 - expandedKey[R1 & 0x3f]) & 0xffff;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   271
        R1 = (R1 - expandedKey[R0 & 0x3f]) & 0xffff;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   272
        R0 = (R0 - expandedKey[R3 & 0x3f]) & 0xffff;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   273
90ce3da70b43 Initial load
duke
parents:
diff changeset
   274
        // 6 r-mixing rounds
90ce3da70b43 Initial load
duke
parents:
diff changeset
   275
        for(int i = 44; i > 20; i -= 4) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   276
            R3 = ((R3 << 11) | (R3 >>> 5)) & 0xffff;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   277
            R3 = (R3 - expandedKey[i - 1] - (R2 & R1) - (~R2 & R0)) & 0xffff;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   278
90ce3da70b43 Initial load
duke
parents:
diff changeset
   279
            R2 = ((R2 << 13) | (R2 >>> 3)) & 0xffff;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   280
            R2 = (R2 - expandedKey[i - 2] - (R1 & R0) - (~R1 & R3)) & 0xffff;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   281
90ce3da70b43 Initial load
duke
parents:
diff changeset
   282
            R1 = ((R1 << 14) | (R1 >>> 2)) & 0xffff;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   283
            R1 = (R1 - expandedKey[i - 3] - (R0 & R3) - (~R0 & R2)) & 0xffff;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   284
90ce3da70b43 Initial load
duke
parents:
diff changeset
   285
            R0 = ((R0 << 15) | (R0 >>> 1)) & 0xffff;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   286
            R0 = (R0 - expandedKey[i - 4] - (R3 & R2) - (~R3 & R1)) & 0xffff;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   287
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   288
90ce3da70b43 Initial load
duke
parents:
diff changeset
   289
        // 1 r-mashing round
90ce3da70b43 Initial load
duke
parents:
diff changeset
   290
        R3 = (R3 - expandedKey[R2 & 0x3f]) & 0xffff;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   291
        R2 = (R2 - expandedKey[R1 & 0x3f]) & 0xffff;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   292
        R1 = (R1 - expandedKey[R0 & 0x3f]) & 0xffff;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   293
        R0 = (R0 - expandedKey[R3 & 0x3f]) & 0xffff;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   294
90ce3da70b43 Initial load
duke
parents:
diff changeset
   295
        // 5 r-mixing rounds
90ce3da70b43 Initial load
duke
parents:
diff changeset
   296
        for(int i = 20; i > 0; i -= 4) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   297
            R3 = ((R3 << 11) | (R3 >>> 5)) & 0xffff;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   298
            R3 = (R3 - expandedKey[i - 1] - (R2 & R1) - (~R2 & R0)) & 0xffff;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   299
90ce3da70b43 Initial load
duke
parents:
diff changeset
   300
            R2 = ((R2 << 13) | (R2 >>> 3)) & 0xffff;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   301
            R2 = (R2 - expandedKey[i - 2] - (R1 & R0) - (~R1 & R3)) & 0xffff;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   302
90ce3da70b43 Initial load
duke
parents:
diff changeset
   303
            R1 = ((R1 << 14) | (R1 >>> 2)) & 0xffff;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   304
            R1 = (R1 - expandedKey[i - 3] - (R0 & R3) - (~R0 & R2)) & 0xffff;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   305
90ce3da70b43 Initial load
duke
parents:
diff changeset
   306
            R0 = ((R0 << 15) | (R0 >>> 1)) & 0xffff;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   307
            R0 = (R0 - expandedKey[i - 4] - (R3 & R2) - (~R3 & R1)) & 0xffff;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   308
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   309
90ce3da70b43 Initial load
duke
parents:
diff changeset
   310
        out[outOfs    ] = (byte)R0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   311
        out[outOfs + 1] = (byte)(R0 >> 8);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   312
        out[outOfs + 2] = (byte)R1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   313
        out[outOfs + 3] = (byte)(R1 >> 8);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   314
        out[outOfs + 4] = (byte)R2;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   315
        out[outOfs + 5] = (byte)(R2 >> 8);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   316
        out[outOfs + 6] = (byte)R3;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   317
        out[outOfs + 7] = (byte)(R3 >> 8);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   318
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   319
90ce3da70b43 Initial load
duke
parents:
diff changeset
   320
}