1 /* 2 * Copyright (C) 2008 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package org.conscrypt; 18 19 import java.io.FileDescriptor; 20 import java.io.IOException; 21 import java.io.OutputStream; 22 import java.net.SocketTimeoutException; 23 import java.security.MessageDigest; 24 import java.security.NoSuchAlgorithmException; 25 import java.security.SignatureException; 26 import java.security.cert.CertificateEncodingException; 27 import java.security.cert.CertificateException; 28 import java.security.cert.CertificateParsingException; 29 import java.security.interfaces.DSAPrivateKey; 30 import java.security.interfaces.ECPrivateKey; 31 import java.security.interfaces.RSAPrivateKey; 32 import java.util.ArrayList; 33 import java.util.Calendar; 34 import java.util.HashMap; 35 import java.util.LinkedHashMap; 36 import java.util.List; 37 import java.util.Map; 38 import javax.crypto.BadPaddingException; 39 import javax.crypto.IllegalBlockSizeException; 40 import javax.net.ssl.SSLException; 41 import javax.security.auth.x500.X500Principal; 42 43 /** 44 * Provides the Java side of our JNI glue for OpenSSL. 45 */ 46 public final class NativeCrypto { 47 48 // --- OpenSSL library initialization -------------------------------------- 49 static { 50 /* 51 * If we're compiled as part of Android, should use a different JNI 52 * library name. Detect this by looking for the jarjar'd package name. 53 */ 54 if ("com.android.org.conscrypt".equals(NativeCrypto.class.getPackage().getName())) { 55 System.loadLibrary("javacrypto"); 56 } else if ("com.google.android.gms.org.conscrypt".equals(NativeCrypto.class.getPackage().getName())) { 57 System.loadLibrary("gmscore"); 58 System.loadLibrary("conscrypt_gmscore_jni"); 59 } else { 60 System.loadLibrary("conscrypt_jni"); 61 } 62 63 clinit(); 64 } 65 66 private native static void clinit(); 67 68 // --- ENGINE functions ---------------------------------------------------- 69 public static native void ENGINE_load_dynamic(); 70 71 public static native long ENGINE_by_id(String id); 72 73 public static native int ENGINE_add(long e); 74 75 public static native int ENGINE_init(long e); 76 77 public static native int ENGINE_finish(long e); 78 79 public static native int ENGINE_free(long e); 80 81 public static native long ENGINE_load_private_key(long e, String key_id); 82 83 public static native String ENGINE_get_id(long engineRef); 84 85 public static native int ENGINE_ctrl_cmd_string(long engineRef, String cmd, String arg, 86 int cmd_optional); 87 88 // --- DSA/RSA public/private key handling functions ----------------------- 89 90 public static native long EVP_PKEY_new_DSA(byte[] p, byte[] q, byte[] g, 91 byte[] pub_key, byte[] priv_key); 92 93 public static native long EVP_PKEY_new_RSA(byte[] n, byte[] e, byte[] d, byte[] p, byte[] q, 94 byte[] dmp1, byte[] dmq1, byte[] iqmp); 95 96 public static native long EVP_PKEY_new_mac_key(int type, byte[] key); 97 98 public static native int EVP_PKEY_size(long pkey); 99 100 public static native int EVP_PKEY_type(long pkey); 101 102 public static native String EVP_PKEY_print_public(long pkeyRef); 103 104 public static native String EVP_PKEY_print_private(long pkeyRef); 105 106 public static native void EVP_PKEY_free(long pkey); 107 108 public static native int EVP_PKEY_cmp(long pkey1, long pkey2); 109 110 public static native byte[] i2d_PKCS8_PRIV_KEY_INFO(long pkey); 111 112 public static native long d2i_PKCS8_PRIV_KEY_INFO(byte[] data); 113 114 public static native byte[] i2d_PUBKEY(long pkey); 115 116 public static native long d2i_PUBKEY(byte[] data); 117 118 public static native long getRSAPrivateKeyWrapper(RSAPrivateKey key, byte[] modulus); 119 120 public static native long getDSAPrivateKeyWrapper(DSAPrivateKey key); 121 122 public static native long getECPrivateKeyWrapper(ECPrivateKey key, long ecGroupRef); 123 124 public static native long RSA_generate_key_ex(int modulusBits, byte[] publicExponent); 125 126 public static native int RSA_size(long pkey); 127 128 public static native int RSA_private_encrypt(int flen, byte[] from, byte[] to, long pkey, 129 int padding); 130 131 public static native int RSA_public_decrypt(int flen, byte[] from, byte[] to, long pkey, 132 int padding) throws BadPaddingException, SignatureException; 133 134 public static native int RSA_public_encrypt(int flen, byte[] from, byte[] to, long pkey, 135 int padding); 136 137 public static native int RSA_private_decrypt(int flen, byte[] from, byte[] to, long pkey, 138 int padding) throws BadPaddingException, SignatureException; 139 140 /** 141 * @return array of {n, e} 142 */ 143 public static native byte[][] get_RSA_public_params(long rsa); 144 145 /** 146 * @return array of {n, e, d, p, q, dmp1, dmq1, iqmp} 147 */ 148 public static native byte[][] get_RSA_private_params(long rsa); 149 150 public static native long DSA_generate_key(int primeBits, byte[] seed, byte[] g, byte[] p, 151 byte[] q); 152 153 /** 154 * @return array of {g, p, q, y(pub), x(priv)} 155 */ 156 public static native byte[][] get_DSA_params(long dsa); 157 158 public static native void set_DSA_flag_nonce_from_hash(long dsa); 159 160 public static native byte[] i2d_RSAPublicKey(long rsa); 161 162 public static native byte[] i2d_RSAPrivateKey(long rsa); 163 164 public static native byte[] i2d_DSAPublicKey(long dsa); 165 166 public static native byte[] i2d_DSAPrivateKey(long dsa); 167 168 // --- DH public/private key handling functions ---------------------------- 169 170 public static native long EVP_PKEY_new_DH(byte[] p, byte[] g, byte[] pub_key, byte[] priv_key); 171 172 public static native long DH_generate_parameters_ex(int primeBits, long generator); 173 174 public static native void DH_generate_key(long pkeyRef); 175 176 /** 177 * @return array of {p, g, y(pub), x(priv)} 178 */ 179 public static native byte[][] get_DH_params(long dh); 180 181 // --- EC functions -------------------------- 182 183 /** 184 * Used to request EC_GROUP_new_curve_GFp to EC_GROUP_new_curve 185 */ 186 public static final int EC_CURVE_GFP = 1; 187 188 /** 189 * Used to request EC_GROUP_new_curve_GF2m to EC_GROUP_new_curve 190 */ 191 public static final int EC_CURVE_GF2M = 2; 192 193 /** 194 * EC_GROUP_set_asn1_flag: indicates an EC_GROUP is a NamedCurve. 195 */ 196 public static final int OPENSSL_EC_NAMED_CURVE = 0x001; 197 198 /** 199 * EC_GROUP_set_point_conversion_form: indicates compressed ASN.1 format 200 */ 201 public static final int POINT_CONVERSION_COMPRESSED = 2; 202 203 /** 204 * EC_GROUP_set_point_conversion_form: indicates uncompressed ASN.1 format 205 */ 206 public static final int POINT_CONVERSION_UNCOMPRESSED = 4; 207 208 /** 209 * EC_GROUP_set_point_conversion_form: indicates hybrid ASN.1 format 210 */ 211 public static final int POINT_CONVERSION_HYBRID = 4; 212 213 public static native long EVP_PKEY_new_EC_KEY(long groupRef, long pubkeyRef, byte[] privkey); 214 215 public static native long EC_GROUP_new_by_curve_name(String curveName); 216 217 public static native long EC_GROUP_new_curve(int type, byte[] p, byte[] a, byte[] b); 218 219 public static native long EC_GROUP_dup(long groupRef); 220 221 public static native void EC_GROUP_set_asn1_flag(long groupRef, int flag); 222 223 public static native void EC_GROUP_set_point_conversion_form(long groupRef, int form); 224 225 public static native String EC_GROUP_get_curve_name(long groupRef); 226 227 public static native byte[][] EC_GROUP_get_curve(long groupRef); 228 229 public static native void EC_GROUP_clear_free(long ctx); 230 231 public static native boolean EC_GROUP_cmp(long ctx1, long ctx2); 232 233 public static native void EC_GROUP_set_generator(long groupCtx, long pointCtx, byte[] n, byte[] h); 234 235 public static native long EC_GROUP_get_generator(long groupCtx); 236 237 public static native int get_EC_GROUP_type(long groupCtx); 238 239 public static native byte[] EC_GROUP_get_order(long groupCtx); 240 241 public static native int EC_GROUP_get_degree(long groupCtx); 242 243 public static native byte[] EC_GROUP_get_cofactor(long groupCtx); 244 245 public static native long EC_POINT_new(long groupRef); 246 247 public static native void EC_POINT_clear_free(long pointRef); 248 249 public static native boolean EC_POINT_cmp(long groupRef, long pointRef1, long pointRef2); 250 251 public static native byte[][] EC_POINT_get_affine_coordinates(long groupCtx, long pointCtx); 252 253 public static native void EC_POINT_set_affine_coordinates(long groupCtx, long pointCtx, byte[] x, 254 byte[] y); 255 256 public static native long EC_KEY_generate_key(long groupRef); 257 258 public static native long EC_KEY_get0_group(long pkeyRef); 259 260 public static native byte[] EC_KEY_get_private_key(long keyRef); 261 262 public static native long EC_KEY_get_public_key(long keyRef); 263 264 public static native void EC_KEY_set_nonce_from_hash(long keyRef, boolean enabled); 265 266 public static native int ECDH_compute_key( 267 byte[] out, int outOffset, long publicKeyRef, long privateKeyRef); 268 269 // --- Message digest functions -------------- 270 271 public static native long EVP_get_digestbyname(String name); 272 273 public static native int EVP_MD_size(long evp_md); 274 275 public static native int EVP_MD_block_size(long evp_md); 276 277 // --- Message digest context functions -------------- 278 279 public static native long EVP_MD_CTX_create(); 280 281 public static native void EVP_MD_CTX_init(OpenSSLDigestContext ctx); 282 283 public static native void EVP_MD_CTX_destroy(long ctx); 284 285 public static native int EVP_MD_CTX_copy(OpenSSLDigestContext dst_ctx, 286 OpenSSLDigestContext src_ctx); 287 288 // --- Digest handling functions ------------------------------------------- 289 290 public static native int EVP_DigestInit(OpenSSLDigestContext ctx, long evp_md); 291 292 public static native void EVP_DigestUpdate(OpenSSLDigestContext ctx, byte[] buffer, 293 int offset, int length); 294 295 public static native int EVP_DigestFinal(OpenSSLDigestContext ctx, byte[] hash, int offset); 296 297 // --- MAC handling functions ---------------------------------------------- 298 299 public static native void EVP_DigestSignInit(OpenSSLDigestContext evp_md_ctx, long evp_md, 300 long evp_pkey); 301 302 public static native void EVP_DigestSignUpdate(OpenSSLDigestContext evp_md_ctx, byte[] in); 303 304 public static native byte[] EVP_DigestSignFinal(OpenSSLDigestContext evp_md_ctx); 305 306 // --- Signature handling functions ---------------------------------------- 307 308 public static native int EVP_SignInit(OpenSSLDigestContext ctx, long evpRef); 309 310 public static native void EVP_SignUpdate(OpenSSLDigestContext ctx, byte[] buffer, 311 int offset, int length); 312 313 public static native int EVP_SignFinal(OpenSSLDigestContext ctx, byte[] signature, int offset, 314 long key); 315 316 public static native int EVP_VerifyInit(OpenSSLDigestContext ctx, long evpRef); 317 318 public static native void EVP_VerifyUpdate(OpenSSLDigestContext ctx, byte[] buffer, 319 int offset, int length); 320 321 public static native int EVP_VerifyFinal(OpenSSLDigestContext ctx, byte[] signature, 322 int offset, int length, long key); 323 324 325 // --- Block ciphers ------------------------------------------------------- 326 327 public static native long EVP_get_cipherbyname(String string); 328 329 public static native void EVP_CipherInit_ex(long ctx, long evpCipher, byte[] key, byte[] iv, 330 boolean encrypting); 331 332 public static native int EVP_CipherUpdate(long ctx, byte[] out, int outOffset, byte[] in, 333 int inOffset, int inLength); 334 335 public static native int EVP_CipherFinal_ex(long ctx, byte[] out, int outOffset) 336 throws BadPaddingException, IllegalBlockSizeException; 337 338 public static native int EVP_CIPHER_iv_length(long evpCipher); 339 340 public static native long EVP_CIPHER_CTX_new(); 341 342 public static native int EVP_CIPHER_CTX_block_size(long ctx); 343 344 public static native int get_EVP_CIPHER_CTX_buf_len(long ctx); 345 346 public static native void EVP_CIPHER_CTX_set_padding(long ctx, boolean enablePadding); 347 348 public static native void EVP_CIPHER_CTX_set_key_length(long ctx, int keyBitSize); 349 350 public static native void EVP_CIPHER_CTX_cleanup(long ctx); 351 352 // --- RAND seeding -------------------------------------------------------- 353 354 public static final int RAND_SEED_LENGTH_IN_BYTES = 1024; 355 356 public static native void RAND_seed(byte[] seed); 357 358 public static native int RAND_load_file(String filename, long max_bytes); 359 360 public static native void RAND_bytes(byte[] output); 361 362 // --- ASN.1 objects ------------------------------------------------------- 363 364 public static native int OBJ_txt2nid(String oid); 365 366 public static native String OBJ_txt2nid_longName(String oid); 367 368 public static native String OBJ_txt2nid_oid(String oid); 369 370 // --- X509_NAME ----------------------------------------------------------- 371 372 public static int X509_NAME_hash(X500Principal principal) { 373 return X509_NAME_hash(principal, "SHA1"); 374 } 375 public static int X509_NAME_hash_old(X500Principal principal) { 376 return X509_NAME_hash(principal, "MD5"); 377 } 378 private static int X509_NAME_hash(X500Principal principal, String algorithm) { 379 try { 380 byte[] digest = MessageDigest.getInstance(algorithm).digest(principal.getEncoded()); 381 int offset = 0; 382 return (((digest[offset++] & 0xff) << 0) | 383 ((digest[offset++] & 0xff) << 8) | 384 ((digest[offset++] & 0xff) << 16) | 385 ((digest[offset ] & 0xff) << 24)); 386 } catch (NoSuchAlgorithmException e) { 387 throw new AssertionError(e); 388 } 389 } 390 391 public static native String X509_NAME_print_ex(long x509nameCtx, long flags); 392 393 // --- X509 ---------------------------------------------------------------- 394 395 /** Used to request get_X509_GENERAL_NAME_stack get the "altname" field. */ 396 public static final int GN_STACK_SUBJECT_ALT_NAME = 1; 397 398 /** 399 * Used to request get_X509_GENERAL_NAME_stack get the issuerAlternativeName 400 * extension. 401 */ 402 public static final int GN_STACK_ISSUER_ALT_NAME = 2; 403 404 /** 405 * Used to request only non-critical types in get_X509*_ext_oids. 406 */ 407 public static final int EXTENSION_TYPE_NON_CRITICAL = 0; 408 409 /** 410 * Used to request only critical types in get_X509*_ext_oids. 411 */ 412 public static final int EXTENSION_TYPE_CRITICAL = 1; 413 414 public static native long d2i_X509_bio(long bioCtx); 415 416 public static native long d2i_X509(byte[] encoded); 417 418 public static native long PEM_read_bio_X509(long bioCtx); 419 420 public static native byte[] i2d_X509(long x509ctx); 421 422 /** Takes an X509 context not an X509_PUBKEY context. */ 423 public static native byte[] i2d_X509_PUBKEY(long x509ctx); 424 425 public static native byte[] ASN1_seq_pack_X509(long[] x509CertRefs); 426 427 public static native long[] ASN1_seq_unpack_X509_bio(long bioRef); 428 429 public static native void X509_free(long x509ctx); 430 431 public static native int X509_cmp(long x509ctx1, long x509ctx2); 432 433 public static native int get_X509_hashCode(long x509ctx); 434 435 public static native void X509_print_ex(long bioCtx, long x509ctx, long nmflag, long certflag); 436 437 public static native byte[] X509_get_issuer_name(long x509ctx); 438 439 public static native byte[] X509_get_subject_name(long x509ctx); 440 441 public static native String get_X509_sig_alg_oid(long x509ctx); 442 443 public static native byte[] get_X509_sig_alg_parameter(long x509ctx); 444 445 public static native boolean[] get_X509_issuerUID(long x509ctx); 446 447 public static native boolean[] get_X509_subjectUID(long x509ctx); 448 449 public static native long X509_get_pubkey(long x509ctx) throws NoSuchAlgorithmException; 450 451 public static native String get_X509_pubkey_oid(long x509ctx); 452 453 public static native byte[] X509_get_ext_oid(long x509ctx, String oid); 454 455 public static native String[] get_X509_ext_oids(long x509ctx, int critical); 456 457 public static native Object[][] get_X509_GENERAL_NAME_stack(long x509ctx, int type) 458 throws CertificateParsingException; 459 460 public static native boolean[] get_X509_ex_kusage(long x509ctx); 461 462 public static native String[] get_X509_ex_xkusage(long x509ctx); 463 464 public static native int get_X509_ex_pathlen(long x509ctx); 465 466 public static native long X509_get_notBefore(long x509ctx); 467 468 public static native long X509_get_notAfter(long x509ctx); 469 470 public static native long X509_get_version(long x509ctx); 471 472 public static native byte[] X509_get_serialNumber(long x509ctx); 473 474 public static native void X509_verify(long x509ctx, long pkeyCtx) throws BadPaddingException; 475 476 public static native byte[] get_X509_cert_info_enc(long x509ctx); 477 478 public static native byte[] get_X509_signature(long x509ctx); 479 480 public static native int get_X509_ex_flags(long x509ctx); 481 482 public static native int X509_check_issued(long ctx, long ctx2); 483 484 // --- X509 EXFLAG --------------------------------------------------------- 485 486 public static final int EXFLAG_CA = 0x10; 487 488 public static final int EXFLAG_CRITICAL = 0x200; 489 490 // --- PKCS7 --------------------------------------------------------------- 491 492 /** Used as the "which" field in d2i_PKCS7_bio and PEM_read_bio_PKCS7. */ 493 public static final int PKCS7_CERTS = 1; 494 495 /** Used as the "which" field in d2i_PKCS7_bio and PEM_read_bio_PKCS7. */ 496 public static final int PKCS7_CRLS = 2; 497 498 /** Returns an array of X509 or X509_CRL pointers. */ 499 public static native long[] d2i_PKCS7_bio(long bioCtx, int which); 500 501 /** Returns an array of X509 or X509_CRL pointers. */ 502 public static native byte[] i2d_PKCS7(long[] certs); 503 504 /** Returns an array of X509 or X509_CRL pointers. */ 505 public static native long[] PEM_read_bio_PKCS7(long bioCtx, int which); 506 507 // --- X509_CRL ------------------------------------------------------------ 508 509 public static native long d2i_X509_CRL_bio(long bioCtx); 510 511 public static native long PEM_read_bio_X509_CRL(long bioCtx); 512 513 public static native byte[] i2d_X509_CRL(long x509CrlCtx); 514 515 public static native void X509_CRL_free(long x509CrlCtx); 516 517 public static native void X509_CRL_print(long bioCtx, long x509CrlCtx); 518 519 public static native String get_X509_CRL_sig_alg_oid(long x509CrlCtx); 520 521 public static native byte[] get_X509_CRL_sig_alg_parameter(long x509CrlCtx); 522 523 public static native byte[] X509_CRL_get_issuer_name(long x509CrlCtx); 524 525 /** Returns X509_REVOKED reference that is not duplicated! */ 526 public static native long X509_CRL_get0_by_cert(long x509CrlCtx, long x509Ctx); 527 528 /** Returns X509_REVOKED reference that is not duplicated! */ 529 public static native long X509_CRL_get0_by_serial(long x509CrlCtx, byte[] serial); 530 531 /** Returns an array of X509_REVOKED that are owned by the caller. */ 532 public static native long[] X509_CRL_get_REVOKED(long x509CrlCtx); 533 534 public static native String[] get_X509_CRL_ext_oids(long x509ctx, int critical); 535 536 public static native byte[] X509_CRL_get_ext_oid(long x509CrlCtx, String oid); 537 538 public static native long X509_CRL_get_version(long x509CrlCtx); 539 540 public static native long X509_CRL_get_ext(long x509CrlCtx, String oid); 541 542 public static native byte[] get_X509_CRL_signature(long x509ctx); 543 544 public static native void X509_CRL_verify(long x509CrlCtx, long pkeyCtx); 545 546 public static native byte[] get_X509_CRL_crl_enc(long x509CrlCtx); 547 548 public static native long X509_CRL_get_lastUpdate(long x509CrlCtx); 549 550 public static native long X509_CRL_get_nextUpdate(long x509CrlCtx); 551 552 // --- X509_REVOKED -------------------------------------------------------- 553 554 public static native long X509_REVOKED_dup(long x509RevokedCtx); 555 556 public static native byte[] i2d_X509_REVOKED(long x509RevokedCtx); 557 558 public static native String[] get_X509_REVOKED_ext_oids(long x509ctx, int critical); 559 560 public static native byte[] X509_REVOKED_get_ext_oid(long x509RevokedCtx, String oid); 561 562 public static native byte[] X509_REVOKED_get_serialNumber(long x509RevokedCtx); 563 564 public static native long X509_REVOKED_get_ext(long x509RevokedCtx, String oid); 565 566 /** Returns ASN1_TIME reference. */ 567 public static native long get_X509_REVOKED_revocationDate(long x509RevokedCtx); 568 569 public static native void X509_REVOKED_print(long bioRef, long x509RevokedCtx); 570 571 // --- X509_EXTENSION ------------------------------------------------------ 572 573 public static native int X509_supported_extension(long x509ExtensionRef); 574 575 // --- ASN1_TIME ----------------------------------------------------------- 576 577 public static native void ASN1_TIME_to_Calendar(long asn1TimeCtx, Calendar cal); 578 579 // --- BIO stream creation ------------------------------------------------- 580 581 public static native long create_BIO_InputStream(OpenSSLBIOInputStream is); 582 583 public static native long create_BIO_OutputStream(OutputStream os); 584 585 public static native int BIO_read(long bioRef, byte[] buffer); 586 587 public static native void BIO_write(long bioRef, byte[] buffer, int offset, int length) 588 throws IOException; 589 590 public static native void BIO_free_all(long bioRef); 591 592 // --- SSL handling -------------------------------------------------------- 593 594 private static final String SUPPORTED_PROTOCOL_SSLV3 = "SSLv3"; 595 private static final String SUPPORTED_PROTOCOL_TLSV1 = "TLSv1"; 596 private static final String SUPPORTED_PROTOCOL_TLSV1_1 = "TLSv1.1"; 597 private static final String SUPPORTED_PROTOCOL_TLSV1_2 = "TLSv1.2"; 598 599 public static final Map<String, String> OPENSSL_TO_STANDARD_CIPHER_SUITES 600 = new HashMap<String, String>(); 601 public static final Map<String, String> STANDARD_TO_OPENSSL_CIPHER_SUITES 602 = new LinkedHashMap<String, String>(); 603 604 private static void add(String standard, String openssl) { 605 OPENSSL_TO_STANDARD_CIPHER_SUITES.put(openssl, standard); 606 STANDARD_TO_OPENSSL_CIPHER_SUITES.put(standard, openssl); 607 } 608 609 /** 610 * TLS_EMPTY_RENEGOTIATION_INFO_SCSV is RFC 5746's renegotiation 611 * indication signaling cipher suite value. It is not a real 612 * cipher suite. It is just an indication in the default and 613 * supported cipher suite lists indicates that the implementation 614 * supports secure renegotiation. 615 * 616 * In the RI, its presence means that the SCSV is sent in the 617 * cipher suite list to indicate secure renegotiation support and 618 * its absense means to send an empty TLS renegotiation info 619 * extension instead. 620 * 621 * However, OpenSSL doesn't provide an API to give this level of 622 * control, instead always sending the SCSV and always including 623 * the empty renegotiation info if TLS is used (as opposed to 624 * SSL). So we simply allow TLS_EMPTY_RENEGOTIATION_INFO_SCSV to 625 * be passed for compatibility as to provide the hint that we 626 * support secure renegotiation. 627 */ 628 public static final String TLS_EMPTY_RENEGOTIATION_INFO_SCSV 629 = "TLS_EMPTY_RENEGOTIATION_INFO_SCSV"; 630 631 /** 632 * TLS_FALLBACK_SCSV is from 633 * https://tools.ietf.org/html/draft-ietf-tls-downgrade-scsv-00 634 * to indicate to the server that this is a fallback protocol 635 * request. 636 */ 637 public static final String TLS_FALLBACK_SCSV = "TLS_FALLBACK_SCSV"; 638 639 static { 640 add("SSL_RSA_WITH_RC4_128_MD5", "RC4-MD5"); 641 add("SSL_RSA_WITH_RC4_128_SHA", "RC4-SHA"); 642 add("TLS_RSA_WITH_AES_128_CBC_SHA", "AES128-SHA"); 643 add("TLS_RSA_WITH_AES_256_CBC_SHA", "AES256-SHA"); 644 add("TLS_ECDH_ECDSA_WITH_RC4_128_SHA", "ECDH-ECDSA-RC4-SHA"); 645 add("TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA", "ECDH-ECDSA-AES128-SHA"); 646 add("TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA", "ECDH-ECDSA-AES256-SHA"); 647 add("TLS_ECDH_RSA_WITH_RC4_128_SHA", "ECDH-RSA-RC4-SHA"); 648 add("TLS_ECDH_RSA_WITH_AES_128_CBC_SHA", "ECDH-RSA-AES128-SHA"); 649 add("TLS_ECDH_RSA_WITH_AES_256_CBC_SHA", "ECDH-RSA-AES256-SHA"); 650 add("TLS_ECDHE_ECDSA_WITH_RC4_128_SHA", "ECDHE-ECDSA-RC4-SHA"); 651 add("TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA", "ECDHE-ECDSA-AES128-SHA"); 652 add("TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA", "ECDHE-ECDSA-AES256-SHA"); 653 add("TLS_ECDHE_RSA_WITH_RC4_128_SHA", "ECDHE-RSA-RC4-SHA"); 654 add("TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA", "ECDHE-RSA-AES128-SHA"); 655 add("TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA", "ECDHE-RSA-AES256-SHA"); 656 add("TLS_DHE_RSA_WITH_AES_128_CBC_SHA", "DHE-RSA-AES128-SHA"); 657 add("TLS_DHE_RSA_WITH_AES_256_CBC_SHA", "DHE-RSA-AES256-SHA"); 658 add("TLS_DHE_DSS_WITH_AES_128_CBC_SHA", "DHE-DSS-AES128-SHA"); 659 add("TLS_DHE_DSS_WITH_AES_256_CBC_SHA", "DHE-DSS-AES256-SHA"); 660 add("SSL_RSA_WITH_3DES_EDE_CBC_SHA", "DES-CBC3-SHA"); 661 add("TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA", "ECDH-ECDSA-DES-CBC3-SHA"); 662 add("TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA", "ECDH-RSA-DES-CBC3-SHA"); 663 add("TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA", "ECDHE-ECDSA-DES-CBC3-SHA"); 664 add("TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA", "ECDHE-RSA-DES-CBC3-SHA"); 665 add("SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA", "EDH-RSA-DES-CBC3-SHA"); 666 add("SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA", "EDH-DSS-DES-CBC3-SHA"); 667 add("SSL_RSA_WITH_DES_CBC_SHA", "DES-CBC-SHA"); 668 add("SSL_DHE_RSA_WITH_DES_CBC_SHA", "EDH-RSA-DES-CBC-SHA"); 669 add("SSL_DHE_DSS_WITH_DES_CBC_SHA", "EDH-DSS-DES-CBC-SHA"); 670 add("SSL_RSA_EXPORT_WITH_RC4_40_MD5", "EXP-RC4-MD5"); 671 add("SSL_RSA_EXPORT_WITH_DES40_CBC_SHA", "EXP-DES-CBC-SHA"); 672 add("SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA", "EXP-EDH-RSA-DES-CBC-SHA"); 673 add("SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA", "EXP-EDH-DSS-DES-CBC-SHA"); 674 add("SSL_RSA_WITH_NULL_MD5", "NULL-MD5"); 675 add("SSL_RSA_WITH_NULL_SHA", "NULL-SHA"); 676 add("TLS_ECDH_ECDSA_WITH_NULL_SHA", "ECDH-ECDSA-NULL-SHA"); 677 add("TLS_ECDH_RSA_WITH_NULL_SHA", "ECDH-RSA-NULL-SHA"); 678 add("TLS_ECDHE_ECDSA_WITH_NULL_SHA", "ECDHE-ECDSA-NULL-SHA"); 679 add("TLS_ECDHE_RSA_WITH_NULL_SHA", "ECDHE-RSA-NULL-SHA"); 680 add("SSL_DH_anon_WITH_RC4_128_MD5", "ADH-RC4-MD5"); 681 add("TLS_DH_anon_WITH_AES_128_CBC_SHA", "ADH-AES128-SHA"); 682 add("TLS_DH_anon_WITH_AES_256_CBC_SHA", "ADH-AES256-SHA"); 683 add("SSL_DH_anon_WITH_3DES_EDE_CBC_SHA", "ADH-DES-CBC3-SHA"); 684 add("SSL_DH_anon_WITH_DES_CBC_SHA", "ADH-DES-CBC-SHA"); 685 add("TLS_ECDH_anon_WITH_RC4_128_SHA", "AECDH-RC4-SHA"); 686 add("TLS_ECDH_anon_WITH_AES_128_CBC_SHA", "AECDH-AES128-SHA"); 687 add("TLS_ECDH_anon_WITH_AES_256_CBC_SHA", "AECDH-AES256-SHA"); 688 add("TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA", "AECDH-DES-CBC3-SHA"); 689 add("SSL_DH_anon_EXPORT_WITH_RC4_40_MD5", "EXP-ADH-RC4-MD5"); 690 add("SSL_DH_anon_EXPORT_WITH_DES40_CBC_SHA", "EXP-ADH-DES-CBC-SHA"); 691 add("TLS_ECDH_anon_WITH_NULL_SHA", "AECDH-NULL-SHA"); 692 693 // TLSv1.2 cipher suites 694 add("TLS_RSA_WITH_NULL_SHA256", "NULL-SHA256"); 695 add("TLS_RSA_WITH_AES_128_CBC_SHA256", "AES128-SHA256"); 696 add("TLS_RSA_WITH_AES_256_CBC_SHA256", "AES256-SHA256"); 697 add("TLS_RSA_WITH_AES_128_GCM_SHA256", "AES128-GCM-SHA256"); 698 add("TLS_RSA_WITH_AES_256_GCM_SHA384", "AES256-GCM-SHA384"); 699 add("TLS_DHE_RSA_WITH_AES_128_CBC_SHA256", "DHE-RSA-AES128-SHA256"); 700 add("TLS_DHE_RSA_WITH_AES_256_CBC_SHA256", "DHE-RSA-AES256-SHA256"); 701 add("TLS_DHE_RSA_WITH_AES_128_GCM_SHA256", "DHE-RSA-AES128-GCM-SHA256"); 702 add("TLS_DHE_RSA_WITH_AES_256_GCM_SHA384", "DHE-RSA-AES256-GCM-SHA384"); 703 add("TLS_DHE_DSS_WITH_AES_128_CBC_SHA256", "DHE-DSS-AES128-SHA256"); 704 add("TLS_DHE_DSS_WITH_AES_256_CBC_SHA256", "DHE-DSS-AES256-SHA256"); 705 add("TLS_DHE_DSS_WITH_AES_128_GCM_SHA256", "DHE-DSS-AES128-GCM-SHA256"); 706 add("TLS_DHE_DSS_WITH_AES_256_GCM_SHA384", "DHE-DSS-AES256-GCM-SHA384"); 707 add("TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256", "ECDH-RSA-AES128-SHA256"); 708 add("TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384", "ECDH-RSA-AES256-SHA384"); 709 add("TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256", "ECDH-RSA-AES128-GCM-SHA256"); 710 add("TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384", "ECDH-RSA-AES256-GCM-SHA384"); 711 add("TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256", "ECDH-ECDSA-AES128-SHA256"); 712 add("TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384", "ECDH-ECDSA-AES256-SHA384"); 713 add("TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256", "ECDH-ECDSA-AES128-GCM-SHA256"); 714 add("TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384", "ECDH-ECDSA-AES256-GCM-SHA384"); 715 add("TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256", "ECDHE-RSA-AES128-SHA256"); 716 add("TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384", "ECDHE-RSA-AES256-SHA384"); 717 add("TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256", "ECDHE-RSA-AES128-GCM-SHA256"); 718 add("TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384", "ECDHE-RSA-AES256-GCM-SHA384"); 719 add("TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256", "ECDHE-ECDSA-AES128-SHA256"); 720 add("TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384", "ECDHE-ECDSA-AES256-SHA384"); 721 add("TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256", "ECDHE-ECDSA-AES128-GCM-SHA256"); 722 add("TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384", "ECDHE-ECDSA-AES256-GCM-SHA384"); 723 add("TLS_DH_anon_WITH_AES_128_CBC_SHA256", "ADH-AES128-SHA256"); 724 add("TLS_DH_anon_WITH_AES_256_CBC_SHA256", "ADH-AES256-SHA256"); 725 add("TLS_DH_anon_WITH_AES_128_GCM_SHA256", "ADH-AES128-GCM-SHA256"); 726 add("TLS_DH_anon_WITH_AES_256_GCM_SHA384", "ADH-AES256-GCM-SHA384"); 727 728 // No Kerberos in Android 729 // add("TLS_KRB5_WITH_RC4_128_SHA", "KRB5-RC4-SHA"); 730 // add("TLS_KRB5_WITH_RC4_128_MD5", "KRB5-RC4-MD5"); 731 // add("TLS_KRB5_WITH_3DES_EDE_CBC_SHA", "KRB5-DES-CBC3-SHA"); 732 // add("TLS_KRB5_WITH_3DES_EDE_CBC_MD5", "KRB5-DES-CBC3-MD5"); 733 // add("TLS_KRB5_WITH_DES_CBC_SHA", "KRB5-DES-CBC-SHA"); 734 // add("TLS_KRB5_WITH_DES_CBC_MD5", "KRB5-DES-CBC-MD5"); 735 // add("TLS_KRB5_EXPORT_WITH_RC4_40_SHA", "EXP-KRB5-RC4-SHA"); 736 // add("TLS_KRB5_EXPORT_WITH_RC4_40_MD5", "EXP-KRB5-RC4-MD5"); 737 // add("TLS_KRB5_EXPORT_WITH_DES_CBC_40_SHA", "EXP-KRB5-DES-CBC-SHA"); 738 // add("TLS_KRB5_EXPORT_WITH_DES_CBC_40_MD5", "EXP-KRB5-DES-CBC-MD5"); 739 740 // not implemented by either RI or OpenSSL 741 // add("SSL_DH_DSS_EXPORT_WITH_DES40_CBC_SHA", null); 742 // add("SSL_DH_RSA_EXPORT_WITH_DES40_CBC_SHA", null); 743 744 // EXPORT1024 suites were never standardized but were widely implemented. 745 // OpenSSL 0.9.8c and later have disabled TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES 746 // add("SSL_RSA_EXPORT1024_WITH_DES_CBC_SHA", "EXP1024-DES-CBC-SHA"); 747 // add("SSL_RSA_EXPORT1024_WITH_RC4_56_SHA", "EXP1024-RC4-SHA"); 748 749 // No RC2 750 // add("SSL_RSA_EXPORT_WITH_RC2_CBC_40_MD5", "EXP-RC2-CBC-MD5"); 751 // add("TLS_KRB5_EXPORT_WITH_RC2_CBC_40_SHA", "EXP-KRB5-RC2-CBC-SHA"); 752 // add("TLS_KRB5_EXPORT_WITH_RC2_CBC_40_MD5", "EXP-KRB5-RC2-CBC-MD5"); 753 754 // Pre-Shared Key (PSK) cipher suites 755 add("TLS_PSK_WITH_3DES_EDE_CBC_SHA", "PSK-3DES-EDE-CBC-SHA"); 756 add("TLS_PSK_WITH_AES_128_CBC_SHA", "PSK-AES128-CBC-SHA"); 757 add("TLS_PSK_WITH_AES_256_CBC_SHA", "PSK-AES256-CBC-SHA"); 758 add("TLS_PSK_WITH_RC4_128_SHA", "PSK-RC4-SHA"); 759 add("TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA", "ECDHE-PSK-AES128-CBC-SHA"); 760 add("TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA", "ECDHE-PSK-AES256-CBC-SHA"); 761 762 // Signaling Cipher Suite Value for secure renegotiation handled as special case. 763 // add("TLS_EMPTY_RENEGOTIATION_INFO_SCSV", null); 764 765 // Similarly, the fallback SCSV is handled as a special case. 766 // add("TLS_FALLBACK_SCSV", null); 767 } 768 769 private static final String[] SUPPORTED_CIPHER_SUITES; 770 static { 771 int size = STANDARD_TO_OPENSSL_CIPHER_SUITES.size(); 772 SUPPORTED_CIPHER_SUITES = new String[size + 2]; 773 STANDARD_TO_OPENSSL_CIPHER_SUITES.keySet().toArray(SUPPORTED_CIPHER_SUITES); 774 SUPPORTED_CIPHER_SUITES[size] = TLS_EMPTY_RENEGOTIATION_INFO_SCSV; 775 SUPPORTED_CIPHER_SUITES[size + 1] = TLS_FALLBACK_SCSV; 776 } 777 778 // EVP_PKEY types from evp.h and objects.h 779 public static final int EVP_PKEY_RSA = 6; // NID_rsaEcnryption 780 public static final int EVP_PKEY_DSA = 116; // NID_dsa 781 public static final int EVP_PKEY_DH = 28; // NID_dhKeyAgreement 782 public static final int EVP_PKEY_EC = 408; // NID_X9_62_id_ecPublicKey 783 public static final int EVP_PKEY_HMAC = 855; // NID_hmac 784 public static final int EVP_PKEY_CMAC = 894; // NID_cmac 785 786 // RSA padding modes from rsa.h 787 public static final int RSA_PKCS1_PADDING = 1; 788 public static final int RSA_NO_PADDING = 3; 789 790 // SSL mode from ssl.h 791 public static final long SSL_MODE_HANDSHAKE_CUTTHROUGH = 0x00000080L; 792 public static final long SSL_MODE_CBC_RECORD_SPLITTING = 0x00000100L; 793 public static final long SSL_MODE_SEND_FALLBACK_SCSV = 0x00000200L; 794 795 // SSL options from ssl.h 796 public static final long SSL_OP_TLSEXT_PADDING = 0x00000010L; 797 public static final long SSL_OP_NO_TICKET = 0x00004000L; 798 public static final long SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION = 0x00010000L; 799 public static final long SSL_OP_NO_SSLv3 = 0x02000000L; 800 public static final long SSL_OP_NO_TLSv1 = 0x04000000L; 801 public static final long SSL_OP_NO_TLSv1_1 = 0x10000000L; 802 public static final long SSL_OP_NO_TLSv1_2 = 0x08000000L; 803 804 /* 805 * Client certificate types as defined in 806 * TLS 1.0 spec., 7.4.4. Certificate request. 807 * EC constants from RFC 4492. 808 * OpenSSL constants from ssl/tls1.h. 809 */ 810 public static final byte TLS_CT_RSA_SIGN = 1; 811 public static final byte TLS_CT_DSS_SIGN = 2; 812 public static final byte TLS_CT_RSA_FIXED_DH = 3; 813 public static final byte TLS_CT_DSS_FIXED_DH = 4; 814 public static final byte TLS_CT_ECDSA_SIGN = 64; 815 public static final byte TLS_CT_RSA_FIXED_ECDH = 65; 816 public static final byte TLS_CT_ECDSA_FIXED_ECDH = 66; 817 818 /* 819 * Used in the SSL_get_shutdown and SSL_set_shutdown functions. 820 */ 821 public static final int SSL_SENT_SHUTDOWN = 1; 822 public static final int SSL_RECEIVED_SHUTDOWN = 2; 823 824 public static native long SSL_CTX_new(); 825 826 // IMPLEMENTATION NOTE: The default list of cipher suites is a trade-off between what we'd like 827 // to use and what servers currently support. We strive to be secure enough by default. We thus 828 // avoid unacceptably weak suites (e.g., those with bulk cipher secret key shorter than 128 829 // bits), while maintaining the capability to connect to the majority of servers. 830 // 831 // Cipher suites are listed in preference order (favorite choice first) of the client. However, 832 // servers are not required to honor the order. The key rules governing the preference order 833 // are: 834 // * Prefer Forward Secrecy (i.e., cipher suites that use ECDHE and DHE for key agreement). 835 // * Prefer AES-GCM to AES-CBC whose MAC-pad-then-encrypt approach leads to weaknesses (e.g., 836 // Lucky 13). 837 // * Prefer AES to RC4 whose foundations are a bit shaky. See http://www.isg.rhul.ac.uk/tls/. 838 // BEAST and Lucky13 mitigations are enabled. 839 // * Prefer 128-bit bulk encryption to 256-bit one, because 128-bit is safe enough while 840 // consuming less CPU/time/energy. 841 // 842 // NOTE: Removing cipher suites from this list needs to be done with caution, because this may 843 // prevent apps from connecting to servers they were previously able to connect to. 844 845 /** X.509 based cipher suites enabled by default (if requested), in preference order. */ 846 static final String[] DEFAULT_X509_CIPHER_SUITES = new String[] { 847 "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256", 848 "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384", 849 "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256", 850 "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384", 851 "TLS_DHE_RSA_WITH_AES_128_GCM_SHA256", 852 "TLS_DHE_RSA_WITH_AES_256_GCM_SHA384", 853 "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA", 854 "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA", 855 "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA", 856 "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA", 857 "TLS_DHE_RSA_WITH_AES_128_CBC_SHA", 858 "TLS_DHE_RSA_WITH_AES_256_CBC_SHA", 859 "TLS_DHE_DSS_WITH_AES_128_CBC_SHA", 860 "TLS_DHE_DSS_WITH_AES_256_CBC_SHA", 861 "TLS_ECDHE_ECDSA_WITH_RC4_128_SHA", 862 "TLS_ECDHE_RSA_WITH_RC4_128_SHA", 863 "TLS_RSA_WITH_AES_128_GCM_SHA256", 864 "TLS_RSA_WITH_AES_256_GCM_SHA384", 865 "TLS_RSA_WITH_AES_128_CBC_SHA", 866 "TLS_RSA_WITH_AES_256_CBC_SHA", 867 "SSL_RSA_WITH_RC4_128_SHA", 868 }; 869 870 /** TLS-PSK cipher suites enabled by default (if requested), in preference order. */ 871 static final String[] DEFAULT_PSK_CIPHER_SUITES = new String[] { 872 "TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA", 873 "TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA", 874 "TLS_PSK_WITH_AES_128_CBC_SHA", 875 "TLS_PSK_WITH_AES_256_CBC_SHA", 876 }; 877 878 public static String[] getSupportedCipherSuites() { 879 return SUPPORTED_CIPHER_SUITES.clone(); 880 } 881 882 public static native void SSL_CTX_free(long ssl_ctx); 883 884 public static native void SSL_CTX_set_session_id_context(long ssl_ctx, byte[] sid_ctx); 885 886 public static native long SSL_new(long ssl_ctx) throws SSLException; 887 888 public static native void SSL_enable_tls_channel_id(long ssl) throws SSLException; 889 890 public static native byte[] SSL_get_tls_channel_id(long ssl) throws SSLException; 891 892 public static native void SSL_set1_tls_channel_id(long ssl, long pkey); 893 894 public static native void SSL_use_certificate(long ssl, long[] x509refs); 895 896 public static native void SSL_use_PrivateKey(long ssl, long pkey); 897 898 public static native void SSL_check_private_key(long ssl) throws SSLException; 899 900 public static native void SSL_set_client_CA_list(long ssl, byte[][] asn1DerEncodedX500Principals); 901 902 public static native long SSL_get_mode(long ssl); 903 904 public static native long SSL_set_mode(long ssl, long mode); 905 906 public static native long SSL_clear_mode(long ssl, long mode); 907 908 public static native long SSL_get_options(long ssl); 909 910 public static native long SSL_set_options(long ssl, long options); 911 912 public static native long SSL_clear_options(long ssl, long options); 913 914 public static native void SSL_use_psk_identity_hint(long ssl, String identityHint) 915 throws SSLException; 916 917 public static native void set_SSL_psk_client_callback_enabled(long ssl, boolean enabled); 918 919 public static native void set_SSL_psk_server_callback_enabled(long ssl, boolean enabled); 920 921 public static final String[] DEFAULT_PROTOCOLS = new String[] { 922 SUPPORTED_PROTOCOL_SSLV3, 923 SUPPORTED_PROTOCOL_TLSV1, 924 SUPPORTED_PROTOCOL_TLSV1_1, 925 SUPPORTED_PROTOCOL_TLSV1_2, 926 }; 927 928 public static String[] getSupportedProtocols() { 929 return new String[] { SUPPORTED_PROTOCOL_SSLV3, 930 SUPPORTED_PROTOCOL_TLSV1, 931 SUPPORTED_PROTOCOL_TLSV1_1, 932 SUPPORTED_PROTOCOL_TLSV1_2, 933 }; 934 } 935 936 public static void setEnabledProtocols(long ssl, String[] protocols) { 937 checkEnabledProtocols(protocols); 938 // openssl uses negative logic letting you disable protocols. 939 // so first, assume we need to set all (disable all) and clear none (enable none). 940 // in the loop, selectively move bits from set to clear (from disable to enable) 941 long optionsToSet = (SSL_OP_NO_SSLv3 | SSL_OP_NO_TLSv1 | SSL_OP_NO_TLSv1_1 | SSL_OP_NO_TLSv1_2); 942 long optionsToClear = 0; 943 for (int i = 0; i < protocols.length; i++) { 944 String protocol = protocols[i]; 945 if (protocol.equals(SUPPORTED_PROTOCOL_SSLV3)) { 946 optionsToSet &= ~SSL_OP_NO_SSLv3; 947 optionsToClear |= SSL_OP_NO_SSLv3; 948 } else if (protocol.equals(SUPPORTED_PROTOCOL_TLSV1)) { 949 optionsToSet &= ~SSL_OP_NO_TLSv1; 950 optionsToClear |= SSL_OP_NO_TLSv1; 951 } else if (protocol.equals(SUPPORTED_PROTOCOL_TLSV1_1)) { 952 optionsToSet &= ~SSL_OP_NO_TLSv1_1; 953 optionsToClear |= SSL_OP_NO_TLSv1_1; 954 } else if (protocol.equals(SUPPORTED_PROTOCOL_TLSV1_2)) { 955 optionsToSet &= ~SSL_OP_NO_TLSv1_2; 956 optionsToClear |= SSL_OP_NO_TLSv1_2; 957 } else { 958 // error checked by checkEnabledProtocols 959 throw new IllegalStateException(); 960 } 961 } 962 963 SSL_set_options(ssl, optionsToSet); 964 SSL_clear_options(ssl, optionsToClear); 965 } 966 967 public static String[] checkEnabledProtocols(String[] protocols) { 968 if (protocols == null) { 969 throw new IllegalArgumentException("protocols == null"); 970 } 971 for (int i = 0; i < protocols.length; i++) { 972 String protocol = protocols[i]; 973 if (protocol == null) { 974 throw new IllegalArgumentException("protocols[" + i + "] == null"); 975 } 976 if ((!protocol.equals(SUPPORTED_PROTOCOL_SSLV3)) 977 && (!protocol.equals(SUPPORTED_PROTOCOL_TLSV1)) 978 && (!protocol.equals(SUPPORTED_PROTOCOL_TLSV1_1)) 979 && (!protocol.equals(SUPPORTED_PROTOCOL_TLSV1_2))) { 980 throw new IllegalArgumentException("protocol " + protocol 981 + " is not supported"); 982 } 983 } 984 return protocols; 985 } 986 987 public static native void SSL_set_cipher_lists(long ssl, String[] ciphers); 988 989 /** 990 * Gets the list of cipher suites enabled for the provided {@code SSL} instance. 991 * 992 * @return array of {@code SSL_CIPHER} references. 993 */ 994 public static native long[] SSL_get_ciphers(long ssl); 995 996 /* 997 * Constants for SSL_CIPHER algorithm_mkey (key exchange algorithm). 998 * OpenSSL constants from ssl/ssl_locl.h. 999 */ 1000 /** RSA key exchange */ 1001 public static final int SSL_kRSA = 0x00000001; 1002 /** DH cert, RSA CA cert -- no such ciphersuite supported! */ 1003 public static final int SSL_kDHr = 0x00000002; 1004 /** DH cert, DSA CA cert -- no such ciphersuite supported! */ 1005 public static final int SSL_kDHd = 0x00000004; 1006 /** tmp DH key no DH cert */ 1007 public static final int SSL_kEDH = 0x00000008; 1008 /** Kerberos5 key exchange */ 1009 public static final int SSL_kKRB5 = 0x00000010; 1010 /** ECDH cert, RSA CA cert */ 1011 public static final int SSL_kECDHr = 0x00000020; 1012 /** ECDH cert, ECDSA CA cert */ 1013 public static final int SSL_kECDHe = 0x00000040; 1014 /** ephemeral ECDH */ 1015 public static final int SSL_kEECDH = 0x00000080; 1016 /** PSK */ 1017 public static final int SSL_kPSK = 0x00000100; 1018 /** GOST key exchange */ 1019 public static final int SSL_kGOST = 0x00000200; 1020 /** SRP */ 1021 public static final int SSL_kSRP = 0x00000400; 1022 1023 /* 1024 * Constants for SSL_CIPHER algorithm_auth (server authentication). 1025 * OpenSSL constants from ssl/ssl_locl.h. 1026 */ 1027 /** RSA auth */ 1028 public static final int SSL_aRSA = 0x00000001; 1029 /** DSS auth */ 1030 public static final int SSL_aDSS = 0x00000002; 1031 /** no auth (i.e. use ADH or AECDH) */ 1032 public static final int SSL_aNULL = 0x00000004; 1033 /** Fixed DH auth (kDHd or kDHr) -- no such ciphersuites supported! */ 1034 public static final int SSL_aDH = 0x00000008; 1035 /** Fixed ECDH auth (kECDHe or kECDHr) */ 1036 public static final int SSL_aECDH = 0x00000010; 1037 /** KRB5 auth */ 1038 public static final int SSL_aKRB5 = 0x00000020; 1039 /** ECDSA auth*/ 1040 public static final int SSL_aECDSA = 0x00000040; 1041 /** PSK auth */ 1042 public static final int SSL_aPSK = 0x00000080; 1043 /** GOST R 34.10-94 signature auth */ 1044 public static final int SSL_aGOST94 = 0x00000100; 1045 /** GOST R 34.10-2001 signature auth */ 1046 public static final int SSL_aGOST01 = 0x00000200; 1047 1048 public static native int get_SSL_CIPHER_algorithm_mkey(long sslCipher); 1049 public static native int get_SSL_CIPHER_algorithm_auth(long sslCipher); 1050 1051 public static void setEnabledCipherSuites(long ssl, String[] cipherSuites) { 1052 checkEnabledCipherSuites(cipherSuites); 1053 List<String> opensslSuites = new ArrayList<String>(); 1054 for (int i = 0; i < cipherSuites.length; i++) { 1055 String cipherSuite = cipherSuites[i]; 1056 if (cipherSuite.equals(TLS_EMPTY_RENEGOTIATION_INFO_SCSV)) { 1057 continue; 1058 } 1059 if (cipherSuite.equals(TLS_FALLBACK_SCSV)) { 1060 SSL_set_mode(ssl, SSL_MODE_SEND_FALLBACK_SCSV); 1061 continue; 1062 } 1063 String openssl = STANDARD_TO_OPENSSL_CIPHER_SUITES.get(cipherSuite); 1064 String cs = (openssl == null) ? cipherSuite : openssl; 1065 opensslSuites.add(cs); 1066 } 1067 SSL_set_cipher_lists(ssl, opensslSuites.toArray(new String[opensslSuites.size()])); 1068 } 1069 1070 public static String[] checkEnabledCipherSuites(String[] cipherSuites) { 1071 if (cipherSuites == null) { 1072 throw new IllegalArgumentException("cipherSuites == null"); 1073 } 1074 // makes sure all suites are valid, throwing on error 1075 for (int i = 0; i < cipherSuites.length; i++) { 1076 String cipherSuite = cipherSuites[i]; 1077 if (cipherSuite == null) { 1078 throw new IllegalArgumentException("cipherSuites[" + i + "] == null"); 1079 } 1080 if (cipherSuite.equals(TLS_EMPTY_RENEGOTIATION_INFO_SCSV) || 1081 cipherSuite.equals(TLS_FALLBACK_SCSV)) { 1082 continue; 1083 } 1084 if (STANDARD_TO_OPENSSL_CIPHER_SUITES.containsKey(cipherSuite)) { 1085 continue; 1086 } 1087 if (OPENSSL_TO_STANDARD_CIPHER_SUITES.containsKey(cipherSuite)) { 1088 // TODO log warning about using backward compatability 1089 continue; 1090 } 1091 throw new IllegalArgumentException("cipherSuite " + cipherSuite + " is not supported."); 1092 } 1093 return cipherSuites; 1094 } 1095 1096 /* 1097 * See the OpenSSL ssl.h header file for more information. 1098 */ 1099 public static final int SSL_VERIFY_NONE = 0x00; 1100 public static final int SSL_VERIFY_PEER = 0x01; 1101 public static final int SSL_VERIFY_FAIL_IF_NO_PEER_CERT = 0x02; 1102 1103 public static native void SSL_set_accept_state(long sslNativePointer); 1104 1105 public static native void SSL_set_connect_state(long sslNativePointer); 1106 1107 public static native void SSL_set_verify(long sslNativePointer, int mode); 1108 1109 public static native void SSL_set_session(long sslNativePointer, long sslSessionNativePointer) 1110 throws SSLException; 1111 1112 public static native void SSL_set_session_creation_enabled( 1113 long sslNativePointer, boolean creationEnabled) throws SSLException; 1114 1115 public static native void SSL_set_tlsext_host_name(long sslNativePointer, String hostname) 1116 throws SSLException; 1117 public static native String SSL_get_servername(long sslNativePointer); 1118 1119 /** 1120 * Enables NPN for all SSL connections in the context. 1121 * 1122 * <p>For clients this causes the NPN extension to be included in the 1123 * ClientHello message. 1124 * 1125 * <p>For servers this causes the NPN extension to be included in the 1126 * ServerHello message. The NPN extension will not be included in the 1127 * ServerHello response if the client didn't include it in the ClientHello 1128 * request. 1129 * 1130 * <p>In either case the caller should pass a non-null byte array of NPN 1131 * protocols to {@link #SSL_do_handshake}. 1132 */ 1133 public static native void SSL_CTX_enable_npn(long sslCtxNativePointer); 1134 1135 /** 1136 * Disables NPN for all SSL connections in the context. 1137 */ 1138 public static native void SSL_CTX_disable_npn(long sslCtxNativePointer); 1139 1140 /** 1141 * For clients, sets the list of supported ALPN protocols in wire-format 1142 * (length-prefixed 8-bit strings). 1143 */ 1144 public static native int SSL_set_alpn_protos(long sslPointer, byte[] protos); 1145 1146 /** 1147 * Returns the selected ALPN protocol. If the server did not select a 1148 * protocol, {@code null} will be returned. 1149 */ 1150 public static native byte[] SSL_get0_alpn_selected(long sslPointer); 1151 1152 /** 1153 * Returns the sslSessionNativePointer of the negotiated session. If this is 1154 * a server negotiation, supplying the {@code alpnProtocols} will enable 1155 * ALPN negotiation. 1156 */ 1157 public static native long SSL_do_handshake(long sslNativePointer, 1158 FileDescriptor fd, 1159 SSLHandshakeCallbacks shc, 1160 int timeoutMillis, 1161 boolean client_mode, 1162 byte[] npnProtocols, 1163 byte[] alpnProtocols) 1164 throws SSLException, SocketTimeoutException, CertificateException; 1165 1166 /** 1167 * Returns the sslSessionNativePointer of the negotiated session. If this is 1168 * a server negotiation, supplying the {@code alpnProtocols} will enable 1169 * ALPN negotiation. 1170 */ 1171 public static native long SSL_do_handshake_bio(long sslNativePointer, 1172 long sourceBioRef, 1173 long sinkBioRef, 1174 SSLHandshakeCallbacks shc, 1175 boolean client_mode, 1176 byte[] npnProtocols, 1177 byte[] alpnProtocols) 1178 throws SSLException, SocketTimeoutException, CertificateException; 1179 1180 public static native byte[] SSL_get_npn_negotiated_protocol(long sslNativePointer); 1181 1182 /** 1183 * Currently only intended for forcing renegotiation for testing. 1184 * Not used within OpenSSLSocketImpl. 1185 */ 1186 public static native void SSL_renegotiate(long sslNativePointer) throws SSLException; 1187 1188 /** 1189 * Returns the local X509 certificate references. Must X509_free when done. 1190 */ 1191 public static native long[] SSL_get_certificate(long sslNativePointer); 1192 1193 /** 1194 * Returns the peer X509 certificate references. Must X509_free when done. 1195 */ 1196 public static native long[] SSL_get_peer_cert_chain(long sslNativePointer); 1197 1198 /** 1199 * Reads with the native SSL_read function from the encrypted data stream 1200 * @return -1 if error or the end of the stream is reached. 1201 */ 1202 public static native int SSL_read(long sslNativePointer, 1203 FileDescriptor fd, 1204 SSLHandshakeCallbacks shc, 1205 byte[] b, int off, int len, int readTimeoutMillis) 1206 throws IOException; 1207 1208 public static native int SSL_read_BIO(long sslNativePointer, 1209 byte[] dest, 1210 int destOffset, 1211 int destLength, 1212 long sourceBioRef, 1213 long sinkBioRef, 1214 SSLHandshakeCallbacks shc) 1215 throws IOException; 1216 1217 /** 1218 * Writes with the native SSL_write function to the encrypted data stream. 1219 */ 1220 public static native void SSL_write(long sslNativePointer, 1221 FileDescriptor fd, 1222 SSLHandshakeCallbacks shc, 1223 byte[] b, int off, int len, int writeTimeoutMillis) 1224 throws IOException; 1225 1226 public static native int SSL_write_BIO(long sslNativePointer, 1227 byte[] source, 1228 int length, 1229 long sinkBioRef, 1230 SSLHandshakeCallbacks shc) 1231 throws IOException; 1232 1233 public static native void SSL_interrupt(long sslNativePointer); 1234 public static native void SSL_shutdown(long sslNativePointer, 1235 FileDescriptor fd, 1236 SSLHandshakeCallbacks shc) throws IOException; 1237 1238 public static native void SSL_shutdown_BIO(long sslNativePointer, 1239 long sourceBioRef, long sinkBioRef, 1240 SSLHandshakeCallbacks shc) throws IOException; 1241 1242 public static native int SSL_get_shutdown(long sslNativePointer); 1243 1244 public static native void SSL_free(long sslNativePointer); 1245 1246 public static native byte[] SSL_SESSION_session_id(long sslSessionNativePointer); 1247 1248 public static native long SSL_SESSION_get_time(long sslSessionNativePointer); 1249 1250 public static native String SSL_SESSION_get_version(long sslSessionNativePointer); 1251 1252 public static native String SSL_SESSION_cipher(long sslSessionNativePointer); 1253 1254 public static native void SSL_SESSION_free(long sslSessionNativePointer); 1255 1256 public static native byte[] i2d_SSL_SESSION(long sslSessionNativePointer); 1257 1258 public static native long d2i_SSL_SESSION(byte[] data); 1259 1260 /** 1261 * A collection of callbacks from the native OpenSSL code that are 1262 * related to the SSL handshake initiated by SSL_do_handshake. 1263 */ 1264 public interface SSLHandshakeCallbacks { 1265 /** 1266 * Verify that we trust the certificate chain is trusted. 1267 * 1268 * @param sslSessionNativePtr pointer to a reference of the SSL_SESSION 1269 * @param certificateChainRefs chain of X.509 certificate references 1270 * @param authMethod auth algorithm name 1271 * 1272 * @throws CertificateException if the certificate is untrusted 1273 */ 1274 public void verifyCertificateChain(long sslSessionNativePtr, long[] certificateChainRefs, 1275 String authMethod) throws CertificateException; 1276 1277 /** 1278 * Called on an SSL client when the server requests (or 1279 * requires a certificate). The client can respond by using 1280 * SSL_use_certificate and SSL_use_PrivateKey to set a 1281 * certificate if has an appropriate one available, similar to 1282 * how the server provides its certificate. 1283 * 1284 * @param keyTypes key types supported by the server, 1285 * convertible to strings with #keyType 1286 * @param asn1DerEncodedX500Principals CAs known to the server 1287 */ 1288 public void clientCertificateRequested(byte[] keyTypes, 1289 byte[][] asn1DerEncodedX500Principals) 1290 throws CertificateEncodingException, SSLException; 1291 1292 /** 1293 * Gets the key to be used in client mode for this connection in Pre-Shared Key (PSK) key 1294 * exchange. 1295 * 1296 * @param identityHint PSK identity hint provided by the server or {@code null} if no hint 1297 * provided. 1298 * @param identity buffer to be populated with PSK identity (NULL-terminated modified UTF-8) 1299 * by this method. This identity will be provided to the server. 1300 * @param key buffer to be populated with key material by this method. 1301 * 1302 * @return number of bytes this method stored in the {@code key} buffer or {@code 0} if an 1303 * error occurred in which case the handshake will be aborted. 1304 */ 1305 public int clientPSKKeyRequested(String identityHint, byte[] identity, byte[] key); 1306 1307 /** 1308 * Gets the key to be used in server mode for this connection in Pre-Shared Key (PSK) key 1309 * exchange. 1310 * 1311 * @param identityHint PSK identity hint provided by this server to the client or 1312 * {@code null} if no hint was provided. 1313 * @param identity PSK identity provided by the client. 1314 * @param key buffer to be populated with key material by this method. 1315 * 1316 * @return number of bytes this method stored in the {@code key} buffer or {@code 0} if an 1317 * error occurred in which case the handshake will be aborted. 1318 */ 1319 public int serverPSKKeyRequested(String identityHint, String identity, byte[] key); 1320 1321 /** 1322 * Called when SSL state changes. This could be handshake completion. 1323 */ 1324 public void onSSLStateChange(long sslSessionNativePtr, int type, int val); 1325 } 1326 1327 // Values used in the SSLHandshakeCallbacks#onSSLStateChange as the {@code type}. 1328 public static final int SSL_ST_CONNECT = 0x1000; 1329 public static final int SSL_ST_ACCEPT = 0x2000; 1330 public static final int SSL_ST_MASK = 0x0FFF; 1331 public static final int SSL_ST_INIT = (SSL_ST_CONNECT | SSL_ST_ACCEPT); 1332 public static final int SSL_ST_BEFORE = 0x4000; 1333 public static final int SSL_ST_OK = 0x03; 1334 public static final int SSL_ST_RENEGOTIATE = (0x04 | SSL_ST_INIT); 1335 1336 public static final int SSL_CB_LOOP = 0x01; 1337 public static final int SSL_CB_EXIT = 0x02; 1338 public static final int SSL_CB_READ = 0x04; 1339 public static final int SSL_CB_WRITE = 0x08; 1340 public static final int SSL_CB_ALERT = 0x4000; 1341 public static final int SSL_CB_READ_ALERT = (SSL_CB_ALERT | SSL_CB_READ); 1342 public static final int SSL_CB_WRITE_ALERT = (SSL_CB_ALERT | SSL_CB_WRITE); 1343 public static final int SSL_CB_ACCEPT_LOOP = (SSL_ST_ACCEPT | SSL_CB_LOOP); 1344 public static final int SSL_CB_ACCEPT_EXIT = (SSL_ST_ACCEPT | SSL_CB_EXIT); 1345 public static final int SSL_CB_CONNECT_LOOP = (SSL_ST_CONNECT | SSL_CB_LOOP); 1346 public static final int SSL_CB_CONNECT_EXIT = (SSL_ST_CONNECT | SSL_CB_EXIT); 1347 public static final int SSL_CB_HANDSHAKE_START = 0x10; 1348 public static final int SSL_CB_HANDSHAKE_DONE = 0x20; 1349 1350 /* 1351 * From ssl/ssl3.h 1352 */ 1353 public static final int SSL3_RT_HEADER_LENGTH = 5; 1354 public static final int SSL_RT_MAX_CIPHER_BLOCK_SIZE = 16; 1355 public static final int SSL3_RT_MAX_MD_SIZE = 64; 1356 public static final int SSL3_RT_MAX_PLAIN_LENGTH = 16384; 1357 public static final int SSL3_RT_MAX_ENCRYPTED_OVERHEAD = 256 + SSL3_RT_MAX_MD_SIZE; 1358 public static final int SSL3_RT_SEND_MAX_ENCRYPTED_OVERHEAD = SSL_RT_MAX_CIPHER_BLOCK_SIZE 1359 + SSL3_RT_MAX_MD_SIZE; 1360 public static final int SSL3_RT_MAX_COMPRESSED_LENGTH = SSL3_RT_MAX_PLAIN_LENGTH; 1361 public static final int SSL3_RT_MAX_ENCRYPTED_LENGTH = SSL3_RT_MAX_ENCRYPTED_OVERHEAD 1362 + SSL3_RT_MAX_COMPRESSED_LENGTH; 1363 public static final int SSL3_RT_MAX_PACKET_SIZE = SSL3_RT_MAX_ENCRYPTED_LENGTH 1364 + SSL3_RT_HEADER_LENGTH; 1365 1366 public static native long ERR_peek_last_error(); 1367 } 1368