/********************************************************************************* * TotalCross Software Development Kit * * Copyright (C) 2000-2012 SuperWaba Ltda. * * All Rights Reserved * * * * This library and virtual machine is distributed in the hope that it will * * be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * * * * This file is covered by the GNU LESSER GENERAL PUBLIC LICENSE VERSION 3.0 * * A copy of this license is located in file license.txt at the root of this * * SDK or can be downloaded here: * * http://www.gnu.org/licenses/lgpl-3.0.txt * * * *********************************************************************************/ /* * Copyright(C) 2006 Cameron Rich * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* * A wrapper around the unmanaged interface to give a semi-decent Java API */ package totalcross.net.ssl; /** * @defgroup java_api Java API. * * Ensure that the appropriate dispose() methods are called when finished with * various objects - otherwise memory leaks will result. */ /** * A representation of an SSL connection. */ public class SSL4D { /** A pointer to the real SSL type. For internal use only. */ long ssl; boolean dontFinalize; protected Object nativeHeap; /** * Store the reference to an SSL context. * @param ssl [in] A reference to an SSL object. */ protected SSL4D() { } /** * Free any used resources on this connection. * * A "Close Notify" message is sent on this connection (if possible). It * is up to the application to close the socket. */ native public void dispose4D(); /** * Return the result of a handshake. * @return SSL_OK if the handshake is complete and ok. */ native public int handshakeStatus4D(); /** * Return the SSL cipher id. * @return The cipher id which is one of: * - TLS_RSA_WITH_AES_128_CBC_SHA (0x2f) * - TLS_RSA_WITH_AES_256_CBC_SHA (0x35) * - TLS_RSA_WITH_RC4_128_SHA (0x05) * - TLS_RSA_WITH_RC4_128_MD5 (0x04) */ native public byte getCipherId4D(); /** * Get the session id for a handshake. * * This will be a 32 byte sequence and is available after the first * handshaking messages are sent. * @return The session id as a 32 byte sequence. * @note A SSLv23 handshake may have only 16 valid bytes. */ native public byte[] getSessionId4D(); /** * Retrieve an X.509 distinguished name component. * * When a handshake is complete and a certificate has been exchanged, then * the details of the remote certificate can be retrieved. * * This will usually be used by a client to check that the server's common * name matches the URL. * * A full handshake needs to occur for this call to work. * * @param component [in] one of: * - SSL_X509_CERT_COMMON_NAME * - SSL_X509_CERT_ORGANIZATION * - SSL_X509_CERT_ORGANIZATIONAL_NAME * - SSL_X509_CA_CERT_COMMON_NAME * - SSL_X509_CA_CERT_ORGANIZATION * - SSL_X509_CA_CERT_ORGANIZATIONAL_NAME * @return The appropriate string (or null if not defined) */ native public String getCertificateDN4D(int component); /** * Read the SSL data stream. * @param rh [out] After a successful read, the decrypted data can be * retrieved with rh.getData(). It will be null otherwise. * @return The number of decrypted bytes: * - if > 0, then the handshaking is complete and we are returning the * number of decrypted bytes. * - SSL_OK if the handshaking stage is successful (but not yet complete). * - < 0 if an error. * @note Use rh before doing any successive ssl calls. */ native public int read4D(SSLReadHolder rh); /** * Write to the SSL data stream. * @param out_data [in] The data to be written * @return The number of bytes sent, or if < 0 if an error. */ final public int write(byte[] out_data) { return write4D(out_data, out_data.length); } /** * Write to the SSL data stream. * @param out_data [in] The data to be written * @param out_len [in] The number of bytes to be written * @return The number of bytes sent, or if < 0 if an error. */ native public int write4D(byte[] out_data, int out_len); /** * Authenticate a received certificate. * This call is usually made by a client after a handshake is complete * and the context is in SSL_SERVER_VERIFY_LATER mode. * @return SSL_OK if the certificate is verified. */ native public int verifyCertificate4D(); /** * Force the client to perform its handshake again. * For a client this involves sending another "client hello" message. * For the server is means sending a "hello request" message. * This is a blocking call on the client (until the handshake completes). * @return SSL_OK if renegotiation instantiation was ok */ native public int renegotiate4D(); public final Exception getLastException() { return null; } protected void finalize() { dispose4D(); } }