{"id":4214,"date":"2013-07-16T23:36:56","date_gmt":"2013-07-16T15:36:56","guid":{"rendered":"http:\/\/blog.dword1511.info\/?p=4214"},"modified":"2013-07-16T23:36:56","modified_gmt":"2013-07-16T15:36:56","slug":"%e4%b8%ba%e8%af%a5%e6%ad%bb%e7%9a%84-android-%e7%bc%96%e8%af%91%e6%96%b0%e7%89%88%e6%9c%ac%e7%9a%84-openssl-%e5%ba%93","status":"publish","type":"post","link":"http:\/\/blog.dword1511.info\/?p=4214","title":{"rendered":"\u4e3a\u8be5\u6b7b\u7684 Android \u7f16\u8bd1\u65b0\u7248\u672c\u7684 OpenSSL \u5e93"},"content":{"rendered":"<p>\u4e0d\u77e5\u9053\u4ece\u4ec0\u4e48\u65f6\u5019\u8d77\uff0c\u5927\u5bb6\u90fd\u559c\u6b22\u628a\u7b80\u5355\u7684\u4e8b\u60c5\u590d\u6742\u5316\uff0c\u597d\u50cf\u8d8a\u96be\u7528\u5c31\u8d8a\u725b\u903c\u4e00\u6837\u3002\u88c5\u903c\u7684\u5012\u662f\u65e0\u6240\u8c13\uff0c\u7b49\u5230\u8981\u7528\u7684\u65f6\u5019\u5c31\u50bb\u4e86\u3002\u4ee5\u4e0a\u662f\u9898\u5916\u8bdd\u3002\u624b\u673a\u4e0a\u7684 Android ICS \u7684 OpenSSL \u5e93\u7248\u672c\u8f83\u65e7\uff08 1.0.0e \uff09\uff0c\u5728\u795e\u5947\u7684\u5730\u65b9\u4f7f\u7528\u5bb9\u6613\u51fa\u73b0\u4e00\u4e9b\u95ee\u9898\uff0c\u56e0\u6b64\u6253\u7b97\u7528\u65b0\u7248\u672c\u7684\u66ff\u6362\u6389\uff0c\u770b\u770b\u80fd\u4e0d\u80fd\u89e3\u51b3\u5728\u5172\u671d\u65f6\u4e0d\u65f6\u51fa\u73b0\u7684 SSL \u9519\u8bef\uff08\u624b\u673a\u4e0a\u7279\u6709\u7684\u73b0\u8c61\uff09\u3002\u53e6\u5916\u5b89\u88c5 openssl \u547d\u4ee4\u884c\u5de5\u5177\u4e5f\u53ef\u4ee5\u7528\u4e8e\u624b\u673a\u5904\u7406\u5668\u6027\u80fd\u7684 benchmark \u3002<\/p>\n<p><!--more--><\/p>\n<p>\u6574\u4e2a\u5de5\u4f5c\u7684\u57fa\u7840\u662f\u00a0<a href=\"http:\/\/crrrazzzy.blogspot.co.il\/p\/steps-for-porting-openssl-for-android.html\" target=\"_blank\">http:\/\/crrrazzzy.blogspot.co.il\/p\/steps-for-porting-openssl-for-android.html<\/a>\u00a0\uff0c\u4f46\u662f\u5fc5\u987b\u8df3\u8fc7\u7b2c\u516d\u6b65\u2014\u2014\u8fd9\u4e00\u6b65\u4f1a\u5bfc\u81f4\u8bf8\u591a\u9ebb\u70e6\u3002\u6700\u540e\u5f97\u5230\u7684 SSL \u5e93\u662f\u4e3a\u5e94\u7528\u8bbe\u8ba1\u7684\uff0c\u5e76\u4e0d\u80fd\u66ff\u4ee3\u7cfb\u7edf\u7684 SSL \u5e93\uff0c\u56e0\u6b64\u8fd8\u9700\u8981\u4fee\u6539\u3002<\/p>\n<h3>\u6e90\u7801\u4fee\u6539<\/h3>\n<p>\u9996\u5148\uff0c\u53bb\u00a0<a href=\"http:\/\/developer.android.com\/tools\/sdk\/ndk\/index.html\" target=\"_blank\">http:\/\/developer.android.com\/tools\/sdk\/ndk\/index.html<\/a>\u00a0\u4e0b\u8f7d\u6700\u65b0\u7684 Android NDK \uff0c\u53bb\u00a0<a href=\"http:\/\/www.openssl.org\/source\/\" target=\"_blank\">http:\/\/www.openssl.org\/source\/<\/a>\u00a0\u4e0b\u8f7d OpenSSL \u7684\u6700\u65b0\u6e90\u7801\u3002\u89e3\u538b\u8fd9\u4e24\u4e2a\u5305\u3002<\/p>\n<p>\u63a5\u7740\uff0c\u5728 OpenSSL \u6e90\u7801\u76ee\u5f55\u4e0b\u6267\u884c\uff1a<\/p>\n<pre class=\"brush: bash; title: \u4ee3\u7801; notranslate\" title=\"\u4ee3\u7801\">\r\n# For ARM Cortex\r\n.\/Configure android-armv7 -DL_ENDIAN\r\n# For x86\r\n.\/Configure android-x86 -DL_ENDIAN\r\n<\/pre>\n<p>\u7136\u540e\uff1a<\/p>\n<pre class=\"brush: bash; title: \u4ee3\u7801; notranslate\" title=\"\u4ee3\u7801\">\r\ncp LICENSE NOTICE\r\ntouch MODULE_LICENSE_BSD_LIKE\r\nrm -f AndroidManifest.xml\r\n<\/pre>\n<p>\u63a5\u4e0b\u6765\uff0c\u67e5\u770b Makefile \u91cc\u7684 CFLAG \u548c DEPFLAG \uff0c\u63a5\u7740\u521b\u5efa\u5982\u4e0b\u7684 android-config.mk \uff1a<\/p>\n<pre># From CLFAG (Please replace)\r\nLOCAL_CFLAGS += -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H \\\r\n                -DL_ENDIAN -O3 -fomit-frame-pointer -Wall\r\n\r\n# From DEPFLAG (Please replace)\r\nLOCAL_CFLAGS += -DOPENSSL_NO_EC_NISTP_64_GCC_128 -DOPENSSL_NO_SCTP \\\r\n                -DOPENSSL_NO_CAMELLIA -DOPENSSL_NO_CAPIENG -DOPENSSL_NO_CAST \\\r\n                -DOPENSSL_NO_CMS -DOPENSSL_NO_GMP -DOPENSSL_NO_IDEA \\\r\n                -DOPENSSL_NO_JPAKE -DOPENSSL_NO_MD2 -DOPENSSL_NO_MDC2 \\\r\n                -DOPENSSL_NO_RC5 -DOPENSSL_NO_SHA0 -DOPENSSL_NO_RFC3779 \\\r\n                -DOPENSSL_NO_SEED -DOPENSSL_NO_STORE -DOPENSSL_NO_WHIRLPOOL\r\n\r\n# Extra\r\nLOCAL_CFLAGS += -DZLIB -DOPENSSL_NO_HW -DOPENSSL_NO_GOST<\/pre>\n<p>\u7136\u540e\u8fd8\u9700\u8981\u4e00\u5927\u7968 Android.mk \uff08\u8001\u8001\u5b9e\u5b9e\u7528 Makefile \u80fd\u6b7b\u4eba\u5417\uff1f\uff09\uff1a<\/p>\n<p>jni\/Application.mk \uff08\u76ee\u5f55\u9700\u81ea\u884c\u521b\u5efa\uff09\uff1a<\/p>\n<pre>APP_PROJECT_PATH := $(shell pwd)\r\nAPP_BUILD_SCRIPT := $(APP_PROJECT_PATH)\/Android.mk<\/pre>\n<p>Android.mk \uff1a<\/p>\n<pre>LOCAL_PATH := $(call my-dir)\r\n\r\nsubdirs := $(addprefix $(LOCAL_PATH)\/,$(addsuffix \/Android.mk, \\\r\n\t\tcrypto \\\r\n\t\tssl \\\r\n\t\tapps \\\r\n\t))\r\n\r\ninclude $(subdirs)<\/pre>\n<p>apps\/Android.mk \uff1a<\/p>\n<pre>LOCAL_PATH:= $(call my-dir)\r\ninclude $(CLEAR_VARS)\r\n\r\nLOCAL_SRC_FILES:= \\\r\n\tapp_rand.c \\\r\n\tapps.c \\\r\n\tasn1pars.c \\\r\n\tca.c \\\r\n\tciphers.c \\\r\n\tcrl.c \\\r\n\tcrl2p7.c \\\r\n\tdgst.c \\\r\n\tdh.c \\\r\n\tdhparam.c \\\r\n\tdsa.c \\\r\n\tdsaparam.c \\\r\n\tecparam.c \\\r\n\tec.c \\\r\n\tenc.c \\\r\n\tengine.c \\\r\n\terrstr.c \\\r\n\tgendh.c \\\r\n\tgendsa.c \\\r\n\tgenpkey.c \\\r\n\tgenrsa.c \\\r\n\tnseq.c \\\r\n\tocsp.c \\\r\n\topenssl.c \\\r\n\tpasswd.c \\\r\n\tpkcs12.c \\\r\n\tpkcs7.c \\\r\n\tpkcs8.c \\\r\n\tpkey.c \\\r\n\tpkeyparam.c \\\r\n\tpkeyutl.c \\\r\n\tprime.c \\\r\n\trand.c \\\r\n\treq.c \\\r\n\trsa.c \\\r\n\trsautl.c \\\r\n\ts_cb.c \\\r\n\ts_client.c \\\r\n\ts_server.c \\\r\n\ts_socket.c \\\r\n\ts_time.c \\\r\n\tsess_id.c \\\r\n\tsmime.c \\\r\n\tspeed.c \\\r\n\tspkac.c \\\r\n\tsrp.c \\\r\n\tverify.c \\\r\n\tversion.c \\\r\n\tx509.c\r\n\r\nLOCAL_SHARED_LIBRARIES := \\\r\n\tlibssl \\\r\n\tlibcrypto\r\n\r\nLOCAL_C_INCLUDES := \\\r\n\t$(NDK_PROJECT_PATH) \\\r\n\t$(NDK_PROJECT_PATH)\/include \\\r\n\t$(NDK_PROJECT_PATH)\/..\/include\r\n\r\nLOCAL_CFLAGS := -DMONOLITH\r\n\r\ninclude $(LOCAL_PATH)\/..\/android-config.mk\r\n\r\nLOCAL_CFLAGS += -DOPENSSL_NO_DTLS1\r\n\r\nLOCAL_MODULE:= openssl\r\n\r\nLOCAL_MODULE_TAGS := tests\r\n\r\ninclude $(BUILD_EXECUTABLE)<\/pre>\n<p>crypto\/Android.mk \uff08\u5c24\u5176\u6ce8\u610f\u9700\u8981\u6253\u5f00 engine \uff09\uff1a<\/p>\n<pre>LOCAL_PATH:= $(call my-dir)\r\n\r\narm_cflags := -DOPENSSL_BN_ASM_MONT -DAES_ASM -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM\r\narm_src_files := \\\r\n    aes\/asm\/aes-armv4.S \\\r\n    bn\/asm\/armv4-mont.S \\\r\n    sha\/asm\/sha1-armv4-large.S \\\r\n    sha\/asm\/sha256-armv4.S \\\r\n    sha\/asm\/sha512-armv4.S\r\n\r\nnon_arm_src_files := aes\/aes_core.c\r\n\r\nlocal_src_files := \\\r\n\tcryptlib.c \\\r\n\tmem.c \\\r\n\tmem_clr.c \\\r\n\tmem_dbg.c \\\r\n\tcversion.c \\\r\n\tex_data.c \\\r\n\tcpt_err.c \\\r\n\tebcdic.c \\\r\n\tuid.c \\\r\n\to_time.c \\\r\n\to_str.c \\\r\n\to_dir.c \\\r\n\to_fips.c \\\r\n\to_init.c \\\r\n\tfips_ers.c \\\r\n\taes\/aes_cbc.c \\\r\n\taes\/aes_cfb.c \\\r\n\taes\/aes_ctr.c \\\r\n\taes\/aes_ecb.c \\\r\n\taes\/aes_ige.c \\\r\n\taes\/aes_misc.c \\\r\n\taes\/aes_ofb.c \\\r\n\taes\/aes_wrap.c \\\r\n\tasn1\/a_bitstr.c \\\r\n\tasn1\/a_bool.c \\\r\n\tasn1\/a_bytes.c \\\r\n\tasn1\/a_d2i_fp.c \\\r\n\tasn1\/a_digest.c \\\r\n\tasn1\/a_dup.c \\\r\n\tasn1\/a_enum.c \\\r\n\tasn1\/a_gentm.c \\\r\n\tasn1\/a_i2d_fp.c \\\r\n\tasn1\/a_int.c \\\r\n\tasn1\/a_mbstr.c \\\r\n\tasn1\/a_object.c \\\r\n\tasn1\/a_octet.c \\\r\n\tasn1\/a_print.c \\\r\n\tasn1\/a_set.c \\\r\n\tasn1\/a_sign.c \\\r\n\tasn1\/a_strex.c \\\r\n\tasn1\/a_strnid.c \\\r\n\tasn1\/a_time.c \\\r\n\tasn1\/a_type.c \\\r\n\tasn1\/a_utctm.c \\\r\n\tasn1\/a_utf8.c \\\r\n\tasn1\/a_verify.c \\\r\n\tasn1\/ameth_lib.c \\\r\n\tasn1\/asn1_err.c \\\r\n\tasn1\/asn1_gen.c \\\r\n\tasn1\/asn1_lib.c \\\r\n\tasn1\/asn1_par.c \\\r\n\tasn1\/asn_mime.c \\\r\n\tasn1\/asn_moid.c \\\r\n\tasn1\/asn_pack.c \\\r\n\tasn1\/bio_asn1.c \\\r\n\tasn1\/bio_ndef.c \\\r\n\tasn1\/d2i_pr.c \\\r\n\tasn1\/d2i_pu.c \\\r\n\tasn1\/evp_asn1.c \\\r\n\tasn1\/f_enum.c \\\r\n\tasn1\/f_int.c \\\r\n\tasn1\/f_string.c \\\r\n\tasn1\/i2d_pr.c \\\r\n\tasn1\/i2d_pu.c \\\r\n\tasn1\/n_pkey.c \\\r\n\tasn1\/nsseq.c \\\r\n\tasn1\/p5_pbe.c \\\r\n\tasn1\/p5_pbev2.c \\\r\n\tasn1\/p8_pkey.c \\\r\n\tasn1\/t_bitst.c \\\r\n\tasn1\/t_crl.c \\\r\n\tasn1\/t_pkey.c \\\r\n\tasn1\/t_req.c \\\r\n\tasn1\/t_spki.c \\\r\n\tasn1\/t_x509.c \\\r\n\tasn1\/t_x509a.c \\\r\n\tasn1\/tasn_dec.c \\\r\n\tasn1\/tasn_enc.c \\\r\n\tasn1\/tasn_fre.c \\\r\n\tasn1\/tasn_new.c \\\r\n\tasn1\/tasn_prn.c \\\r\n\tasn1\/tasn_typ.c \\\r\n\tasn1\/tasn_utl.c \\\r\n\tasn1\/x_algor.c \\\r\n\tasn1\/x_attrib.c \\\r\n\tasn1\/x_bignum.c \\\r\n\tasn1\/x_crl.c \\\r\n\tasn1\/x_exten.c \\\r\n\tasn1\/x_info.c \\\r\n\tasn1\/x_long.c \\\r\n\tasn1\/x_name.c \\\r\n\tasn1\/x_nx509.c \\\r\n\tasn1\/x_pkey.c \\\r\n\tasn1\/x_pubkey.c \\\r\n\tasn1\/x_req.c \\\r\n\tasn1\/x_sig.c \\\r\n\tasn1\/x_spki.c \\\r\n\tasn1\/x_val.c \\\r\n\tasn1\/x_x509.c \\\r\n\tasn1\/x_x509a.c \\\r\n\tbf\/bf_cfb64.c \\\r\n\tbf\/bf_ecb.c \\\r\n\tbf\/bf_enc.c \\\r\n\tbf\/bf_ofb64.c \\\r\n\tbf\/bf_skey.c \\\r\n\tbio\/b_dump.c \\\r\n\tbio\/b_print.c \\\r\n\tbio\/b_sock.c \\\r\n\tbio\/bf_buff.c \\\r\n\tbio\/bf_nbio.c \\\r\n\tbio\/bf_null.c \\\r\n\tbio\/bio_cb.c \\\r\n\tbio\/bio_err.c \\\r\n\tbio\/bio_lib.c \\\r\n\tbio\/bss_acpt.c \\\r\n\tbio\/bss_bio.c \\\r\n\tbio\/bss_conn.c \\\r\n\tbio\/bss_dgram.c \\\r\n\tbio\/bss_fd.c \\\r\n\tbio\/bss_file.c \\\r\n\tbio\/bss_log.c \\\r\n\tbio\/bss_mem.c \\\r\n\tbio\/bss_null.c \\\r\n\tbio\/bss_sock.c \\\r\n\tbn\/bn_add.c \\\r\n\tbn\/bn_asm.c \\\r\n\tbn\/bn_blind.c \\\r\n\tbn\/bn_const.c \\\r\n\tbn\/bn_ctx.c \\\r\n\tbn\/bn_depr.c \\\r\n\tbn\/bn_div.c \\\r\n\tbn\/bn_err.c \\\r\n\tbn\/bn_exp.c \\\r\n\tbn\/bn_exp2.c \\\r\n\tbn\/bn_gcd.c \\\r\n\tbn\/bn_gf2m.c \\\r\n\tbn\/bn_kron.c \\\r\n\tbn\/bn_lib.c \\\r\n\tbn\/bn_mod.c \\\r\n\tbn\/bn_mont.c \\\r\n\tbn\/bn_mpi.c \\\r\n\tbn\/bn_mul.c \\\r\n\tbn\/bn_nist.c \\\r\n\tbn\/bn_prime.c \\\r\n\tbn\/bn_print.c \\\r\n\tbn\/bn_rand.c \\\r\n\tbn\/bn_recp.c \\\r\n\tbn\/bn_shift.c \\\r\n\tbn\/bn_sqr.c \\\r\n\tbn\/bn_sqrt.c \\\r\n\tbn\/bn_word.c \\\r\n\tbn\/bn_x931p.c \\\r\n\tbuffer\/buf_err.c \\\r\n\tbuffer\/buf_str.c \\\r\n\tbuffer\/buffer.c \\\r\n\tcmac\/cmac.c \\\r\n\tcmac\/cm_ameth.c \\\r\n\tcmac\/cm_pmeth.c \\\r\n\tcomp\/c_rle.c \\\r\n\tcomp\/c_zlib.c \\\r\n\tcomp\/comp_err.c \\\r\n\tcomp\/comp_lib.c \\\r\n\tconf\/conf_api.c \\\r\n\tconf\/conf_def.c \\\r\n\tconf\/conf_err.c \\\r\n\tconf\/conf_lib.c \\\r\n\tconf\/conf_mall.c \\\r\n\tconf\/conf_mod.c \\\r\n\tconf\/conf_sap.c \\\r\n\tdes\/cbc_cksm.c \\\r\n\tdes\/cbc_enc.c \\\r\n\tdes\/cfb64ede.c \\\r\n\tdes\/cfb64enc.c \\\r\n\tdes\/cfb_enc.c \\\r\n\tdes\/des_enc.c \\\r\n\tdes\/des_old.c \\\r\n\tdes\/des_old2.c \\\r\n\tdes\/ecb3_enc.c \\\r\n\tdes\/ecb_enc.c \\\r\n\tdes\/ede_cbcm_enc.c \\\r\n\tdes\/enc_read.c \\\r\n\tdes\/enc_writ.c \\\r\n\tdes\/fcrypt.c \\\r\n\tdes\/fcrypt_b.c \\\r\n\tdes\/ofb64ede.c \\\r\n\tdes\/ofb64enc.c \\\r\n\tdes\/ofb_enc.c \\\r\n\tdes\/pcbc_enc.c \\\r\n\tdes\/qud_cksm.c \\\r\n\tdes\/rand_key.c \\\r\n\tdes\/read2pwd.c \\\r\n\tdes\/rpc_enc.c \\\r\n\tdes\/set_key.c \\\r\n\tdes\/str2key.c \\\r\n\tdes\/xcbc_enc.c \\\r\n\tdh\/dh_ameth.c \\\r\n\tdh\/dh_asn1.c \\\r\n\tdh\/dh_check.c \\\r\n\tdh\/dh_depr.c \\\r\n\tdh\/dh_err.c \\\r\n\tdh\/dh_gen.c \\\r\n\tdh\/dh_key.c \\\r\n\tdh\/dh_lib.c \\\r\n\tdh\/dh_pmeth.c \\\r\n\tdh\/dh_prn.c \\\r\n\tdsa\/dsa_ameth.c \\\r\n\tdsa\/dsa_asn1.c \\\r\n\tdsa\/dsa_depr.c \\\r\n\tdsa\/dsa_err.c \\\r\n\tdsa\/dsa_gen.c \\\r\n\tdsa\/dsa_key.c \\\r\n\tdsa\/dsa_lib.c \\\r\n\tdsa\/dsa_ossl.c \\\r\n\tdsa\/dsa_pmeth.c \\\r\n\tdsa\/dsa_prn.c \\\r\n\tdsa\/dsa_sign.c \\\r\n\tdsa\/dsa_vrf.c \\\r\n\tdso\/dso_dl.c \\\r\n\tdso\/dso_dlfcn.c \\\r\n\tdso\/dso_err.c \\\r\n\tdso\/dso_lib.c \\\r\n\tdso\/dso_null.c \\\r\n\tdso\/dso_openssl.c \\\r\n\tdso\/dso_vms.c \\\r\n\tdso\/dso_win32.c \\\r\n\tdso\/dso_beos.c \\\r\n\tec\/ec2_mult.c \\\r\n\tec\/ec2_smpl.c \\\r\n\tec\/ec_ameth.c \\\r\n\tec\/ec_asn1.c \\\r\n\tec\/ec_check.c \\\r\n\tec\/ec_curve.c \\\r\n\tec\/ec_cvt.c \\\r\n\tec\/ec_err.c \\\r\n\tec\/ec_key.c \\\r\n\tec\/ec_lib.c \\\r\n\tec\/ec_mult.c \\\r\n\tec\/ec_pmeth.c \\\r\n\tec\/ec_print.c \\\r\n\tec\/eck_prn.c \\\r\n\tec\/ecp_mont.c \\\r\n\tec\/ecp_nist.c \\\r\n\tec\/ecp_smpl.c \\\r\n\tec\/ecp_nistp224.c \\\r\n\tec\/ecp_nistp256.c \\\r\n\tec\/ecp_nistp521.c \\\r\n\tec\/ecp_nistputil.c \\\r\n\tec\/ecp_oct.c \\\r\n\tec\/ec2_oct.c \\\r\n\tec\/ec_oct.c \\\r\n\tecdh\/ech_err.c \\\r\n\tecdh\/ech_key.c \\\r\n\tecdh\/ech_lib.c \\\r\n\tecdh\/ech_ossl.c \\\r\n\tecdsa\/ecs_asn1.c \\\r\n\tecdsa\/ecs_err.c \\\r\n\tecdsa\/ecs_lib.c \\\r\n\tecdsa\/ecs_ossl.c \\\r\n\tecdsa\/ecs_sign.c \\\r\n\tecdsa\/ecs_vrf.c \\\r\n\terr\/err.c \\\r\n\terr\/err_all.c \\\r\n\terr\/err_prn.c \\\r\n\tevp\/bio_b64.c \\\r\n\tevp\/bio_enc.c \\\r\n\tevp\/bio_md.c \\\r\n\tevp\/bio_ok.c \\\r\n\tevp\/c_all.c \\\r\n\tevp\/c_allc.c \\\r\n\tevp\/c_alld.c \\\r\n\tevp\/digest.c \\\r\n\tevp\/e_aes.c \\\r\n\tevp\/e_bf.c \\\r\n\tevp\/e_des.c \\\r\n\tevp\/e_des3.c \\\r\n\tevp\/e_null.c \\\r\n\tevp\/e_old.c \\\r\n\tevp\/e_rc2.c \\\r\n\tevp\/e_rc4.c \\\r\n\tevp\/e_rc5.c \\\r\n\tevp\/e_xcbc_d.c \\\r\n\tevp\/encode.c \\\r\n\tevp\/evp_acnf.c \\\r\n\tevp\/evp_enc.c \\\r\n\tevp\/evp_err.c \\\r\n\tevp\/evp_key.c \\\r\n\tevp\/evp_lib.c \\\r\n\tevp\/evp_pbe.c \\\r\n\tevp\/evp_pkey.c \\\r\n\tevp\/m_dss.c \\\r\n\tevp\/m_dss1.c \\\r\n\tevp\/m_ecdsa.c \\\r\n\tevp\/m_md4.c \\\r\n\tevp\/m_md5.c \\\r\n\tevp\/m_mdc2.c \\\r\n\tevp\/m_null.c \\\r\n\tevp\/m_ripemd.c \\\r\n\tevp\/m_sha1.c \\\r\n\tevp\/m_sigver.c \\\r\n\tevp\/m_wp.c \\\r\n\tevp\/names.c \\\r\n\tevp\/p5_crpt.c \\\r\n\tevp\/p5_crpt2.c \\\r\n\tevp\/p_dec.c \\\r\n\tevp\/p_enc.c \\\r\n\tevp\/p_lib.c \\\r\n\tevp\/p_open.c \\\r\n\tevp\/p_seal.c \\\r\n\tevp\/p_sign.c \\\r\n\tevp\/p_verify.c \\\r\n\tevp\/pmeth_fn.c \\\r\n\tevp\/pmeth_gn.c \\\r\n\tevp\/pmeth_lib.c \\\r\n\tevp\/e_idea.c \\\r\n\tevp\/e_camellia.c \\\r\n\tevp\/e_seed.c \\\r\n\tevp\/e_cast.c \\\r\n\tevp\/m_md2.c \\\r\n\tevp\/m_sha.c \\\r\n\tevp\/evp_fips.c \\\r\n\tevp\/e_aes_cbc_hmac_sha1.c \\\r\n\tevp\/e_rc4_hmac_md5.c \\\r\n\thmac\/hm_ameth.c \\\r\n\thmac\/hm_pmeth.c \\\r\n\thmac\/hmac.c \\\r\n\tkrb5\/krb5_asn.c \\\r\n\tlhash\/lh_stats.c \\\r\n\tlhash\/lhash.c \\\r\n\tmd4\/md4_dgst.c \\\r\n\tmd4\/md4_one.c \\\r\n\tmd5\/md5_dgst.c \\\r\n\tmd5\/md5_one.c \\\r\n\tmodes\/cbc128.c \\\r\n\tmodes\/ctr128.c \\\r\n\tmodes\/cts128.c \\\r\n\tmodes\/cfb128.c \\\r\n\tmodes\/ofb128.c \\\r\n\tmodes\/gcm128.c \\\r\n\tmodes\/ccm128.c \\\r\n\tmodes\/xts128.c \\\r\n\tobjects\/o_names.c \\\r\n\tobjects\/obj_dat.c \\\r\n\tobjects\/obj_err.c \\\r\n\tobjects\/obj_lib.c \\\r\n\tobjects\/obj_xref.c \\\r\n\tocsp\/ocsp_asn.c \\\r\n\tocsp\/ocsp_cl.c \\\r\n\tocsp\/ocsp_err.c \\\r\n\tocsp\/ocsp_ext.c \\\r\n\tocsp\/ocsp_ht.c \\\r\n\tocsp\/ocsp_lib.c \\\r\n\tocsp\/ocsp_prn.c \\\r\n\tocsp\/ocsp_srv.c \\\r\n\tocsp\/ocsp_vfy.c \\\r\n\tpem\/pem_all.c \\\r\n\tpem\/pem_err.c \\\r\n\tpem\/pem_info.c \\\r\n\tpem\/pem_lib.c \\\r\n\tpem\/pem_oth.c \\\r\n\tpem\/pem_pk8.c \\\r\n\tpem\/pem_pkey.c \\\r\n\tpem\/pem_seal.c \\\r\n\tpem\/pem_sign.c \\\r\n\tpem\/pem_x509.c \\\r\n\tpem\/pem_xaux.c \\\r\n\tpem\/pvkfmt.c \\\r\n\tpkcs12\/p12_add.c \\\r\n\tpkcs12\/p12_asn.c \\\r\n\tpkcs12\/p12_attr.c \\\r\n\tpkcs12\/p12_crpt.c \\\r\n\tpkcs12\/p12_crt.c \\\r\n\tpkcs12\/p12_decr.c \\\r\n\tpkcs12\/p12_init.c \\\r\n\tpkcs12\/p12_key.c \\\r\n\tpkcs12\/p12_kiss.c \\\r\n\tpkcs12\/p12_mutl.c \\\r\n\tpkcs12\/p12_npas.c \\\r\n\tpkcs12\/p12_p8d.c \\\r\n\tpkcs12\/p12_p8e.c \\\r\n\tpkcs12\/p12_utl.c \\\r\n\tpkcs12\/pk12err.c \\\r\n\tpkcs7\/pk7_asn1.c \\\r\n\tpkcs7\/pk7_attr.c \\\r\n\tpkcs7\/pk7_doit.c \\\r\n\tpkcs7\/pk7_lib.c\t\\\r\n\tpkcs7\/pk7_mime.c \\\r\n\tpkcs7\/pk7_smime.c \\\r\n\tpkcs7\/pkcs7err.c \\\r\n\tpkcs7\/bio_pk7.c \\\r\n\tpqueue\/pqueue.c \\\r\n\trand\/md_rand.c \\\r\n\trand\/rand_egd.c \\\r\n\trand\/rand_err.c \\\r\n\trand\/rand_lib.c \\\r\n\trand\/rand_unix.c \\\r\n\trand\/randfile.c \\\r\n\trc2\/rc2_cbc.c \\\r\n\trc2\/rc2_ecb.c \\\r\n\trc2\/rc2_skey.c \\\r\n\trc2\/rc2cfb64.c \\\r\n\trc2\/rc2ofb64.c \\\r\n\trc4\/rc4_enc.c \\\r\n\trc4\/rc4_skey.c \\\r\n\trc4\/rc4_utl.c \\\r\n\tripemd\/rmd_dgst.c \\\r\n\tripemd\/rmd_one.c \\\r\n\trsa\/rsa_ameth.c \\\r\n\trsa\/rsa_asn1.c \\\r\n\trsa\/rsa_chk.c \\\r\n\trsa\/rsa_eay.c \\\r\n\trsa\/rsa_err.c \\\r\n\trsa\/rsa_gen.c \\\r\n\trsa\/rsa_lib.c \\\r\n\trsa\/rsa_none.c \\\r\n\trsa\/rsa_null.c \\\r\n\trsa\/rsa_oaep.c \\\r\n\trsa\/rsa_pk1.c \\\r\n\trsa\/rsa_pmeth.c \\\r\n\trsa\/rsa_prn.c \\\r\n\trsa\/rsa_pss.c \\\r\n\trsa\/rsa_saos.c \\\r\n\trsa\/rsa_sign.c \\\r\n\trsa\/rsa_ssl.c \\\r\n\trsa\/rsa_x931.c \\\r\n\trsa\/rsa_depr.c \\\r\n\trsa\/rsa_crpt.c \\\r\n\tsha\/sha1_one.c \\\r\n\tsha\/sha1dgst.c \\\r\n\tsha\/sha256.c \\\r\n\tsha\/sha512.c \\\r\n\tsha\/sha_dgst.c \\\r\n\tsha\/sha_one.c \\\r\n\tsrp\/srp_lib.c \\\r\n\tsrp\/srp_vfy.c \\\r\n\tstack\/stack.c \\\r\n\tts\/ts_err.c \\\r\n\ttxt_db\/txt_db.c \\\r\n\tui\/ui_compat.c \\\r\n\tui\/ui_err.c \\\r\n\tui\/ui_lib.c \\\r\n\tui\/ui_openssl.c \\\r\n\tui\/ui_util.c \\\r\n\tx509\/by_dir.c \\\r\n\tx509\/by_file.c \\\r\n\tx509\/x509_att.c \\\r\n\tx509\/x509_cmp.c \\\r\n\tx509\/x509_d2.c \\\r\n\tx509\/x509_def.c \\\r\n\tx509\/x509_err.c \\\r\n\tx509\/x509_ext.c \\\r\n\tx509\/x509_lu.c \\\r\n\tx509\/x509_obj.c \\\r\n\tx509\/x509_r2x.c \\\r\n\tx509\/x509_req.c \\\r\n\tx509\/x509_set.c \\\r\n\tx509\/x509_trs.c \\\r\n\tx509\/x509_txt.c \\\r\n\tx509\/x509_v3.c \\\r\n\tx509\/x509_vfy.c \\\r\n\tx509\/x509_vpm.c \\\r\n\tx509\/x509cset.c \\\r\n\tx509\/x509name.c \\\r\n\tx509\/x509rset.c \\\r\n\tx509\/x509spki.c \\\r\n\tx509\/x509type.c \\\r\n\tx509\/x_all.c \\\r\n\tx509v3\/pcy_cache.c \\\r\n\tx509v3\/pcy_data.c \\\r\n\tx509v3\/pcy_lib.c \\\r\n\tx509v3\/pcy_map.c \\\r\n\tx509v3\/pcy_node.c \\\r\n\tx509v3\/pcy_tree.c \\\r\n\tx509v3\/v3_akey.c \\\r\n\tx509v3\/v3_akeya.c \\\r\n\tx509v3\/v3_alt.c \\\r\n\tx509v3\/v3_asid.c \\\r\n\tx509v3\/v3_addr.c \\\r\n\tx509v3\/v3_bcons.c \\\r\n\tx509v3\/v3_bitst.c \\\r\n\tx509v3\/v3_conf.c \\\r\n\tx509v3\/v3_cpols.c \\\r\n\tx509v3\/v3_crld.c \\\r\n\tx509v3\/v3_enum.c \\\r\n\tx509v3\/v3_extku.c \\\r\n\tx509v3\/v3_genn.c \\\r\n\tx509v3\/v3_ia5.c \\\r\n\tx509v3\/v3_info.c \\\r\n\tx509v3\/v3_int.c \\\r\n\tx509v3\/v3_lib.c \\\r\n\tx509v3\/v3_ncons.c \\\r\n\tx509v3\/v3_ocsp.c \\\r\n\tx509v3\/v3_pci.c \\\r\n\tx509v3\/v3_pcia.c \\\r\n\tx509v3\/v3_pcons.c \\\r\n\tx509v3\/v3_pku.c \\\r\n\tx509v3\/v3_pmaps.c \\\r\n\tx509v3\/v3_prn.c \\\r\n\tx509v3\/v3_purp.c \\\r\n\tx509v3\/v3_skey.c \\\r\n\tx509v3\/v3_sxnet.c \\\r\n\tx509v3\/v3_utl.c \\\r\n\tx509v3\/v3err.c \\\r\n\tengine\/eng_err.c \\\r\n\tengine\/eng_lib.c \\\r\n\tengine\/eng_list.c \\\r\n\tengine\/eng_init.c \\\r\n\tengine\/eng_ctrl.c \\\r\n\tengine\/eng_table.c \\\r\n\tengine\/eng_pkey.c \\\r\n\tengine\/eng_fat.c \\\r\n\tengine\/tb_rsa.c \\\r\n\tengine\/tb_dsa.c \\\r\n\tengine\/tb_ecdsa.c \\\r\n\tengine\/tb_dh.c \\\r\n\tengine\/tb_ecdh.c \\\r\n\tengine\/tb_rand.c \\\r\n\tengine\/tb_store.c \\\r\n\tengine\/tb_cipher.c \\\r\n\tengine\/tb_digest.c \\\r\n\tengine\/tb_pkmeth.c \\\r\n\tengine\/tb_asnmth.c \\\r\n\tengine\/eng_openssl.c \\\r\n\tengine\/eng_cnf.c \\\r\n\tengine\/eng_dyn.c \\\r\n\tengine\/eng_cryptodev.c \\\r\n\tengine\/eng_rsax.c \\\r\n\tengine\/eng_rdrand.c \\\r\n\tengine\/eng_all.c \\\r\n\tfakewapi.c\r\n\r\nlocal_c_includes := \\\r\n\t$(NDK_PROJECT_PATH) \\\r\n\t$(NDK_PROJECT_PATH)\/crypto\/asn1 \\\r\n\t$(NDK_PROJECT_PATH)\/crypto\/evp \\\r\n\t$(NDK_PROJECT_PATH)\/include \\\r\n\t$(NDK_PROJECT_PATH)\/include\/openssl \\\r\n\t$(NDK_PROJECT_PATH)\/..\/include \r\n\r\nlocal_c_flags := -DNO_WINDOWS_BRAINDEATH\r\n\r\ninclude $(CLEAR_VARS)\r\ninclude $(LOCAL_PATH)\/..\/android-config.mk\r\nLOCAL_SRC_FILES += $(local_src_files)\r\nLOCAL_CFLAGS += $(local_c_flags)\r\nLOCAL_C_INCLUDES += $(local_c_includes)\r\nLOCAL_LDLIBS += -lz\r\nifeq ($(TARGET_ARCH),arm)\r\n\tLOCAL_SRC_FILES += $(arm_src_files)\r\n\tLOCAL_CFLAGS += $(arm_cflags)\r\nelse\r\n\tLOCAL_SRC_FILES += $(non_arm_src_files)\r\nendif\r\nifeq ($(TARGET_SIMULATOR),true)\r\n\t# Make valgrind happy.\r\n\tLOCAL_CFLAGS += -DPURIFY\r\n    LOCAL_LDLIBS += -ldl\r\nendif\r\nLOCAL_MODULE_TAGS := optional\r\nLOCAL_MODULE:= libcrypto\r\ninclude $(BUILD_SHARED_LIBRARY)\r\n\r\nifeq ($(WITH_HOST_DALVIK),true)\r\n    include $(CLEAR_VARS)\r\n    include $(LOCAL_PATH)\/..\/android-config.mk\r\n    LOCAL_SRC_FILES += $(local_src_files)\r\n    LOCAL_CFLAGS += $(local_c_flags) -DPURIFY\r\n    LOCAL_C_INCLUDES += $(local_c_includes)\r\n    LOCAL_SRC_FILES += $(non_arm_src_files)\r\n    LOCAL_LDLIBS += -ldl\r\n    LOCAL_MODULE_TAGS := optional\r\n    LOCAL_MODULE:= libcrypto\r\n    include $(BUILD_SHARED_LIBRARY)\r\nendif\r\n\r\ninclude $(CLEAR_VARS)\r\ninclude $(LOCAL_PATH)\/..\/android-config.mk\r\nLOCAL_SRC_FILES += $(local_src_files)\r\nLOCAL_CFLAGS += $(local_c_flags) -DPURIFY\r\nLOCAL_C_INCLUDES += $(local_c_includes)\r\nLOCAL_SRC_FILES += $(non_arm_src_files)\r\nLOCAL_LDLIBS += -ldl\r\nLOCAL_MODULE_TAGS := optional\r\nLOCAL_MODULE:= libcrypto_static\r\ninclude $(BUILD_STATIC_LIBRARY)<\/pre>\n<p>ssl\/Android.mk \uff1a<\/p>\n<pre>LOCAL_PATH:= $(call my-dir)\r\n\r\nlocal_c_includes := \\\r\n\t$(NDK_PROJECT_PATH) \\\r\n\t$(NDK_PROJECT_PATH)\/include \\\r\n\t$(NDK_PROJECT_PATH)\/crypto \\\r\n\t$(NDK_PROJECT_PATH)\/..\/include\r\n\r\nlocal_src_files:= \\\r\n\ts2_meth.c \\\r\n\ts2_srvr.c \\\r\n\ts2_clnt.c \\\r\n\ts2_lib.c \\\r\n\ts2_enc.c \\\r\n\ts2_pkt.c \\\r\n\ts3_meth.c \\\r\n\ts3_srvr.c \\\r\n\ts3_clnt.c \\\r\n\ts3_lib.c \\\r\n\ts3_enc.c \\\r\n\ts3_pkt.c \\\r\n\ts3_both.c \\\r\n\ts23_meth.c \\\r\n\ts23_srvr.c \\\r\n\ts23_clnt.c \\\r\n\ts23_lib.c \\\r\n\ts23_pkt.c \\\r\n\tt1_meth.c \\\r\n\tt1_srvr.c \\\r\n\tt1_clnt.c \\\r\n\tt1_lib.c \\\r\n\tt1_enc.c \\\r\n\tt1_reneg.c \\\r\n\td1_meth.c \\\r\n\td1_srvr.c \\\r\n\td1_clnt.c \\\r\n\td1_lib.c \\\r\n\td1_pkt.c \\\r\n\td1_both.c \\\r\n\td1_enc.c \\\r\n\td1_srtp.c \\\r\n\tssl_lib.c \\\r\n\tssl_err2.c \\\r\n\tssl_cert.c \\\r\n\tssl_sess.c \\\r\n\tssl_ciph.c \\\r\n\tssl_stat.c \\\r\n\tssl_rsa.c \\\r\n\tssl_asn1.c \\\r\n\tssl_txt.c \\\r\n\tssl_algs.c \\\r\n\tbio_ssl.c \\\r\n\tssl_err.c \\\r\n\tkssl.c \\\r\n\ttls_srp.c\r\n\r\ninclude $(CLEAR_VARS)\r\ninclude $(LOCAL_PATH)\/..\/android-config.mk\r\nLOCAL_SRC_FILES += $(local_src_files)\r\nLOCAL_C_INCLUDES += $(local_c_includes)\r\nLOCAL_SHARED_LIBRARIES += libcrypto\r\nLOCAL_MODULE_TAGS := optional\r\nLOCAL_MODULE:= libssl\r\ninclude $(BUILD_SHARED_LIBRARY)\r\n\r\nifeq ($(WITH_HOST_DALVIK),true)\r\n    include $(CLEAR_VARS)\r\n    include $(LOCAL_PATH)\/..\/android-config.mk\r\n    LOCAL_SRC_FILES += $(local_src_files)\r\n    LOCAL_C_INCLUDES += $(local_c_includes)\r\n    LOCAL_SHARED_LIBRARIES += libcrypto\r\n    LOCAL_MODULE_TAGS := optional\r\n    LOCAL_MODULE:= libssl\r\n    include $(BUILD_SHARED_LIBRARY)\r\nendif\r\n\r\ninclude $(CLEAR_VARS)\r\ninclude $(LOCAL_PATH)\/..\/android-config.mk\r\nLOCAL_SRC_FILES:= ssltest.c\r\nLOCAL_C_INCLUDES += $(local_c_includes)\r\nLOCAL_SHARED_LIBRARIES := libssl libcrypto\r\nLOCAL_MODULE:= ssltest\r\nLOCAL_MODULE_TAGS := optional\r\ninclude $(BUILD_EXECUTABLE)<\/pre>\n<p>\u63a5\u7740\uff0c\u751f\u6210 libcrypto \u7684\u4e00\u7968\u5b50\u6c47\u7f16\u4ee3\u7801\u3002\u5bf9\u4e8e ARM \u7684\u673a\u5668\u6709\uff1a<\/p>\n<pre class=\"brush: bash; title: \u4ee3\u7801; notranslate\" title=\"\u4ee3\u7801\">\r\nperl crypto\/aes\/asm\/aes-armv4.pl        &gt; crypto\/aes\/asm\/aes-armv4.S\r\nperl crypto\/bn\/asm\/armv4-mont.pl        &gt; crypto\/bn\/asm\/armv4-mont.S\r\nperl crypto\/sha\/asm\/sha1-armv4-large.pl &gt; crypto\/sha\/asm\/sha1-armv4-large.S\r\nperl crypto\/sha\/asm\/sha256-armv4.pl     &gt; crypto\/sha\/asm\/sha256-armv4.S\r\nperl crypto\/sha\/asm\/sha512-armv4.pl     &gt; crypto\/sha\/asm\/sha512-armv4.S\r\n<\/pre>\n<p>\u65b0\u5efa crypto\/fakewapi.c \uff0c\u7528\u4e00\u4e9b dummy \u586b\u5145\u67d0\u4e9b\u652f\u6301 WAPI \u7684\u673a\u5668\u4e0a wpa_supplicant \u6240\u9700\u7684\u4e00\u4e9b\u51fd\u6570\uff08\u6e90\u7801\u6ca1\u627e\u5230\uff0c<span style=\"color: #ff0000;\">\u8fd9\u5c06\u5e9f\u6389 WAPI \u652f\u6301<\/span>\uff09\uff1a<\/p>\n<pre class=\"brush: cpp; title: \u4ee3\u7801; notranslate\" title=\"\u4ee3\u7801\">\r\nint i2o_ECPrivateKey(int i, ...) {\r\n  return 0;\r\n}\r\n\r\nint i2o_ECDSA_SIG(int i, ...) {\r\n  return 0;\r\n}\r\n\r\nint o2i_ECDSA_SIG(int i, ...) {\r\n  return 0;\r\n}\r\n\r\n<\/pre>\n<p>\u4fdd\u5b58\u4e0b\u9762\u8fd9\u4e2a patch \u5230 jsse.patch \uff1a<\/p>\n<pre class=\"brush: diff; title: \u4ee3\u7801; notranslate\" title=\"\u4ee3\u7801\">\r\n--- openssl-1.0.0b.orig\/ssl\/ssl.h\t2010-11-30 00:03:46.000000000 +0000\r\n+++ openssl-1.0.0b\/ssl\/ssl.h\t2010-11-30 00:03:47.000000000 +0000\r\n@@ -1133,6 +1133,9 @@ struct ssl_st\r\n \t\/* This can also be in the session once a session is established *\/\r\n \tSSL_SESSION *session;\r\n\r\n+        \/* This can be disabled to prevent the use of uncached sessions *\/\r\n+\tint session_creation_enabled;\r\n+\r\n \t\/* Default generate session ID callback. *\/\r\n \tGEN_SESSION_CB generate_session_id;\r\n\r\n@@ -1546,6 +1549,7 @@ const SSL_CIPHER *SSL_get_current_cipher\r\n int\tSSL_CIPHER_get_bits(const SSL_CIPHER *c,int *alg_bits);\r\n char *\tSSL_CIPHER_get_version(const SSL_CIPHER *c);\r\n const char *\tSSL_CIPHER_get_name(const SSL_CIPHER *c);\r\n+const char *\tSSL_CIPHER_authentication_method(const SSL_CIPHER *c);\r\n\r\n int\tSSL_get_fd(const SSL *s);\r\n int\tSSL_get_rfd(const SSL *s);\r\n@@ -1554,6 +1558,7 @@ const char  * SSL_get_cipher_list(const\r\n char *\tSSL_get_shared_ciphers(const SSL *s, char *buf, int len);\r\n int\tSSL_get_read_ahead(const SSL * s);\r\n int\tSSL_pending(const SSL *s);\r\n+const char *\tSSL_authentication_method(const SSL *c);\r\n #ifndef OPENSSL_NO_SOCK\r\n int\tSSL_set_fd(SSL *s, int fd);\r\n int\tSSL_set_rfd(SSL *s, int fd);\r\n@@ -1565,6 +1570,7 @@ BIO *\tSSL_get_rbio(const SSL *s);\r\n BIO *\tSSL_get_wbio(const SSL *s);\r\n #endif\r\n int\tSSL_set_cipher_list(SSL *s, const char *str);\r\n+int\tSSL_set_cipher_lists(SSL *s, STACK_OF(SSL_CIPHER) *sk);\r\n void\tSSL_set_read_ahead(SSL *s, int yes);\r\n int\tSSL_get_verify_mode(const SSL *s);\r\n int\tSSL_get_verify_depth(const SSL *s);\r\n@@ -1580,6 +1586,8 @@ int\tSSL_use_PrivateKey(SSL *ssl, EVP_PKE\r\n int\tSSL_use_PrivateKey_ASN1(int pk,SSL *ssl, const unsigned char *d, long len);\r\n int\tSSL_use_certificate(SSL *ssl, X509 *x);\r\n int\tSSL_use_certificate_ASN1(SSL *ssl, const unsigned char *d, int len);\r\n+int\tSSL_use_certificate_chain(SSL *ssl, STACK_OF(X509) *cert_chain);\r\n+STACK_OF(X509) * SSL_get_certificate_chain(SSL *ssl, X509 *x);\r\n\r\n #ifndef OPENSSL_NO_STDIO\r\n int\tSSL_use_RSAPrivateKey_file(SSL *ssl, const char *file, int type);\r\n@@ -1615,6 +1623,7 @@ void\tSSL_copy_session_id(SSL *to,const S\r\n SSL_SESSION *SSL_SESSION_new(void);\r\n const unsigned char *SSL_SESSION_get_id(const SSL_SESSION *s,\r\n \t\t\t\t\tunsigned int *len);\r\n+const char *\tSSL_SESSION_get_version(const SSL_SESSION *s);\r\n #ifndef OPENSSL_NO_FP_API\r\n int\tSSL_SESSION_print_fp(FILE *fp,const SSL_SESSION *ses);\r\n #endif\r\n@@ -1624,6 +1633,7 @@ int\tSSL_SESSION_print(BIO *fp,const SSL_\r\n void\tSSL_SESSION_free(SSL_SESSION *ses);\r\n int\ti2d_SSL_SESSION(SSL_SESSION *in,unsigned char **pp);\r\n int\tSSL_set_session(SSL *to, SSL_SESSION *session);\r\n+void\tSSL_set_session_creation_enabled(SSL *, int);\r\n int\tSSL_CTX_add_session(SSL_CTX *s, SSL_SESSION *c);\r\n int\tSSL_CTX_remove_session(SSL_CTX *,SSL_SESSION *c);\r\n int\tSSL_CTX_set_generate_session_id(SSL_CTX *, GEN_SESSION_CB);\r\n@@ -2066,6 +2076,7 @@ void ERR_load_SSL_strings(void);\r\n #define SSL_F_SSL_UNDEFINED_VOID_FUNCTION\t\t 244\r\n #define SSL_F_SSL_USE_CERTIFICATE\t\t\t 198\r\n #define SSL_F_SSL_USE_CERTIFICATE_ASN1\t\t\t 199\r\n+#define SSL_F_SSL_USE_CERTIFICATE_CHAIN\t\t\t 2000\r\n #define SSL_F_SSL_USE_CERTIFICATE_FILE\t\t\t 200\r\n #define SSL_F_SSL_USE_PRIVATEKEY\t\t\t 201\r\n #define SSL_F_SSL_USE_PRIVATEKEY_ASN1\t\t\t 202\r\n@@ -2272,6 +2283,7 @@ void ERR_load_SSL_strings(void);\r\n #define SSL_R_SCSV_RECEIVED_WHEN_RENEGOTIATING\t\t 345\r\n #define SSL_R_SERVERHELLO_TLSEXT\t\t\t 275\r\n #define SSL_R_SESSION_ID_CONTEXT_UNINITIALIZED\t\t 277\r\n+#define SSL_R_SESSION_MAY_NOT_BE_CREATED\t\t 2000\r\n #define SSL_R_SHORT_READ\t\t\t\t 219\r\n #define SSL_R_SIGNATURE_FOR_NON_SIGNING_CERTIFICATE\t 220\r\n #define SSL_R_SSL23_DOING_SESSION_ID_REUSE\t\t 221\r\n--- openssl-1.0.0b.orig\/ssl\/d1_clnt.c\t2010-01-26 19:46:29.000000000 +0000\r\n+++ openssl-1.0.0b\/ssl\/d1_clnt.c\t2010-11-30 00:03:47.000000000 +0000\r\n@@ -613,6 +613,12 @@ int dtls1_client_hello(SSL *s)\r\n #endif\r\n \t\t\t(s-&gt;session-&gt;not_resumable))\r\n \t\t\t{\r\n+\t\t        if (!s-&gt;session_creation_enabled)\r\n+\t\t\t\t{\r\n+\t\t\t\tssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_HANDSHAKE_FAILURE);\r\n+\t\t\t\tSSLerr(SSL_F_DTLS1_CLIENT_HELLO,SSL_R_SESSION_MAY_NOT_BE_CREATED);\r\n+\t\t\t\tgoto err;\r\n+\t\t\t\t}\r\n \t\t\tif (!ssl_get_new_session(s,0))\r\n \t\t\t\tgoto err;\r\n \t\t\t}\r\n--- openssl-1.0.0b.orig\/ssl\/s23_clnt.c\t2010-02-16 14:20:40.000000000 +0000\r\n+++ openssl-1.0.0b\/ssl\/s23_clnt.c\t2010-11-30 00:03:47.000000000 +0000\r\n@@ -687,6 +687,13 @@ static int ssl23_get_server_hello(SSL *s\r\n\r\n \t\/* Since, if we are sending a ssl23 client hello, we are not\r\n \t * reusing a session-id *\/\r\n+        if (!s-&gt;session_creation_enabled)\r\n+\t\t{\r\n+\t\tif (!(s-&gt;client_version == SSL2_VERSION))\r\n+\t\t\tssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_HANDSHAKE_FAILURE);\r\n+\t\tSSLerr(SSL_F_SSL23_GET_SERVER_HELLO,SSL_R_SESSION_MAY_NOT_BE_CREATED);\r\n+\t\tgoto err;\r\n+\t\t}\r\n \tif (!ssl_get_new_session(s,0))\r\n \t\tgoto err;\r\n\r\n--- openssl-1.0.0b.orig\/ssl\/s3_both.c\t2010-11-30 00:03:46.000000000 +0000\r\n+++ openssl-1.0.0b\/ssl\/s3_both.c\t2010-11-30 00:03:47.000000000 +0000\r\n@@ -347,8 +347,11 @@ unsigned long ssl3_output_cert_chain(SSL\r\n \tunsigned long l=7;\r\n \tBUF_MEM *buf;\r\n \tint no_chain;\r\n+\tSTACK_OF(X509) *cert_chain;\r\n\r\n-\tif ((s-&gt;mode &amp; SSL_MODE_NO_AUTO_CHAIN) || s-&gt;ctx-&gt;extra_certs)\r\n+\tcert_chain = SSL_get_certificate_chain(s, x);\r\n+\r\n+\tif ((s-&gt;mode &amp; SSL_MODE_NO_AUTO_CHAIN) || s-&gt;ctx-&gt;extra_certs || cert_chain)\r\n \t\tno_chain = 1;\r\n \telse\r\n \t\tno_chain = 0;\r\n@@ -400,6 +403,10 @@ unsigned long ssl3_output_cert_chain(SSL\r\n \t\t\treturn(0);\r\n \t\t}\r\n\r\n+\tfor (i=0; i&lt;sk_X509_num(cert_chain); i++) +\t\tif (ssl3_add_cert_to_buf(buf, &amp;l, sk_X509_value(cert_chain,i))) +\t\t\treturn(0); +  \tl-=7;  \tp=(unsigned char *)&amp;(buf-&gt;data[4]);\r\n \tl2n3(l,p);\r\n--- openssl-1.0.0b.orig\/ssl\/s3_clnt.c\t2010-11-30 00:03:46.000000000 +0000\r\n+++ openssl-1.0.0b\/ssl\/s3_clnt.c\t2010-11-30 00:03:47.000000000 +0000\r\n@@ -686,6 +686,12 @@ int ssl3_client_hello(SSL *s)\r\n #endif\r\n \t\t\t(sess-&gt;not_resumable))\r\n \t\t\t{\r\n+\t\t        if (!s-&gt;session_creation_enabled)\r\n+\t\t\t\t{\r\n+\t\t\t\tssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_HANDSHAKE_FAILURE);\r\n+\t\t\t\tSSLerr(SSL_F_SSL3_CLIENT_HELLO,SSL_R_SESSION_MAY_NOT_BE_CREATED);\r\n+\t\t\t\tgoto err;\r\n+\t\t\t\t}\r\n \t\t\tif (!ssl_get_new_session(s,0))\r\n \t\t\t\tgoto err;\r\n \t\t\t}\r\n@@ -894,6 +900,12 @@ int ssl3_get_server_hello(SSL *s)\r\n \t\ts-&gt;hit=0;\r\n \t\tif (s-&gt;session-&gt;session_id_length &gt; 0)\r\n \t\t\t{\r\n+\t\t        if (!s-&gt;session_creation_enabled)\r\n+\t\t\t\t{\r\n+\t\t\t\tssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_HANDSHAKE_FAILURE);\r\n+\t\t\t\tSSLerr(SSL_F_SSL3_GET_SERVER_HELLO,SSL_R_SESSION_MAY_NOT_BE_CREATED);\r\n+\t\t\t\tgoto err;\r\n+\t\t\t\t}\r\n \t\t\tif (!ssl_get_new_session(s,0))\r\n \t\t\t\t{\r\n \t\t\t\tal=SSL_AD_INTERNAL_ERROR;\r\n--- openssl-1.0.0b.orig\/ssl\/s3_srvr.c\t2010-11-30 00:03:46.000000000 +0000\r\n+++ openssl-1.0.0b\/ssl\/s3_srvr.c\t2010-11-30 00:03:47.000000000 +0000\r\n@@ -902,6 +902,12 @@ int ssl3_get_client_hello(SSL *s)\r\n \t *\/\r\n \tif ((s-&gt;new_session &amp;&amp; (s-&gt;options &amp; SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION)))\r\n \t\t{\r\n+\t        if (!s-&gt;session_creation_enabled)\r\n+\t\t\t{\r\n+\t\t\tssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_HANDSHAKE_FAILURE);\r\n+\t\t\tSSLerr(SSL_F_SSL3_GET_CLIENT_HELLO,SSL_R_SESSION_MAY_NOT_BE_CREATED);\r\n+\t\t\tgoto err;\r\n+\t\t}\r\n \t\tif (!ssl_get_new_session(s,1))\r\n \t\t\tgoto err;\r\n \t\t}\r\n@@ -916,6 +922,12 @@ int ssl3_get_client_hello(SSL *s)\r\n \t\t\tgoto err;\r\n \t\telse \/* i == 0 *\/\r\n \t\t\t{\r\n+\t\t        if (!s-&gt;session_creation_enabled)\r\n+\t\t\t\t{\r\n+\t\t\t\tssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_HANDSHAKE_FAILURE);\r\n+\t\t\t\tSSLerr(SSL_F_SSL3_GET_CLIENT_HELLO,SSL_R_SESSION_MAY_NOT_BE_CREATED);\r\n+\t\t\t\tgoto err;\r\n+\t\t\t\t}\r\n \t\t\tif (!ssl_get_new_session(s,1))\r\n \t\t\t\tgoto err;\r\n \t\t\t}\r\n--- openssl-1.0.0b.orig\/ssl\/ssl_ciph.c\t2010-06-15 17:25:14.000000000 +0000\r\n+++ openssl-1.0.0b\/ssl\/ssl_ciph.c\t2010-11-30 00:03:47.000000000 +0000\r\n@@ -1652,6 +1652,52 @@ int SSL_CIPHER_get_bits(const SSL_CIPHER\r\n \treturn(ret);\r\n \t}\r\n\r\n+\/* return string version of key exchange algorithm *\/\r\n+const char* SSL_CIPHER_authentication_method(const SSL_CIPHER* cipher)\r\n+\t{\r\n+\tswitch (cipher-&gt;algorithm_mkey)\r\n+\t\t{\r\n+\tcase SSL_kRSA:\r\n+\t\treturn SSL_TXT_RSA;\r\n+\tcase SSL_kDHr:\r\n+\t\treturn SSL_TXT_DH &quot;_&quot; SSL_TXT_RSA;\r\n+\tcase SSL_kDHd:\r\n+\t\treturn SSL_TXT_DH &quot;_&quot; SSL_TXT_DSS;\r\n+\tcase SSL_kEDH:\r\n+\t\tswitch (cipher-&gt;algorithm_auth)\r\n+\t\t\t{\r\n+\t\tcase SSL_aDSS:\r\n+\t\t\treturn &quot;DHE_&quot; SSL_TXT_DSS;\r\n+\t\tcase SSL_aRSA:\r\n+\t\t\treturn &quot;DHE_&quot; SSL_TXT_RSA;\r\n+\t\tcase SSL_aNULL:\r\n+\t\t\treturn SSL_TXT_DH &quot;_anon&quot;;\r\n+\t\tdefault:\r\n+\t\t\treturn &quot;UNKNOWN&quot;;\r\n+                        }\r\n+\tcase SSL_kKRB5:\r\n+\t\treturn SSL_TXT_KRB5;\r\n+\tcase SSL_kECDHr:\r\n+\t\treturn SSL_TXT_ECDH &quot;_&quot; SSL_TXT_RSA;\r\n+\tcase SSL_kECDHe:\r\n+\t\treturn SSL_TXT_ECDH &quot;_&quot; SSL_TXT_ECDSA;\r\n+\tcase SSL_kEECDH:\r\n+\t\tswitch (cipher-&gt;algorithm_auth)\r\n+\t\t\t{\r\n+\t\tcase SSL_aECDSA:\r\n+\t\t\treturn &quot;ECDHE_&quot; SSL_TXT_ECDSA;\r\n+\t\tcase SSL_aRSA:\r\n+\t\t\treturn &quot;ECDHE_&quot; SSL_TXT_RSA;\r\n+\t\tcase SSL_aNULL:\r\n+\t\t\treturn SSL_TXT_ECDH &quot;_anon&quot;;\r\n+\t\tdefault:\r\n+\t\t\treturn &quot;UNKNOWN&quot;;\r\n+                        }\r\n+        default:\r\n+\t\treturn &quot;UNKNOWN&quot;;\r\n+\t\t}\r\n+\t}\r\n+\r\n SSL_COMP *ssl3_comp_find(STACK_OF(SSL_COMP) *sk, int n)\r\n \t{\r\n \tSSL_COMP *ctmp;\r\n--- openssl-1.0.0b.orig\/ssl\/ssl_err.c\t2010-11-30 00:03:46.000000000 +0000\r\n+++ openssl-1.0.0b\/ssl\/ssl_err.c\t2010-11-30 00:03:47.000000000 +0000\r\n@@ -465,6 +465,7 @@ static ERR_STRING_DATA SSL_str_reasons[]\r\n {ERR_REASON(SSL_R_SCSV_RECEIVED_WHEN_RENEGOTIATING),&quot;scsv received when renegotiating&quot;},\r\n {ERR_REASON(SSL_R_SERVERHELLO_TLSEXT)    ,&quot;serverhello tlsext&quot;},\r\n {ERR_REASON(SSL_R_SESSION_ID_CONTEXT_UNINITIALIZED),&quot;session id context uninitialized&quot;},\r\n+{ERR_REASON(SSL_R_SESSION_MAY_NOT_BE_CREATED),&quot;session may not be created&quot;},\r\n {ERR_REASON(SSL_R_SHORT_READ)            ,&quot;short read&quot;},\r\n {ERR_REASON(SSL_R_SIGNATURE_FOR_NON_SIGNING_CERTIFICATE),&quot;signature for non signing certificate&quot;},\r\n {ERR_REASON(SSL_R_SSL23_DOING_SESSION_ID_REUSE),&quot;ssl23 doing session id reuse&quot;},\r\n--- openssl-1.0.0b.orig\/ssl\/ssl_lib.c\t2010-11-30 00:03:46.000000000 +0000\r\n+++ openssl-1.0.0b\/ssl\/ssl_lib.c\t2010-11-30 00:03:47.000000000 +0000\r\n@@ -326,6 +326,7 @@ SSL *SSL_new(SSL_CTX *ctx)\r\n \tOPENSSL_assert(s-&gt;sid_ctx_length &lt;= sizeof s-&gt;sid_ctx);\r\n \tmemcpy(&amp;s-&gt;sid_ctx,&amp;ctx-&gt;sid_ctx,sizeof(s-&gt;sid_ctx));\r\n \ts-&gt;verify_callback=ctx-&gt;default_verify_callback;\r\n+\ts-&gt;session_creation_enabled=1;\r\n \ts-&gt;generate_session_id=ctx-&gt;generate_session_id;\r\n\r\n \ts-&gt;param = X509_VERIFY_PARAM_new();\r\n@@ -1311,6 +1312,32 @@ int SSL_set_cipher_list(SSL *s,const cha\r\n \treturn 1;\r\n \t}\r\n\r\n+\/** specify the ciphers to be used by the SSL *\/\r\n+int SSL_set_cipher_lists(SSL *s,STACK_OF(SSL_CIPHER) *sk)\r\n+\t{\r\n+\tSTACK_OF(SSL_CIPHER) *tmp_cipher_list;\r\n+\r\n+\tif (sk == NULL)\r\n+\t\treturn 0;\r\n+\r\n+        \/* Based on end of ssl_create_cipher_list *\/\r\n+\ttmp_cipher_list = sk_SSL_CIPHER_dup(sk);\r\n+\tif (tmp_cipher_list == NULL)\r\n+\t\t{\r\n+\t\treturn 0;\r\n+\t\t}\r\n+\tif (s-&gt;cipher_list != NULL)\r\n+\t\tsk_SSL_CIPHER_free(s-&gt;cipher_list);\r\n+\ts-&gt;cipher_list = sk;\r\n+\tif (s-&gt;cipher_list_by_id != NULL)\r\n+\t\tsk_SSL_CIPHER_free(s-&gt;cipher_list_by_id);\r\n+\ts-&gt;cipher_list_by_id = tmp_cipher_list;\r\n+\t(void)sk_SSL_CIPHER_set_cmp_func(s-&gt;cipher_list_by_id,ssl_cipher_ptr_id_cmp);\r\n+\r\n+\tsk_SSL_CIPHER_sort(s-&gt;cipher_list_by_id);\r\n+\treturn 1;\r\n+\t}\r\n+\r\n \/* works well for SSLv2, not so good for SSLv3 *\/\r\n char *SSL_get_shared_ciphers(const SSL *s,char *buf,int len)\r\n \t{\r\n@@ -2551,18 +2578,45 @@ SSL_METHOD *ssl_bad_method(int ver)\r\n \treturn(NULL);\r\n \t}\r\n\r\n-const char *SSL_get_version(const SSL *s)\r\n+static const char *ssl_get_version(int version)\r\n \t{\r\n-\tif (s-&gt;version == TLS1_VERSION)\r\n+\tif (version == TLS1_VERSION)\r\n \t\treturn(&quot;TLSv1&quot;);\r\n-\telse if (s-&gt;version == SSL3_VERSION)\r\n+\telse if (version == SSL3_VERSION)\r\n \t\treturn(&quot;SSLv3&quot;);\r\n-\telse if (s-&gt;version == SSL2_VERSION)\r\n+\telse if (version == SSL2_VERSION)\r\n \t\treturn(&quot;SSLv2&quot;);\r\n \telse\r\n \t\treturn(&quot;unknown&quot;);\r\n \t}\r\n\r\n+const char *SSL_get_version(const SSL *s)\r\n+\t{\r\n+\t\treturn ssl_get_version(s-&gt;version);\r\n+\t}\r\n+\r\n+const char *SSL_SESSION_get_version(const SSL_SESSION *s)\r\n+\t{\r\n+\t\treturn ssl_get_version(s-&gt;ssl_version);\r\n+\t}\r\n+\r\n+const char* SSL_authentication_method(const SSL* ssl)\r\n+\t{\r\n+\tif (ssl-&gt;cert != NULL &amp;&amp; ssl-&gt;cert-&gt;rsa_tmp != NULL)\r\n+\t\treturn SSL_TXT_RSA &quot;_&quot; SSL_TXT_EXPORT;\r\n+\tswitch (ssl-&gt;version)\r\n+\t\t{\r\n+\tcase SSL2_VERSION:\r\n+\t\treturn SSL_TXT_RSA;\r\n+\tcase SSL3_VERSION:\r\n+\tcase TLS1_VERSION:\r\n+\tcase DTLS1_VERSION:\r\n+\t\treturn SSL_CIPHER_authentication_method(ssl-&gt;s3-&gt;tmp.new_cipher);\r\n+\tdefault:\r\n+\t\treturn &quot;UNKNOWN&quot;;\r\n+\t\t}\r\n+\t}\r\n+\r\n SSL *SSL_dup(SSL *s)\r\n \t{\r\n \tSTACK_OF(X509_NAME) *sk;\r\n--- openssl-1.0.0b.orig\/ssl\/ssl_locl.h\t2010-11-30 00:03:46.000000000 +0000\r\n+++ openssl-1.0.0b\/ssl\/ssl_locl.h\t2010-11-30 00:03:47.000000000 +0000\r\n@@ -456,6 +456,7 @@\r\n typedef struct cert_pkey_st\r\n \t{\r\n \tX509 *x509;\r\n+\tSTACK_OF(X509) *cert_chain;\r\n \tEVP_PKEY *privatekey;\r\n \t} CERT_PKEY;\r\n\r\n--- openssl-1.0.0b.orig\/ssl\/ssl_rsa.c\t2009-09-12 23:09:26.000000000 +0000\r\n+++ openssl-1.0.0b\/ssl\/ssl_rsa.c\t2010-11-30 00:03:47.000000000 +0000\r\n@@ -697,6 +697,42 @@ int SSL_CTX_use_PrivateKey_ASN1(int type\r\n \t}\r\n\r\n+int SSL_use_certificate_chain(SSL *ssl, STACK_OF(X509) *cert_chain)\r\n+\t{\r\n+\tif (ssl == NULL)\r\n+\t\t{\r\n+\t\tSSLerr(SSL_F_SSL_USE_CERTIFICATE_CHAIN,ERR_R_PASSED_NULL_PARAMETER);\r\n+\t\treturn(0);\r\n+\t\t}\r\n+\tif (ssl-&gt;cert == NULL)\r\n+\t\t{\r\n+\t\tSSLerr(SSL_F_SSL_USE_CERTIFICATE_CHAIN,SSL_R_NO_CERTIFICATE_ASSIGNED);\r\n+\t\treturn(0);\r\n+\t\t}\r\n+\tif (ssl-&gt;cert-&gt;key == NULL)\r\n+\t\t{\r\n+\t\tSSLerr(SSL_F_SSL_USE_CERTIFICATE_CHAIN,SSL_R_NO_CERTIFICATE_ASSIGNED);\r\n+\t\treturn(0);\r\n+\t\t}\r\n+\tssl-&gt;cert-&gt;key-&gt;cert_chain = cert_chain;\r\n+\treturn(1);\r\n+\t}\r\n+\r\n+STACK_OF(X509) *SSL_get_certificate_chain(SSL *ssl, X509 *x)\r\n+\t{\r\n+\tint i;\r\n+\tif (x == NULL)\r\n+\t\treturn NULL;\r\n+\tif (ssl == NULL)\r\n+\t\treturn NULL;\r\n+\tif (ssl-&gt;cert == NULL)\r\n+\t\treturn NULL;\r\n+\tfor (i = 0; i &lt; SSL_PKEY_NUM; i++) +\t\tif (ssl-&gt;cert-&gt;pkeys[i].x509 == x)\r\n+\t\t\treturn ssl-&gt;cert-&gt;pkeys[i].cert_chain;\r\n+\treturn NULL;\r\n+\t}\r\n+\r\n #ifndef OPENSSL_NO_STDIO\r\n \/* Read a file that contains our certificate in &quot;PEM&quot; format,\r\n  * possibly followed by a sequence of CA certificates that should be\r\n--- openssl-1.0.0b.orig\/ssl\/ssl_sess.c\t2010-02-01 16:49:42.000000000 +0000\r\n+++ openssl-1.0.0b\/ssl\/ssl_sess.c\t2010-11-30 00:03:47.000000000 +0000\r\n@@ -261,6 +261,11 @@ static int def_generate_session_id(const\r\n \treturn 0;\r\n }\r\n\r\n+void SSL_set_session_creation_enabled (SSL *s, int creation_enabled)\r\n+\t{\r\n+\ts-&gt;session_creation_enabled = creation_enabled;\r\n+\t}\r\n+\r\n int ssl_get_new_session(SSL *s, int session)\r\n \t{\r\n \t\/* This gets used by clients and servers. *\/\r\n@@ -269,6 +274,8 @@ int ssl_get_new_session(SSL *s, int sess\r\n \tSSL_SESSION *ss=NULL;\r\n \tGEN_SESSION_CB cb = def_generate_session_id;\r\n\r\n+\t\/* caller should check this if they can do better error handling *\/\r\n+        if (!s-&gt;session_creation_enabled) return(0);\r\n \tif ((ss=SSL_SESSION_new()) == NULL) return(0);\r\n\r\n \t\/* If the context has a default timeout, use it *\/\r\n<\/pre>\n<p>\u63a5\u7740\u5e94\u7528\u8fd9\u4e2a patch \uff1a<\/p>\n<pre class=\"brush: bash; title: \u4ee3\u7801; notranslate\" title=\"\u4ee3\u7801\">\r\npatch -p1 &lt; jsse.patch\r\n<\/pre>\n<p>\u6709\u4e9b\u5730\u65b9\u4f1a\u5408\u5e76\u5931\u8d25\uff0c\u9700\u8981\u53c2\u7167 rej \u6587\u4ef6\u624b\u52a8 merge \u3002\u8fd9\u4e2a patch \u4f1a\u63d0\u4f9b Android \u9700\u8981\u7684\u4e00\u4e9b\u9644\u52a0\u51fd\u6570\u3002<\/p>\n<p>\u6253\u5f00 crypto\/bf\/blowfish.h \uff0c\u5220\u9664\u5f00\u5934\u7684\u4ee5\u4e0b\u5185\u5bb9\uff1a<\/p>\n<pre class=\"brush: diff; title: \u4ee3\u7801; notranslate\" title=\"\u4ee3\u7801\">\r\ndiff --git a\/crypto\/bf\/blowfish.h b\/crypto\/bf\/blowfish.h\r\nindex 4b6c892..2a9ae98 100644\r\n--- a\/crypto\/bf\/blowfish.h\r\n+++ b\/crypto\/bf\/blowfish.h\r\n@@ -65,10 +65,6 @@\r\n extern &quot;C&quot; {\r\n #endif\r\n\r\n-#ifdef OPENSSL_NO_BF\r\n-#error BF is disabled.\r\n-#endif\r\n-\r\n #define BF_ENCRYPT     1\r\n #define BF_DECRYPT     0\r\n<\/pre>\n<p>\u8fd9\u6837\uff0c\u6e90\u7801\u7684\u4fee\u6539\u57fa\u672c\u5c31\u5b8c\u6210\u4e86\u3002<\/p>\n<h3>\u7f16\u8bd1<\/h3>\n<p>\u7f16\u8bd1\u7684\u8fc7\u7a0b\u76f8\u5bf9\u7b80\u5355\uff0c\u5728 OpenSSL \u6e90\u7801\u76ee\u5f55\u4e0b\u8f93\u5165\uff1a<\/p>\n<pre class=\"brush: bash; title: \u4ee3\u7801; notranslate\" title=\"\u4ee3\u7801\">\r\nNDK_PROJECT_PATH=. \/path\/to\/android-ndk\/ndk-build\r\n<\/pre>\n<p>\u7a0d\u7b49\u7247\u523b\u5373\u53ef\u3002<\/p>\n<h3>\u5b89\u88c5<\/h3>\n<p><span style=\"color: #ff0000;\">\u6ce8\u610f\uff01\u7531\u4e8e Android \u7684\u7cfb\u7edf\u6838\u5fc3\u5e93\u9700\u8981\u8fde\u63a5 libcrypt \u548c libssl \uff0c\u66f4\u6362\u7f3a\u5c11\u7b26\u53f7\u7684 OpenSSL \u5e93\u4f1a\u5bfc\u81f4\u5927\u91cf\u7a0b\u5e8f\u65e0\u6cd5\u542f\u52a8\u751a\u81f3\u624b\u673a\u53d8\u7816\uff0c\u8bf7\u786e\u8ba4 OpenSSL \u5e93\u542b\u6709 Android \u7cfb\u7edf\u6240\u9700\u7684\u6240\u6709\u7b26\u53f7\u3002<\/span><\/p>\n<p>\u5b89\u88c5\u524d\u8bf7\u786e\u8ba4\u624b\u673a\u5df2\u7ecf root \u4e14 su \u548c busybox \u53ef\u7528\u3002<\/p>\n<p>\u7b2c\u4e00\u6b65\u662f\u4e0b\u8f7d <a href=\"http:\/\/developer.android.com\/sdk\/index.html\" target=\"_blank\">Android SDK<\/a> \u6216\u8005\u4ece\u7cfb\u7edf\u8f6f\u4ef6\u6e90\u91cc\u9762\u5b89\u88c5 adb \u3002\u7b2c\u4e8c\u6b65\u5c31\u662f\u6253\u5f00\u624b\u673a\u4e0a\u7684 USB \u8c03\u8bd5\u3002<span style=\"color: #ff0000;\">\u66f4\u6362 OpenSSL \u5e93\u540e\uff0c\u5728\u786e\u5b9a\u5404\u4e2a\u7a0b\u5e8f\u8fd0\u884c\u6b63\u5e38\u3001\u624b\u673a\u80fd\u6b63\u5e38\u91cd\u542f\u5e76\u4f7f\u7528 Wifi \u4e4b\u524d\u8bf7\u4e0d\u8981\u5173\u6389 USB \u8c03\u8bd5\u3002<\/span><\/p>\n<p>\u7b2c\u4e09\u6b65\uff0c\u7528 adb \u628a\u7f16\u8bd1\u597d\u7684\u6587\u4ef6\u4f20\u9001\u81f3\u624b\u673a SD \u5361\u4e2d\uff1a<\/p>\n<pre class=\"brush: bash; title: \u4ee3\u7801; notranslate\" title=\"\u4ee3\u7801\">\r\nadb push libs\/armeabi\/libcrypto.so \/sdcard\/\r\nadb push libs\/armeabi\/libssl.so \/sdcard\/\r\nadb push libs\/armeabi\/openssl \/sdcard\/\r\n<\/pre>\n<p>\u7b2c\u56db\u6b65\uff0c\u8f93\u5165 adb shell \uff0c\u542f\u52a8\u624b\u673a\u4e0a\u7684\u7ec8\u7aef\u3002\u5728\u91cc\u9762\u952e\u5165\u4ee5\u4e0b\u547d\u4ee4\uff1a<\/p>\n<pre class=\"brush: bash; title: \u4ee3\u7801; notranslate\" title=\"\u4ee3\u7801\">\r\nbusybox mount -o remount,rw \/system\r\nmkdir \/system\/lib\/old-ssl\r\nmv \/system\/lib\/libcrypto.so \/system\/lib\/libssl.so \/system\/lib\/old-ssl\/\r\ncp \/sdcard\/libcrypto.so \/system\/lib\/\r\ncp \/sdcard\/libssl.so \/system\/lib\/\r\ncp \/sdcard\/openssl \/system\/xbin\/\r\nchmod 0644 \/system\/lib\/libcrypto.so \/system\/lib\/libssl.so\r\nchmod 0755 \/system\/xbin\/openssl\r\nrm \/sdcard\/libcrypto.so \/sdcard\/libssl.so \/sdcard\/openssl\r\nbusybox mount -o remount,ro \/system\r\n<\/pre>\n<p>\u7b2c\u4e94\u6b65\uff0c\u6d4b\u8bd5\u3002\u65b0\u5f00\u4e00\u4e2a adb shell \uff0c\u8f93\u5165 su \uff0c\u89c2\u5bdf\u94fe\u63a5\u5668\u662f\u5426\u62a5\u9519\u3002\u8f93\u5165\u201c openssl version \u201d\u67e5\u770b\u7248\u672c\u4fe1\u606f\u3002\u5173\u95ed\u624b\u673a\u4e0a\u7684\u6d4f\u89c8\u5668\u548c Wifi \uff0c\u6740\u6389\u6240\u6709\u8fdb\u7a0b\uff0c\u91cd\u5f00 Wifi \u548c\u6d4f\u89c8\u5668\uff0c\u8bbf\u95ee\u5e26\u6709 SSL \u7684\u7f51\u7ad9\uff0c\u89c2\u5bdf\u5176\u5de5\u4f5c\u662f\u5426\u6b63\u5e38\u3002\u5728\u6b64\u671f\u95f4\u53ef\u4ee5\u7528\u201c adb logcat \u201d\u67e5\u770b\u65e5\u5fd7\u3002<\/p>\n<p>\u82e5\u51fa\u73b0\u5de5\u4f5c\u4e0d\u6b63\u5e38\u7684\u7a0b\u5e8f\uff0c\u5728 adb shell \u91cc\u624b\u5de5\u8c03\u7528\uff0c\u89c2\u5bdf\u94fe\u63a5\u5668\u8f93\u51fa\uff0c\u8003\u8651\u662f\u5426\u80fd patch \u4ee3\u7801\u91cd\u65b0\u7f16\u8bd1\u6765\u4fee\u590d\u3002\u82e5\u65e0\u6cd5\u4fee\u590d\uff0c\u5c31\u53ea\u597d\u8fd8\u539f OpenSSL \u7684\u5907\u4efd\u4e86\uff1a<\/p>\n<pre class=\"brush: bash; title: \u4ee3\u7801; notranslate\" title=\"\u4ee3\u7801\">\r\nbusybox mount -o remount,rw \/system\r\nmv \/system\/lib\/old-ssl\/* \/system\/lib\r\nrmdir \/system\/lib\/old-ssl\r\nrm \/system\/xbin\/openssl\r\nbusybox mount -o remount,ro \/system\r\n<\/pre>\n<p>\u82e5\u6d4b\u8bd5\u6210\u529f\uff0c\u5219\u53ef\u4ee5\u201c adb reboot \u201d\u6765\u91cd\u542f\u624b\u673a\uff0c\u770b\u770b\u5404\u90e8\u4ef6\u662f\u5426\u4ecd\u7136\u80fd\u6b63\u5e38\u5de5\u4f5c\u3002\u82e5\u624b\u673a\u4e00\u76f4\u505c\u7559\u5728\u542f\u52a8\u753b\u9762\uff0c\u5219\u53ef\u4ee5\u5c1d\u8bd5\u901a\u8fc7 adb shell \u8fd8\u539f\u539f\u6765\u7684 OpenSSL \u5e93\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u4e0d\u77e5\u9053\u4ece\u4ec0\u4e48\u65f6\u5019\u8d77\uff0c\u5927\u5bb6\u90fd\u559c\u6b22\u628a\u7b80\u5355\u7684\u4e8b\u60c5\u590d\u6742\u5316\uff0c\u597d\u50cf\u8d8a\u96be\u7528\u5c31\u8d8a\u725b\u903c\u4e00\u6837\u3002\u88c5\u903c\u7684\u5012\u662f\u65e0\u6240\u8c13\uff0c\u7b49\u5230\u8981\u7528\u7684\u65f6\u5019\u5c31\u50bb &hellip; <a href=\"http:\/\/blog.dword1511.info\/?p=4214\" class=\"more-link\">\u7ee7\u7eed\u9605\u8bfb<span class=\"screen-reader-text\">\u4e3a\u8be5\u6b7b\u7684 Android \u7f16\u8bd1\u65b0\u7248\u672c\u7684 OpenSSL \u5e93<\/span> <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_mi_skip_tracking":false},"categories":[14,11],"tags":[],"_links":{"self":[{"href":"http:\/\/blog.dword1511.info\/index.php?rest_route=\/wp\/v2\/posts\/4214"}],"collection":[{"href":"http:\/\/blog.dword1511.info\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/blog.dword1511.info\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/blog.dword1511.info\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/blog.dword1511.info\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=4214"}],"version-history":[{"count":7,"href":"http:\/\/blog.dword1511.info\/index.php?rest_route=\/wp\/v2\/posts\/4214\/revisions"}],"predecessor-version":[{"id":4221,"href":"http:\/\/blog.dword1511.info\/index.php?rest_route=\/wp\/v2\/posts\/4214\/revisions\/4221"}],"wp:attachment":[{"href":"http:\/\/blog.dword1511.info\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4214"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.dword1511.info\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4214"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.dword1511.info\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4214"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}