BCJSSE Client communication with GNU-TLS Server using OpenPGP
Aravinth Sundaram <[email protected]>
| Newsgroups | gmane.comp.encryption.bouncy-castle.devel |
|---|---|
| Message-ID | <CAKDdUYw=dtwhRDD++-M0_+cfgCVBQePvXEFih7biSRTx5cOBEA@mail.gmail.com> |
I am trying to communicate with a GnuTLS Server (RFC6091) using BCJSSE. The
Server accepts cipher suites sent by a GnuTLS client written in C but does
not accept the same cipher suites sent by Java. The below is the code
snipper I am using. Can anyone help?
TlsCrypto crypto = new BcTlsCrypto(new SecureRandom());
TlsClient tlsClient = new DefaultTlsClient(crypto) {
@Override
protected CertificateStatusRequest getCertificateStatusRequest() {
CertificateStatusRequest certReq = super.getCertificateStatusRequest();
System.out.println("getCertificateStatusRequest()::" +
certReq.getStatusType() + "::"
+ certReq.getOCSPStatusRequest());
return certReq;
}
@Override
public void init(TlsClientContext ctx) {
System.out.println("init()::" + ctx);
super.init(ctx);
}
@Override
public TlsCrypto getCrypto() {
TlsCrypto crypto = super.getCrypto();
System.out.println("getCrypto()::ECDHAgreement=" + crypto.hasECDHAgreement()
+ "::RSAEncryption=" + crypto.hasRSAEncryption());
return crypto;
}
@Override
public Hashtable<Integer, byte[]> getClientExtensions() throws IOException {
final Hashtable<Integer, byte[]> clientExtensions =
super.getClientExtensions();
clientExtensions.put(9, new byte[] { 1, 1 });
clientExtensions.put(65281, new byte[] { 0 });
clientExtensions.put(35, new byte[] {});
clientExtensions.entrySet().forEach(entry -> {
System.out.println(
"client extension::" + entry.getKey() + "::" +
Arrays.toString(entry.getValue()));
});
return clientExtensions;
}
@Override
public ProtocolVersion getClientVersion() {
final ProtocolVersion clientVersion = ProtocolVersion.TLSv11;//
super.getClientVersion();
System.out.println(clientVersion);
return clientVersion;
}
@Override
public void notifySelectedCipherSuite(int cipherSuite) {
System.out.println("notifySelectedCipherSuite()::" + cipherSuite);
super.notifySelectedCipherSuite(cipherSuite);
}
@Override
public void notifySessionID(byte[] sessionId) {
System.out.println(new String(sessionId));
super.notifySessionID(sessionId);
}
@Override
public void processServerExtensions(Hashtable extension) throws IOException
{
System.out.println("server extension::" + extension);
super.processServerExtensions(extension);
}
@Override
public void notifyAlertRaised(short alertLevel, short alertDescription,
String message,
Throwable cause) {
System.out.println("notifyAlertRaised()::" + alertLevel + "::" +
alertDescription + "::"
+ message + "::" + cause);
super.notifyAlertRaised(alertLevel, alertDescription, message, cause);
}
@Override
public void notifyAlertReceived(short alertLevel, short alertDescription) {
System.out.println("notifyAlertReceived()::" + alertLevel + "::" +
alertDescription);
super.notifyAlertReceived(alertLevel, alertDescription);
}
@Override
public void notifyHandshakeComplete() throws IOException {
System.out.println("notifyHandshakeComplete()");
super.notifyHandshakeComplete();
}
@Override
public void notifySecureRenegotiation(boolean secureRenegotiation) throws
IOException {
System.out.println("notifySecureRenegotiation()::" + secureRenegotiation);
super.notifySecureRenegotiation(secureRenegotiation);
}
@Override
public int[] getCipherSuites() {
final int[] cipherSuites = super.getCipherSuites();
System.out.println(LocalTime.now() + ":getCipherSuites(): " +
Arrays.toString(cipherSuites));
return cipherSuites;
}
@Override
public TlsKeyExchange getKeyExchange() throws IOException {
System.out.println("getKeyExchange()");
final TlsKeyExchange keyExchange = super.getKeyExchange();
System.out.println(keyExchange);
return keyExchange;
}
@Override
public TlsAuthentication getAuthentication() throws IOException {
System.out.println("getAuthentication()");
return new TlsAuthentication() {
@Override
public void notifyServerCertificate(TlsServerCertificate certificate)
throws IOException {
System.out.println("CERTIFICATE: " + certificate);
}
@Override
public TlsCredentials getClientCredentials(CertificateRequest certRequest)
throws IOException {
System.out.println("getClientCredentials()::" + certRequest);
return () -> new Certificate(null);
}
};
}
};
protocol = new TlsClientProtocol(inputStream,
plainClient.getOutputStream());
// Initiate a TLS handshake
System.out.println("Initiating handshake...");
protocol.connect(tlsClient);
System.out.println("Handshake Complete");
// Read/write to protocol.getInputStream(), protocol.getOutputStream()
Scanner read = new Scanner(protocol.getInputStream());
while (read.hasNextByte()) {
System.out.println(read.nextByte());
}
read.close();
Thanks and Regards,
Aravinth