Cyberduck Mountain Duck CLI

Ticket #185: Ciphers.patch

File Ciphers.patch, 10.8 KB (added by dkocher, on Nov 12, 2010 at 3:15:29 PM)

Higher priority for weaker ciphers

  • source/ch/ethz/ssh2/crypto/cipher/BlockCipherFactory.java

     
    1 
    21package ch.ethz.ssh2.crypto.cipher;
    32
    43import java.util.Vector;
    54
    65/**
    76 * BlockCipherFactory.
    8  * 
     7 *
    98 * @author Christian Plattner, plattner@inf.ethz.ch
    109 * @version $Id: BlockCipherFactory.java 2839 2007-02-12 13:17:54Z dkocher $
    1110 */
    12 public class BlockCipherFactory
    13 {
    14         static class CipherEntry
    15         {
    16                 String type;
    17                 int blocksize;
    18                 int keysize;
    19                 String cipherClass;
     11public class BlockCipherFactory {
     12    static class CipherEntry {
     13        String type;
     14        int blocksize;
     15        int keysize;
     16        String cipherClass;
    2017
    21                 public CipherEntry(String type, int blockSize, int keySize, String cipherClass)
    22                 {
    23                         this.type = type;
    24                         this.blocksize = blockSize;
    25                         this.keysize = keySize;
    26                         this.cipherClass = cipherClass;
    27                 }
    28         }
     18        public CipherEntry(String type, int blockSize, int keySize, String cipherClass) {
     19            this.type = type;
     20            this.blocksize = blockSize;
     21            this.keysize = keySize;
     22            this.cipherClass = cipherClass;
     23        }
     24    }
    2925
    30         static Vector ciphers = new Vector();
     26    static Vector<CipherEntry> ciphers = new Vector<CipherEntry>();
    3127
    32         static
    33         {
    34                 /* Higher Priority First */
    35 
    36                 ciphers.addElement(new CipherEntry("aes256-ctr", 16, 32, "ch.ethz.ssh2.crypto.cipher.AES"));
    37                 ciphers.addElement(new CipherEntry("aes192-ctr", 16, 24, "ch.ethz.ssh2.crypto.cipher.AES"));
    38                 ciphers.addElement(new CipherEntry("aes128-ctr", 16, 16, "ch.ethz.ssh2.crypto.cipher.AES"));
    39                 ciphers.addElement(new CipherEntry("blowfish-ctr", 8, 16, "ch.ethz.ssh2.crypto.cipher.BlowFish"));
     28    static {
     29        /* Higher Priority First */
     30        ciphers.addElement(new CipherEntry("aes128-ctr", 16, 16, "ch.ethz.ssh2.crypto.cipher.AES"));
     31        ciphers.addElement(new CipherEntry("aes192-ctr", 16, 24, "ch.ethz.ssh2.crypto.cipher.AES"));
     32        ciphers.addElement(new CipherEntry("aes256-ctr", 16, 32, "ch.ethz.ssh2.crypto.cipher.AES"));
     33        ciphers.addElement(new CipherEntry("blowfish-ctr", 8, 16, "ch.ethz.ssh2.crypto.cipher.BlowFish"));
    4034
    41                 ciphers.addElement(new CipherEntry("aes256-cbc", 16, 32, "ch.ethz.ssh2.crypto.cipher.AES"));
    42                 ciphers.addElement(new CipherEntry("aes192-cbc", 16, 24, "ch.ethz.ssh2.crypto.cipher.AES"));
    43                 ciphers.addElement(new CipherEntry("aes128-cbc", 16, 16, "ch.ethz.ssh2.crypto.cipher.AES"));
    44                 ciphers.addElement(new CipherEntry("blowfish-cbc", 8, 16, "ch.ethz.ssh2.crypto.cipher.BlowFish"));
    45                
    46                 ciphers.addElement(new CipherEntry("3des-ctr", 8, 24, "ch.ethz.ssh2.crypto.cipher.DESede"));
    47                 ciphers.addElement(new CipherEntry("3des-cbc", 8, 24, "ch.ethz.ssh2.crypto.cipher.DESede"));
    48         }
     35        ciphers.addElement(new CipherEntry("aes128-cbc", 16, 16, "ch.ethz.ssh2.crypto.cipher.AES"));
     36        ciphers.addElement(new CipherEntry("aes192-cbc", 16, 24, "ch.ethz.ssh2.crypto.cipher.AES"));
     37        ciphers.addElement(new CipherEntry("aes256-cbc", 16, 32, "ch.ethz.ssh2.crypto.cipher.AES"));
     38        ciphers.addElement(new CipherEntry("blowfish-cbc", 8, 16, "ch.ethz.ssh2.crypto.cipher.BlowFish"));
     39
     40        ciphers.addElement(new CipherEntry("3des-ctr", 8, 24, "ch.ethz.ssh2.crypto.cipher.DESede"));
     41        ciphers.addElement(new CipherEntry("3des-cbc", 8, 24, "ch.ethz.ssh2.crypto.cipher.DESede"));
     42    }
    4943
    50         public static String[] getDefaultCipherList()
    51         {
    52                 String list[] = new String[ciphers.size()];
    53                 for (int i = 0; i < ciphers.size(); i++)
    54                 {
    55                         CipherEntry ce = (CipherEntry) ciphers.elementAt(i);
    56                         list[i] = new String(ce.type);
    57                 }
    58                 return list;
    59         }
     44    public static String[] getDefaultCipherList() {
     45        String list[] = new String[ciphers.size()];
     46        for(int i = 0; i < ciphers.size(); i++) {
     47            CipherEntry ce = ciphers.elementAt(i);
     48            list[i] = ce.type;
     49        }
     50        return list;
     51    }
    6052
    61         public static void checkCipherList(String[] cipherCandidates)
    62         {
    63                 for (int i = 0; i < cipherCandidates.length; i++)
    64                         getEntry(cipherCandidates[i]);
    65         }
     53    public static void checkCipherList(String[] cipherCandidates) {
     54        for(String cipherCandidate : cipherCandidates) {
     55            getEntry(cipherCandidate);
     56        }
     57    }
    6658
    67         public static BlockCipher createCipher(String type, boolean encrypt, byte[] key, byte[] iv)
    68         {
    69                 try
    70                 {
    71                         CipherEntry ce = getEntry(type);
    72                         Class cc = Class.forName(ce.cipherClass);
    73                         BlockCipher bc = (BlockCipher) cc.newInstance();
     59    public static BlockCipher createCipher(String type, boolean encrypt, byte[] key, byte[] iv) {
     60        try {
     61            CipherEntry ce = getEntry(type);
     62            Class cc = Class.forName(ce.cipherClass);
     63            BlockCipher bc = (BlockCipher) cc.newInstance();
    7464
    75                         if (type.endsWith("-cbc"))
    76                         {
    77                                 bc.init(encrypt, key);
    78                                 return new CBCMode(bc, iv, encrypt);
    79                         }
    80                         else if (type.endsWith("-ctr"))
    81                         {
    82                                 bc.init(true, key);
    83                                 return new CTRMode(bc, iv, encrypt);
    84                         }
    85                         throw new IllegalArgumentException("Cannot instantiate " + type);
    86                 }
    87                 catch (Exception e)
    88                 {
    89                         throw new IllegalArgumentException("Cannot instantiate " + type);
    90                 }
    91         }
     65            if(type.endsWith("-cbc")) {
     66                bc.init(encrypt, key);
     67                return new CBCMode(bc, iv, encrypt);
     68            }
     69            else if(type.endsWith("-ctr")) {
     70                bc.init(true, key);
     71                return new CTRMode(bc, iv, encrypt);
     72            }
     73            throw new IllegalArgumentException("Cannot instantiate " + type);
     74        }
     75        catch(Exception e) {
     76            throw new IllegalArgumentException("Cannot instantiate " + type);
     77        }
     78    }
    9279
    93         private static CipherEntry getEntry(String type)
    94         {
    95                 for (int i = 0; i < ciphers.size(); i++)
    96                 {
    97                         CipherEntry ce = (CipherEntry) ciphers.elementAt(i);
    98                         if (ce.type.equals(type))
    99                                 return ce;
    100                 }
    101                 throw new IllegalArgumentException("Unkown algorithm " + type);
    102         }
     80    private static CipherEntry getEntry(String type) {
     81        for(int i = 0; i < ciphers.size(); i++) {
     82            CipherEntry ce = ciphers.elementAt(i);
     83            if(ce.type.equals(type)) {
     84                return ce;
     85            }
     86        }
     87        throw new IllegalArgumentException("Unkown algorithm " + type);
     88    }
    10389
    104         public static int getBlockSize(String type)
    105         {
    106                 CipherEntry ce = getEntry(type);
    107                 return ce.blocksize;
    108         }
     90    public static int getBlockSize(String type) {
     91        CipherEntry ce = getEntry(type);
     92        return ce.blocksize;
     93    }
    10994
    110         public static int getKeySize(String type)
    111         {
    112                 CipherEntry ce = getEntry(type);
    113                 return ce.keysize;
    114         }
     95    public static int getKeySize(String type) {
     96        CipherEntry ce = getEntry(type);
     97        return ce.keysize;
     98    }
    11599}
  • source/ch/ethz/ssh2/crypto/digest/MAC.java

     
    1 
    21package ch.ethz.ssh2.crypto.digest;
    32
    43/**
    54 * MAC.
    6  * 
     5 *
    76 * @author Christian Plattner, plattner@inf.ethz.ch
    87 * @version $Id: MAC.java 2839 2007-02-12 13:17:54Z dkocher $
    98 */
    10 public final class MAC
    11 {
    12         Digest mac;
    13         int size;
     9public final class MAC {
     10    Digest mac;
     11    int size;
    1412
    15         public final static String[] getMacList()
    16         {
    17                 /* Higher Priority First */
     13    public static String[] getMacList() {
     14        /* Higher Priority First */
    1815
    19                 return new String[] { "hmac-sha1-96", "hmac-sha1", "hmac-md5-96", "hmac-md5" };
    20         }
     16        return new String[]{
     17                "hmac-md5",
     18                "hmac-md5-96",
     19                "hmac-sha1",
     20                "hmac-sha1-96"
     21        };
     22    }
    2123
    22         public final static void checkMacList(String[] macs)
    23         {
    24                 for (int i = 0; i < macs.length; i++)
    25                         getKeyLen(macs[i]);
    26         }
     24    public static void checkMacList(String[] macs) {
     25        for(String mac : macs) {
     26            getKeyLen(mac);
     27        }
     28    }
    2729
    28         public final static int getKeyLen(String type)
    29         {
    30                 if (type.equals("hmac-sha1"))
    31                         return 20;
    32                 if (type.equals("hmac-sha1-96"))
    33                         return 20;
    34                 if (type.equals("hmac-md5"))
    35                         return 16;
    36                 if (type.equals("hmac-md5-96"))
    37                         return 16;
    38                 throw new IllegalArgumentException("Unkown algorithm " + type);
    39         }
     30    public static int getKeyLen(String type) {
     31        if(type.equals("hmac-sha1")) {
     32            return 20;
     33        }
     34        if(type.equals("hmac-sha1-96")) {
     35            return 20;
     36        }
     37        if(type.equals("hmac-md5")) {
     38            return 16;
     39        }
     40        if(type.equals("hmac-md5-96")) {
     41            return 16;
     42        }
     43        throw new IllegalArgumentException("Unkown algorithm " + type);
     44    }
    4045
    41         public MAC(String type, byte[] key)
    42         {
    43                 if (type.equals("hmac-sha1"))
    44                 {
    45                         mac = new HMAC(new SHA1(), key, 20);
    46                 }
    47                 else if (type.equals("hmac-sha1-96"))
    48                 {
    49                         mac = new HMAC(new SHA1(), key, 12);
    50                 }
    51                 else if (type.equals("hmac-md5"))
    52                 {
    53                         mac = new HMAC(new MD5(), key, 16);
    54                 }
    55                 else if (type.equals("hmac-md5-96"))
    56                 {
    57                         mac = new HMAC(new MD5(), key, 12);
    58                 }
    59                 else
    60                         throw new IllegalArgumentException("Unkown algorithm " + type);
     46    public MAC(String type, byte[] key) {
     47        if(type.equals("hmac-sha1")) {
     48            mac = new HMAC(new SHA1(), key, 20);
     49        }
     50        else if(type.equals("hmac-sha1-96")) {
     51            mac = new HMAC(new SHA1(), key, 12);
     52        }
     53        else if(type.equals("hmac-md5")) {
     54            mac = new HMAC(new MD5(), key, 16);
     55        }
     56        else if(type.equals("hmac-md5-96")) {
     57            mac = new HMAC(new MD5(), key, 12);
     58        }
     59        else {
     60            throw new IllegalArgumentException("Unkown algorithm " + type);
     61        }
    6162
    62                 size = mac.getDigestLength();
    63         }
     63        size = mac.getDigestLength();
     64    }
    6465
    65         public final void initMac(int seq)
    66         {
    67                 mac.reset();
    68                 mac.update((byte) (seq >> 24));
    69                 mac.update((byte) (seq >> 16));
    70                 mac.update((byte) (seq >> 8));
    71                 mac.update((byte) (seq));
    72         }
     66    public final void initMac(int seq) {
     67        mac.reset();
     68        mac.update((byte) (seq >> 24));
     69        mac.update((byte) (seq >> 16));
     70        mac.update((byte) (seq >> 8));
     71        mac.update((byte) (seq));
     72    }
    7373
    74         public final void update(byte[] packetdata, int off, int len)
    75         {
    76                 mac.update(packetdata, off, len);
    77         }
     74    public final void update(byte[] packetdata, int off, int len) {
     75        mac.update(packetdata, off, len);
     76    }
    7877
    79         public final void getMac(byte[] out, int off)
    80         {
    81                 mac.digest(out, off);
    82         }
     78    public final void getMac(byte[] out, int off) {
     79        mac.digest(out, off);
     80    }
    8381
    84         public final int size()
    85         {
    86                 return size;
    87         }
     82    public final int size() {
     83        return size;
     84    }
    8885}
swiss made software