package org.bouncycastle.tls.test; import java.util.Random; import java.util.Vector; import junit.framework.TestCase; import org.bouncycastle.tls.HashAlgorithm; import org.bouncycastle.tls.KeyExchangeAlgorithm; import org.bouncycastle.tls.ProtocolVersion; import org.bouncycastle.tls.SecurityParameters; import org.bouncycastle.tls.SignatureAlgorithm; import org.bouncycastle.tls.SignatureAndHashAlgorithm; import org.bouncycastle.tls.TlsContext; import org.bouncycastle.tls.TlsServerContext; import org.bouncycastle.tls.TlsSession; import org.bouncycastle.tls.TlsUtils; import org.bouncycastle.tls.crypto.TlsCrypto; public class TlsUtilsTest extends TestCase { public void testChooseSignatureAndHash() throws Exception { int keyExchangeAlgorithm = KeyExchangeAlgorithm.ECDHE_RSA; TlsContext context = new TlsServerContext() { public TlsCrypto getCrypto() { return null; } public SecurityParameters getSecurityParameters() { return null; } public boolean isServer() { return false; } public ProtocolVersion getClientVersion() { return null; } public ProtocolVersion getServerVersion() { return ProtocolVersion.TLSv12; } public TlsSession getResumableSession() { return null; } public TlsSession getSession() { return null; } public Object getUserObject() { throw new UnsupportedOperationException(); } public void setUserObject(Object userObject) { throw new UnsupportedOperationException(); } public byte[] exportChannelBinding(int channelBinding) { throw new UnsupportedOperationException(); } public byte[] exportKeyingMaterial(String asciiLabel, byte[] context_value, int length) { throw new UnsupportedOperationException(); } }; short signatureAlgorithm = TlsUtils.getSignatureAlgorithm(keyExchangeAlgorithm); Vector supportedSignatureAlgorithms = getSignatureAlgorithms(false); SignatureAndHashAlgorithm sigAlg = TlsUtils.chooseSignatureAndHashAlgorithm(context, supportedSignatureAlgorithms, signatureAlgorithm); assertEquals(HashAlgorithm.sha256, sigAlg.getHash()); supportedSignatureAlgorithms = getSignatureAlgorithms(true); sigAlg = TlsUtils.chooseSignatureAndHashAlgorithm(context, supportedSignatureAlgorithms, signatureAlgorithm); assertEquals(HashAlgorithm.sha256, sigAlg.getHash()); supportedSignatureAlgorithms = getSignatureAlgorithms(true); sigAlg = TlsUtils.chooseSignatureAndHashAlgorithm(context, supportedSignatureAlgorithms, signatureAlgorithm); assertEquals(HashAlgorithm.sha256, sigAlg.getHash()); } private static Vector getSignatureAlgorithms(boolean randomise) { short[] hashAlgorithms = new short[]{ HashAlgorithm.sha1, HashAlgorithm.sha224, HashAlgorithm.sha256, HashAlgorithm.sha384, HashAlgorithm.sha512, HashAlgorithm.md5 }; short[] signatureAlgorithms = new short[]{ SignatureAlgorithm.rsa, SignatureAlgorithm.dsa, SignatureAlgorithm.ecdsa }; Vector result = new Vector(); int hOffset = (randomise) ? new Random().nextInt() & 0xff : 0; int sOffset = (randomise) ? new Random().nextInt() & 0xff : 0; for (int i = 0; i < signatureAlgorithms.length; ++i) { for (int j = 0; j < hashAlgorithms.length; ++j) { result.addElement(new SignatureAndHashAlgorithm( hashAlgorithms[(hOffset + j) % hashAlgorithms.length], signatureAlgorithms[(sOffset + i) % signatureAlgorithms.length])); } } return result; } }