FileDocCategorySizeDatePackage
OpenSSLSessionImpl.javaAPI DocAndroid 1.5 API19284Wed May 06 22:41:06 BST 2009org.apache.harmony.xnet.provider.jsse

OpenSSLSessionImpl

public class OpenSSLSessionImpl extends Object implements SSLSession
Implementation of the class OpenSSLSessionImpl based on OpenSSL. The JNI native interface for some methods of this this class are defined in the file: org_apache_harmony_xnet_provider_jsse_OpenSSLSessionImpl.cpp

Fields Summary
long
lastAccessedTime
X509Certificate[]
localCertificates
X509Certificate[]
peerCertificates
private boolean
isValid
private org.apache.harmony.luni.util.TwoKeyHashMap
values
private X509Certificate[]
peerCertificateChain
protected int
session
private SSLParameters
sslParameters
private String
peerHost
private int
peerPort
private final SSLSessionContext
sessionContext
Constructors Summary
protected OpenSSLSessionImpl(int session, SSLParameters sslParameters, String peerHost, int peerPort, SSLSessionContext sessionContext)
Class constructor creates an SSL session context given the appropriate SSL parameters.

param
session the Identifier for SSL session
param
sslParameters the SSL parameters like ciphers' suites etc.


                                     
        
                  
        this.session = session;
        this.sslParameters = sslParameters;
        this.peerHost = peerHost;
        this.peerPort = peerPort;
        this.sessionContext = sessionContext;
    
OpenSSLSessionImpl(byte[] derData, SSLParameters sslParameters, String peerHost, int peerPort, X509Certificate[] peerCertificateChain, SSLSessionContext sessionContext)
Constructs a session from a byte[].

        this.sslParameters = sslParameters;
        this.peerHost = peerHost;
        this.peerPort = peerPort;
        this.peerCertificateChain = peerCertificateChain;
        this.sessionContext = sessionContext;
        initializeNative(derData);
    
Methods Summary
protected voidfinalize()
Frees the OpenSSL session in the memory.

        synchronized (OpenSSLSocketImpl.class) {
            nativefree(session);
        }
    
public intgetApplicationBufferSize()
Gives the largest buffer size for the application's data bound to this concrete SSL session.

return
the largest buffer size

        return SSLRecordProtocol.MAX_DATA_LENGTH;
    
public java.lang.StringgetCipherSuite()
Gives back a string identifier of the crypto tools used in the actual SSL session. For example AES_256_WITH_MD5.

return
an identifier for all the cryptographic algorithms used in the actual SSL session.

        return nativegetciphersuite();
    
public longgetCreationTime()
Gets the creation time of the SSL session.

return
the session's creation time in milli seconds since 12.00 PM, January 1st, 1970

        return nativegetcreationtime();
    
byte[]getEncoded()
Get the session object in DER format. This allows saving the session data or sharing it with other processes.

      return nativeserialize();
    
public byte[]getId()
Gets the identifier of the actual SSL session

return
array of sessions' identifiers.

        return nativegetid();
    
public longgetLastAccessedTime()
Gives the last time this concrete SSL session was accessed. Accessing here is to mean that a new connection with the same SSL context data was established.

return
the session's accessing time in milli seconds since 12.00 PM, January 1st, 1970

        if (lastAccessedTime == 0)
            return nativegetcreationtime();
        else
            return lastAccessedTime;
    
public java.security.cert.Certificate[]getLocalCertificates()
Gives the certificate(s) of the principal (subject) of this concrete SSL session used in the handshaking phase of the connection. The OpenSSL native method supports only RSA certificates.

return
an array of certificates (the local one first and then eventually that of the certification authority) or null if no certificate were used during the handshaking phase.

        X509Certificate[] localCertificates = null;
        // This implementation only supports RSA certificates.
        String alias = sslParameters.getKeyManager().chooseClientAlias(new String[] { "RSA" }, null, null);
        if (alias != null) {
            localCertificates = sslParameters.getKeyManager().getCertificateChain(alias);
        }
        return localCertificates;
    
public java.security.PrincipalgetLocalPrincipal()
Gives the principal (subject) of this concrete SSL session used in the handshaking phase of the connection.

return
a X509 certificate or null if no principal was defined

        if (localCertificates != null && localCertificates.length > 0) {
            return localCertificates[0].getSubjectX500Principal();
        } else {
            return null;
        }
    
public intgetPacketBufferSize()
Gives the largest SSL/TLS packet size one can expect for this concrete SSL session.

return
the largest packet size

        return SSLRecordProtocol.MAX_SSL_PACKET_SIZE;
    
public javax.security.cert.X509Certificate[]getPeerCertificateChain()
Gives the certificate(s) of the peer in this SSL session used in the handshaking phase of the connection. Please notice hat this method is superseded by getPeerCertificates().

return
an array of X509 certificates (the peer's one first and then eventually that of the certification authority) or null if no certificate were used during the SSL connection.
throws
SSLPeerUnverifiedcertificateException if either a not X509 certificate was used (i.e. Kerberos certificates) or the peer could not be verified.

        if (peerCertificateChain == null) {
            try {
                byte[][] bytes = nativegetpeercertificates();
                if (bytes == null) throw new SSLPeerUnverifiedException("No certificate available");

                peerCertificateChain = new javax.security.cert.X509Certificate[bytes.length];

                for(int i = 0; i < bytes.length; i++) {
                    peerCertificateChain[i] = javax.security.cert.X509Certificate.getInstance(bytes[i]);
                }

                return peerCertificateChain;
            } catch (javax.security.cert.CertificateException e) {
                throw new SSLPeerUnverifiedException(e.getMessage());
            }
        } else {
            return peerCertificateChain;
        }
    
public java.security.cert.Certificate[]getPeerCertificates()
Gives the identitity of the peer in this SSL session determined via certificate(s).

return
an array of X509 certificates (the peer's one first and then eventually that of the certification authority) or null if no certificate were used during the SSL connection.
throws
SSLPeerUnverifiedException if either a not X509 certificate was used (i.e. Kerberos certificates) or the peer could not be verified.

        if (peerCertificates == null) {
            if (peerCertificateChain == null) getPeerCertificateChain();
            try {
                if (peerCertificateChain.length == 0) return new X509Certificate[]{};

                peerCertificates = new X509CertImpl[peerCertificateChain.length];
                for(int i = 0; i < peerCertificates.length; i++) {
                    peerCertificates[i] = new X509CertImpl(peerCertificateChain[i].getEncoded());
                }
                return peerCertificates;
            } catch (SSLPeerUnverifiedException e) {
                return new X509Certificate[]{};
            } catch (IOException e) {
                return new X509Certificate[]{};
            } catch (CertificateEncodingException e) {
                return new X509Certificate[]{};
            }
        } else {
            return peerCertificates;
        }
    
public java.lang.StringgetPeerHost()
The peer's host name used in this SSL session is returned. It is the host name of the client for the server; and that of the server for the client. It is not a reliable way to get a fully qualified host name: it is mainly used internally to implement links for a temporary cache of SSL sessions.

return
the host name of the peer, or null if no information is available.

        return peerHost;
        //return nativegetpeerhost();
    
public intgetPeerPort()
Gives the peer's port number for the actual SSL session. It is the port number of the client for the server; and that of the server for the client. It is not a reliable way to get a peer's port number: it is mainly used internally to implement links for a temporary cache of SSL sessions.

return
the peer's port number, or -1 if no one is available.

        return peerPort;
        //return Integer.parseInt(nativegetpeerport());
    
public java.security.PrincipalgetPeerPrincipal()
The identity of the principal that was used by the peer during the SSL handshake phase is returned by this method.

return
a X500Principal of the last certificate for X509-based cipher suites. If no principal was sent, then null is returned.
throws
SSLPeerUnverifiedException if either a not X509 certificate was used (i.e. Kerberos certificates) or the peer does not exist.

        if (peerCertificates == null) {
            throw new SSLPeerUnverifiedException("No peer certificate");
        }
        return peerCertificates[0].getSubjectX500Principal();
    
public java.lang.StringgetProtocol()
Gives back the standard version name of the SSL protocol used in all connections pertaining to this SSL session.

return
the standard version name of the SSL protocol used in all connections pertaining to this SSL session.

        return nativegetprotocol();
    
public javax.net.ssl.SSLSessionContextgetSessionContext()
Gives back the context to which the actual SSL session is bound. A SSL context consists of (1) a possible delegate, (2) a provider and (3) a protocol. If the security manager is activated and one tries to access the SSL context an exception may be thrown if a SSLPermission("getSSLSessionContext") permission is not set.

return
the SSL context used for this session, or null if it is unavailable.

        SecurityManager sm = System.getSecurityManager();
        if (sm != null) {
            sm.checkPermission(new SSLPermission("getSSLSessionContext"));
        }
        return sessionContext;
    
public java.lang.ObjectgetValue(java.lang.String name)
Gives back the object which is bound to the the input parameter name. This name is a sort of link to the data of the SSL session's application layer, if any exists. The search for this link is monitored, as a matter of security, by the full machinery of the AccessController class.

param
name the name of the binding to find.
return
the value bound to that name, or null if the binding does not exist.
throws
IllegalArgumentException if the argument is null.

        if (name == null) {
            throw new IllegalArgumentException("Parameter is null");
        }
        return values.get(name, AccessController.getContext());
    
public java.lang.String[]getValueNames()
Gives back an array with the names (sort of links) of all the data objects of the application layer bound into the SSL session. The search for this link is monitored, as a matter of security, by the full machinery of the AccessController class.

return
a non-null (possibly empty) array of names of the data objects bound to this SSL session.

        Vector v = new Vector();
        AccessControlContext current = AccessController.getContext();
        AccessControlContext cont;
        for (Iterator it = values.entrySet().iterator(); it.hasNext();) {
            TwoKeyHashMap.Entry entry = (TwoKeyHashMap.Entry) it.next();
            cont = (AccessControlContext) entry.getKey2();
            if ((current == null && cont == null)
                    || (current != null && current.equals(cont))) {
                v.add(entry.getKey1());
            }
        }
        return (String[]) v.toArray(new String[0]);
    
private voidinitializeNative(byte[] derData)
Init the underlying native object from DER data. This allows loading the saved session.

throws
IOException

      this.session = nativedeserialize(derData, derData.length);
      if (this.session == 0) { 
        throw new IOException("Invalid session data");
      }
    
public voidinvalidate()
It invalidates a SSL session forbidding any resumption.

        isValid = false;
    
public booleanisValid()
Gives back a boolean flag signaling whether a SSL session is valid and available for resuming or joining or not.

return
true if this session may be resumed.

        SSLSessionContext context = sessionContext;
        if (isValid
                && context != null
                && context.getSessionTimeout() != 0
                && lastAccessedTime + context.getSessionTimeout() > System
                        .currentTimeMillis()) {
            isValid = false;
        }
        return isValid;
    
private native intnativedeserialize(byte[] data, int size)
Create a SSL_SESSION object using d2i_SSL_SESSION.

private native voidnativefree(int session)

private native java.lang.Stringnativegetciphersuite()
Returns via OpenSSL call the actual cipher suite in use.

private native longnativegetcreationtime()
Gets the creation time of the OpenSSL session.

return
the session's creation time in milli seconds since January 1st, 1970

private native byte[]nativegetid()
Returns the identifier of the actual OpenSSL session.

private native byte[][]nativegetpeercertificates()
Returns the X509 certificates of the peer in the PEM format.

private native java.lang.Stringnativegetpeerhost()
Returns via OpenSSL call the actual peer host name.

private native java.lang.Stringnativegetpeerport()
Returns via OpenSSL call the actual peer port number.

private native java.lang.Stringnativegetprotocol()
Returns via OpenSSL call the actual version of the SSL protocol.

private native byte[]nativeserialize()
Serialize the native state of the session ( ID, cypher, keys - but not certs ), using openSSL i2d_SSL_SESSION()

return
the DER encoding of the session.

public voidputValue(java.lang.String name, java.lang.Object value)
A link (name) with the specified value object of the SSL session's application layer data is created or replaced. If the new (or existing) value object implements the SSLSessionBindingListener interface, that object will be notified in due course. These links-to -data bounds are monitored, as a matter of security, by the full machinery of the AccessController class.

param
name the name of the link (no null are accepted!)
param
value data object that shall be bound to name.
throws
IllegalArgumentException if one or both argument(s) is null.

        if (name == null || value == null) {
            throw new IllegalArgumentException("Parameter is null");
        }
        Object old = values.put(name, AccessController.getContext(), value);
        if (value instanceof SSLSessionBindingListener) {
            ((SSLSessionBindingListener) value)
                    .valueBound(new SSLSessionBindingEvent(this, name));
        }
        if (old != null && old instanceof SSLSessionBindingListener) {
            ((SSLSessionBindingListener) old)
                    .valueUnbound(new SSLSessionBindingEvent(this, name));
        }
    
public voidremoveValue(java.lang.String name)
Removes a link (name) with the specified value object of the SSL session's application layer data. These links-to -data bounds are monitored, as a matter of security, by the full machinery of the AccessController class.

param
name the name of the link (no null are accepted!)
throws
IllegalArgumentException if the argument is null.

        if (name == null) {
            throw new IllegalArgumentException("Parameter is null");
        }
        values.remove(name, AccessController.getContext());