1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* 2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Licensed to the Apache Software Foundation (ASF) under one or more 3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * contributor license agreements. See the NOTICE file distributed with 4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this work for additional information regarding copyright ownership. 5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0 6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (the "License"); you may not use this file except in compliance with 7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the License. You may obtain a copy of the License at 8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * See the License for the specific language governing permissions and 15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * limitations under the License. 16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage javax.crypto.spec; 19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.InvalidKeyException; 21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.spec.KeySpec; 22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/** 24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The key specification for a DES key. 25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class DESKeySpec implements KeySpec { 27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The length of a DES key in bytes. 30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static final int DES_KEY_LEN = 8; 32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final byte[] key; 34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // DES weak and semi-weak keys 36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Got from: 37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // FIP PUB 74 38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // FEDERAL INFORMATION PROCESSING STANDARDS PUBLICATION 1981 39f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes // GUIDELINES FOR IMPLEMENTING AND USING THE NBS DATA ENCRYPTION STANDARD 40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // http://www.dice.ucl.ac.be/crypto/standards/fips/fip74/fip74-1.pdf 41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static final byte[][] SEMIWEAKS = { 42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project {(byte) 0xE0, (byte) 0x01, (byte) 0xE0, (byte) 0x01, 43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project (byte) 0xF1, (byte) 0x01, (byte) 0xF1, (byte) 0x01}, 44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project {(byte) 0x01, (byte) 0xE0, (byte) 0x01, (byte) 0xE0, 46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project (byte) 0x01, (byte) 0xF1, (byte) 0x01, (byte) 0xF1}, 47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project {(byte) 0xFE, (byte) 0x1F, (byte) 0xFE, (byte) 0x1F, 49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project (byte) 0xFE, (byte) 0x0E, (byte) 0xFE, (byte) 0x0E}, 50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project {(byte) 0x1F, (byte) 0xFE, (byte) 0x1F, (byte) 0xFE, 52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project (byte) 0x0E, (byte) 0xFE, (byte) 0x0E, (byte) 0xFE}, 53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project {(byte) 0xE0, (byte) 0x1F, (byte) 0xE0, (byte) 0x1F, 55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project (byte) 0xF1, (byte) 0x0E, (byte) 0xF1, (byte) 0x0E}, 56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project {(byte) 0x1F, (byte) 0xE0, (byte) 0x1F, (byte) 0xE0, 58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project (byte) 0x0E, (byte) 0xF1, (byte) 0x0E, (byte) 0xF1}, 59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project {(byte) 0x01, (byte) 0xFE, (byte) 0x01, (byte) 0xFE, 61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project (byte) 0x01, (byte) 0xFE, (byte) 0x01, (byte) 0xFE}, 62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project {(byte) 0xFE, (byte) 0x01, (byte) 0xFE, (byte) 0x01, 64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project (byte) 0xFE, (byte) 0x01, (byte) 0xFE, (byte) 0x01}, 65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project {(byte) 0x01, (byte) 0x1F, (byte) 0x01, (byte) 0x1F, 67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project (byte) 0x01, (byte) 0x0E, (byte) 0x01, (byte) 0x0E}, 68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project {(byte) 0x1F, (byte) 0x01, (byte) 0x1F, (byte) 0x01, 70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project (byte) 0x0E, (byte) 0x01, (byte) 0x0E, (byte) 0x01}, 71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project {(byte) 0xE0, (byte) 0xFE, (byte) 0xE0, (byte) 0xFE, 73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project (byte) 0xF1, (byte) 0xFE, (byte) 0xF1, (byte) 0xFE}, 74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project {(byte) 0xFE, (byte) 0xE0, (byte) 0xFE, (byte) 0xE0, 76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project (byte) 0xFE, (byte) 0xF1, (byte) 0xFE, (byte) 0xF1}, 77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 78f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes {(byte) 0x01, (byte) 0x01, (byte) 0x01, (byte) 0x01, 79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project (byte) 0x01, (byte) 0x01, (byte) 0x01, (byte) 0x01}, 80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project {(byte) 0xFE, (byte) 0xFE, (byte) 0xFE, (byte) 0xFE, 82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project (byte) 0xFE, (byte) 0xFE, (byte) 0xFE, (byte) 0xFE}, 83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project {(byte) 0xE0, (byte) 0xE0, (byte) 0xE0, (byte) 0xE0, 85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project (byte) 0xF1, (byte) 0xF1, (byte) 0xF1, (byte) 0xF1}, 86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project {(byte) 0x1F, (byte) 0x1F, (byte) 0x1F, (byte) 0x1F, 88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project (byte) 0x0E, (byte) 0x0E, (byte) 0x0E, (byte) 0x0E}, 89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project }; 91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Creates a new <code>DESKeySpec</code> from the first 8 bytes of the 94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * specified key data. 95ce9ec01c0b6da3f3ba01e9c81cc3e5a461aabfb6Jesse Wilson * 96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param key 97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the key data. 98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws InvalidKeyException 99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the length of the specified key data is less than 8. 100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public DESKeySpec(byte[] key) throws InvalidKeyException { 102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this(key, 0); 103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Creates a new <code>DESKeySpec</code> from the first 8 bytes of the 107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * specified key data starting at <code>offset</code>. 108ce9ec01c0b6da3f3ba01e9c81cc3e5a461aabfb6Jesse Wilson * 109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param key 110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the key data 111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param offset 112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the offset to start at. 113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws InvalidKeyException 114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the length of the specified key data starting at offset is 115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * less than 8. 116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 11780a7fbab52b96c9fd47c72f8987d1babe2cd001dElliott Hughes public DESKeySpec(byte[] key, int offset) throws InvalidKeyException { 118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (key == null) { 11980a7fbab52b96c9fd47c72f8987d1babe2cd001dElliott Hughes throw new NullPointerException("key == null"); 120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (key.length - offset < DES_KEY_LEN) { 12280a7fbab52b96c9fd47c72f8987d1babe2cd001dElliott Hughes throw new InvalidKeyException("key too short"); 123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.key = new byte[DES_KEY_LEN]; 125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project System.arraycopy(key, offset, this.key, 0, DES_KEY_LEN); 126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns a copy of the key. 130ce9ec01c0b6da3f3ba01e9c81cc3e5a461aabfb6Jesse Wilson * 131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return a copy of the key. 132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public byte[] getKey() { 134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project byte[] result = new byte[DES_KEY_LEN]; 135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project System.arraycopy(this.key, 0, result, 0, DES_KEY_LEN); 136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return result; 137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns whether the specified key data starting at <code>offset</code> is 141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <i>parity-adjusted</i>. 142ce9ec01c0b6da3f3ba01e9c81cc3e5a461aabfb6Jesse Wilson * 143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param key 144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the key data. 145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param offset 146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the offset to start checking at. 147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return {@code true} if the specified key data is parity-adjusted, 148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code false} otherwise. 149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws InvalidKeyException 150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the length of the key data starting at offset is less than 151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 8, or the key is null. 152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 15380a7fbab52b96c9fd47c72f8987d1babe2cd001dElliott Hughes public static boolean isParityAdjusted(byte[] key, int offset) throws InvalidKeyException { 154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (key == null) { 15580a7fbab52b96c9fd47c72f8987d1babe2cd001dElliott Hughes throw new InvalidKeyException("key == null"); 156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (key.length - offset < DES_KEY_LEN) { 15880a7fbab52b96c9fd47c72f8987d1babe2cd001dElliott Hughes throw new InvalidKeyException("key too short"); 159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int byteKey = 0; 162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (int i = offset; i < DES_KEY_LEN; i++) { 164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project byteKey = key[i]; 165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project byteKey ^= byteKey >> 1; 167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project byteKey ^= byteKey >> 2; 168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project byteKey ^= byteKey >> 4; 169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if ((byteKey & 1) == 0) { 171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return false; 172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return true; 175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns whether the specified key data starting at <code>offset</code> is 179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * weak or semi-weak. 180ce9ec01c0b6da3f3ba01e9c81cc3e5a461aabfb6Jesse Wilson * 181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param key 182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the key data. 183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param offset 184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the offset to start checking at. 185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return {@code true} if the specified key data is weak or semi-weak. 186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws InvalidKeyException 187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the length of the key data starting at offset is less than 188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 8, or it is null. 189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 19080a7fbab52b96c9fd47c72f8987d1babe2cd001dElliott Hughes public static boolean isWeak(byte[] key, int offset) throws InvalidKeyException { 191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (key == null) { 19280a7fbab52b96c9fd47c72f8987d1babe2cd001dElliott Hughes throw new InvalidKeyException("key == null"); 193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (key.length - offset < DES_KEY_LEN) { 19580a7fbab52b96c9fd47c72f8987d1babe2cd001dElliott Hughes throw new InvalidKeyException("key too short"); 196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project I: 198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (int i=0; i<SEMIWEAKS.length; i++) { 199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (int j=0; j<DES_KEY_LEN; j++) { 200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (SEMIWEAKS[i][j] != key[offset+j]) { 201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project continue I; 202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return true; 205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return false; 207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 209