1863 lines
70 KiB
Java
1863 lines
70 KiB
Java
/* WolfSSL.java
|
|
*
|
|
* Copyright (C) 2006-2025 wolfSSL Inc.
|
|
*
|
|
* This file is part of wolfSSL.
|
|
*
|
|
* wolfSSL 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 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* wolfSSL 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 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
|
|
*/
|
|
|
|
package com.wolfssl;
|
|
|
|
import java.io.File;
|
|
import java.io.FileInputStream;
|
|
import java.io.IOException;
|
|
import java.io.FileNotFoundException;
|
|
|
|
/**
|
|
* Base class which wraps the native WolfSSL embedded SSL library.
|
|
* This class contains library init and cleanup methods, general callback
|
|
* methods, as well as error codes and general wolfSSL codes.
|
|
*
|
|
* @author wolfSSL
|
|
*/
|
|
public class WolfSSL {
|
|
|
|
/* If this enum is changed, also change switch statement cases in
|
|
* ./native/com_wolfssl_WolfSSL.c,
|
|
* Java_com_wolfssl_WolfSSL_getAvailableCipherSuitesIana() */
|
|
/** TLS protocol versions */
|
|
public enum TLS_VERSION {
|
|
/** invalid TLS version */
|
|
INVALID,
|
|
/** TLS 1.0 */
|
|
TLSv1,
|
|
/** TLS 1.1 */
|
|
TLSv1_1,
|
|
/** TLS 1.2 */
|
|
TLSv1_2,
|
|
/** TLS 1.3 */
|
|
TLSv1_3,
|
|
/** Downgrade starting from highest supported SSL/TLS version */
|
|
SSLv23,
|
|
/** DTLS 1.0 */
|
|
DTLSv1,
|
|
/** DTLS 1.2 */
|
|
DTLSv1_2,
|
|
/** DTLS 1.3 */
|
|
DTLSv1_3
|
|
}
|
|
|
|
/* ------------------ wolfSSL JNI error codes ----------------------- */
|
|
/** Session unavailable */
|
|
public static final int JNI_SESSION_UNAVAILABLE = -10001;
|
|
|
|
/**
|
|
* Socket select/poll() failed, matches com_wolfssl_WolfSSLSession.c
|
|
* socketSelect() and socketPoll() return value.
|
|
*/
|
|
public static final int WOLFJNI_IO_EVENT_FAIL = -10;
|
|
|
|
/**
|
|
* Socket timed out, matches com_wolfssl_WolfSSLSession.c
|
|
* socketSelect() and socketPoll() return value.
|
|
*/
|
|
public static final int WOLFJNI_IO_EVENT_TIMEOUT = -11;
|
|
|
|
/**
|
|
* Socket poll() exceptional error, matches com_wolfssl_WolfSSLSession.c
|
|
* socketPoll() return value */
|
|
public static final int WOLFJNI_IO_EVENT_ERROR = -14;
|
|
|
|
/**
|
|
* Socket file descriptor closed, matches com_wolfssl_WolfSSLSession.c
|
|
* socketPoll() return value */
|
|
public static final int WOLFJNI_IO_EVENT_FD_CLOSED = -15;
|
|
|
|
/**
|
|
* Socket disconnected during poll(), matches
|
|
* com_wolfssl_WolfSSLSession.c socketPoll() return value */
|
|
public static final int WOLFJNI_IO_EVENT_POLLHUP = -16;
|
|
|
|
/**
|
|
* Socket invalid timeout during poll/select(), matches
|
|
* com_wolfssl_WolfSSLSession.c socketPoll/socketSelect() return value */
|
|
public static final int WOLFJNI_IO_EVENT_INVALID_TIMEOUT = -17;
|
|
|
|
/* ----------------------- wolfSSL codes ---------------------------- */
|
|
|
|
/** Error code: no error */
|
|
public static final int SSL_ERROR_NONE = 0;
|
|
/** Error code: failure */
|
|
public static final int SSL_FAILURE = 0;
|
|
/** Error code: success */
|
|
public static final int SSL_SUCCESS = 1;
|
|
/** Error code: TLS shutdown not done */
|
|
public static final int SSL_SHUTDOWN_NOT_DONE = 2;
|
|
|
|
/** Error code: bad certificate */
|
|
public static final int SSL_BAD_CERTTYPE = -8;
|
|
/** Error code: bad file stat */
|
|
public static final int SSL_BAD_STAT = -7;
|
|
/** Error code: bad path */
|
|
public static final int SSL_BAD_PATH = -6;
|
|
/** Error code: bad file type */
|
|
public static final int SSL_BAD_FILETYPE = -5;
|
|
/** Error code: bad file */
|
|
public static final int SSL_BAD_FILE = -4;
|
|
/** Error code: not implemented */
|
|
public static final int SSL_NOT_IMPLEMENTED = -3;
|
|
/** Error code: unknown */
|
|
public static final int SSL_UNKNOWN = -2;
|
|
/** Error code: fatal error */
|
|
public static final int SSL_FATAL_ERROR = -1;
|
|
|
|
/** wolfSSL file type: ASN.1/DER */
|
|
public static final int SSL_FILETYPE_ASN1 = 2;
|
|
/** wolfSSL file type: PEM */
|
|
public static final int SSL_FILETYPE_PEM = 1;
|
|
/** ASN1 */
|
|
public static final int SSL_FILETYPE_DEFAULT = 2;
|
|
/** NTRU raw key blog */
|
|
public static final int SSL_FILETYPE_RAW = 3;
|
|
|
|
/**
|
|
* Verification mode for peer certificates.
|
|
* <p>
|
|
* <b>Client mode:</b> the client will not verify the certificate
|
|
* received from the server and the handshake will continue as normal.
|
|
* <br>
|
|
* <b>Server mode:</b> the server will not send a certificate request
|
|
* to the client. As such, client verification will not be enabled.
|
|
*
|
|
* @see WolfSSLContext#setVerify(long, int, WolfSSLVerifyCallback)
|
|
*/
|
|
public static final int SSL_VERIFY_NONE = 0;
|
|
|
|
/**
|
|
* Verification mode for peer certificates.
|
|
* <p>
|
|
* <b>Client mode:</b> the client will verify the certificate received
|
|
* from the server during the handshake. This is turned on by default
|
|
* in wolfSSL, therefore, using this option has no effect.
|
|
* <br>
|
|
* <b>Server mode:</b> the server will send a certificate request to the
|
|
* client and verify the client certificate which is received.
|
|
*
|
|
* @see WolfSSLContext#setVerify(long, int, WolfSSLVerifyCallback)
|
|
*/
|
|
public static final int SSL_VERIFY_PEER = 1;
|
|
|
|
/**
|
|
* Verification mode for peer certificates.
|
|
* <p>
|
|
* <b>Client mode:</b> no effect when used on the client side.
|
|
* <br>
|
|
* <b>Server mode:</b> the verification will fail on the server side
|
|
* if the client fails to send a certificate when requested to do so
|
|
* (when using SSL_VERIFY_PEER on the SSL server).
|
|
*
|
|
* @see WolfSSLContext#setVerify(long, int, WolfSSLVerifyCallback)
|
|
*/
|
|
public static final int SSL_VERIFY_FAIL_IF_NO_PEER_CERT = 2;
|
|
|
|
/**
|
|
* Verification mode for peer certificates.
|
|
* Currently not supported by native wolfSSL.
|
|
*
|
|
* @see WolfSSLContext#setVerify(long, int, WolfSSLVerifyCallback)
|
|
*/
|
|
public static final int SSL_VERIFY_CLIENT_ONCE = 4;
|
|
|
|
/** Disable session cache */
|
|
public static final int SSL_SESS_CACHE_OFF = 30;
|
|
/** currently unused */
|
|
public static final int SSL_SESS_CACHE_CLIENT = 31;
|
|
/** Native session cache mode: server */
|
|
public static final int SSL_SESS_CACHE_SERVER = 32;
|
|
/** currently unused */
|
|
public static final int SSL_SESS_CACHE_BOTH = 33;
|
|
/** Native session cache mode: auto flush */
|
|
public static final int SSL_SESS_CACHE_NO_AUTO_CLEAR = 34;
|
|
/** currently unused */
|
|
public static final int SSL_SESS_CACHE_NO_INTERNAL_LOOKUP = 35;
|
|
|
|
/** I/O read would block, wolfSSL needs more data */
|
|
public static final int SSL_ERROR_WANT_READ = 2;
|
|
/** I/O send would block, wolfSSL needs to write data */
|
|
public static final int SSL_ERROR_WANT_WRITE = 3;
|
|
/** currently unused */
|
|
public static final int SSL_ERROR_WANT_CONNECT = 7;
|
|
/** currently unused */
|
|
public static final int SSL_ERROR_WANT_ACCEPT = 8;
|
|
/** Error with underlying I/O */
|
|
public static final int SSL_ERROR_SYSCALL = 5;
|
|
/** I/O operation should be called again when client cert is available */
|
|
public static final int SSL_ERROR_WANT_X509_LOOKUP = 83;
|
|
/** I/O error, zero return, no more data */
|
|
public static final int SSL_ERROR_ZERO_RETURN = 6;
|
|
/** General SSL error */
|
|
public static final int SSL_ERROR_SSL = 85;
|
|
/** Error state on socket */
|
|
public static final int SOCKET_ERROR_E = -308;
|
|
/** Received fatal alert error */
|
|
public static final int FATAL_ERROR = -313;
|
|
/** Out of order message */
|
|
public static final int OUT_OF_ORDER_E = -373;
|
|
/** Peer closed socket */
|
|
public static final int SSL_ERROR_SOCKET_PEER_CLOSED = -397;
|
|
/** Unrecognized ALPN protocol name */
|
|
public static final int UNKNOWN_ALPN_PROTOCOL_NAME_E = -405;
|
|
/** DTLS application data ready for read */
|
|
public static final int APP_DATA_READY = -441;
|
|
|
|
/* extra definitions from ssl.h */
|
|
/** CertManager: check all cert CRLs */
|
|
public static final int WOLFSSL_CRL_CHECKALL = 1;
|
|
/** CertManager: use override URL instead of URL in certificates */
|
|
public static final int WOLFSSL_OCSP_URL_OVERRIDE = 1;
|
|
/** CertManager: disable sending OCSP nonce */
|
|
public static final int WOLFSSL_OCSP_NO_NONCE = 2;
|
|
|
|
/* ALPN definitions from ssl.h */
|
|
/** ALPN: no match found */
|
|
public static final int WOLFSSL_ALPN_NO_MATCH = 0;
|
|
/** ALPN: found match */
|
|
public static final int WOLFSSL_ALPN_MATCH = 1;
|
|
/** ALPN: continue on protocol mismatch */
|
|
public static final int WOLFSSL_ALPN_CONTINUE_ON_MISMATCH = 2;
|
|
/** ALPN: failed on protocol mismatch */
|
|
public static final int WOLFSSL_ALPN_FAILED_ON_MISMATCH = 4;
|
|
|
|
/* I/O callback default errors, pulled from wolfssl/ssl.h IOerrors */
|
|
/** I/O callback error: general error */
|
|
public static final int WOLFSSL_CBIO_ERR_GENERAL = -1;
|
|
/** I/O callback error: want read */
|
|
public static final int WOLFSSL_CBIO_ERR_WANT_READ = -2;
|
|
/** I/O callback error: want write */
|
|
public static final int WOLFSSL_CBIO_ERR_WANT_WRITE = -2;
|
|
/** I/O callback error: connection reset */
|
|
public static final int WOLFSSL_CBIO_ERR_CONN_RST = -3;
|
|
/** I/O callback error: socket interrupted */
|
|
public static final int WOLFSSL_CBIO_ERR_ISR = -4;
|
|
/** I/O callback error: connection closed */
|
|
public static final int WOLFSSL_CBIO_ERR_CONN_CLOSE = -5;
|
|
/** I/O callback error: timeout */
|
|
public static final int WOLFSSL_CBIO_ERR_TIMEOUT = -6;
|
|
|
|
/* Atomic User Needs, from ssl.h */
|
|
/** Represents server side */
|
|
public static final int WOLFSSL_SERVER_END = 0;
|
|
/** Represents Client side */
|
|
public static final int WOLFSSL_CLIENT_END = 1;
|
|
/** wolfSSL block algorithm type */
|
|
public static final int WOLFSSL_BLOCK_TYPE = 2;
|
|
/** wolfSSL stream algorithm type */
|
|
public static final int WOLFSSL_STREAM_TYPE = 3;
|
|
/** wolfSSL AEAD algorithm type */
|
|
public static final int WOLFSSL_AEAD_TYPE = 4;
|
|
/** wolfSSL TLS HMAC inner size */
|
|
public static final int WOLFSSL_TLS_HMAC_INNER_SZ = 13;
|
|
|
|
/* GetBulkCipher enum, pulled in from ssl.h for Atomic Record layer */
|
|
/** Bulk cipher algorithm enum: NULL */
|
|
public static int wolfssl_cipher_null;
|
|
/** Bulk cipher algorithm enum: RC4 */
|
|
public static int wolfssl_rc4;
|
|
/** Bulk cipher algorithm enum: RC2 */
|
|
public static int wolfssl_rc2;
|
|
/** Bulk cipher algorithm enum: DES */
|
|
public static int wolfssl_des;
|
|
/** Bulk cipher algorithm enum: 3DES */
|
|
public static int wolfssl_triple_des;
|
|
/** Bulk cipher algorithm enum: DES40 */
|
|
public static int wolfssl_des40;
|
|
/** Bulk cipher algorithm enum: AES */
|
|
public static int wolfssl_aes;
|
|
/** Bulk cipher algorithm enum: AES-GCM */
|
|
public static int wolfssl_aes_gcm;
|
|
/** Bulk cipher algorithm enum: AES-CCM */
|
|
public static int wolfssl_aes_ccm;
|
|
|
|
/* wolfSSL error codes, pulled in from wolfssl/error.h wolfSSL_ErrorCodes */
|
|
/** Generate Cookie Error */
|
|
public static final int GEN_COOKIE_E = -277;
|
|
|
|
/** Close notify alert sent */
|
|
public static final int SSL_SENT_SHUTDOWN = 1;
|
|
/** Close notify alert received */
|
|
public static final int SSL_RECEIVED_SHUTDOWN = 2;
|
|
/** Make it possible to return SSL write with changed buffer location */
|
|
public static final int SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER = 4;
|
|
/** Disable SSL 2.0. wolfSSL does not support SSL 2.0. */
|
|
public static final int SSL_OP_NO_SSLv2 = 8;
|
|
/** Disable SSL 3.0 */
|
|
public static final int SSL_OP_NO_SSLv3 = 0x00001000;
|
|
/** Disable TLS 1.0 */
|
|
public static final int SSL_OP_NO_TLSv1 = 0x00002000;
|
|
/** Disable TLS 1.1 */
|
|
public static final int SSL_OP_NO_TLSv1_1 = 0x04000000;
|
|
/** Disable TLS 1.2 */
|
|
public static final int SSL_OP_NO_TLSv1_2 = 0x08000000;
|
|
/** Disable TLS compression. Off by default */
|
|
public static final int SSL_OP_NO_COMPRESSION = 0x10000000;
|
|
/** Disable TLS 1.3 */
|
|
public static final int SSL_OP_NO_TLSv1_3 = 0x20000000;
|
|
|
|
/** SSL/TLS handshake failure */
|
|
public static final int SSL_HANDSHAKE_FAILURE = 101;
|
|
/** Alert: Unknown CA */
|
|
public static final int SSL_R_TLSV1_ALERT_UNKNOWN_CA = 102;
|
|
/** Alert: Certificate Unknown */
|
|
public static final int SSL_R_SSLV3_ALERT_CERTIFICATE_UNKNOWN = 103;
|
|
/** Alert: Bad certificate */
|
|
public static final int SSL_R_SSLV3_ALERT_BAD_CERTIFICATE = 104;
|
|
|
|
/** Monitor this CRL directory flag */
|
|
public static final int WOLFSSL_CRL_MONITOR = 0x01;
|
|
|
|
/** Start CRL monitoring flag */
|
|
public static final int WOLFSSL_CRL_START_MON = 0x02;
|
|
|
|
/** Bad mutex */
|
|
public static final int BAD_MUTEX_ERROR = -256;
|
|
|
|
/** Bad path for opendir */
|
|
public static final int BAD_PATH_ERROR = -258;
|
|
|
|
/** CRL Monitor already running */
|
|
public static final int MONITOR_RUNNING_E = -263;
|
|
|
|
/** Thread create error */
|
|
public static final int THREAD_CREATE_E = -264;
|
|
|
|
/** Cache header match error */
|
|
public static final int CACHE_MATCH_ERROR = -280;
|
|
|
|
/* ------------------ TLS extension specific ------------------------ */
|
|
/** SNI Host name type, for UseSNI() */
|
|
public static final int WOLFSSL_SNI_HOST_NAME = 0;
|
|
|
|
/** ALPN ERR OK, ALPN protocol match */
|
|
public static final int SSL_TLSEXT_ERR_OK = 0;
|
|
|
|
/** ALPN ERR NOACK, ALPN callback no match but not fatal */
|
|
public static final int SSL_TLSEXT_ERR_NOACK = 3;
|
|
|
|
/** ALPN ERR FATAL, ALPN callback no match and fatal */
|
|
public static final int SSL_TLSEXT_ERR_ALERT_FATAL = 2;
|
|
|
|
/* ----------------- TLS 1.3 secret callback IDs -------------------- */
|
|
/** TLS 1.3 secret ID: client early traffic secret */
|
|
public static int CLIENT_EARLY_TRAFFIC_SECRET;
|
|
|
|
/** TLS 1.3 secret ID: client handshake traffic secret */
|
|
public static int CLIENT_HANDSHAKE_TRAFFIC_SECRET;
|
|
|
|
/** TLS 1.3 secret ID: server handshake traffic secret */
|
|
public static int SERVER_HANDSHAKE_TRAFFIC_SECRET;
|
|
|
|
/** TLS 1.3 secret ID: client traffic secret */
|
|
public static int CLIENT_TRAFFIC_SECRET;
|
|
|
|
/** TLS 1.3 secret ID: server traffic secret */
|
|
public static int SERVER_TRAFFIC_SECRET;
|
|
|
|
/** TLS 1.3 secret ID: early exporter secret */
|
|
public static int EARLY_EXPORTER_SECRET;
|
|
|
|
/** TLS 1.3 secret ID: exporter secret */
|
|
public static int EXPORTER_SECRET;
|
|
|
|
/* ---------------------- wolfCrypt codes ---------------------------- */
|
|
|
|
/** Out of memory error */
|
|
public static final int MEMORY_E = -125;
|
|
|
|
/** Output buffer too small or input too large */
|
|
public static final int BUFFER_E = -132;
|
|
|
|
/** ASN input error, not enough data */
|
|
public static final int ASN_INPUT_E = -154;
|
|
|
|
/** Bad function argument provided */
|
|
public static final int BAD_FUNC_ARG = -173;
|
|
|
|
/** Feature not compiled in */
|
|
public static final int NOT_COMPILED_IN = -174;
|
|
|
|
/** No password provided by user */
|
|
public static final int NO_PASSWORD = -176;
|
|
|
|
/** TLS 1.3 secret callback function failure */
|
|
public static final int TLS13_SECRET_CB_E = -438;
|
|
|
|
/* HMAC codes, from wolfssl/wolfcrypt/hmac.h. These values
|
|
* are set via JNI calls in static class block since they can change
|
|
* depending on if wolfSSL is a FIPS or non-FIPS build. */
|
|
/** Md5 HMAC type */
|
|
public static int MD5;
|
|
/** SHA-1 HMAC type */
|
|
public static int SHA;
|
|
/** SHA2-256 HMAC type */
|
|
public static int SHA256;
|
|
/** SHA2-512 HMAC type */
|
|
public static int SHA512;
|
|
/** SHA2-384 HMAC type */
|
|
public static int SHA384;
|
|
|
|
/* key types */
|
|
/** DSA key type */
|
|
public static int DSAk;
|
|
/** RSA key type */
|
|
public static int RSAk;
|
|
/** ECDSA key type */
|
|
public static int ECDSAk;
|
|
/** Ed25519 key type */
|
|
public static int ED25519k;
|
|
|
|
/* GeneralName types. Match native values in asn.h */
|
|
/** ASN other type */
|
|
public static final int ASN_OTHER_TYPE = 0x00;
|
|
/** ASN RFC822 type */
|
|
public static final int ASN_RFC822_TYPE = 0x01;
|
|
/** ASN DNS type */
|
|
public static final int ASN_DNS_TYPE = 0x02;
|
|
/** ASN DIR/directory type */
|
|
public static final int ASN_DIR_TYPE = 0x04;
|
|
/** ASN URI type */
|
|
public static final int ASN_URI_TYPE = 0x06;
|
|
/** ASN IP type */
|
|
public static final int ASN_IP_TYPE = 0x07;
|
|
|
|
/* NIDs, from native asn.h */
|
|
/** Surname NID */
|
|
public static int NID_surname;
|
|
/** Serial number NID */
|
|
public static int NID_serialNumber;
|
|
/** PKCS9 Unstructured name NID */
|
|
public static int NID_pkcs9_unstructuredName;
|
|
/** PKCS9 contentType NID */
|
|
public static int NID_pkcs9_contentType;
|
|
/** PKCS9 challenge password NID */
|
|
public static int NID_pkcs9_challengePassword;
|
|
/** Given name NID */
|
|
public static int NID_givenName;
|
|
/** Initials NID */
|
|
public static int NID_initials;
|
|
/** Key Usage NID */
|
|
public static int NID_key_usage;
|
|
/** Subject Alternative Name NID */
|
|
public static int NID_subject_alt_name;
|
|
/** Basic Constraints NID */
|
|
public static int NID_basic_constraints;
|
|
/** Extended Key Usage NID */
|
|
public static int NID_ext_key_usage;
|
|
/** Domain name qualifier NID */
|
|
public static int NID_dnQualifier;
|
|
|
|
/* is this object active, or has it been cleaned up? */
|
|
private boolean active = false;
|
|
|
|
/* -------------- Named Groups (from enum in ssl.h) ----------------- */
|
|
/** Invalid named group */
|
|
public static final int WOLFSSL_NAMED_GROUP_INVALID = 0;
|
|
/** ECC SECT163K1 */
|
|
public static final int WOLFSSL_ECC_SECT163K1 = 1;
|
|
/** ECC SECT163R1 */
|
|
public static final int WOLFSSL_ECC_SECT163R1 = 2;
|
|
/** ECC SECT163R2 */
|
|
public static final int WOLFSSL_ECC_SECT163R2 = 3;
|
|
/** ECC SECT193R1 */
|
|
public static final int WOLFSSL_ECC_SECT193R1 = 4;
|
|
/** ECC SECT193R2 */
|
|
public static final int WOLFSSL_ECC_SECT193R2 = 5;
|
|
/** ECC SECT233K1 */
|
|
public static final int WOLFSSL_ECC_SECT233K1 = 6;
|
|
/** ECC SECT233R1 */
|
|
public static final int WOLFSSL_ECC_SECT233R1 = 7;
|
|
/** ECC SECT239K1 */
|
|
public static final int WOLFSSL_ECC_SECT239K1 = 8;
|
|
/** ECC SECT283K1 */
|
|
public static final int WOLFSSL_ECC_SECT283K1 = 9;
|
|
/** ECC SECT283R1 */
|
|
public static final int WOLFSSL_ECC_SECT283R1 = 10;
|
|
/** ECC SECT409K1 */
|
|
public static final int WOLFSSL_ECC_SECT409K1 = 11;
|
|
/** ECC SECT409R1 */
|
|
public static final int WOLFSSL_ECC_SECT409R1 = 12;
|
|
/** ECC SECT571K1 */
|
|
public static final int WOLFSSL_ECC_SECT571K1 = 13;
|
|
/** ECC SECT571R1 */
|
|
public static final int WOLFSSL_ECC_SECT571R1 = 14;
|
|
/** ECC SECP160K1 */
|
|
public static final int WOLFSSL_ECC_SECP160K1 = 15;
|
|
/** ECC SECP160R1 */
|
|
public static final int WOLFSSL_ECC_SECP160R1 = 16;
|
|
/** ECC SECP160R2 */
|
|
public static final int WOLFSSL_ECC_SECP160R2 = 17;
|
|
/** ECC SECP192K1 */
|
|
public static final int WOLFSSL_ECC_SECP192K1 = 18;
|
|
/** ECC SECP192R1 */
|
|
public static final int WOLFSSL_ECC_SECP192R1 = 19;
|
|
/** ECC SECP224K1 */
|
|
public static final int WOLFSSL_ECC_SECP224K1 = 20;
|
|
/** ECC SECP224R1 */
|
|
public static final int WOLFSSL_ECC_SECP224R1 = 21;
|
|
/** ECC SECP256K1 */
|
|
public static final int WOLFSSL_ECC_SECP256K1 = 22;
|
|
/** ECC SECP256R1 */
|
|
public static final int WOLFSSL_ECC_SECP256R1 = 23;
|
|
/** ECC SECP384R1 */
|
|
public static final int WOLFSSL_ECC_SECP384R1 = 24;
|
|
/** ECC SECP521R1 */
|
|
public static final int WOLFSSL_ECC_SECP521R1 = 25;
|
|
/** ECC BRAINPOOLP256R1 */
|
|
public static final int WOLFSSL_ECC_BRAINPOOLP256R1 = 26;
|
|
/** ECC BRAINPOOLP384R1 */
|
|
public static final int WOLFSSL_ECC_BRAINPOOLP384R1 = 27;
|
|
/** ECC BRAINPOOLP512R1 */
|
|
public static final int WOLFSSL_ECC_BRAINPOOLP512R1 = 28;
|
|
/** ECC X25519 */
|
|
public static final int WOLFSSL_ECC_X25519 = 29;
|
|
/** ECC X448 */
|
|
public static final int WOLFSSL_ECC_X448 = 30;
|
|
/** ECC SM2P256V1 */
|
|
public static final int WOLFSSL_ECC_SM2P256V1 = 41;
|
|
/** FFDHE 2048 */
|
|
public static final int WOLFSSL_FFDHE_2048 = 256;
|
|
/** FFDHE 3072 */
|
|
public static final int WOLFSSL_FFDHE_3072 = 257;
|
|
/** FFDHE 4096 */
|
|
public static final int WOLFSSL_FFDHE_4096 = 258;
|
|
/** FFDHE 6144 */
|
|
public static final int WOLFSSL_FFDHE_6144 = 259;
|
|
/** FFDHE 8192 */
|
|
public static final int WOLFSSL_FFDHE_8192 = 260;
|
|
|
|
/* -------------------- Crypto Callback DevID ----------------------- */
|
|
/** Invalid DevID value, when used as devId software crypto is used */
|
|
public static final int INVALID_DEVID = -2;
|
|
|
|
/** Crypto callback devId to be used by wolfSSL for WOLFSSL and
|
|
* WOLFSSL_CTX. This static devId will be used by wolfJSSE and set for all
|
|
* WolfSSLContext objects, if set to something besides
|
|
* WolfSSL.INVALID_DEVID. Applications can set this in wolfJSSE via
|
|
* WolfSSLProvider.setDevId(), or on a per SSLContext and SSLSession
|
|
* level with WolfSSLContext.setDevId() and WolfSSLSession.setDevId() */
|
|
public static int devId = WolfSSL.INVALID_DEVID;
|
|
|
|
/* ------------------------- Flag Values ---------------------------- */
|
|
/** WolfSSLCertificate.checkHost() match only wildcards in left-most
|
|
* position, used for LDAPS hostname verification. */
|
|
public static int WOLFSSL_LEFT_MOST_WILDCARD_ONLY = 0x40;
|
|
|
|
/* ---------------------------- locks ------------------------------- */
|
|
|
|
/* lock for cleanup */
|
|
private final Object cleanupLock = new Object();
|
|
|
|
/* ------------------------ constructors ---------------------------- */
|
|
|
|
/**
|
|
* Initializes the wolfSSL library for use.
|
|
*
|
|
* @throws com.wolfssl.WolfSSLException if wolfSSL library fails to
|
|
* initialize correctly
|
|
*/
|
|
public WolfSSL() throws WolfSSLException {
|
|
int ret;
|
|
|
|
WolfSSLDebug.log(getClass(), WolfSSLDebug.Component.JNI,
|
|
WolfSSLDebug.INFO, () -> "initializing wolfSSL library");
|
|
|
|
ret = init();
|
|
if (ret != SSL_SUCCESS) {
|
|
throw new WolfSSLException(
|
|
"Failed to initialize wolfSSL library: " + ret);
|
|
}
|
|
|
|
/* Populate NID values from native wolfSSL enums */
|
|
NID_surname = getNID_surname();
|
|
NID_serialNumber = getNID_serialNumber();
|
|
NID_pkcs9_unstructuredName = getNID_pkcs9_unstructuredName();
|
|
NID_pkcs9_contentType = getNID_pkcs9_contentType();
|
|
NID_pkcs9_challengePassword = getNID_pkcs9_challengePassword();
|
|
NID_givenName = getNID_givenName();
|
|
NID_initials = getNID_initials();
|
|
NID_key_usage = getNID_key_usage();
|
|
NID_subject_alt_name = getNID_subject_alt_name();
|
|
NID_basic_constraints = getNID_basic_constraints();
|
|
NID_ext_key_usage = getNID_ext_key_usage();
|
|
NID_dnQualifier = getNID_dnQualifier();
|
|
|
|
/* initialize cipher enum values */
|
|
wolfssl_aes = getBulkCipherAlgorithmEnumAES();
|
|
wolfssl_cipher_null = getBulkCipherAlgorithmEnumNULL();
|
|
wolfssl_rc4 = getBulkCipherAlgorithmEnumRC4();
|
|
wolfssl_rc2 = getBulkCipherAlgorithmEnumRC2();
|
|
wolfssl_des = getBulkCipherAlgorithmEnumDES();
|
|
wolfssl_triple_des = getBulkCipherAlgorithmEnumDES();
|
|
wolfssl_des40 = getBulkCipherAlgorithmEnumDES40();
|
|
wolfssl_aes_gcm = getBulkCipherAlgorithmEnumAESGCM();
|
|
wolfssl_aes_ccm = getBulkCipherAlgorithmEnumAESCCM();
|
|
|
|
/* initialize cipher enum values */
|
|
MD5 = getHmacEnumMD5();
|
|
SHA = getHmacEnumSHA1();
|
|
SHA256 = getHmacEnumSHA256();
|
|
SHA384 = getHmacEnumSHA384();
|
|
SHA512 = getHmacEnumSHA512();
|
|
|
|
/* initialize key type enum values */
|
|
DSAk = getKeyTypeEnumDSA();
|
|
RSAk = getKeyTypeEnumRSA();
|
|
ECDSAk = getKeyTypeEnumECDSA();
|
|
ED25519k = getKeyTypeEnumED25519();
|
|
|
|
/* initialize TLS 1.3 secret callback ID enums */
|
|
CLIENT_EARLY_TRAFFIC_SECRET =
|
|
getTls13SecretEnum_CLIENT_EARLY_TRAFFIC_SECRET();
|
|
CLIENT_HANDSHAKE_TRAFFIC_SECRET =
|
|
getTls13SecretEnum_CLIENT_HANDSHAKE_TRAFFIC_SECRET();
|
|
SERVER_HANDSHAKE_TRAFFIC_SECRET =
|
|
getTls13SecretEnum_SERVER_HANDSHAKE_TRAFFIC_SECRET();
|
|
CLIENT_TRAFFIC_SECRET =
|
|
getTls13SecretEnum_CLIENT_TRAFFIC_SECRET();
|
|
SERVER_TRAFFIC_SECRET =
|
|
getTls13SecretEnum_SERVER_TRAFFIC_SECRET();
|
|
EARLY_EXPORTER_SECRET =
|
|
getTls13SecretEnum_EARLY_EXPORTER_SECRET();
|
|
EXPORTER_SECRET =
|
|
getTls13SecretEnum_EXPORTER_SECRET();
|
|
|
|
this.active = true;
|
|
|
|
WolfSSLDebug.log(getClass(), WolfSSLDebug.Component.JNI,
|
|
WolfSSLDebug.INFO, () -> "wolfSSL library initialization done");
|
|
}
|
|
|
|
/* ------------------- private/protected methods -------------------- */
|
|
|
|
private native int init();
|
|
|
|
/**
|
|
* Free native memory allocated at pointer provided.
|
|
* @param ptr native pointer
|
|
*/
|
|
public static native void nativeFree(long ptr);
|
|
|
|
static native int getNID_surname();
|
|
static native int getNID_serialNumber();
|
|
static native int getNID_pkcs9_unstructuredName();
|
|
static native int getNID_pkcs9_contentType();
|
|
static native int getNID_pkcs9_challengePassword();
|
|
static native int getNID_givenName();
|
|
static native int getNID_initials();
|
|
static native int getNID_key_usage();
|
|
static native int getNID_subject_alt_name();
|
|
static native int getNID_basic_constraints();
|
|
static native int getNID_ext_key_usage();
|
|
static native int getNID_dnQualifier();
|
|
|
|
static native int getBulkCipherAlgorithmEnumNULL();
|
|
static native int getBulkCipherAlgorithmEnumRC4();
|
|
static native int getBulkCipherAlgorithmEnumRC2();
|
|
static native int getBulkCipherAlgorithmEnumDES();
|
|
static native int getBulkCipherAlgorithmEnum3DES();
|
|
static native int getBulkCipherAlgorithmEnumDES40();
|
|
static native int getBulkCipherAlgorithmEnumAES();
|
|
static native int getBulkCipherAlgorithmEnumAESGCM();
|
|
static native int getBulkCipherAlgorithmEnumAESCCM();
|
|
static native int getBulkCipherAlgorithmEnumCHACHA();
|
|
static native int getBulkCipherAlgorithmEnumCAMELLIA();
|
|
|
|
static native int getHmacEnumMD5();
|
|
static native int getHmacEnumSHA1();
|
|
static native int getHmacEnumSHA256();
|
|
static native int getHmacEnumSHA384();
|
|
static native int getHmacEnumSHA512();
|
|
|
|
static native int getKeyTypeEnumDSA();
|
|
static native int getKeyTypeEnumRSA();
|
|
static native int getKeyTypeEnumECDSA();
|
|
static native int getKeyTypeEnumED25519();
|
|
|
|
static native int getTls13SecretEnum_CLIENT_EARLY_TRAFFIC_SECRET();
|
|
static native int getTls13SecretEnum_CLIENT_HANDSHAKE_TRAFFIC_SECRET();
|
|
static native int getTls13SecretEnum_SERVER_HANDSHAKE_TRAFFIC_SECRET();
|
|
static native int getTls13SecretEnum_CLIENT_TRAFFIC_SECRET();
|
|
static native int getTls13SecretEnum_SERVER_TRAFFIC_SECRET();
|
|
static native int getTls13SecretEnum_EARLY_EXPORTER_SECRET();
|
|
static native int getTls13SecretEnum_EXPORTER_SECRET();
|
|
|
|
static native String getEnabledCipherSuites();
|
|
static native String getEnabledCipherSuitesIana();
|
|
static native String getAvailableCipherSuitesIana(int version);
|
|
|
|
/** Native wrapper to set wolfSSL crypto callback, only passing in devId
|
|
* and allowing native code to set up and manage callback and context */
|
|
private static native int wc_CryptoCb_RegisterDevice(int devId);
|
|
|
|
/** Native wrapper to unregister wolfSSL crypto callback */
|
|
private static native void wc_CryptoCb_UnRegisterDevice(int devId);
|
|
|
|
/* ------------------------- Java methods --------------------------- */
|
|
|
|
/**
|
|
* Loads JNI library; must be called prior to any other calls in this class.
|
|
*
|
|
* The native library is expected to be be called "wolfssljni", and must be
|
|
* on the system library search path.
|
|
*
|
|
* "wolfssljni" links against the wolfSSL native C library ("wolfssl"),
|
|
* and for Windows compatibility "wolfssl" needs to be explicitly
|
|
* loaded first here.
|
|
*
|
|
* @throws UnsatisfiedLinkError if the library is not found.
|
|
*/
|
|
public static void loadLibrary() throws UnsatisfiedLinkError {
|
|
|
|
int fipsLoaded = 0;
|
|
|
|
WolfSSLDebug.log(WolfSSL.class, WolfSSLDebug.Component.JNI,
|
|
WolfSSLDebug.INFO, () -> "loading native library: wolfssl");
|
|
|
|
String osName = System.getProperty("os.name");
|
|
if (osName != null && osName.toLowerCase().contains("win")) {
|
|
try {
|
|
/* Default wolfCrypt FIPS library on Windows is compiled
|
|
* as "wolfssl-fips" by Visual Studio solution */
|
|
System.loadLibrary("wolfssl-fips");
|
|
fipsLoaded = 1;
|
|
} catch (UnsatisfiedLinkError e) {
|
|
/* wolfCrypt FIPS not available */
|
|
}
|
|
|
|
if (fipsLoaded == 0) {
|
|
/* FIPS library not loaded, try normal libwolfssl */
|
|
System.loadLibrary("wolfssl");
|
|
}
|
|
}
|
|
|
|
WolfSSLDebug.log(WolfSSL.class, WolfSSLDebug.Component.JNI,
|
|
WolfSSLDebug.INFO, () -> "loading native library: wolfssljni");
|
|
|
|
/* Load wolfssljni library */
|
|
System.loadLibrary("wolfssljni");
|
|
}
|
|
|
|
/**
|
|
* Load JNI library with a specific name; must be called prior to any
|
|
* other calls in this package.
|
|
*
|
|
* The native library needs to be located on the system library search
|
|
* path.
|
|
*
|
|
* @param libName name of native JNI library
|
|
* @throws UnsatisfiedLinkError if the library is not found.
|
|
*/
|
|
public static void loadLibrary(String libName) throws UnsatisfiedLinkError {
|
|
|
|
WolfSSLDebug.log(WolfSSL.class, WolfSSLDebug.Component.JNI,
|
|
WolfSSLDebug.INFO, () -> "loading native lib by name: " + libName);
|
|
|
|
System.loadLibrary(libName);
|
|
}
|
|
|
|
/**
|
|
* Loads dynamic JNI library from a specific path; must be called prior to
|
|
* any other calls in this package.
|
|
*
|
|
* This function gives the application more control over the exact native
|
|
* library being loaded, as both WolfSSL.loadLibrary() and
|
|
* WolfSSL.loadLibrary(String libName) search for a library on the system
|
|
* library search path. This function allows the appliation to specify
|
|
* a specific absolute path to the native library file to load, thus
|
|
* guaranteeing the exact library loaded and helping to prevent against
|
|
* malicious attackers from attempting to override the library being
|
|
* loaded.
|
|
*
|
|
* @param libPath complete path name to the native dynamic JNI library
|
|
* @throws UnsatisfiedLinkError if the library is not found.
|
|
*/
|
|
public static void loadLibraryAbsolute(String libPath)
|
|
throws UnsatisfiedLinkError {
|
|
|
|
WolfSSLDebug.log(WolfSSL.class, WolfSSLDebug.Component.JNI,
|
|
WolfSSLDebug.INFO, () -> "loading native lib by path: " + libPath);
|
|
|
|
System.load(libPath);
|
|
}
|
|
|
|
/* ----------------- generic static helper functions ---------------- */
|
|
|
|
/**
|
|
* Read a File into byte array.
|
|
*
|
|
* This method can't use the java.nio package since we have users
|
|
* on Android API 24 which does not support java.nio.
|
|
*
|
|
* @param file File to read into byte array
|
|
*
|
|
* @return byte array representing input File, or null if file is null
|
|
*
|
|
* @throws FileNotFoundException if file is not found
|
|
* @throws IOException if unable to read entire file
|
|
*/
|
|
protected static byte[] fileToBytes(File file)
|
|
throws FileNotFoundException, IOException {
|
|
|
|
int bytesRead = 0;
|
|
long fileLen = 0;
|
|
byte[] fileBytes = null;
|
|
FileInputStream fis = null;
|
|
|
|
if (file == null) {
|
|
return null;
|
|
}
|
|
|
|
fileLen = file.length();
|
|
if (fileLen == 0) {
|
|
return new byte[0];
|
|
}
|
|
|
|
try {
|
|
fis = new FileInputStream(file);
|
|
if (fis != null) {
|
|
fileBytes = new byte[(int)fileLen];
|
|
|
|
bytesRead = fis.read(fileBytes);
|
|
|
|
if (bytesRead != fileLen) {
|
|
throw new IOException("Unable to read entire file: " +
|
|
file.getAbsolutePath());
|
|
}
|
|
}
|
|
} finally {
|
|
if (fis != null) {
|
|
fis.close();
|
|
}
|
|
}
|
|
|
|
return fileBytes;
|
|
}
|
|
|
|
/* --------------- native feature detection functions --------------- */
|
|
|
|
/**
|
|
* Tests if TLS 1.0 has been compiled into the native wolfSSL library.
|
|
* TLS 1.0 is disabled by default in native wolfSSL, unless the user
|
|
* has configured wolfSSL with "--enable-tls10".
|
|
*
|
|
* @return true if enabled, otherwise false if not compiled in.
|
|
*/
|
|
public static native boolean TLSv1Enabled();
|
|
|
|
/**
|
|
* Tests if TLS 1.1 has been compiled into the native wolfSSL library.
|
|
*
|
|
* @return true if enabled, otherwise false if not compiled in.
|
|
*/
|
|
public static native boolean TLSv11Enabled();
|
|
|
|
/**
|
|
* Tests if TLS 1.2 has been compiled into the native wolfSSL library.
|
|
*
|
|
* @return true if enabled, otherwise false if not compiled in.
|
|
*/
|
|
public static native boolean TLSv12Enabled();
|
|
|
|
/**
|
|
* Tests if TLS 1.3 has been compiled into the native wolfSSL library.
|
|
*
|
|
* @return true if enabled, otherwise false if not compiled in.
|
|
*/
|
|
public static native boolean TLSv13Enabled();
|
|
|
|
/**
|
|
* Tests if DTLS 1.3 has been compiled into the native wolfSSL library.
|
|
*
|
|
* @return true if enabled, otherwise false if not compiled in.
|
|
*/
|
|
public static native boolean DTLSv13Enabled();
|
|
|
|
/**
|
|
* Tests if SHA-1 is enabled in the native wolfSSL library.
|
|
*
|
|
* @return true if enabled, otherwise false if not compiled in.
|
|
*/
|
|
public static native boolean ShaEnabled();
|
|
|
|
/**
|
|
* Tests if SHA-224 is enabled in the native wolfSSL library.
|
|
*
|
|
* @return true if enabled, otherwise false if not compiled in.
|
|
*/
|
|
public static native boolean Sha224Enabled();
|
|
|
|
/**
|
|
* Tests if SHA-256 is enabled in the native wolfSSL library.
|
|
*
|
|
* @return true if enabled, otherwise false if not compiled in.
|
|
*/
|
|
public static native boolean Sha256Enabled();
|
|
|
|
/**
|
|
* Tests if SHA-384 is enabled in the native wolfSSL library.
|
|
*
|
|
* @return true if enabled, otherwise false if not compiled in.
|
|
*/
|
|
public static native boolean Sha384Enabled();
|
|
|
|
/**
|
|
* Tests if SHA-512 is enabled in the native wolfSSL library.
|
|
*
|
|
* @return true if enabled, otherwise false if not compiled in.
|
|
*/
|
|
public static native boolean Sha512Enabled();
|
|
|
|
/**
|
|
* Tests if ECC support has been compiled into the native wolfSSL library.
|
|
*
|
|
* @return true if enabled, otherwise false if not compiled in.
|
|
*/
|
|
public static native boolean EccEnabled();
|
|
|
|
/**
|
|
* Tests if RSA support has been compiled into the native wolfSSL library.
|
|
*
|
|
* @return true if enabled, otherwise false if not compiled in.
|
|
*/
|
|
public static native boolean RsaEnabled();
|
|
|
|
/**
|
|
* Tests if RSA_PSS support has been compiled into the native wolfSSL
|
|
* library.
|
|
*
|
|
* @return true if enabled, otherwise false if not compiled in.
|
|
*/
|
|
public static native boolean RsaPssEnabled();
|
|
|
|
/**
|
|
* Tests if Curve25519/X25519 support has been compiled into the native
|
|
* wolfSSL library.
|
|
*
|
|
* @return true if enabled, otherwise false if not compiled in.
|
|
*/
|
|
public static native boolean Curve25519Enabled();
|
|
|
|
/**
|
|
* Tests if Curve448/X448 support has been compiled into the native
|
|
* wolfSSL library.
|
|
*
|
|
* @return true if enabled, otherwise false if not compiled in.
|
|
*/
|
|
public static native boolean Curve448Enabled();
|
|
|
|
/**
|
|
* Tests if filesystem support has been compiled into the wolfSSL library.
|
|
*
|
|
* @return true if enabled, otherwise false if NO_FILESYSTEM has been
|
|
* defined.
|
|
*/
|
|
public static native boolean FileSystemEnabled();
|
|
|
|
/**
|
|
* Tests if Certificate Signing Request (CSR) support has been compiled
|
|
* into the native wolfSSL library.
|
|
*
|
|
* @return true if enabled, otherwise false if WOLFSSL_CERT_EXT not defined.
|
|
*/
|
|
public static native boolean certReqEnabled();
|
|
|
|
/**
|
|
* Tests if native wolfSSL has been compiled with WOLFSSL_TRUST_PEER_CERT.
|
|
*
|
|
* @return true if enabled, otherwise false if WOLFSSL_TRUST_PEER_CERT
|
|
* has not been defined.
|
|
*/
|
|
public static native boolean trustPeerCertEnabled();
|
|
|
|
/**
|
|
* Tests if native session ticket support has been compiled into wolfSSL
|
|
* with HAVE_SESSION_TICKET.
|
|
*
|
|
* @return true if enabled, otherwise false if HAVE_SESSION_TICKET
|
|
* has not been defined.
|
|
*/
|
|
public static native boolean sessionTicketEnabled();
|
|
|
|
/**
|
|
* Tests if native wolfSSL has been compiled with HAVE_SECRET_CALLBACK
|
|
* If defined, will compile in APIs to support SSL/TLS secret
|
|
* callback support.
|
|
*
|
|
* @return true if enabled, otherwise false if HAVE_SECRET_CALLBACK
|
|
* has not been defind.
|
|
*/
|
|
public static native boolean secretCallbackEnabled();
|
|
|
|
/**
|
|
* Tests if native wolfSSL has been compiled with HAVE_ENCRYPT_THEN_MAC.
|
|
*
|
|
* @return true if enabled, otherwise false if HAVE_ENCRYPT_THEN_MAC
|
|
* has not been defined.
|
|
*/
|
|
public static native boolean encryptThenMacEnabled();
|
|
|
|
/* ---------------- native SSL/TLS version functions ---------------- */
|
|
|
|
/**
|
|
* Indicates that the application is a server and will only support the
|
|
* SSL 3.0 protocol.
|
|
* This method allocates memory for and initializes a new native
|
|
* WOLFSSL_METHOD structure to be used when creating the SSL/TLS
|
|
* context with newContext().
|
|
*
|
|
* @return A pointer to the created WOLFSSL_METHOD structure if
|
|
* successful, null on failure.
|
|
* @see WolfSSLContext#newContext(long)
|
|
* @deprecated SSL 3.0 is now considered insecure.
|
|
*/
|
|
@Deprecated
|
|
public static final native long SSLv3_ServerMethod();
|
|
|
|
/**
|
|
* Indicates that the application is a client and will only support the
|
|
* SSL 3.0 protocol.
|
|
* This method allocates memory for and initializes a new native
|
|
* WOLFSSL_METHOD structure to be used when creating the SSL/TLS
|
|
* context with newContext().
|
|
*
|
|
* @return A pointer to the created WOLFSSL_METHOD structure if
|
|
* successful, null on failure.
|
|
* @see WolfSSLContext#newContext(long)
|
|
* @deprecated SSL 3.0 is now considered insecure.
|
|
*/
|
|
@Deprecated
|
|
public static final native long SSLv3_ClientMethod();
|
|
|
|
/**
|
|
* Indicates that the application will only support the TLS 1.0 protocol.
|
|
* Application is side-independent at this time, and client/server side
|
|
* will be determined at connect/accept stage.
|
|
* This method allocates memory for and initializes a new native
|
|
* WOLFSSL_METHOD structure to be used when creating the SSL/TLS
|
|
* context with newContext().
|
|
*
|
|
* @return A pointer to the created WOLFSSL_METHOD structure if
|
|
* successful, null on failure.
|
|
* @see WolfSSLContext#newContext(long)
|
|
*/
|
|
public static final native long TLSv1_Method();
|
|
|
|
/**
|
|
* Indicates that the application is a server and will only support the
|
|
* TLS 1.0 protocol.
|
|
* This method allocates memory for and initializes a new native
|
|
* WOLFSSL_METHOD structure to be used when creating the SSL/TLS
|
|
* context with newContext().
|
|
*
|
|
* @return A pointer to the created WOLFSSL_METHOD structure if
|
|
* successful, null on failure.
|
|
* @see WolfSSLContext#newContext(long)
|
|
*/
|
|
public static final native long TLSv1_ServerMethod();
|
|
|
|
/**
|
|
* Indicates that the application is a client and will only support the
|
|
* TLS 1.0 protocol.
|
|
* This method allocates memory for and initializes a new native
|
|
* WOLFSSL_METHOD structure to be used when creating the SSL/TLS
|
|
* context with newContext().
|
|
*
|
|
* @return A pointer to the created WOLFSSL_METHOD structure if
|
|
* successful, null on failure.
|
|
* @see WolfSSLContext#newContext(long)
|
|
*/
|
|
public static final native long TLSv1_ClientMethod();
|
|
|
|
/**
|
|
* Indicates that the application will only support the TLS 1.1 protocol.
|
|
* Application is side-independent at this time, and client/server side
|
|
* will be determined at connect/accept stage.
|
|
* This method allocates memory for and initializes a new native
|
|
* WOLFSSL_METHOD structure to be used when creating the SSL/TLS
|
|
* context with newContext().
|
|
*
|
|
* @return A pointer to the created WOLFSSL_METHOD structure if
|
|
* successful, null on failure.
|
|
* @see WolfSSLContext#newContext(long)
|
|
*/
|
|
public static final native long TLSv1_1_Method();
|
|
|
|
/**
|
|
* Indicates that the application is a server and will only support the
|
|
* TLS 1.1 protocol.
|
|
* This method allocates memory for and initializes a new native
|
|
* WOLFSSL_METHOD structure to be used when creating the SSL/TLS
|
|
* context with newContext().
|
|
*
|
|
* @return A pointer to the created WOLFSSL_METHOD structure if
|
|
* successful, null on failure.
|
|
* @see WolfSSLContext#newContext(long)
|
|
*/
|
|
public static final native long TLSv1_1_ServerMethod();
|
|
|
|
/**
|
|
* Indicates that the application is a client and will only support the
|
|
* TLS 1.1 protocol.
|
|
* This method allocates memory for and initializes a new native
|
|
* WOLFSSL_METHOD structure to be used when creating the SSL/TLS
|
|
* context with newContext().
|
|
*
|
|
* @return A pointer to the created WOLFSSL_METHOD structure if
|
|
* successful, null on failure.
|
|
* @see WolfSSLContext#newContext(long)
|
|
*/
|
|
public static final native long TLSv1_1_ClientMethod();
|
|
|
|
/**
|
|
* Indicates that the application will only support the TLS 1.2 protocol.
|
|
* Application is side-independent at this time, and client/server side
|
|
* will be determined at connect/accept stage.
|
|
* This method allocates memory for and initializes a new native
|
|
* WOLFSSL_METHOD structure to be used when creating the SSL/TLS
|
|
* context with newContext().
|
|
*
|
|
* @return A pointer to the created WOLFSSL_METHOD structure if
|
|
* successful, null on failure.
|
|
* @see WolfSSLContext#newContext(long)
|
|
*/
|
|
public static final native long TLSv1_2_Method();
|
|
|
|
/**
|
|
* Indicates that the application is a server and will only support the
|
|
* TLS 1.2 protocol.
|
|
* This method allocates memory for and initializes a new native
|
|
* WOLFSSL_METHOD structure to be used when creating the SSL/TLS
|
|
* context with newContext().
|
|
*
|
|
* @return A pointer to the created WOLFSSL_METHOD structure if
|
|
* successful, null on failure.
|
|
* @see WolfSSLContext#newContext(long)
|
|
*/
|
|
public static final native long TLSv1_2_ServerMethod();
|
|
|
|
/**
|
|
* Indicates that the application is a client and will only support the
|
|
* TLS 1.2 protocol.
|
|
* This method allocates memory for and initializes a new native
|
|
* WOLFSSL_METHOD structure to be used when creating the SSL/TLS
|
|
* context with newContext().
|
|
*
|
|
* @return A pointer to the created WOLFSSL_METHOD structure if
|
|
* successful, null on failure.
|
|
* @see WolfSSLContext#newContext(long)
|
|
*/
|
|
public static final native long TLSv1_2_ClientMethod();
|
|
|
|
/**
|
|
* Indicates that the application will only support the TLS 1.3 protocol.
|
|
* Application is side-independent at this time, and client/server side
|
|
* will be determined at connect/accept stage.
|
|
* This method allocates memory for and initializes a new native
|
|
* WOLFSSL_METHOD structure to be used when creating the SSL/TLS
|
|
* context with newContext().
|
|
*
|
|
* @return A pointer to the created WOLFSSL_METHOD structure if
|
|
* successful, null on failure.
|
|
* @see WolfSSLContext#newContext(long)
|
|
*/
|
|
public static final native long TLSv1_3_Method();
|
|
|
|
/**
|
|
* Indicates that the application is a server and will only support the
|
|
* TLS 1.3 protocol.
|
|
* This method allocates memory for and initializes a new native
|
|
* WOLFSSL_METHOD structure to be used when creating the SSL/TLS
|
|
* context with newContext().
|
|
*
|
|
* @return A pointer to the created WOLFSSL_METHOD structure if
|
|
* successful, null on failure.
|
|
* @see WolfSSLContext#newContext(long)
|
|
*/
|
|
public final static native long TLSv1_3_ServerMethod();
|
|
|
|
/**
|
|
* Indicates that the application is a client and will only support the
|
|
* TLS 1.3 protocol.
|
|
* This method allocates memory for and initializes a new native
|
|
* WOLFSSL_METHOD structure to be used when creating the SSL/TLS
|
|
* context with newContext().
|
|
*
|
|
* @return A pointer to the created WOLFSSL_METHOD structure if
|
|
* successful, null on failure.
|
|
* @see WolfSSLContext#newContext(long)
|
|
*/
|
|
public final static native long TLSv1_3_ClientMethod();
|
|
|
|
/**
|
|
* Indicates that the application will only support the DTLS 1.0 protocol.
|
|
* Application is side-independent at this time, and client/server side
|
|
* will be determined at connect/accept stage.
|
|
* This method allocates memory for and initializes a new native
|
|
* WOLFSSL_METHOD structure to be used when creating the SSL/TLS
|
|
* context with newContext().
|
|
*
|
|
* @return A pointer to the created WOLFSSL_METHOD structure if
|
|
* successful, null on failure.
|
|
* @see WolfSSLContext#newContext(long)
|
|
*/
|
|
public static final native long DTLSv1_Method();
|
|
|
|
/**
|
|
* Indicates that the application is a server and will only support the
|
|
* DTLS 1.0 protocol.
|
|
* This method allocates memory for and initializes a new native
|
|
* WOLFSSL_METHOD structure to be used when creating the SSL/TLS
|
|
* context with newContext().
|
|
*
|
|
* @return A pointer to the created WOLFSSL_METHOD structure if
|
|
* successful, null on failure.
|
|
* @see WolfSSLContext#newContext(long)
|
|
*/
|
|
public static final native long DTLSv1_ServerMethod();
|
|
|
|
/**
|
|
* Indicates that the application is a client and will only support the
|
|
* DTLS 1.0 protocol.
|
|
* This method allocates memory for and initializes a new native
|
|
* WOLFSSL_METHOD structure to be used when creating the SSL/TLS
|
|
* context with newContext().
|
|
*
|
|
* @return A pointer to the created WOLFSSL_METHOD structure if
|
|
* successful, null on failure.
|
|
* @see WolfSSLContext#newContext(long)
|
|
*/
|
|
public static final native long DTLSv1_ClientMethod();
|
|
|
|
/**
|
|
* Indicates that the application will only support the DTLS 1.2 protocol.
|
|
* Application is side-independent at this time, and client/server side
|
|
* will be determined at connect/accept stage.
|
|
* This method allocates memory for and initializes a new native
|
|
* WOLFSSL_METHOD structure to be used when creating the SSL/TLS
|
|
* context with newContext().
|
|
*
|
|
* @return A pointer to the created WOLFSSL_METHOD structure if
|
|
* successful, null on failure.
|
|
* @see WolfSSLContext#newContext(long)
|
|
*/
|
|
public static final native long DTLSv1_2_Method();
|
|
|
|
/**
|
|
* Indicates that the application is a server and will only support the
|
|
* DTLS 1.2 protocol.
|
|
* This method allocates memory for and initializes a new native
|
|
* WOLFSSL_METHOD structure to be used when creating the SSL/TLS
|
|
* context with newContext().
|
|
*
|
|
* @return A pointer to the created WOLFSSL_METHOD structure if
|
|
* successful, null on failure.
|
|
* @see WolfSSLContext#newContext(long)
|
|
*/
|
|
public static final native long DTLSv1_2_ServerMethod();
|
|
|
|
/**
|
|
* Indicates that the application is a client and will only support the
|
|
* DTLS 1.2 protocol.
|
|
* This method allocates memory for and initializes a new native
|
|
* WOLFSSL_METHOD structure to be used when creating the SSL/TLS
|
|
* context with newContext().
|
|
*
|
|
* @return A pointer to the created WOLFSSL_METHOD structure if
|
|
* successful, null on failure.
|
|
* @see WolfSSLContext#newContext(long)
|
|
*/
|
|
public static final native long DTLSv1_2_ClientMethod();
|
|
|
|
/**
|
|
* Indicates that the application will only support the DTLS 1.3 protocol.
|
|
* Application is side-independent at this time, and client/server side
|
|
* will be determined at connect/accept stage.
|
|
* This method allocates memory for and initializes a new native
|
|
* WOLFSSL_METHOD structure to be used when creating the SSL/TLS
|
|
* context with newContext().
|
|
*
|
|
* @return A pointer to the created WOLFSSL_METHOD structure if
|
|
* successful, null on failure.
|
|
* @see WolfSSLContext#newContext(long)
|
|
*/
|
|
public static final native long DTLSv1_3_Method();
|
|
|
|
/**
|
|
* Indicates that the application is a server and will only support the
|
|
* DTLS 1.3 protocol.
|
|
* This method allocates memory for and initializes a new native
|
|
* WOLFSSL_METHOD structure to be used when creating the SSL/TLS
|
|
* context with newContext().
|
|
*
|
|
* @return A pointer to the created WOLFSSL_METHOD structure if
|
|
* successful, null on failure.
|
|
* @see WolfSSLContext#newContext(long)
|
|
*/
|
|
public static final native long DTLSv1_3_ServerMethod();
|
|
|
|
/**
|
|
* Indicates that the application is a client and will only support the
|
|
* DTLS 1.3 protocol.
|
|
* This method allocates memory for and initializes a new native
|
|
* WOLFSSL_METHOD structure to be used when creating the SSL/TLS
|
|
* context with newContext().
|
|
*
|
|
* @return A pointer to the created WOLFSSL_METHOD structure if
|
|
* successful, null on failure.
|
|
* @see WolfSSLContext#newContext(long)
|
|
*/
|
|
public static final native long DTLSv1_3_ClientMethod();
|
|
|
|
/**
|
|
* Indicates that the application will use the highest possible SSL/TLS
|
|
* version from SSL 3.0 up to TLS 1.2, but is side-independent at creation
|
|
* time. Client/server side will be determined at connect/accept stage.
|
|
* This method allocates memory for and initializes a new native
|
|
* WOLFSSL_METHOD structure to be used when creating the SSL/TLS
|
|
* context with newContext().
|
|
*
|
|
* @return A pointer to the created WOLFSSL_METHOD structure if
|
|
* successful, null on failure.
|
|
* @see WolfSSLContext#newContext(long)
|
|
*/
|
|
public static final native long SSLv23_Method();
|
|
|
|
/**
|
|
* Indicates that the application is a server and will use the highest
|
|
* possible SSL/TLS version from SSL 3.0 up to TLS 1.2.
|
|
* This method allocates memory for and initializes a new native
|
|
* WOLFSSL_METHOD structure to be used when creating the SSL/TLS
|
|
* context with newContext().
|
|
*
|
|
* @return A pointer to the created WOLFSSL_METHOD structure if
|
|
* successful, null on failure.
|
|
* @see WolfSSLContext#newContext(long)
|
|
*/
|
|
public static final native long SSLv23_ServerMethod();
|
|
|
|
/**
|
|
* Indicates that the application is a client and will use the highest
|
|
* possible SSL/TLS version from SSL 3.0 up to TLS 1.2.
|
|
* This method allocates memory for and initializes a new native
|
|
* WOLFSSL_METHOD structure to be used when creating the SSL/TLS
|
|
* context with newContext().
|
|
*
|
|
* @return A pointer to the created WOLFSSL_METHOD structure if
|
|
* successful, null on failure.
|
|
* @see WolfSSLContext#newContext(long)
|
|
*/
|
|
public static final native long SSLv23_ClientMethod();
|
|
|
|
/**
|
|
* Converts an error code returned by getError() into a more human-
|
|
* readable error string.
|
|
* The maximum length of the returned string is 80 characters by
|
|
* default, as defined by MAX_ERROR_SZ in the native wolfSSL
|
|
* error.h header file.
|
|
*
|
|
* @param errNumber error code returned by <code>getError()</code>
|
|
* @return output String containing human-readable error
|
|
* string matching <code>errNumber</code>
|
|
* on success. On failure, this method returns a
|
|
* String with the appropriate failure reason.
|
|
* @see WolfSSLSession#getError(long, int)
|
|
*/
|
|
public static final native String getErrorString(long errNumber);
|
|
|
|
/**
|
|
* Un-initializes the wolfSSL library from further use.
|
|
* Doesn't have to be called, though it will free any resources used by
|
|
* the library.
|
|
*
|
|
* @return <code>SSL_SUCCESS</code> upon success, <code>BAD_MUTEX_ERROR
|
|
* </code> on mutex error.
|
|
*/
|
|
public static final native int cleanup();
|
|
|
|
/**
|
|
* Turns on debug logging at runtime.
|
|
* To enable logging at build time, use <b>--enable-debug</b> or define
|
|
* <b>DEBUG_WOLFSSL</b>. Debugging must be enabled at build time in order
|
|
* for the method to have any effect.
|
|
*
|
|
* @return <code>SSL_SUCCESS</code> upon success. <code>NOT_COMPILED_IN
|
|
* </code> if logging isnt' enabled for this wolfSSL build.
|
|
* @see #debuggingOFF()
|
|
* @see #setLoggingCb(WolfSSLLoggingCallback)
|
|
*/
|
|
public static final native int debuggingON();
|
|
|
|
/**
|
|
* Turns off runtime debug log messages.
|
|
* If they're already off, no action is taken.
|
|
*
|
|
* @see #debuggingON()
|
|
* @see #setLoggingCb(WolfSSLLoggingCallback)
|
|
*/
|
|
public static final native void debuggingOFF();
|
|
|
|
/**
|
|
* Registers the callback to be used for Logging debug and trace
|
|
* messages.
|
|
*
|
|
* @param cb Callback to be used for logging debug messages
|
|
* @return <b><code>SSL_ERROR_NONE</code></b> upon success,
|
|
* <b><code>BAD_FUNC_ARG</code></b> if input is null,
|
|
* <b><code>NOT_COMPILED_IN</code></b> if wolfSSL was not
|
|
* compiled with debugging support enabled.
|
|
* @see #debuggingON()
|
|
* @see #debuggingOFF()
|
|
*/
|
|
public static final native int setLoggingCb(WolfSSLLoggingCallback cb);
|
|
|
|
/**
|
|
* Registers the callback to be used for wolfCrypt FIPS verifyCore error.
|
|
* This method is a NOOP if called when not using a wolfCrypt FIPS
|
|
* library.
|
|
*
|
|
* @param cb Callback to be used for wolfCrypt FIPS verifyCore errors
|
|
* @return <b><code>SSL_SUCCESS</code></b> on success,
|
|
* <b><code>NOT_COMPILED_IN</code></b> if not using wolfCrypt
|
|
* FIPS library distribution, or negative on error.
|
|
*/
|
|
public static final native int setFIPSCb(WolfSSLFIPSErrorCallback cb);
|
|
|
|
|
|
/**
|
|
* Returns the current verifyCore hash from wolfCrypt FIPS, from
|
|
* native wolfcrypt/src/fips_test.c, verifyCore[] array.
|
|
*
|
|
* NOTE: this method returns NULL if not used with a wolfCrypt FIPS
|
|
* library.
|
|
*
|
|
* @return current verifyCore hash from wolfCrypt FIPS, or NULL
|
|
* if called when not using a wolfCrypt FIPS library.
|
|
*/
|
|
public static final native String getWolfCryptFIPSCoreHash();
|
|
|
|
/**
|
|
* Persists session cache to memory buffer.
|
|
* This method can be used to persist the current session cache to a
|
|
* memory buffer for storage. The cache can be loaded back into wolfSSL
|
|
* using the corresponding <code>memrestoreSessionCache()</code> method.
|
|
*
|
|
* @param mem buffer to store session cache in
|
|
* @param sz size of the input buffer, <b>mem</b>
|
|
* @return <b><code>SSL_SUCCESS</code></b> on success,
|
|
* <b><code>SSL_FAILURE</code></b> on general failure,
|
|
* <b><code>BUFFER_E</code></b> if the memory buffer is too
|
|
* small to store the session cache in,
|
|
* <b><code>BAD_MUTEX_ERROR</code></b> if the session cache
|
|
* mutex lock failed,
|
|
* <b><code>BAD_FUNC_ARG</code></b> if invalid parameters are
|
|
* used.
|
|
* @see #memrestoreSessionCache(byte[], int)
|
|
* @see #getSessionCacheMemsize()
|
|
* @see WolfSSLContext#memsaveCertCache(long, byte[], int, int[])
|
|
* @see WolfSSLContext#memrestoreCertCache(long, byte[], int)
|
|
* @see WolfSSLContext#getCertCacheMemsize(long)
|
|
*/
|
|
public static native int memsaveSessionCache(byte[] mem, int sz);
|
|
|
|
/**
|
|
* Restores the persistant session cache from memory buffer.
|
|
* This function restores a session cache that was previously saved to
|
|
* a memory buffer.
|
|
*
|
|
* @param mem buffer containing persistant session cache to be restored
|
|
* @param sz size of the input buffer, <b>mem</b>
|
|
* @return <b><code>SSL_SUCCESS</code></b> upon success,
|
|
* <b><code>SSL_FAILURE</code></b> upon general failure,
|
|
* <b><code>BUFFER_E</code></b> if the memory buffer is too
|
|
* small, <b><code>CACHE_MATCH_ERROR</code></b> if the
|
|
* session cache header match failed and there were
|
|
* differences in how the cache and the current library
|
|
* are configured, <b><code>BAD_MUTEX_ERROR</code></b>
|
|
* if the session cache mutex lock failed,
|
|
* <b><code>BAD_FUNC_ARG</code></b> if invalid parameters are
|
|
* used.
|
|
* @see #memsaveSessionCache(byte[], int)
|
|
* @see #getSessionCacheMemsize()
|
|
* @see WolfSSLContext#memsaveCertCache(long, byte[], int, int[])
|
|
* @see WolfSSLContext#memrestoreCertCache(long, byte[], int)
|
|
* @see WolfSSLContext#getCertCacheMemsize(long)
|
|
*/
|
|
public static native int memrestoreSessionCache(byte[] mem, int sz);
|
|
|
|
/**
|
|
* Gets how big the session cache save buffer needs to be.
|
|
* Use this method to determine how large the buffer needs to be to
|
|
* store the persistant session cache into memory.
|
|
*
|
|
* @return size, in bytes, of how large the output buffer should be
|
|
* to store the session cache into memory.
|
|
* @see #memsaveSessionCache(byte[], int)
|
|
* @see #memrestoreSessionCache(byte[], int)
|
|
* @see WolfSSLContext#memsaveCertCache(long, byte[], int, int[])
|
|
* @see WolfSSLContext#memrestoreCertCache(long, byte[], int)
|
|
* @see WolfSSLContext#getCertCacheMemsize(long)
|
|
*/
|
|
public static native int getSessionCacheMemsize();
|
|
|
|
/**
|
|
* Strips off PKCS#8 header from byte array.
|
|
* This function starts reading the input array for a PKCS#8 header,
|
|
* beginning at input offset, idx. If found, it returns the offset of
|
|
* the inner traditional data.
|
|
*
|
|
* @param in input buffer containing PKCS#8 formatted key
|
|
* @param idx index/offset into input array to begin reading
|
|
* @param sz size of input array
|
|
* @return offset where the traditional key begins, or negative on
|
|
* failure.
|
|
*/
|
|
public static native int getPkcs8TraditionalOffset(byte[] in, long idx,
|
|
long sz);
|
|
|
|
/**
|
|
* Returns the DER-encoded form of the certificate pointed to by
|
|
* x509.
|
|
*
|
|
* @param x509 pointer (long) to a native WOLFSSL_X509 object. This
|
|
* objects represents an X.509 certificate.
|
|
* @return DER-encoded certificate or
|
|
* <code>null</code> if the input buffer is null.
|
|
*
|
|
*/
|
|
public static native byte[] x509_getDer(long x509);
|
|
|
|
/**
|
|
* Returns the wolfSSL max HMAC digest size.
|
|
* Specifically, returns the value of the native wolfSSL
|
|
* MAX_DIGEST_SIZE define.
|
|
*
|
|
* @return value of native MAX_DIGEST_SIZE define
|
|
*/
|
|
public static native int getHmacMaxSize();
|
|
|
|
/**
|
|
* Return the wolfSSL library vesrion number in hex.
|
|
*
|
|
* Wrapper around native wolfSSL_lib_version_hex()
|
|
*
|
|
* @return wolfSSL native library version hex value
|
|
*/
|
|
public static native long getLibVersionHex();
|
|
|
|
/**
|
|
* Returns the enabled cipher suites for native wolfSSL.
|
|
*
|
|
* @return array of cipher suite Strings
|
|
*/
|
|
public static String[] getCiphers() {
|
|
|
|
String cipherSuites = getEnabledCipherSuites();
|
|
if (cipherSuites == null)
|
|
return null;
|
|
|
|
return cipherSuites.split(":");
|
|
}
|
|
|
|
/**
|
|
* Gets a list of all cipher suites supported by native wolfSSL and
|
|
* uses the format TLS_*. This list may not be in priority order. If
|
|
* priority order is desired, see getCiphersAvailableIana().
|
|
* @return list of all cipher suites supported
|
|
*/
|
|
public static String[] getCiphersIana() {
|
|
String cipherSuites = getEnabledCipherSuitesIana();
|
|
if (cipherSuites == null)
|
|
return null;
|
|
|
|
return cipherSuites.split(":");
|
|
}
|
|
|
|
/**
|
|
* Gets a list of all cipher suites available for current native wolfSSL
|
|
* configuration and selected protocol level. In the format TLS_*.
|
|
*
|
|
* @param version protocol version for which to get cipher suites.
|
|
* @return list of cipher suites.
|
|
*/
|
|
public static String[] getCiphersAvailableIana(TLS_VERSION version) {
|
|
/* passing Enum as ordinal to JNI layer, see com_wolfssl_WolfSSL.c */
|
|
String cipherSuites = getAvailableCipherSuitesIana(version.ordinal());
|
|
if (cipherSuites == null)
|
|
return null;
|
|
|
|
return cipherSuites.split(":");
|
|
}
|
|
|
|
/**
|
|
* Register native wolfSSL crypto callback function. Currently requires
|
|
* modification to native JNI code to write/implement correct native
|
|
* crypto callback function implementation.
|
|
*
|
|
* Note that this API only allows one devId to be set. Users who need
|
|
* support for multiple devId's and callbacks, please contact
|
|
* support@wolfssl.com to open a feature request.
|
|
*
|
|
* See native/com_wolfssl_WolfSSL.c
|
|
*
|
|
* @param devId device ID to register crypto callback for
|
|
*
|
|
* @return 0 on success, negative on error
|
|
*/
|
|
public static int cryptoCbRegisterDevice(int devId) {
|
|
|
|
WolfSSLDebug.log(WolfSSL.class, WolfSSLDebug.Component.JNI,
|
|
WolfSSLDebug.INFO, () -> "registering crypto cb devId: " + devId);
|
|
|
|
return wc_CryptoCb_RegisterDevice(devId);
|
|
}
|
|
|
|
/**
|
|
* Unregister native wolfSSL crypto callback function.
|
|
* @param devId device ID to unregister
|
|
*
|
|
* @return 0 on success, negative on error.
|
|
*/
|
|
public static int cryptoCbUnRegisterDevice(int devId) {
|
|
|
|
WolfSSLDebug.log(WolfSSL.class, WolfSSLDebug.Component.JNI,
|
|
WolfSSLDebug.INFO, () -> "unregistering crypto cb devId: " + devId);
|
|
|
|
wc_CryptoCb_UnRegisterDevice(devId);
|
|
|
|
return 0;
|
|
}
|
|
|
|
/* ------------------------- isEnabled methods -------------------------- */
|
|
|
|
/**
|
|
* Checks if CRL support is enabled in wolfSSL native library.
|
|
*
|
|
* @return 1 if enabled, 0 if not compiled in
|
|
*/
|
|
public static native int isEnabledCRL();
|
|
|
|
/**
|
|
* Checks if CRL Monitor support is enabled in wolfSSL native library.
|
|
*
|
|
* @return 1 if enabled, 0 if not compiled in
|
|
*/
|
|
public static native int isEnabledCRLMonitor();
|
|
|
|
/**
|
|
* Checks if OCSP support is enabled in wolfSSL native library.
|
|
*
|
|
* @return 1 if enabled, 0 if not compiled in
|
|
*/
|
|
public static native int isEnabledOCSP();
|
|
|
|
/**
|
|
* Checks if PSK support is enabled in wolfSSL native library.
|
|
*
|
|
* @return 1 if enabled, 0 if not compiled in
|
|
*/
|
|
public static native int isEnabledPSK();
|
|
|
|
/**
|
|
* Checks if DTLS support is enabled in wolfSSL native library.
|
|
*
|
|
* @return 1 if enabled, 0 if not compiled in
|
|
*/
|
|
public static native int isEnabledDTLS();
|
|
|
|
/**
|
|
* Checks if (D)TLS 1.3 HRR Cookie is enabled in the native wolfSSL
|
|
* library. Checks if native WOLFSSL_SEND_HRR_COOKIE is defined.
|
|
*
|
|
* @return 1 if enabled, 9 if not compiled in.
|
|
*/
|
|
public static native int isEnabledSendHrrCookie();
|
|
|
|
/**
|
|
* Checks if Atomic User support is enabled in wolfSSL native library.
|
|
*
|
|
* @return 1 if enabled, 0 if not compiled in
|
|
*/
|
|
public static native int isEnabledAtomicUser();
|
|
|
|
/**
|
|
* Checks if Public Key Callback support is enabled in wolfSSL
|
|
* native library.
|
|
*
|
|
* @return 1 if enabled, 0 if not compiled in
|
|
*/
|
|
public static native int isEnabledPKCallbacks();
|
|
|
|
/**
|
|
* Checks if TLS Extended Master Secret support has been compiled into
|
|
* native wolfSSL library.
|
|
*
|
|
* @return 1 if available, 0 if not compiled in.
|
|
*/
|
|
public static native int isEnabledTLSExtendedMasterSecret();
|
|
|
|
/**
|
|
* Checks which protocols where built into wolfSSL
|
|
*
|
|
* @return an array of Strings for supported protocols
|
|
*/
|
|
public static native String[] getProtocols();
|
|
|
|
/**
|
|
* Checks which protocols where built into wolfSSL with Mask
|
|
*
|
|
* @param mask flags prohibiting TLS version (i.e. SSL_OP_NO_xxx)
|
|
* @return an array of Strings for supported protocols
|
|
*/
|
|
public static native String[] getProtocolsMask(long mask);
|
|
|
|
/* ----------------------- native helper methods ------------------------ */
|
|
|
|
/**
|
|
* Return native system errno value.
|
|
*
|
|
* Some native system calls, such as select() will set errno when an
|
|
* error is encountered. This JNI method is a simple getter to retrive
|
|
* the current system errno value.
|
|
*
|
|
* If on Windows, this will return 0 (no errno support on Windows)
|
|
*
|
|
* @return System native errno value
|
|
*/
|
|
public static native int getErrno();
|
|
|
|
/**
|
|
* Gets the internal wolfSSL named group enum matching provided string.
|
|
*
|
|
* Returned enum values are in Named Groups section above and come from
|
|
* native ssl.h "Named Groups" enum.
|
|
*
|
|
* @param curveName String representation of ECC curve
|
|
* @return Native wolfSSL Named Groups enum value which maps to input
|
|
* String, or WolfSSL.WOLFSSL_NAMED_GROUP_INVALID if curve
|
|
* String not supported.
|
|
*/
|
|
protected static int getNamedGroupFromString(String curveName) {
|
|
|
|
switch (curveName) {
|
|
case "sect163k1":
|
|
return WolfSSL.WOLFSSL_ECC_SECT163K1;
|
|
case "sect163r1":
|
|
return WolfSSL.WOLFSSL_ECC_SECT163R1;
|
|
case "sect163r2":
|
|
return WolfSSL.WOLFSSL_ECC_SECT163R2;
|
|
case "sect193r1":
|
|
return WolfSSL.WOLFSSL_ECC_SECT193R1;
|
|
case "sect193r2":
|
|
return WolfSSL.WOLFSSL_ECC_SECT193R2;
|
|
case "sect233k1":
|
|
return WolfSSL.WOLFSSL_ECC_SECT233K1;
|
|
case "sect233r1":
|
|
return WolfSSL.WOLFSSL_ECC_SECT233R1;
|
|
case "sect239k1":
|
|
return WolfSSL.WOLFSSL_ECC_SECT239K1;
|
|
case "sect283k1":
|
|
return WolfSSL.WOLFSSL_ECC_SECT283K1;
|
|
case "sect283r1":
|
|
return WolfSSL.WOLFSSL_ECC_SECT283R1;
|
|
case "sect409k1":
|
|
return WolfSSL.WOLFSSL_ECC_SECT409K1;
|
|
case "sect409r1":
|
|
return WolfSSL.WOLFSSL_ECC_SECT409R1;
|
|
case "sect571k1":
|
|
return WolfSSL.WOLFSSL_ECC_SECT571K1;
|
|
case "sect571r1":
|
|
return WolfSSL.WOLFSSL_ECC_SECT571R1;
|
|
case "secp160k1":
|
|
return WolfSSL.WOLFSSL_ECC_SECP160K1;
|
|
case "secp160r1":
|
|
return WolfSSL.WOLFSSL_ECC_SECP160R1;
|
|
case "secp160r2":
|
|
return WolfSSL.WOLFSSL_ECC_SECP160R2;
|
|
case "secp192k1":
|
|
return WolfSSL.WOLFSSL_ECC_SECP192K1;
|
|
case "secp192r1":
|
|
return WolfSSL.WOLFSSL_ECC_SECP192R1;
|
|
case "secp224k1":
|
|
return WolfSSL.WOLFSSL_ECC_SECP224K1;
|
|
case "secp224r1":
|
|
return WolfSSL.WOLFSSL_ECC_SECP224R1;
|
|
case "secp256k1":
|
|
return WolfSSL.WOLFSSL_ECC_SECP256K1;
|
|
case "secp256r1":
|
|
return WolfSSL.WOLFSSL_ECC_SECP256R1;
|
|
case "secp384r1":
|
|
return WolfSSL.WOLFSSL_ECC_SECP384R1;
|
|
case "secp521r1":
|
|
return WolfSSL.WOLFSSL_ECC_SECP521R1;
|
|
case "brainpoolP256r1":
|
|
return WolfSSL.WOLFSSL_ECC_BRAINPOOLP256R1;
|
|
case "brainpoolP384r1":
|
|
return WolfSSL.WOLFSSL_ECC_BRAINPOOLP384R1;
|
|
case "brainpoolP512r1":
|
|
return WolfSSL.WOLFSSL_ECC_BRAINPOOLP512R1;
|
|
case "X25519":
|
|
case "x25519":
|
|
return WolfSSL.WOLFSSL_ECC_X25519;
|
|
case "X448":
|
|
case "x448":
|
|
return WolfSSL.WOLFSSL_ECC_X448;
|
|
case "sm2P256v1":
|
|
return WolfSSL.WOLFSSL_ECC_SM2P256V1;
|
|
case "ffdhe2048":
|
|
return WolfSSL.WOLFSSL_FFDHE_2048;
|
|
case "ffdhe3072":
|
|
return WolfSSL.WOLFSSL_FFDHE_3072;
|
|
case "ffdhe4096":
|
|
return WolfSSL.WOLFSSL_FFDHE_4096;
|
|
case "ffdhe6144":
|
|
return WolfSSL.WOLFSSL_FFDHE_6144;
|
|
case "ffdhe8192":
|
|
return WolfSSL.WOLFSSL_FFDHE_8192;
|
|
default:
|
|
return WolfSSL.WOLFSSL_NAMED_GROUP_INVALID;
|
|
|
|
}
|
|
}
|
|
|
|
@SuppressWarnings("deprecation")
|
|
@Override
|
|
protected void finalize() throws Throwable
|
|
{
|
|
synchronized(cleanupLock) {
|
|
if (this.active == true) {
|
|
/* reset logging callback before calling cleanup() */
|
|
setLoggingCb(null);
|
|
|
|
/* free resources, set state */
|
|
cleanup();
|
|
this.active = false;
|
|
}
|
|
}
|
|
super.finalize();
|
|
}
|
|
|
|
} /* end WolfSSL */
|
|
|