aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/ch/ethz/ssh2/crypto/cipher/BlockCipherFactory.java
blob: 1f933369836ecb5356bcd0b5e0ff0001d29ee133 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
/*
 * Copyright (c) 2006-2011 Christian Plattner. All rights reserved.
 * Please refer to the LICENSE.txt for licensing details.
 */
package ch.ethz.ssh2.crypto.cipher;

import java.util.ArrayList;
import java.util.List;
import java.util.Vector;

/**
 * BlockCipherFactory.
 *
 * @author Christian Plattner
 * @version $Id: BlockCipherFactory.java 29 2011-05-28 21:28:32Z dkocher@sudo.ch $
 */
public class BlockCipherFactory
{
	private static final class CipherEntry
	{
		String type;
		int blocksize;
		int keysize;
		String cipherClass;

		public CipherEntry(String type, int blockSize, int keySize, String cipherClass)
		{
			this.type = type;
			this.blocksize = blockSize;
			this.keysize = keySize;
			this.cipherClass = cipherClass;
		}
	}

	private static final List<CipherEntry> ciphers = new Vector<CipherEntry>();

	static
	{
		/* Higher Priority First */
		ciphers.add(new CipherEntry("aes128-ctr", 16, 16, "ch.ethz.ssh2.crypto.cipher.AES"));
		ciphers.add(new CipherEntry("aes192-ctr", 16, 24, "ch.ethz.ssh2.crypto.cipher.AES"));
		ciphers.add(new CipherEntry("aes256-ctr", 16, 32, "ch.ethz.ssh2.crypto.cipher.AES"));
		ciphers.add(new CipherEntry("blowfish-ctr", 8, 16, "ch.ethz.ssh2.crypto.cipher.BlowFish"));

		ciphers.add(new CipherEntry("aes128-cbc", 16, 16, "ch.ethz.ssh2.crypto.cipher.AES"));
		ciphers.add(new CipherEntry("aes192-cbc", 16, 24, "ch.ethz.ssh2.crypto.cipher.AES"));
		ciphers.add(new CipherEntry("aes256-cbc", 16, 32, "ch.ethz.ssh2.crypto.cipher.AES"));
		ciphers.add(new CipherEntry("blowfish-cbc", 8, 16, "ch.ethz.ssh2.crypto.cipher.BlowFish"));

		ciphers.add(new CipherEntry("3des-ctr", 8, 24, "ch.ethz.ssh2.crypto.cipher.DESede"));
		ciphers.add(new CipherEntry("3des-cbc", 8, 24, "ch.ethz.ssh2.crypto.cipher.DESede"));
	}

	public static String[] getDefaultCipherList()
	{
		List<String> list = new ArrayList<String>(ciphers.size());
		for (CipherEntry ce : ciphers)
		{
			list.add(ce.type);
		}
		return list.toArray(new String[ciphers.size()]);
	}

	public static void checkCipherList(String[] cipherCandidates)
	{
		for (String cipherCandidate : cipherCandidates)
		{
			getEntry(cipherCandidate);
		}
	}

	//	@SuppressWarnings("rawtypes")
	public static BlockCipher createCipher(String type, boolean encrypt, byte[] key, byte[] iv)
	{
		try
		{
			CipherEntry ce = getEntry(type);
			Class cc = Class.forName(ce.cipherClass);
			BlockCipher bc = (BlockCipher) cc.newInstance();

			if (type.endsWith("-cbc"))
			{
				bc.init(encrypt, key);
				return new CBCMode(bc, iv, encrypt);
			}
			else if (type.endsWith("-ctr"))
			{
				bc.init(true, key);
				return new CTRMode(bc, iv, encrypt);
			}
			throw new IllegalArgumentException("Cannot instantiate " + type);
		}
		catch (ClassNotFoundException e)
		{
			throw new IllegalArgumentException("Cannot instantiate " + type, e);
		}
		catch (InstantiationException e)
		{
			throw new IllegalArgumentException("Cannot instantiate " + type, e);
		}
		catch (IllegalAccessException e)
		{
			throw new IllegalArgumentException("Cannot instantiate " + type, e);
		}
	}

	private static CipherEntry getEntry(String type)
	{
		for (CipherEntry ce : ciphers)
		{
			if (ce.type.equals(type))
			{
				return ce;
			}
		}
		throw new IllegalArgumentException("Unkown algorithm " + type);
	}

	public static int getBlockSize(String type)
	{
		CipherEntry ce = getEntry(type);
		return ce.blocksize;
	}

	public static int getKeySize(String type)
	{
		CipherEntry ce = getEntry(type);
		return ce.keysize;
	}
}