Page MenuHomeFreeBSD

D14634.id40111.diff
No OneTemporary

D14634.id40111.diff

Index: security/Makefile
===================================================================
--- security/Makefile
+++ security/Makefile
@@ -449,6 +449,7 @@
SUBDIR += openssh-askpass
SUBDIR += openssh-portable
SUBDIR += openssl
+ SUBDIR += openssl-chelsio
SUBDIR += openssl-devel
SUBDIR += openssl-unsafe
SUBDIR += openssl_tpm_engine
Index: security/openssl-chelsio/Makefile
===================================================================
--- /dev/null
+++ security/openssl-chelsio/Makefile
@@ -0,0 +1,172 @@
+# Created by: Dirk Froemberg <dirk@FreeBSD.org>
+# $FreeBSD$
+
+PORTNAME= openssl
+PORTVERSION= 1.0.2n
+PKGNAMESUFFIX= -chelsio
+CATEGORIES= security devel
+MASTER_SITES= http://www.openssl.org/source/ \
+ ftp://ftp.cert.dfn.de/pub/tools/net/openssl/source/
+DIST_SUBDIR= ${PORTNAME}-${DISTVERSION:C/[a-z]$//}
+
+MAINTAINER= jhb@FreeBSD.org
+COMMENT= SSL and crypto library supporting Chelsio TLS offload
+
+LICENSE= OpenSSL
+LICENSE_FILE= ${WRKSRC}/LICENSE
+
+CONFLICTS_INSTALL= libressl-[0-9]* \
+ libressl-devel-[0-9]* \
+ openssl-devel-[0-9]*
+
+OPTIONS_DEFINE= PADLOCK RFC3779 THREADS ZLIB
+OPTIONS_DEFAULT= ASM MD2 SCTP SSE2 SSL2 SSL3 THREADS
+OPTIONS_DEFINE_amd64= EC
+OPTIONS_DEFAULT_amd64= EC
+TARGET_ARCH?= ${MACHINE_ARCH}
+.if ${TARGET_ARCH} == "mips64el"
+OPTIONS_DEFINE_mips= EC
+OPTIONS_DEFAULT_mips= EC
+.endif
+OPTIONS_GROUP= CIPHERS HASHES OPTIMIZE PROTOCOLS
+OPTIONS_GROUP_CIPHERS= EXPCIPHERS RC5
+OPTIONS_GROUP_HASHES= MD2
+OPTIONS_GROUP_OPTIMIZE= ASM SSE2
+OPTIONS_GROUP_PROTOCOLS= SCTP SSL2 SSL3
+.if ${TARGET_ARCH} == "i386"
+OPTIONS_GROUP_OPTIMIZE+= I386
+.endif
+OPTIONS_SUB= yes
+ASM_DESC= Optimized Assembler code
+CIPHERS_DESC= Cipher Suite support
+EC_DESC= Optimize NIST elliptic curves
+EXPCIPHERS_DESC= Include experimental ciphers
+HASHES_DESC= Hash Function Support
+I386_DESC= Optimize for i386 (instead of i486+)
+MD2_DESC= MD2 hash (obsolete)
+OPTIMIZE_DESC= Optimizations
+PADLOCK_DESC= VIA Padlock support
+PROTOCOLS_DESC= Protocol Support
+RC5_DESC= RC5 cipher (patented)
+RFC3779_DESC= RFC3779 support (BGP)
+SCTP_DESC= SCTP protocol support
+SSE2_DESC= Runtime SSE2 detection
+SSL2_DESC= SSLv2 protocol support
+SSL3_DESC= SSLv3 protocol support
+ZLIB_DESC= zlib compression support
+
+USES= compiler cpe perl5
+USE_PERL5= build
+MAKE_ARGS+= WHOLE_ARCHIVE_FLAG=--whole-archive
+MAKE_ENV+= LIBRPATH="${PREFIX}/openssl-chelsio/lib" GREP_OPTIONS=
+MAKE_ENV+= SHLIBVER=${OPENSSL_SHLIBVER}
+SUB_FILES= pkg-message
+
+
+MAKE_JOBS_UNSAFE= yes
+
+ASM_CONFIGURE_OFF= no-asm
+EC_CONFIGURE_ON= enable-ec_nistp_64_gcc_128
+EC_CONFIGURE_OFF= no-ec_nistp_64_gcc_128
+I386_CONFIGURE_ON= 386
+MD2_CONFIGURE_ON= enable-md2
+MD2_CONFIGURE_OFF= no-md2
+PADLOCK_CFLAGS= -Wno-unused-function
+PADLOCK_CONFIGURE_OFF= no-padlock
+PADLOCK_PATCH_SITES= http://git.alpinelinux.org/cgit/aports/plain/main/openssl/:padlock
+PADLOCK_PATCHFILES= 1001-crypto-hmac-support-EVP_MD_CTX_FLAG_ONESHOT-and-set-.patch:padlock \
+ 1002-backport-changes-from-upstream-padlock-module.patch:padlock \
+ 1003-engines-e_padlock-implement-sha1-sha224-sha256-accel.patch:padlock \
+ 1004-crypto-engine-autoload-padlock-dynamic-engine.patch:padlock
+PADLOCK_VARS= PATCH_DIST_STRIP=-p1
+RC5_CONFIGURE_ON= enable-rc5
+RC5_CONFIGURE_OFF= no-rc5
+RFC3779_CONFIGURE_ON= enable-rfc3779
+RFC3779_CONFIGURE_OFF= no-rfc3779
+SCTP_CONFIGURE_ON= sctp
+SCTP_CONFIGURE_OFF= no-sctp
+SSE2_CONFIGURE_OFF= no-sse2
+SSL2_CONFIGURE_ON= enable-ssl2
+SSL2_CONFIGURE_OFF= no-ssl2
+SSL3_CONFIGURE_ON= enable-ssl3
+SSL3_CONFIGURE_OFF= no-ssl3 no-ssl3-method
+SSL3_EXTRA_PATCHES_OFF= ${PATCHDIR}/extra-patch-test_testssl
+THREADS_CONFIGURE_ON= threads
+THREADS_CONFIGURE_OFF= no-threads
+ZLIB_CONFIGURE_ON= zlib zlib-dynamic
+ZLIB_CONFIGURE_OFF= no-zlib no-zlib-dynamic
+
+.include <bsd.port.pre.mk>
+
+.if ${CHOSEN_COMPILER_TYPE} != gcc && ${COMPILER_VERSION} != 42
+CFLAGS+= -Werror -Qunused-arguments
+.endif
+
+OPENSSLDIR?= ${PREFIX}/chelsio-openssl/etc
+PLIST_SUB+= OPENSSLDIR=${OPENSSLDIR:S=^${PREFIX}/==}
+PLIST_SUB+= SHLIBVER=${OPENSSL_SHLIBVER}
+
+.if !exists(/usr/src/sys/dev/cxgbe/tom/t4_tls.h)
+BROKEN= Requires kernel sources with Chelsio TLS offload driver
+.endif
+
+CFLAGS+= -DCHSSL_OFFLOAD=yes -DCHSSL_TLS_RX=yes -I/usr/src/sys
+
+.include "version.mk"
+
+.if ${PORT_OPTIONS:MASM}
+BROKEN_sparc64= option ASM generates illegal instructions
+.endif
+
+CONFIGURE_ARGS+= no-gmp shared
+
+post-patch:
+ ${REINPLACE_CMD} -e 's|m4 -B 8192|m4|g' \
+ ${WRKSRC}/crypto/des/Makefile
+ ${REINPLACE_CMD} -e 's|SHLIB_VERSION_NUMBER "1.0.0"|SHLIB_VERSION_NUMBER "${OPENSSL_SHLIBVER}"|' \
+ ${WRKSRC}/crypto/opensslv.h
+ ${REINPLACE_CMD} -e 's|ERR_R_MALLOC_ERROR|ERR_R_MALLOC_FAILURE|' \
+ ${WRKSRC}/crypto/bio/bss_dgram.c
+.if ${PORT_OPTIONS:MEXPCIPHERS}
+ ${REINPLACE_CMD} -e 's|TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES 0|TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES 1|' \
+ ${WRKSRC}/ssl/tls1.h
+.endif
+ ${GREP} -L openssl_manual_section ${WRKSRC}/doc/crypto/*.pod | ${XARGS} ${RM}
+ ${RM} -r ${WRKSRC}/doc/ssl/*.pod
+ ${REINPLACE_CMD} -e 's|pod doc/ssl/\*\.pod|pod|' ${WRKSRC}/Makefile.org
+ ${PATCH} -d ${WRKSRC} -p3 -s < ${PATCHDIR}/extra-patch-chssl
+
+do-configure:
+ ${REINPLACE_CMD} -e "s|options 386|options|" \
+ ${WRKSRC}/config
+ cd ${WRKSRC} \
+ && ${SETENV} CC="${CC}" FREEBSDCC="${CC}" CFLAGS="${CFLAGS}" PERL="${PERL}" \
+ ./config --prefix=${PREFIX} --openssldir=${OPENSSLDIR} \
+ --install_prefix=${STAGEDIR} \
+ -L${PREFIX}/lib ${CONFIGURE_ARGS}
+
+post-configure:
+ ${REINPLACE_CMD} \
+ -e 's|^MANDIR=.*$$|MANDIR=$$(PREFIX)/man|' \
+ -e 's|$$(LIBDIR)/pkgconfig|libdata/pkgconfig|g' \
+ -e 's|LIBVERSION=[^ ]* |LIBVERSION=${OPENSSL_SHLIBVER} |' \
+ ${WRKSRC}/Makefile
+
+do-install:
+ ${MKDIR} ${STAGEDIR}${PREFIX}/openssl-chelsio/lib/engines
+.for i in libcrypto libssl
+ ${INSTALL_DATA} ${WRKSRC}/$i.so.${OPENSSL_SHLIBVER} ${STAGEDIR}${PREFIX}/openssl-chelsio/lib
+ ${STRIP_CMD} ${STAGEDIR}${PREFIX}/openssl-chelsio/lib/$i.so.${OPENSSL_SHLIBVER}
+ ${LN} -sf $i.so.${OPENSSL_SHLIBVER} ${STAGEDIR}${PREFIX}/lib/$i.so
+.endfor
+.for i in 4758cca aep atalla capi chil cswift gmp nuron padlock sureware ubsec
+ ${INSTALL_DATA} ${WRKSRC}/engines/lib${i}.so ${STAGEDIR}/${PREFIX}/openssl-chelsio/lib/engines
+ ${STRIP_CMD} ${STAGEDIR}${PREFIX}/openssl-chelsio/lib/engines/lib${i}.so
+.endfor
+
+test: build
+ cd ${WRKSRC} && ${MAKE} test
+
+regression-test: test
+
+.include <bsd.port.post.mk>
Index: security/openssl-chelsio/distinfo
===================================================================
--- /dev/null
+++ security/openssl-chelsio/distinfo
@@ -0,0 +1,11 @@
+TIMESTAMP = 1512655797
+SHA256 (openssl-1.0.2/openssl-1.0.2n.tar.gz) = 370babb75f278c39e0c50e8c4e7493bc0f18db6867478341a832a982fd15a8fe
+SIZE (openssl-1.0.2/openssl-1.0.2n.tar.gz) = 5375802
+SHA256 (openssl-1.0.2/1001-crypto-hmac-support-EVP_MD_CTX_FLAG_ONESHOT-and-set-.patch) = 2eddcb7ab342285cb637ce6b6be143cca835f449f35dd9bb8c7b9167ba2117a7
+SIZE (openssl-1.0.2/1001-crypto-hmac-support-EVP_MD_CTX_FLAG_ONESHOT-and-set-.patch) = 3717
+SHA256 (openssl-1.0.2/1002-backport-changes-from-upstream-padlock-module.patch) = aee88a24622ce9d71e38deeb874e58435dcf8ff5690f56194f0e4a00fb09b260
+SIZE (openssl-1.0.2/1002-backport-changes-from-upstream-padlock-module.patch) = 5770
+SHA256 (openssl-1.0.2/1003-engines-e_padlock-implement-sha1-sha224-sha256-accel.patch) = c10b8aaf56a4f4f79ca195fc587e0bb533f643e777d7a3e6fb0350399a6060ea
+SIZE (openssl-1.0.2/1003-engines-e_padlock-implement-sha1-sha224-sha256-accel.patch) = 20935
+SHA256 (openssl-1.0.2/1004-crypto-engine-autoload-padlock-dynamic-engine.patch) = 97eb4411d0fc0890e94bc7c2d682f68b71135da782af769ca73914b37da2b1fd
+SIZE (openssl-1.0.2/1004-crypto-engine-autoload-padlock-dynamic-engine.patch) = 832
Index: security/openssl-chelsio/files/extra-patch-chssl
===================================================================
--- /dev/null
+++ security/openssl-chelsio/files/extra-patch-chssl
@@ -0,0 +1,2274 @@
+diff --git a/crypto/openssl/crypto/evp/digest.c b/crypto/openssl/crypto/evp/digest.c
+index 4db179629d04..272e8bdceb85 100644
+--- a/crypto/openssl/crypto/evp/digest.c
++++ b/crypto/openssl/crypto/evp/digest.c
+@@ -185,7 +185,11 @@ int EVP_DigestInit_ex(EVP_MD_CTX *ctx, const EVP_MD *type, ENGINE *impl)
+ } else
+ /* Ask if an ENGINE is reserved for this job */
+ impl = ENGINE_get_digest_engine(type->type);
+- if (impl) {
++ if (impl
++#ifdef CHSSL_OFFLOAD
++ && !ctx->is_chssl
++#endif
++ ) {
+ /* There's an ENGINE for this job ... (apparently) */
+ const EVP_MD *d = ENGINE_get_digest(impl, type->type);
+ if (!d) {
+@@ -364,6 +368,26 @@ int EVP_Digest(const void *data, size_t count,
+ return ret;
+ }
+
++#ifdef CHSSL_OFFLOAD
++int CHSSL_EVP_Digest(const void *data, size_t count,
++ unsigned char *md, unsigned int *size,
++ const EVP_MD *type, ENGINE *impl)
++{
++ EVP_MD_CTX ctx;
++ int ret;
++
++ EVP_MD_CTX_init(&ctx);
++ ctx.is_chssl = 1;
++ EVP_MD_CTX_set_flags(&ctx,EVP_MD_CTX_FLAG_ONESHOT);
++ ret=EVP_DigestInit_ex(&ctx, type, impl)
++ && EVP_DigestUpdate(&ctx, data, count)
++ && EVP_DigestFinal_ex(&ctx, md, size);
++ EVP_MD_CTX_cleanup(&ctx);
++
++ return ret;
++}
++#endif
++
+ void EVP_MD_CTX_destroy(EVP_MD_CTX *ctx)
+ {
+ if (ctx) {
+diff --git a/crypto/openssl/crypto/evp/evp.h b/crypto/openssl/crypto/evp/evp.h
+index cf1de15e6d03..690b10aa7ffa 100644
+--- a/crypto/openssl/crypto/evp/evp.h
++++ b/crypto/openssl/crypto/evp/evp.h
+@@ -270,6 +270,9 @@ struct env_md_ctx_st {
+ ENGINE *engine; /* functional reference if 'digest' is
+ * ENGINE-provided */
+ unsigned long flags;
++#ifdef CHSSL_OFFLOAD
++ unsigned short is_chssl;
++#endif
+ void *md_data;
+ /* Public key context for sign/verify */
+ EVP_PKEY_CTX *pctx;
+@@ -597,6 +600,11 @@ int EVP_DigestFinal_ex(EVP_MD_CTX *ctx, unsigned char *md, unsigned int *s);
+ int EVP_Digest(const void *data, size_t count,
+ unsigned char *md, unsigned int *size, const EVP_MD *type,
+ ENGINE *impl);
++#ifdef CHSSL_OFFLOAD
++int CHSSL_EVP_Digest(const void *data, size_t count,
++ unsigned char *md, unsigned int *size, const EVP_MD *type,
++ ENGINE *impl);
++#endif
+
+ int EVP_MD_CTX_copy(EVP_MD_CTX *out, const EVP_MD_CTX *in);
+ int EVP_DigestInit(EVP_MD_CTX *ctx, const EVP_MD *type);
+diff --git a/crypto/openssl/crypto/evp/m_sha1.c b/crypto/openssl/crypto/evp/m_sha1.c
+index a74e6b77948e..5d445dd2a112 100644
+--- a/crypto/openssl/crypto/evp/m_sha1.c
++++ b/crypto/openssl/crypto/evp/m_sha1.c
+@@ -68,6 +68,21 @@
+ # include <openssl/rsa.h>
+ # endif
+
++#ifdef CHSSL_OFFLOAD
++#include <arpa/inet.h>
++
++#define uint64_t unsigned long long
++#define htonll(data) ( \
++ (((uint64_t)(data) >> 56) & 0x00000000000000FF) | \
++ (((uint64_t)(data) >> 40) & 0x000000000000FF00) | \
++ (((uint64_t)(data) >> 24) & 0x0000000000FF0000) | \
++ (((uint64_t)(data) >> 8 ) & 0x00000000FF000000) | \
++ (((uint64_t)(data) << 8) & 0x000000FF00000000) | \
++ (((uint64_t)(data) << 24) & 0x0000FF0000000000) | \
++ (((uint64_t)(data) << 40) & 0x00FF000000000000) | \
++ (((uint64_t)(data) << 56) & 0xFF00000000000000))
++#endif
++
+ static int init(EVP_MD_CTX *ctx)
+ {
+ return SHA1_Init(ctx->md_data);
+@@ -80,6 +95,20 @@ static int update(EVP_MD_CTX *ctx, const void *data, size_t count)
+
+ static int final(EVP_MD_CTX *ctx, unsigned char *md)
+ {
++#ifdef CHSSL_OFFLOAD
++ if (ctx->is_chssl) {
++ unsigned int *temp;
++ unsigned char *iopad;
++ int i;
++ temp = ctx->md_data;
++ for (i=0; i< 5; i++)
++ temp[i] = htonl(temp[i]);
++ iopad = (unsigned char *)temp;
++ memcpy(md, iopad, 20);
++ return 1;
++ }
++#endif
++
+ return SHA1_Final(md, ctx->md_data);
+ }
+
+@@ -127,6 +156,20 @@ static int update256(EVP_MD_CTX *ctx, const void *data, size_t count)
+
+ static int final256(EVP_MD_CTX *ctx, unsigned char *md)
+ {
++#ifdef CHSSL_OFFLOAD
++ if (ctx->is_chssl) {
++ unsigned int *temp;
++ unsigned char *iopad;
++ int i;
++
++ temp = ctx->md_data;
++ for (i=0; i< 8; i++)
++ temp[i] = htonl(temp[i]);
++ iopad = (unsigned char *)temp;
++ memcpy(md, iopad, 32);
++ return 1;
++ }
++#endif
+ return SHA256_Final(md, ctx->md_data);
+ }
+
+@@ -190,6 +233,21 @@ static int update512(EVP_MD_CTX *ctx, const void *data, size_t count)
+
+ static int final512(EVP_MD_CTX *ctx, unsigned char *md)
+ {
++#ifdef CHSSL_OFFLOAD
++ if (ctx->is_chssl) {
++ unsigned long long *temp;
++ unsigned char *iopad;
++ int i;
++
++ temp = ctx->md_data;
++ for (i = 0; i < 8; i++)
++ temp[i] = htonll(temp[i]);
++ iopad = (unsigned char *)temp;
++ memcpy(md, iopad, 64);
++ return 1;
++ }
++#endif
++
+ return SHA512_Final(md, ctx->md_data);
+ }
+
+diff --git a/crypto/openssl/ssl/Makefile b/crypto/openssl/ssl/Makefile
+index 7866a3ccd77b..a4ce38b0d6c2 100644
+--- a/crypto/openssl/ssl/Makefile
++++ b/crypto/openssl/ssl/Makefile
+@@ -31,7 +31,8 @@ LIBSRC= \
+ ssl_lib.c ssl_err2.c ssl_cert.c ssl_sess.c \
+ ssl_ciph.c ssl_stat.c ssl_rsa.c \
+ ssl_asn1.c ssl_txt.c ssl_algs.c ssl_conf.c \
+- bio_ssl.c ssl_err.c kssl.c t1_reneg.c tls_srp.c t1_trce.c ssl_utst.c
++ bio_ssl.c ssl_err.c kssl.c t1_reneg.c tls_srp.c t1_trce.c ssl_utst.c \
++ ssl_tom.c
+ LIBOBJ= \
+ s2_meth.o s2_srvr.o s2_clnt.o s2_lib.o s2_enc.o s2_pkt.o \
+ s3_meth.o s3_srvr.o s3_clnt.o s3_lib.o s3_enc.o s3_pkt.o s3_both.o s3_cbc.o \
+@@ -42,7 +43,8 @@ LIBOBJ= \
+ ssl_lib.o ssl_err2.o ssl_cert.o ssl_sess.o \
+ ssl_ciph.o ssl_stat.o ssl_rsa.o \
+ ssl_asn1.o ssl_txt.o ssl_algs.o ssl_conf.o \
+- bio_ssl.o ssl_err.o kssl.o t1_reneg.o tls_srp.o t1_trce.o ssl_utst.o
++ bio_ssl.o ssl_err.o kssl.o t1_reneg.o tls_srp.o t1_trce.o ssl_utst.o \
++ ssl_tom.o
+
+ SRC= $(LIBSRC)
+
+@@ -1122,3 +1124,4 @@ tls_srp.o: ../include/openssl/ssl23.h ../include/openssl/ssl3.h
+ tls_srp.o: ../include/openssl/stack.h ../include/openssl/symhacks.h
+ tls_srp.o: ../include/openssl/tls1.h ../include/openssl/x509.h
+ tls_srp.o: ../include/openssl/x509_vfy.h ssl_locl.h tls_srp.c
++ssl_tom.o: ../include/openssl/x509_vfy.h ssl_tom.c
+diff --git a/crypto/openssl/ssl/d1_clnt.c b/crypto/openssl/ssl/d1_clnt.c
+index 76451a346d86..cd2b6759377e 100644
+--- a/crypto/openssl/ssl/d1_clnt.c
++++ b/crypto/openssl/ssl/d1_clnt.c
+@@ -127,6 +127,9 @@
+ #ifndef OPENSSL_NO_DH
+ # include <openssl/dh.h>
+ #endif
++#if defined(CHSSL_OFFLOAD) && defined(CHSSL_DTLS)
++#include "ssl_tom.h"
++#endif
+
+ static const SSL_METHOD *dtls1_get_client_method(int ver);
+ static int dtls1_get_hello_verify(SSL *s);
+@@ -615,6 +618,10 @@ int dtls1_connect(SSL *s)
+
+ case SSL3_ST_CW_FINISHED_A:
+ case SSL3_ST_CW_FINISHED_B:
++#if defined(CHSSL_OFFLOAD) && defined(CHSSL_DTLS)
++ if (SSL_ofld(s))
++ chssl_program_hwkey_context(s, KEY_WRITE_TX, SSL_ST_CONNECT);
++#endif
+ if (!s->hit)
+ dtls1_start_timer(s);
+ ret = ssl3_send_finished(s,
+@@ -700,6 +707,10 @@ int dtls1_connect(SSL *s)
+ SSL3_ST_CR_FINISHED_B);
+ if (ret <= 0)
+ goto end;
++#if defined(CHSSL_OFFLOAD) && defined(CHSSL_DTLS)
++ if (SSL_ofld_rx(s))
++ chssl_program_hwkey_context(s, KEY_WRITE_RX,SSL_ST_CONNECT);
++#endif
+ dtls1_stop_timer(s);
+
+ if (s->hit)
+diff --git a/crypto/openssl/ssl/d1_pkt.c b/crypto/openssl/ssl/d1_pkt.c
+index 10586fee5408..ee76f6020ca0 100644
+--- a/crypto/openssl/ssl/d1_pkt.c
++++ b/crypto/openssl/ssl/d1_pkt.c
+@@ -121,6 +121,9 @@
+ #include <openssl/buffer.h>
+ #include <openssl/pqueue.h>
+ #include <openssl/rand.h>
++#if defined(CHSSL_OFFLOAD) && defined(CHSSL_DTLS)
++#include "ssl_tom.h"
++#endif
+
+ /* mod 128 saturating subtract of two 64-bit values in big-endian order */
+ static int satsub64be(const unsigned char *v1, const unsigned char *v2)
+@@ -503,6 +506,10 @@ static int dtls1_process_record(SSL *s, DTLS1_BITMAP *bitmap)
+ /* decrypt in place in 'rr->input' */
+ rr->data = rr->input;
+
++#if defined(CHSSL_OFFLOAD) && defined(CHSSL_DTLS)
++ if (!(SSL_enc_offload(s) && SSL_ofld_vers(s) && SSL_ofld_rx(s)))
++ {
++#endif
+ enc_err = s->method->ssl3_enc->enc(s, 0);
+ /*-
+ * enc_err is:
+@@ -516,6 +523,9 @@ static int dtls1_process_record(SSL *s, DTLS1_BITMAP *bitmap)
+ s->packet_length = 0;
+ goto err;
+ }
++#if defined(CHSSL_OFFLOAD) && defined(CHSSL_DTLS)
++ }
++#endif
+ #ifdef TLS_DEBUG
+ printf("dec %d\n", rr->length);
+ {
+@@ -528,7 +538,11 @@ static int dtls1_process_record(SSL *s, DTLS1_BITMAP *bitmap)
+
+ /* r->length is now the compressed data plus mac */
+ if ((sess != NULL) &&
+- (s->enc_read_ctx != NULL) && (EVP_MD_CTX_md(s->read_hash) != NULL)) {
++ (s->enc_read_ctx != NULL) && (EVP_MD_CTX_md(s->read_hash) != NULL)
++#if defined(CHSSL_OFFLOAD) && defined(CHSSL_DTLS)
++ && !(SSL_mac_offload(s) && SSL_ofld_vers(s) && SSL_ofld_rx(s))
++#endif
++ ) {
+ /* s->read_hash != NULL => mac_size != -1 */
+ unsigned char *mac = NULL;
+ unsigned char mac_tmp[EVP_MAX_MD_SIZE];
+@@ -684,6 +698,13 @@ int dtls1_get_record(SSL *s)
+ goto again;
+ }
+
++#if defined(CHSSL_OFFLOAD) && defined(CHSSL_DTLS)
++ #define SSL3_RT_CHERROR 127
++ if (SSL_ofld_vers(s) && SSL_ofld_rx(s) && (*(p) == SSL3_RT_CHERROR)) {
++ s->rstate = SSL_ST_READ_ERROR;
++ }
++ else
++#endif
+ s->rstate = SSL_ST_READ_BODY;
+
+ p = s->packet;
+@@ -733,11 +754,27 @@ int dtls1_get_record(SSL *s)
+ /* now s->rstate == SSL_ST_READ_BODY */
+ }
+
++#if defined(CHSSL_OFFLOAD) && defined(CHSSL_DTLS)
++ if (SSL_Chelsio_ofld(s) && SSL_ofld_rx(s)) {
++ if (s->rstate == SSL_ST_READ_ERROR) {
++ i = rr->length;
++ n = ssl3_read_n(s, i, i, 1);
++ s->rstate = SSL_ST_READ_HEADER;
++ if (n<=0) return n;
++ chssl_process_cherror(s);
++ printf("%s rstate SSL_ST_READ_ERROR \n",__func__);
++ goto again;
++ }
++ }
++ /* this may not be required len in Hdr = '13bytes + decrypted payload' */
++#endif
++
+ /* s->rstate == SSL_ST_READ_BODY, get and decode the data */
+
+ if (rr->length > s->packet_length - DTLS1_RT_HEADER_LENGTH) {
+ /* now s->packet_length == DTLS1_RT_HEADER_LENGTH */
+ i = rr->length;
++ printf("%s i:%d rrl:%d pl:%d\n",__func__,i,rr->length,s->packet_length);
+ n = ssl3_read_n(s, i, i, 1);
+ /* this packet contained a partial record, dump it */
+ if (n != i) {
+@@ -1680,7 +1717,11 @@ int do_dtls1_write(SSL *s, int type, const unsigned char *buf,
+ p += 10;
+
+ /* Explicit IV length, block ciphers appropriate version flag */
+- if (s->enc_write_ctx) {
++ if (s->enc_write_ctx
++#if defined(CHSSL_OFFLOAD) && defined(CHSSL_DTLS)
++ && !(SSL_enc_offload(s) && SSL_ofld_vers(s) && SSL_Tx_keys(s))
++#endif
++ ) {
+ int mode = EVP_CIPHER_CTX_mode(s->enc_write_ctx);
+ if (mode == EVP_CIPH_CBC_MODE) {
+ eivlen = EVP_CIPHER_CTX_iv_length(s->enc_write_ctx);
+@@ -1721,7 +1762,11 @@ int do_dtls1_write(SSL *s, int type, const unsigned char *buf,
+ * wb->buf
+ */
+
+- if (mac_size != 0) {
++ if (mac_size != 0
++#if defined(CHSSL_OFFLOAD) && defined(CHSSL_DTLS)
++ && !(SSL_enc_offload(s) && SSL_ofld_vers(s) && SSL_Tx_keys(s))
++#endif
++ ) {
+ if (s->method->ssl3_enc->mac(s, &(p[wr->length + eivlen]), 1) < 0)
+ goto err;
+ wr->length += mac_size;
+@@ -1734,8 +1779,14 @@ int do_dtls1_write(SSL *s, int type, const unsigned char *buf,
+ if (eivlen)
+ wr->length += eivlen;
+
++#if defined(CHSSL_OFFLOAD) && defined(CHSSL_DTLS)
++ if (!(SSL_enc_offload(s) && SSL_ofld_vers(s) && SSL_Tx_keys(s))) {
++#endif
+ if (s->method->ssl3_enc->enc(s, 1) < 1)
+ goto err;
++#if defined(CHSSL_OFFLOAD) && defined(CHSSL_DTLS)
++ }
++#endif
+
+ /* record length after mac and block padding */
+ /*
+diff --git a/crypto/openssl/ssl/d1_srvr.c b/crypto/openssl/ssl/d1_srvr.c
+index 8502b242e51c..4f2f8d8b3bfa 100644
+--- a/crypto/openssl/ssl/d1_srvr.c
++++ b/crypto/openssl/ssl/d1_srvr.c
+@@ -125,6 +125,9 @@
+ #ifndef OPENSSL_NO_DH
+ # include <openssl/dh.h>
+ #endif
++#if defined(CHSSL_OFFLOAD) && defined(CHSSL_DTLS)
++#include "ssl_tom.h"
++#endif
+
+ static const SSL_METHOD *dtls1_get_server_method(int ver);
+ static int dtls1_send_hello_verify_request(SSL *s);
+@@ -752,6 +755,10 @@ int dtls1_accept(SSL *s)
+ SSL3_ST_SR_FINISHED_B);
+ if (ret <= 0)
+ goto end;
++#if defined(CHSSL_OFFLOAD) && defined(CHSSL_DTLS)
++ if (SSL_ofld_rx(s))
++ chssl_program_hwkey_context(s, KEY_WRITE_RX, SSL_ST_ACCEPT);
++#endif
+ dtls1_stop_timer(s);
+ if (s->hit)
+ s->state = SSL_ST_OK;
+@@ -812,8 +819,14 @@ int dtls1_accept(SSL *s)
+ 0, NULL);
+ }
+ #endif
+-
++#if defined(CHSSL_OFFLOAD) && defined(CHSSL_DTLS)
++ if (SSL_ofld(s)) {
++ s->s3->tmp.next_state = SSL3_ST_SW_FINISHED_A;
++ s->state = SSL3_ST_SW_FLUSH;
++ } else {
+ s->state = SSL3_ST_SW_FINISHED_A;
++ }
++#endif
+ s->init_num = 0;
+
+ if (!s->method->ssl3_enc->change_cipher_state(s,
+@@ -829,6 +842,10 @@ int dtls1_accept(SSL *s)
+
+ case SSL3_ST_SW_FINISHED_A:
+ case SSL3_ST_SW_FINISHED_B:
++#if defined(CHSSL_OFFLOAD) && defined(CHSSL_DTLS)
++ if (SSL_ofld(s))
++ chssl_program_hwkey_context(s, KEY_WRITE_TX, SSL_ST_ACCEPT);
++#endif
+ ret = ssl3_send_finished(s,
+ SSL3_ST_SW_FINISHED_A,
+ SSL3_ST_SW_FINISHED_B,
+diff --git a/crypto/openssl/ssl/s23_clnt.c b/crypto/openssl/ssl/s23_clnt.c
+index add8c9916c8f..53e13c6fe81d 100644
+--- a/crypto/openssl/ssl/s23_clnt.c
++++ b/crypto/openssl/ssl/s23_clnt.c
+@@ -115,6 +115,9 @@
+ #include <openssl/rand.h>
+ #include <openssl/objects.h>
+ #include <openssl/evp.h>
++#ifdef CHSSL_OFFLOAD
++#include "ssl_tom.h"
++#endif
+
+ static const SSL_METHOD *ssl23_get_client_method(int ver);
+ static int ssl23_client_hello(SSL *s);
+@@ -221,6 +224,10 @@ int ssl23_connect(SSL *s)
+ ret = ssl23_client_hello(s);
+ if (ret <= 0)
+ goto end;
++#ifdef CHSSL_OFFLOAD
++ if (chssl_new(s))
++ ssl_tls_offload(s);
++#endif
+ s->state = SSL23_ST_CR_SRVR_HELLO_A;
+ s->init_num = 0;
+
+diff --git a/crypto/openssl/ssl/s23_srvr.c b/crypto/openssl/ssl/s23_srvr.c
+index d3f6db15ccee..15f4736277c2 100644
+--- a/crypto/openssl/ssl/s23_srvr.c
++++ b/crypto/openssl/ssl/s23_srvr.c
+@@ -118,6 +118,9 @@
+ #ifdef OPENSSL_FIPS
+ # include <openssl/fips.h>
+ #endif
++#ifdef CHSSL_OFFLOAD
++#include "ssl_tom.h"
++#endif
+
+ static const SSL_METHOD *ssl23_get_server_method(int ver);
+ int ssl23_get_client_hello(SSL *s);
+@@ -181,6 +184,10 @@ int ssl23_accept(SSL *s)
+
+ /* s->version=SSL3_VERSION; */
+ s->type = SSL_ST_ACCEPT;
++#ifdef CHSSL_OFFLOAD
++ if (chssl_new(s))
++ ssl_tls_offload(s);
++#endif
+
+ if (s->init_buf == NULL) {
+ if ((buf = BUF_MEM_new()) == NULL) {
+diff --git a/crypto/openssl/ssl/s3_both.c b/crypto/openssl/ssl/s3_both.c
+index 054ded1c9903..24885ba86db1 100644
+--- a/crypto/openssl/ssl/s3_both.c
++++ b/crypto/openssl/ssl/s3_both.c
+@@ -123,6 +123,9 @@
+ #include <openssl/objects.h>
+ #include <openssl/evp.h>
+ #include <openssl/x509.h>
++#ifdef CHSSL_OFFLOAD
++#include "ssl_tom.h"
++#endif
+
+ /*
+ * send s->init_buf in records of type 'type' (SSL3_RT_HANDSHAKE or
+@@ -131,6 +134,9 @@
+ int ssl3_do_write(SSL *s, int type)
+ {
+ int ret;
++#ifdef TLS_DEBUG
++ printf("%s type:%d len:%d \n",__func__,type,s->init_num);
++#endif
+
+ ret = ssl3_write_bytes(s, type, &s->init_buf->data[s->init_off],
+ s->init_num);
+@@ -161,6 +167,9 @@ int ssl3_send_finished(SSL *s, int a, int b, const char *sender, int slen)
+ unsigned char *p;
+ int i;
+ unsigned long l;
++#ifdef TLS_DEBUG
++ printf("ssl3_send_finished: state:%x a:%x b%x slen:%d M:%x s:%p\n",s->state,a,b,slen,s->method->version,s);
++#endif
+
+ if (s->state == a) {
+ p = ssl_handshake_start(s);
+@@ -168,6 +177,9 @@ int ssl3_send_finished(SSL *s, int a, int b, const char *sender, int slen)
+ i = s->method->ssl3_enc->final_finish_mac(s,
+ sender, slen,
+ s->s3->tmp.finish_md);
++#ifdef TLS_DEBUG
++ printf("ssl3_send_finished: i:%d slen:%d ver:%x s:%p\n",i,slen,s->method->version,s);
++#endif
+ if (i <= 0)
+ return 0;
+ s->s3->tmp.finish_md_len = i;
+@@ -244,10 +256,22 @@ int ssl3_get_finished(SSL *s, int a, int b)
+ * spec message and is in s->s3->tmp.peer_finish_md
+ */
+ #endif
++#ifdef TLS_DEBUG
++ printf("Enter %s \n",__func__);
++#endif
+
+ /* 64 argument should actually be 36+4 :-) */
++#if defined(CHSSL_OFFLOAD) && defined(CHSSL_TLS_RX)
++ /* XXX: Why a smaller maximum message size? */
++ if (SSL_ofld_rx(s))
++ n = s->method->ssl_get_message(s, a, b, SSL3_MT_FINISHED, 16, &ok);
++ else
++#endif
+ n = s->method->ssl_get_message(s, a, b, SSL3_MT_FINISHED, 64, &ok);
+
++#ifdef TLS_DEBUG
++ printf("%s ok:%d n:%d \n",__func__,ok,n);
++#endif
+ if (!ok)
+ return ((int)n);
+
+@@ -346,6 +370,9 @@ long ssl3_get_message(SSL *s, int st1, int stn, int mt, long max, int *ok)
+ unsigned long l;
+ long n;
+ int i, al;
++#ifdef TLS_DEBUG
++ printf("ssl3_get_message st1:%d stn:%d mt:%d max:%d\n",st1,stn,mt,max);
++#endif
+
+ if (s->s3->tmp.reuse_message) {
+ s->s3->tmp.reuse_message = 0;
+diff --git a/crypto/openssl/ssl/s3_clnt.c b/crypto/openssl/ssl/s3_clnt.c
+index 5b8b2da59f54..e7b319ffe497 100644
+--- a/crypto/openssl/ssl/s3_clnt.c
++++ b/crypto/openssl/ssl/s3_clnt.c
+@@ -166,6 +166,9 @@
+ #ifndef OPENSSL_NO_ENGINE
+ # include <openssl/engine.h>
+ #endif
++#ifdef CHSSL_OFFLOAD
++#include "ssl_tom.h"
++#endif
+
+ static int ca_dn_cmp(const X509_NAME *const *a, const X509_NAME *const *b);
+ #ifndef OPENSSL_NO_TLSEXT
+@@ -299,12 +302,22 @@ int ssl3_connect(SSL *s)
+ ret = ssl3_client_hello(s);
+ if (ret <= 0)
+ goto end;
++#ifdef CHSSL_OFFLOAD
++ if (chssl_new(s) || SSL_ofld_vers(s))
++ ssl_tls_offload(s);
++#endif
+ s->state = SSL3_ST_CR_SRVR_HELLO_A;
+ s->init_num = 0;
+
+ /* turn on buffering for the next lot of output */
++#ifdef CHSSL_OFFLOAD
++ if (!(SSL_ofld(s) && s->renegotiate)) {
++#endif
+ if (s->bbio != s->wbio)
+ s->wbio = BIO_push(s->bbio, s->wbio);
++#ifdef CHSSL_OFFLOAD
++ }
++#endif
+
+ break;
+
+@@ -485,6 +498,14 @@ int ssl3_connect(SSL *s)
+ else
+ s->state = SSL3_ST_CW_FINISHED_A;
+ #endif
++
++#ifdef CHSSL_OFFLOAD
++ //if (SSL_ofld(s)) {
++ s->s3->tmp.next_state = s->state;
++ s->state = SSL3_ST_CW_FLUSH;
++ //}
++#endif
++
+ s->init_num = 0;
+
+ s->session->cipher = s->s3->tmp.new_cipher;
+@@ -509,7 +530,6 @@ int ssl3_connect(SSL *s)
+ s->state = SSL_ST_ERR;
+ goto end;
+ }
+-
+ break;
+
+ #if !defined(OPENSSL_NO_TLSEXT) && !defined(OPENSSL_NO_NEXTPROTONEG)
+@@ -524,6 +544,10 @@ int ssl3_connect(SSL *s)
+
+ case SSL3_ST_CW_FINISHED_A:
+ case SSL3_ST_CW_FINISHED_B:
++#ifdef CHSSL_OFFLOAD
++ if (SSL_ofld(s))
++ chssl_program_hwkey_context(s, KEY_WRITE_TX, SSL_ST_CONNECT);
++#endif
+ ret = ssl3_send_finished(s,
+ SSL3_ST_CW_FINISHED_A,
+ SSL3_ST_CW_FINISHED_B,
+@@ -553,7 +577,6 @@ int ssl3_connect(SSL *s)
+ s->s3->tmp.next_state = SSL3_ST_CR_SESSION_TICKET_A;
+ else
+ #endif
+-
+ s->s3->tmp.next_state = SSL3_ST_CR_FINISHED_A;
+ }
+ s->init_num = 0;
+diff --git a/crypto/openssl/ssl/s3_pkt.c b/crypto/openssl/ssl/s3_pkt.c
+index b91456843041..233f73adca3a 100644
+--- a/crypto/openssl/ssl/s3_pkt.c
++++ b/crypto/openssl/ssl/s3_pkt.c
+@@ -112,11 +112,15 @@
+ #include <stdio.h>
+ #include <limits.h>
+ #include <errno.h>
++ #include <fcntl.h>
+ #define USE_SOCKETS
+ #include "ssl_locl.h"
+ #include <openssl/evp.h>
+ #include <openssl/buffer.h>
+ #include <openssl/rand.h>
++#ifdef CHSSL_OFFLOAD
++#include "ssl_tom.h"
++#endif
+
+ #ifndef EVP_CIPH_FLAG_TLS1_1_MULTIBLOCK
+ # define EVP_CIPH_FLAG_TLS1_1_MULTIBLOCK 0
+@@ -152,6 +156,7 @@ int ssl3_read_n(SSL *s, int n, int max, int extend)
+ long align = 0;
+ unsigned char *pkt;
+ SSL3_BUFFER *rb;
++ //printf("%s n:%d \n",__func__,n);
+
+ if (n <= 0)
+ return n;
+@@ -161,6 +166,7 @@ int ssl3_read_n(SSL *s, int n, int max, int extend)
+ if (!ssl3_setup_read_buffer(s))
+ return -1;
+
++ //printf("%s left:%d \n",__func__,left);
+ left = rb->left;
+ #if defined(SSL3_ALIGN_PAYLOAD) && SSL3_ALIGN_PAYLOAD!=0
+ align = (long)rb->buf + SSL3_RT_HEADER_LENGTH;
+@@ -212,6 +218,7 @@ int ssl3_read_n(SSL *s, int n, int max, int extend)
+ s->packet_length += n;
+ rb->left = left - n;
+ rb->offset += n;
++ //printf("%s n:%d off:%d\n",__func__,n,rb->offset);
+ return (n);
+ }
+
+@@ -228,6 +235,7 @@ int ssl3_read_n(SSL *s, int n, int max, int extend)
+ s->packet = pkt;
+ rb->offset = len + align;
+ }
++ //printf("%s n:%d rb->len:%d off:%d\n",__func__,n,rb->len,rb->offset);
+
+ if (n > (int)(rb->len - rb->offset)) { /* does not happen */
+ SSLerr(SSL_F_SSL3_READ_N, ERR_R_INTERNAL_ERROR);
+@@ -244,6 +252,7 @@ int ssl3_read_n(SSL *s, int n, int max, int extend)
+ if (max > (int)(rb->len - rb->offset))
+ max = rb->len - rb->offset;
+ }
++ //printf("max:%d \n",max);
+
+ while (left < n) {
+ /*
+@@ -260,6 +269,7 @@ int ssl3_read_n(SSL *s, int n, int max, int extend)
+ SSLerr(SSL_F_SSL3_READ_N, SSL_R_READ_BIO_NOT_SET);
+ i = -1;
+ }
++ //printf("bio read:%d sf:%d\n",i,s->rbio->num);
+
+ if (i <= 0) {
+ rb->left = left;
+@@ -285,6 +295,7 @@ int ssl3_read_n(SSL *s, int n, int max, int extend)
+ rb->left = left - n;
+ s->packet_length += n;
+ s->rwstate = SSL_NOTHING;
++ //printf("%s Exit n:%d \n",__func__,n);
+ return (n);
+ }
+
+@@ -309,7 +320,7 @@ int ssl3_read_n(SSL *s, int n, int max, int extend)
+ static int ssl3_get_record(SSL *s)
+ {
+ int ssl_major, ssl_minor, al;
+- int enc_err, n, i, ret = -1;
++ int enc_err = 0, n, i, ret = -1;
+ SSL3_RECORD *rr;
+ SSL_SESSION *sess;
+ unsigned char *p;
+@@ -340,12 +351,25 @@ static int ssl3_get_record(SSL *s)
+ if ((s->rstate != SSL_ST_READ_BODY) ||
+ (s->packet_length < SSL3_RT_HEADER_LENGTH)) {
+ n = ssl3_read_n(s, SSL3_RT_HEADER_LENGTH, s->s3->rbuf.len, 0);
+- if (n <= 0)
++ if (n <= 0) {
+ return (n); /* error or non-blocking */
+- s->rstate = SSL_ST_READ_BODY;
+-
++ }
+ p = s->packet;
+- if (s->msg_callback)
++
++#if defined(CHSSL_OFFLOAD) && defined(CHSSL_TLS_RX)
++ #define SSL3_RT_CHERROR 127
++ if (SSL_ofld_vers(s) && SSL_ofld_rx(s) && (*(p) == SSL3_RT_CHERROR)) {
++ s->rstate = SSL_ST_READ_ERROR;
++ } else
++#endif
++ s->rstate = SSL_ST_READ_BODY;
++
++ if (s->msg_callback
++#if defined(CHSSL_OFFLOAD) && defined(CHSSL_TLS_RX)
++ && (SSL_ofld_vers(s) && SSL_ofld_rx(s)
++ && (s->rstate != SSL_ST_READ_ERROR))
++#endif
++ )
+ s->msg_callback(0, 0, SSL3_RT_HEADER, p, 5, s,
+ s->msg_callback_arg);
+
+@@ -399,18 +423,40 @@ static int ssl3_get_record(SSL *s)
+ /* now s->rstate == SSL_ST_READ_BODY */
+ }
+
++#if defined(CHSSL_OFFLOAD) && defined(CHSSL_TLS_RX)
++ if (SSL_Chelsio_ofld(s) && SSL_ofld_rx(s)) {
++ if (s->rstate == SSL_ST_READ_ERROR) {
++ i = rr->length;
++ n = ssl3_read_n(s, i, i, 1);
++ s->rstate = SSL_ST_READ_HEADER;
++ if (n<=0)
++ return n;
++ al = chssl_process_cherror(s);
++ printf("%s rstate SSL_ST_READ_ERROR \n",__func__);
++ goto f_err;
++ }
++ }
++
++ /* this may not be required len in Hdr = '5bytes + decrypted payload' */
++#endif
++
+ /* s->rstate == SSL_ST_READ_BODY, get and decode the data */
+-
+ if (rr->length > s->packet_length - SSL3_RT_HEADER_LENGTH) {
+ /* now s->packet_length == SSL3_RT_HEADER_LENGTH */
+ i = rr->length;
+ n = ssl3_read_n(s, i, i, 1);
+- if (n <= 0)
++ if (n <= 0) {
++ //printf("%s n:%d \n",__func__,n);
+ return (n); /* error or non-blocking io */
++ }
+ /*
+ * now n == rr->length, and s->packet_length == SSL3_RT_HEADER_LENGTH
+ * + rr->length
+ */
++#if 0
++ for(i=0;i<16;i++)
++ printf("%x ",s->packet[i]);
++#endif
+ }
+
+ s->rstate = SSL_ST_READ_HEADER; /* set state for later operations */
+@@ -437,12 +483,17 @@ static int ssl3_get_record(SSL *s)
+ if (rr->length > SSL3_RT_MAX_ENCRYPTED_LENGTH + extra) {
+ al = SSL_AD_RECORD_OVERFLOW;
+ SSLerr(SSL_F_SSL3_GET_RECORD, SSL_R_ENCRYPTED_LENGTH_TOO_LONG);
++ printf("%s SSL_R_ENCRYPTED_LENGTH_TOO_LONG \n",__func__);
+ goto f_err;
+ }
+
+ /* decrypt in place in 'rr->input' */
+ rr->data = rr->input;
+
++#if defined(CHSSL_OFFLOAD) && defined(CHSSL_TLS_RX)
++ if (!(SSL_enc_offload(s) && SSL_ofld_vers(s) && SSL_ofld_rx(s)))
++#endif
++ {
+ enc_err = s->method->ssl3_enc->enc(s, 0);
+ /*-
+ * enc_err is:
+@@ -453,10 +504,17 @@ static int ssl3_get_record(SSL *s)
+ if (enc_err == 0) {
+ al = SSL_AD_DECRYPTION_FAILED;
+ SSLerr(SSL_F_SSL3_GET_RECORD, SSL_R_BLOCK_CIPHER_PAD_IS_WRONG);
++ printf("%s SSL_R_BLOCK_CIPHER_PAD_IS_WRONG \n",__func__);
+ goto f_err;
+ }
++ }
+ #ifdef TLS_DEBUG
+- printf("dec %d\n", rr->length);
++#ifdef CHSSL_OFFLOAD
++ printf("\n dec %d host enc:%d mac:%d enc_err:%d\n",
++ rr->length,SSL_enc_host(s),SSL_mac_host(s),enc_err);
++#else
++ printf("\n dec %d\n", rr->length);
++#endif
+ {
+ unsigned int z;
+ for (z = 0; z < rr->length; z++)
+@@ -467,7 +525,13 @@ static int ssl3_get_record(SSL *s)
+
+ /* r->length is now the compressed data plus mac */
+ if ((sess != NULL) &&
+- (s->enc_read_ctx != NULL) && (EVP_MD_CTX_md(s->read_hash) != NULL)) {
++ (s->enc_read_ctx != NULL) &&
++ (EVP_MD_CTX_md(s->read_hash) != NULL)
++#if defined(CHSSL_OFFLOAD) && defined(CHSSL_TLS_RX)
++ &&
++ !(SSL_mac_offload(s) && SSL_ofld_vers(s) && SSL_ofld_rx(s))
++#endif
++ ) {
+ /* s->read_hash != NULL => mac_size != -1 */
+ unsigned char *mac = NULL;
+ unsigned char mac_tmp[EVP_MAX_MD_SIZE];
+@@ -491,6 +555,7 @@ static int ssl3_get_record(SSL *s)
+ orig_len < mac_size + 1)) {
+ al = SSL_AD_DECODE_ERROR;
+ SSLerr(SSL_F_SSL3_GET_RECORD, SSL_R_LENGTH_TOO_SHORT);
++ printf("%s SSL_R_LENGTH_TOO_SHORT \n",__func__);
+ goto f_err;
+ }
+
+@@ -533,6 +598,7 @@ static int ssl3_get_record(SSL *s)
+ al = SSL_AD_BAD_RECORD_MAC;
+ SSLerr(SSL_F_SSL3_GET_RECORD,
+ SSL_R_DECRYPTION_FAILED_OR_BAD_RECORD_MAC);
++ printf("%s SSL_R_DECRYPTION_FAILED_OR_BAD_RECORD_MAC \n",__func__);
+ goto f_err;
+ }
+
+@@ -541,6 +607,7 @@ static int ssl3_get_record(SSL *s)
+ if (rr->length > SSL3_RT_MAX_COMPRESSED_LENGTH + extra) {
+ al = SSL_AD_RECORD_OVERFLOW;
+ SSLerr(SSL_F_SSL3_GET_RECORD, SSL_R_COMPRESSED_LENGTH_TOO_LONG);
++ printf("%s SSL_R_COMPRESSED_LENGTH_TOO_LONG \n",__func__);
+ goto f_err;
+ }
+ if (!ssl3_do_uncompress(s)) {
+@@ -553,6 +620,7 @@ static int ssl3_get_record(SSL *s)
+ if (rr->length > SSL3_RT_MAX_PLAIN_LENGTH + extra) {
+ al = SSL_AD_RECORD_OVERFLOW;
+ SSLerr(SSL_F_SSL3_GET_RECORD, SSL_R_DATA_LENGTH_TOO_LONG);
++ printf("%s rr->length :%d extra:%zu\n",__func__,rr->length,extra);
+ goto f_err;
+ }
+
+@@ -575,11 +643,13 @@ static int ssl3_get_record(SSL *s)
+ if (empty_record_count > MAX_EMPTY_RECORDS) {
+ al = SSL_AD_UNEXPECTED_MESSAGE;
+ SSLerr(SSL_F_SSL3_GET_RECORD, SSL_R_RECORD_TOO_SMALL);
++ printf("rr->length == 0 empty_record_count:%d\n",empty_record_count);
++ printf("%s SSL_F_SSL3_GET_RECORD \n",__func__);
+ goto f_err;
+ }
+ goto again;
+ }
+-#if 0
++#ifdef TLS_DEBUG
+ fprintf(stderr, "Ultimate Record type=%d, Length=%d\n", rr->type,
+ rr->length);
+ #endif
+@@ -701,7 +771,11 @@ int ssl3_write_bytes(SSL *s, int type, const void *buf_, int len)
+ SSL_USE_EXPLICIT_IV(s) &&
+ s->enc_write_ctx != NULL &&
+ EVP_CIPHER_flags(s->enc_write_ctx->cipher) &
+- EVP_CIPH_FLAG_TLS1_1_MULTIBLOCK) {
++ EVP_CIPH_FLAG_TLS1_1_MULTIBLOCK
++#ifdef CHSSL_OFFLOAD
++ && !SSL_ofld(s)
++#endif
++ ) {
+ unsigned char aad[13];
+ EVP_CTRL_TLS1_1_MULTIBLOCK_PARAM mb_param;
+ int packlen;
+@@ -986,7 +1060,11 @@ static int do_ssl3_write(SSL *s, int type, const unsigned char *buf,
+ plen = p;
+ p += 2;
+ /* Explicit IV length, block ciphers appropriate version flag */
+- if (s->enc_write_ctx && SSL_USE_EXPLICIT_IV(s)) {
++ if (s->enc_write_ctx && SSL_USE_EXPLICIT_IV(s)
++#ifdef CHSSL_OFFLOAD
++ && !(SSL_enc_offload(s) && SSL_ofld_vers(s))
++#endif
++ ) {
+ int mode = EVP_CIPHER_CTX_mode(s->enc_write_ctx);
+ if (mode == EVP_CIPH_CBC_MODE) {
+ eivlen = EVP_CIPHER_CTX_iv_length(s->enc_write_ctx);
+@@ -1027,7 +1105,11 @@ static int do_ssl3_write(SSL *s, int type, const unsigned char *buf,
+ * wb->buf
+ */
+
+- if (mac_size != 0) {
++ if (mac_size != 0
++#ifdef CHSSL_OFFLOAD
++ && !(SSL_enc_offload(s) && SSL_ofld_vers(s))
++#endif
++ ) {
+ if (s->method->ssl3_enc->mac(s, &(p[wr->length + eivlen]), 1) < 0)
+ goto err;
+ wr->length += mac_size;
+@@ -1043,8 +1125,14 @@ static int do_ssl3_write(SSL *s, int type, const unsigned char *buf,
+ wr->length += eivlen;
+ }
+
++#ifdef CHSSL_OFFLOAD
++ if (!(SSL_enc_offload(s) && SSL_ofld_vers(s))) {
++#endif
+ if (s->method->ssl3_enc->enc(s, 1) < 1)
+ goto err;
++#ifdef CHSSL_OFFLOAD
++ }
++#endif
+
+ /* record length after mac and block padding */
+ s2n(wr->length, plen);
+@@ -1172,8 +1260,10 @@ int ssl3_read_bytes(SSL *s, int type, unsigned char *buf, int len, int peek)
+ void (*cb) (const SSL *ssl, int type2, int val) = NULL;
+
+ if (s->s3->rbuf.buf == NULL) /* Not initialized yet */
+- if (!ssl3_setup_read_buffer(s))
++ if (!ssl3_setup_read_buffer(s)) {
++ printf("%s ssl3_setup_read_buffer fail \n",__func__);
+ return (-1);
++ }
+
+ if ((type && (type != SSL3_RT_APPLICATION_DATA)
+ && (type != SSL3_RT_HANDSHAKE)) || (peek
+@@ -1232,9 +1322,10 @@ int ssl3_read_bytes(SSL *s, int type, unsigned char *buf, int len, int peek)
+ /* get new packet if necessary */
+ if ((rr->length == 0) || (s->rstate == SSL_ST_READ_BODY)) {
+ ret = ssl3_get_record(s);
+- if (ret <= 0)
++ if (ret <= 0) {
+ return (ret);
+ }
++ }
+
+ /*
+ * Reset the count of consecutive warning alerts if we've got a non-empty
+@@ -1276,8 +1367,10 @@ int ssl3_read_bytes(SSL *s, int type, unsigned char *buf, int len, int peek)
+ goto f_err;
+ }
+
+- if (len <= 0)
++ if (len <= 0) {
++ printf("%s len:%d \n",__func__,len);
+ return (len);
++ }
+
+ if ((unsigned int)len > rr->length)
+ n = rr->length;
+@@ -1296,6 +1389,9 @@ int ssl3_read_bytes(SSL *s, int type, unsigned char *buf, int len, int peek)
+ ssl3_release_read_buffer(s);
+ }
+ }
++#ifdef TLS_DEBUG
++ printf("%s %d n:%d \n",__func__,__LINE__,n);
++#endif
+ return (n);
+ }
+
+@@ -1337,6 +1433,9 @@ int ssl3_read_bytes(SSL *s, int type, unsigned char *buf, int len, int peek)
+ s->rwstate = SSL_READING;
+ BIO_clear_retry_flags(SSL_get_rbio(s));
+ BIO_set_retry_read(SSL_get_rbio(s));
++#ifdef TLS_DEBUG
++ printf("%s TLS1_RT_HEARTBEAT \n",__func__);
++#endif
+ return (-1);
+ }
+ #endif
+@@ -1666,7 +1765,6 @@ int ssl3_do_change_cipher_spec(SSL *s)
+ int i;
+ const char *sender;
+ int slen;
+-
+ if (s->state & SSL_ST_ACCEPT)
+ i = SSL3_CHANGE_CIPHER_SERVER_READ;
+ else
+@@ -1677,25 +1775,39 @@ int ssl3_do_change_cipher_spec(SSL *s)
+ /* might happen if dtls1_read_bytes() calls this */
+ SSLerr(SSL_F_SSL3_DO_CHANGE_CIPHER_SPEC,
+ SSL_R_CCS_RECEIVED_EARLY);
+- return (0);
++ goto err;
+ }
+
+ s->session->cipher = s->s3->tmp.new_cipher;
+- if (!s->method->ssl3_enc->setup_key_block(s))
+- return (0);
++ if (!s->method->ssl3_enc->setup_key_block(s)) {
++ goto err;
++ }
+ }
+
+- if (!s->method->ssl3_enc->change_cipher_state(s, i))
+- return (0);
++ if (!s->method->ssl3_enc->change_cipher_state(s, i)){
++ printf("change_cipher_state error \n");
++ goto err;
++ }
+
+ /*
+ * we have to record the message digest at this point so we can get it
+ * before we read the finished message
+ */
+ if (s->state & SSL_ST_CONNECT) {
++#if defined(CHSSL_OFFLOAD) && defined(CHSSL_TLS_RX)
++ if (SSL_ofld_rx(s)) {
++ chssl_program_hwkey_context(s, KEY_WRITE_RX, SSL_ST_CONNECT);
++ if (SSL_clr_quiesce(s))
++ chssl_clear_tom(s);
++ }
++#endif
+ sender = s->method->ssl3_enc->server_finished_label;
+ slen = s->method->ssl3_enc->server_finished_label_len;
+ } else {
++#if defined(CHSSL_OFFLOAD) && defined(CHSSL_TLS_RX)
++ if (SSL_ofld_rx(s))
++ chssl_program_hwkey_context(s, KEY_WRITE_RX, SSL_ST_ACCEPT);
++#endif
+ sender = s->method->ssl3_enc->client_finished_label;
+ slen = s->method->ssl3_enc->client_finished_label_len;
+ }
+@@ -1707,9 +1819,16 @@ int ssl3_do_change_cipher_spec(SSL *s)
+ SSLerr(SSL_F_SSL3_DO_CHANGE_CIPHER_SPEC, ERR_R_INTERNAL_ERROR);
+ return 0;
+ }
++
+ s->s3->tmp.peer_finish_md_len = i;
+
+ return (1);
++err:
++#if defined(CHSSL_OFFLOAD) && defined(CHSSL_TLS_RX)
++ if (SSL_ofld_rx(s))
++ chssl_clear_quies(s);
++#endif
++ return (0);
+ }
+
+ int ssl3_send_alert(SSL *s, int level, int desc)
+diff --git a/crypto/openssl/ssl/s3_srvr.c b/crypto/openssl/ssl/s3_srvr.c
+index 0fb4845d44fa..74afc08f66b8 100644
+--- a/crypto/openssl/ssl/s3_srvr.c
++++ b/crypto/openssl/ssl/s3_srvr.c
+@@ -169,6 +169,9 @@
+ # include <openssl/krb5_asn.h>
+ #endif
+ #include <openssl/md5.h>
++#ifdef CHSSL_OFFLOAD
++#include "ssl_tom.h"
++#endif
+
+ #ifndef OPENSSL_NO_SSL3_METHOD
+ static const SSL_METHOD *ssl3_get_server_method(int ver);
+@@ -250,6 +253,9 @@ int ssl3_accept(SSL *s)
+ for (;;) {
+ state = s->state;
+
++#ifdef TLS_DEBUG
++ fprintf(stderr, "%s: state %d\n", __func__, state);
++#endif
+ switch (s->state) {
+ case SSL_ST_RENEGOTIATE:
+ s->renegotiate = 1;
+@@ -270,6 +276,10 @@ int ssl3_accept(SSL *s)
+ return -1;
+ }
+ s->type = SSL_ST_ACCEPT;
++#ifdef CHSSL_OFFLOAD
++ if (chssl_new(s))
++ ssl_tls_offload(s);
++#endif
+
+ if (s->init_buf == NULL) {
+ if ((buf = BUF_MEM_new()) == NULL) {
+@@ -423,6 +433,12 @@ int ssl3_accept(SSL *s)
+ else
+ s->state = SSL3_ST_SW_CERT_A;
+ s->init_num = 0;
++#ifdef CHSSL_OFFLOAD
++ if (SSL_ofld(s) && s->new_session) {
++ s->s3->tmp.next_state = s->state;
++ s->state = SSL3_ST_SW_FLUSH;
++ }
++#endif
+ break;
+
+ case SSL3_ST_SW_CERT_A:
+@@ -453,6 +469,12 @@ int ssl3_accept(SSL *s)
+ s->state = SSL3_ST_SW_KEY_EXCH_A;
+ #endif
+ s->init_num = 0;
++#ifdef CHSSL_OFFLOAD
++ if (SSL_ofld(s) && s->new_session) {
++ s->s3->tmp.next_state = s->state;
++ s->state = SSL3_ST_SW_FLUSH;
++ }
++#endif
+ break;
+
+ case SSL3_ST_SW_KEY_EXCH_A:
+@@ -505,6 +527,12 @@ int ssl3_accept(SSL *s)
+
+ s->state = SSL3_ST_SW_CERT_REQ_A;
+ s->init_num = 0;
++#ifdef CHSSL_OFFLOAD
++ if (SSL_ofld(s) && s->new_session) {
++ s->s3->tmp.next_state = s->state;
++ s->state = SSL3_ST_SW_FLUSH;
++ }
++#endif
+ break;
+
+ case SSL3_ST_SW_CERT_REQ_A:
+@@ -765,6 +793,12 @@ int ssl3_accept(SSL *s)
+ goto end;
+ s->state = SSL3_ST_SW_CHANGE_A;
+ s->init_num = 0;
++#ifdef CHSSL_OFFLOAD
++ if (SSL_ofld(s) && s->new_session) {
++ s->s3->tmp.next_state = s->state;
++ s->state = SSL3_ST_SW_FLUSH;
++ }
++#endif
+ break;
+
+ case SSL3_ST_SW_CERT_STATUS_A:
+@@ -774,6 +808,12 @@ int ssl3_accept(SSL *s)
+ goto end;
+ s->state = SSL3_ST_SW_KEY_EXCH_A;
+ s->init_num = 0;
++#ifdef CHSSL_OFFLOAD
++ if (SSL_ofld(s) && s->new_session) {
++ s->s3->tmp.next_state = s->state;
++ s->state = SSL3_ST_SW_FLUSH;
++ }
++#endif
+ break;
+
+ #endif
+@@ -794,7 +834,17 @@ int ssl3_accept(SSL *s)
+
+ if (ret <= 0)
+ goto end;
++
++#ifdef CHSSL_OFFLOAD
++ if (SSL_ofld(s)) {
++ s->s3->tmp.next_state = SSL3_ST_SW_FINISHED_A;
++ s->state = SSL3_ST_SW_FLUSH;
++ } else {
+ s->state = SSL3_ST_SW_FINISHED_A;
++ }
++#else
++ s->state = SSL3_ST_SW_FINISHED_A;
++#endif
+ s->init_num = 0;
+
+ if (!s->method->ssl3_enc->change_cipher_state(s,
+@@ -804,11 +854,14 @@ int ssl3_accept(SSL *s)
+ s->state = SSL_ST_ERR;
+ goto end;
+ }
+-
+ break;
+
+ case SSL3_ST_SW_FINISHED_A:
+ case SSL3_ST_SW_FINISHED_B:
++#ifdef CHSSL_OFFLOAD
++ if (SSL_ofld(s))
++ chssl_program_hwkey_context(s, KEY_WRITE_TX, SSL_ST_ACCEPT);
++#endif
+ ret = ssl3_send_finished(s,
+ SSL3_ST_SW_FINISHED_A,
+ SSL3_ST_SW_FINISHED_B,
+@@ -831,6 +884,7 @@ int ssl3_accept(SSL *s)
+ } else
+ s->s3->tmp.next_state = SSL_ST_OK;
+ s->init_num = 0;
++
+ break;
+
+ case SSL_ST_OK:
+diff --git a/crypto/openssl/ssl/ssl.h b/crypto/openssl/ssl/ssl.h
+index 3cf96a239bab..2ae116f78020 100644
+--- a/crypto/openssl/ssl/ssl.h
++++ b/crypto/openssl/ssl/ssl.h
+@@ -1408,11 +1408,47 @@ int SSL_extension_supported(unsigned int ext_type);
+ # define SSL_READING 3
+ # define SSL_X509_LOOKUP 4
+
++#ifdef CHSSL_OFFLOAD
++enum {
++ SSL_ENC_HOST = 0,
++ SSL_ENC_OFLD,
++};
++
++enum {
++ SSL_MAC_HOST = 0,
++ SSL_MAC_OFLD,
++};
++
++enum {
++ KEY_SPACE_AVAIL = 0,
++ KEY_SPACE_NOTAVL,
++};
++
++struct ch_ssl_st {
++ int nl_fd;
++ int sock_fd;
++ char ofld_tx_enable;
++ char ofld_rx_enable;
++ char ofld_enc;
++ char ofld_mac;
++ char key_state;
++ char rx_keys_copied;
++ char tx_keys_copied;
++ void *key_context;
++};
++#endif
++
+ /* These will only be used when doing non-blocking IO */
+ # define SSL_want_nothing(s) (SSL_want(s) == SSL_NOTHING)
+ # define SSL_want_read(s) (SSL_want(s) == SSL_READING)
+ # define SSL_want_write(s) (SSL_want(s) == SSL_WRITING)
+ # define SSL_want_x509_lookup(s) (SSL_want(s) == SSL_X509_LOOKUP)
++#ifdef CHSSL_OFFLOAD
++# define SSL_enc_offload(s) (SSL_enc(s) == SSL_ENC_OFLD)
++# define SSL_enc_host(s) (SSL_enc(s) == SSL_ENC_HOST)
++# define SSL_mac_offload(s) (SSL_mac(s) == SSL_MAC_OFLD)
++# define SSL_mac_host(s) (SSL_mac(s) == SSL_MAC_HOST)
++#endif
+
+ # define SSL_MAC_FLAG_READ_MAC_STREAM 1
+ # define SSL_MAC_FLAG_WRITE_MAC_STREAM 2
+@@ -1447,6 +1483,7 @@ struct ssl_st {
+ char *wbio;
+ char *bbio;
+ # endif
++
+ /*
+ * This holds a variable that indicates what we were doing when a 0 or -1
+ * is returned. This is needed for non-blocking IO so we know what
+@@ -1568,6 +1605,9 @@ struct ssl_st {
+ unsigned int max_psk_len);
+ # endif
+ SSL_CTX *ctx;
++#ifdef CHSSL_OFFLOAD
++ struct ch_ssl_st *chssl;
++#endif
+ /*
+ * set this flag to 1 and a sleep(1) is put into all SSL_read() and
+ * SSL_write() calls, good for nbio debuging :-)
+@@ -1758,6 +1798,9 @@ extern "C" {
+ # define SSL_ST_READ_HEADER 0xF0
+ # define SSL_ST_READ_BODY 0xF1
+ # define SSL_ST_READ_DONE 0xF2
++#ifdef CHSSL_OFFLOAD
++# define SSL_ST_READ_ERROR 0xF3
++#endif
+
+ /*-
+ * Obtain latest Finished message
+@@ -2136,6 +2179,23 @@ X509_STORE *SSL_CTX_get_cert_store(const SSL_CTX *);
+ void SSL_CTX_set_cert_store(SSL_CTX *, X509_STORE *);
+ int SSL_want(const SSL *s);
+ int SSL_clear(SSL *s);
++#ifdef CHSSL_OFFLOAD
++int SSL_enc(const SSL *s);
++int SSL_mac(const SSL *s);
++#ifdef CHSSL_TLS_RX
++int SSL_Rx_keys(const SSL *s);
++#endif
++int SSL_Tx_keys(const SSL *s);
++int SSL_ofld(const SSL *s);
++int SSL_compress(const SSL *s);
++int SSL_Chelsio_ofld(const SSL *s);
++#ifdef CHSSL_TLS_RX
++int chssl_clear_quies(const SSL *s);
++#endif
++int chssl_clear_tom(const SSL *s);
++int chssl_process_cherror(SSL *s);
++void chssl_program_hwkey_context(SSL *s, int rw, int state);
++#endif
+
+ void SSL_CTX_flush_sessions(SSL_CTX *ctx, long tm);
+
+diff --git a/crypto/openssl/ssl/ssl_lib.c b/crypto/openssl/ssl/ssl_lib.c
+index 3539f4b8d20a..2d0fee71d50d 100644
+--- a/crypto/openssl/ssl/ssl_lib.c
++++ b/crypto/openssl/ssl/ssl_lib.c
+@@ -159,6 +159,9 @@
+ #ifndef OPENSSL_NO_ENGINE
+ # include <openssl/engine.h>
+ #endif
++#ifdef CHSSL_OFFLOAD
++#include "ssl_tom.h"
++#endif
+
+ const char *SSL_version_str = OPENSSL_VERSION_TEXT;
+
+@@ -742,6 +745,7 @@ int SSL_set_fd(SSL *s, int fd)
+ }
+ BIO_set_fd(bio, fd, BIO_NOCLOSE);
+ SSL_set_bio(s, bio, bio);
++ //printf("SSL_set_fd: fd:%d bio_fd:%d BIO:%p:%p:%p\n",fd,bio->num,bio,s->wbio,s->rbio);
+ ret = 1;
+ err:
+ return (ret);
+@@ -1068,6 +1072,11 @@ int SSL_shutdown(SSL *s)
+ SSLerr(SSL_F_SSL_SHUTDOWN, SSL_R_UNINITIALIZED);
+ return -1;
+ }
++#ifdef CHSSL_OFFLOAD
++ if (s->chssl) {
++ chssl_free(s);
++ }
++#endif
+
+ if (!SSL_in_init(s)) {
+ return s->method->ssl_shutdown(s);
+diff --git a/crypto/openssl/ssl/ssl_tom.c b/crypto/openssl/ssl/ssl_tom.c
+new file mode 100644
+index 000000000000..8699667cc211
+--- /dev/null
++++ b/crypto/openssl/ssl/ssl_tom.c
+@@ -0,0 +1,725 @@
++/* ssl/ssl_tom.c */
++/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
++ * All rights reserved.
++ *
++ * This package is an SSL implementation written
++ * by Eric Young (eay@cryptsoft.com).
++ * The implementation was written so as to conform with Netscapes SSL.
++ *
++ * This library is free for commercial and non-commercial use as long as
++ * the following conditions are aheared to. The following conditions
++ * apply to all code found in this distribution, be it the RC4, RSA,
++ * lhash, DES, etc., code; not just the SSL code. The SSL documentation
++ * included with this distribution is covered by the same copyright terms
++ * except that the holder is Tim Hudson (tjh@cryptsoft.com).
++ *
++ * Copyright remains Eric Young's, and as such any Copyright notices in
++ * the code are not to be removed.
++ * If this package is used in a product, Eric Young should be given attribution
++ * as the author of the parts of the library used.
++ * This can be in the form of a textual message at program startup or
++ * in documentation (online or textual) provided with the package.
++ * w
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions
++ * are met:
++ * 1. Redistributions of source code must retain the copyright
++ * notice, this list of conditions and the following disclaimer.
++ * 2. Redistributions in binary form must reproduce the above copyright
++ * notice, this list of conditions and the following disclaimer in the
++ * documentation and/or other materials provided with the distribution.
++ * 3. All advertising materials mentioning features or use of this software
++ * must display the following acknowledgement:
++ * "This product includes cryptographic software written by
++ * Eric Young (eay@cryptsoft.com)"
++ * The word 'cryptographic' can be left out if the rouines from the library
++ * being used are not cryptographic related :-).
++ * 4. If you include any Windows specific code (or a derivative thereof) from
++ * the apps directory (application code) you must include an acknowledgement:
++ * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
++ *
++ * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
++ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
++ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
++ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
++ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
++ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
++ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
++ * SUCH DAMAGE.
++ *
++ * The licence and distribution terms for any publically available version or
++ * derivative of this code cannot be changed. i.e. this code cannot simply be
++ * copied and put under another distribution licence
++ * [including the GNU Public Licence.]
++ */
++/* ====================================================================
++ * Copyright (c) 1998-2007 The OpenSSL Project. All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions
++ * are met:
++ *
++ * 1. Redistributions of source code must retain the above copyright
++ * notice, this list of conditions and the following disclaimer.
++ *
++ * 2. Redistributions in binary form must reproduce the above copyright
++ * notice, this list of conditions and the following disclaimer in
++ * the documentation and/or other materials provided with the
++ * distribution.
++ *
++ * 3. All advertising materials mentioning features or use of this
++ * software must display the following acknowledgment:
++ * "This product includes software developed by the OpenSSL Project
++ * for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
++ *
++ * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
++ * endorse or promote products derived from this software without
++ * prior written permission. For written permission, please contact
++ * openssl-core@openssl.org.
++ *
++ * 5. Products derived from this software may not be called "OpenSSL"
++ * nor may "OpenSSL" appear in their names without prior written
++ * permission of the OpenSSL Project.
++ *
++ * 6. Redistributions of any form whatsoever must retain the following
++ * acknowledgment:
++ * "This product includes software developed by the OpenSSL Project
++ * for use in the OpenSSL Toolkit (http://www.openssl.org/)"
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
++ * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
++ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
++ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
++ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
++ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
++ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
++ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
++ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
++ * OF THE POSSIBILITY OF SUCH DAMAGE.
++ * ====================================================================
++ *
++ * This product includes cryptographic software written by Eric Young
++ * (eay@cryptsoft.com). This product includes software written by Tim
++ * Hudson (tjh@cryptsoft.com).
++ * Chelsio Software written by Atul Gupta (atul.gupta@chelsio.com)
++ *
++ */
++
++#include <stdio.h>
++#include <stdlib.h>
++#include <errno.h>
++#include <unistd.h>
++#include <poll.h>
++#include <string.h>
++#include <fcntl.h>
++#include <sys/types.h>
++#include <sys/stat.h>
++#include <sys/socket.h>
++#include <sys/ioctl.h>
++#ifdef __linux__
++#include <linux/genetlink.h>
++#include <linux/types.h>
++#endif
++#ifdef __FreeBSD__
++#include <netinet/tcp.h>
++#endif
++#include "ssl_locl.h"
++#include <openssl/ssl.h>
++#include <netinet/in.h>
++#include "ssl_tom.h"
++#include <sys/uio.h>
++
++#ifdef CHSSL_OFFLOAD
++int ssl_tls_offload(SSL *s)
++{
++#ifdef __FreeBSD__
++ socklen_t optlen;
++#endif
++ int ret, mode = 0;
++
++ if ((s->wbio == NULL) || (s->rbio == NULL)) {
++ SSLerr(SSL_R_BAD_STATE, SSL_R_BIO_NOT_SET);
++ return mode;
++ }
++ s->chssl->sock_fd = s->wbio->num = s->rbio->num;
++
++#ifdef __linux__
++ ret = ioctl(s->chssl->sock_fd, IOCTL_TLSOM_GET_TLS_TOM, &mode);
++ if (!ret && mode)
++ s->chssl->ofld_rx_enable = s->chssl->ofld_tx_enable = TLS_OFLD_TRUE;
++ else
++ s->chssl->ofld_rx_enable = s->chssl->ofld_tx_enable = TLS_OFLD_FALSE;
++#else
++ optlen = sizeof(mode);
++ ret = getsockopt(s->chssl->sock_fd, IPPROTO_TCP, TCP_TLSOM_GET_TLS_TOM,
++ &mode, &optlen);
++ s->chssl->ofld_rx_enable = s->chssl->ofld_tx_enable = TLS_OFLD_FALSE;
++ if (ret == 0) {
++ switch (mode) {
++ case TLS_TOM_BOTH:
++ s->chssl->ofld_rx_enable = TLS_OFLD_TRUE;
++ /* FALLTHROUGH */
++ case TLS_TOM_TXONLY:
++ s->chssl->ofld_tx_enable = TLS_OFLD_TRUE;
++ break;
++ }
++ }
++#endif
++
++ return mode;
++}
++
++int SSL_ofld_vers(const SSL *s)
++{
++ return (s->version == TLS1_1_VERSION || s->version == TLS1_2_VERSION
++ || s->version == DTLS1_2_VERSION);
++}
++
++int SSL_ofld(const SSL *s)
++{
++ return(SSL_ofld_vers(s) && s->chssl && s->chssl->ofld_tx_enable);
++}
++
++#ifdef CHSSL_TLS_RX
++int SSL_ofld_rx(const SSL *s)
++{
++ return(s->chssl && s->chssl->ofld_rx_enable);
++}
++#endif
++
++int SSL_compress(const SSL *s)
++{
++ return(s->compress != NULL);
++}
++
++#ifdef CHSSL_TLS_RX
++int SSL_Rx_keys(const SSL *s)
++{
++ return(s->chssl && s->chssl->rx_keys_copied);
++}
++#endif
++
++int SSL_Tx_keys(const SSL *s)
++{
++ return(s->chssl && s->chssl->tx_keys_copied);
++}
++
++int SSL_enc(const SSL *s)
++{
++ return(s->chssl && s->chssl->ofld_tx_enable && s->chssl->ofld_enc);
++}
++
++int SSL_mac(const SSL *s)
++{
++ return(s->chssl && s->chssl->ofld_tx_enable && s->chssl->ofld_mac);
++}
++
++int SSL_Chelsio_ofld(const SSL *s)
++{
++ return (SSL_ofld(s) && SSL_ofld_rx(s) && SSL_enc(s) && SSL_mac(s));
++}
++
++#ifdef CHSSL_TLS_RX
++int SSL_clr_quiesce(const SSL *s)
++{
++ return (SSL_ofld_rx(s) && (s->chssl->key_state == KEY_SPACE_NOTAVL));
++}
++#endif
++
++/*
++ * Determine HW capability for Digest and Cipher Offload
++ */
++static int tls_ofld_enc_mac(SSL *s)
++{
++ const EVP_CIPHER *p;
++ const SSL_CIPHER *c;
++
++ c = s->s3->tmp.new_cipher;
++ p = s->s3->tmp.new_sym_enc;
++
++ switch(c->algorithm_enc) {
++ case SSL_AES128GCM:
++ case SSL_AES256GCM:
++ s->chssl->ofld_enc = SSL_ENC_OFLD;
++ s->chssl->ofld_mac = SSL_MAC_OFLD;
++ return TLS_OFLD_TRUE;
++
++ case SSL_AES128 :
++ case SSL_AES256 :
++ switch(EVP_CIPHER_mode(p)) {
++ case EVP_CIPH_CTR_MODE:
++ case EVP_CIPH_CBC_MODE:
++ s->chssl->ofld_enc = SSL_ENC_OFLD;
++ break;
++ default:
++ chssl_print(cl,"No HW support\n");
++ return TLS_OFLD_FALSE;
++ }
++ break;
++
++ case SSL_eNULL:
++ s->chssl->ofld_enc = SSL_ENC_OFLD;
++ break;
++
++ default:
++ chssl_print(cl,"No HW support for ENC\n");
++ s->chssl->ofld_enc = SSL_ENC_HOST;
++ return TLS_OFLD_FALSE;
++ }
++
++ switch(c->algorithm_mac) {
++ case SSL_SHA1:
++ case SSL_SHA256:
++ case SSL_SHA384:
++ s->chssl->ofld_mac= SSL_MAC_OFLD;
++ break;
++
++ default:
++ s->chssl->ofld_mac= SSL_MAC_HOST;
++ /* Revert enc mode to non-offload */
++ s->chssl->ofld_enc = SSL_ENC_HOST;
++ chssl_print(cl,"No HW support for MAC\n");
++ return TLS_OFLD_FALSE;
++ }
++ return TLS_OFLD_TRUE;
++}
++
++/*
++ * Authentication Mode expected by HW
++ */
++static unsigned char get_auth_mode(SSL *s)
++{
++ const SSL_CIPHER *c = s->s3->tmp.new_cipher;
++
++ if(c==NULL) return CHSSL_SHA_NOP;
++
++ switch(c->algorithm_mac) {
++ case SSL_SHA1:
++ return CHSSL_SHA1;
++ case SSL_SHA256:
++ return CHSSL_SHA256;
++ case SSL_SHA384:
++ return CHSSL_SHA512_384;
++ case SSL_AEAD:
++ return CHSSL_GHASH;
++ default:
++ return CHSSL_SHA_NOP;
++}
++}
++
++/*
++ * Cipher Mode expected by HW
++ */
++static unsigned char get_cipher_mode(SSL *s)
++{
++ const EVP_CIPHER *c = s->s3->tmp.new_sym_enc;
++
++ switch(EVP_CIPHER_mode(c)) {
++ case EVP_CIPH_CBC_MODE:
++ return CHSSL_AES_CBC;
++ case EVP_CIPH_GCM_MODE:
++ return CHSSL_AES_GCM;
++ case EVP_CIPH_CTR_MODE:
++ return CHSSL_AES_CTR;
++ case EVP_CIPH_STREAM_CIPHER:
++ return CHSSL_CIPH_NOP;
++ default:
++ chssl_print(cl,"invalid cipher mode\n");
++ return CHSSL_CIPH_NOP;
++ }
++}
++
++static void chssl_compute_ipad_opad(unsigned char *key,
++ unsigned char *ipad,
++ unsigned char *opad,
++ int k)
++{
++ int i;
++
++ if(k < MAX_MAC_KSZ) {
++ for(i=k; i < MAX_MAC_KSZ; i++) {
++ ipad[i] = 0x0;
++ opad[i] = 0x0;
++ }
++ }
++ for(i=0; i < MAX_MAC_KSZ; i++) {
++ ipad[i] = key[i] ^ 0x36;
++ opad[i] = key[i] ^ 0x5c;
++ }
++
++ if(k == SHA_DIGEST_LENGTH) {
++ CHSSL_EVP_Digest(ipad, MAX_MAC_KSZ, ipad, NULL, EVP_sha1(), NULL);
++ CHSSL_EVP_Digest(opad, MAX_MAC_KSZ, opad, NULL, EVP_sha1(), NULL);
++ } else if (k == SHA256_DIGEST_LENGTH) {
++ CHSSL_EVP_Digest(ipad, MAX_MAC_KSZ, ipad, NULL, EVP_sha256(), NULL);
++ CHSSL_EVP_Digest(opad, MAX_MAC_KSZ, opad, NULL, EVP_sha256(), NULL);
++ }
++}
++
++static void chssl_compute_ipad_opad_512(unsigned char *key,
++ unsigned char *ipad,
++ unsigned char *opad,
++ int k)
++{
++ int i;
++ unsigned char ipad_512[SHA512_BLOCK] = {0};
++ unsigned char opad_512[SHA512_BLOCK] = {0};
++
++ for(i = 0; i < SHA512_BLOCK; i++) {
++ if (i < k) {
++ ipad_512[i] = key[i] ^ 0x36;
++ opad_512[i] = key[i] ^ 0x5c;
++ } else {
++ ipad_512[i] = 0x36;
++ opad_512[i] = 0x5c;
++ }
++ }
++
++ if(k == SHA384_DIGEST_LENGTH) {
++ CHSSL_EVP_Digest(ipad_512, SHA512_BLOCK, ipad_512, NULL,
++ EVP_sha384(), NULL);
++ CHSSL_EVP_Digest(opad_512, SHA512_BLOCK, opad_512, NULL,
++ EVP_sha384(), NULL);
++ } else if (k == SHA512_DIGEST_LENGTH) {
++ CHSSL_EVP_Digest(ipad_512, SHA512_BLOCK, ipad_512, NULL,
++ EVP_sha512(), NULL);
++ CHSSL_EVP_Digest(opad_512, SHA512_BLOCK, opad_512, NULL,
++ EVP_sha512(), NULL);
++ }
++ memcpy(ipad, ipad_512, MAX_MAC_KSZ);
++ memcpy(opad, opad_512, MAX_MAC_KSZ);
++}
++
++static void chssl_compute_cipher_key(unsigned char *key,
++ int key_len,
++ unsigned char *ghash)
++{
++ int len,len1;
++ EVP_CIPHER_CTX ctx;
++ unsigned char plaintext[GHASH_SIZE] = {0};
++
++ EVP_CIPHER_CTX_init(&ctx);
++ if(key_len == 16)
++ EVP_EncryptInit_ex(&ctx, EVP_aes_128_cbc(), NULL, key, NULL);
++ else
++ EVP_EncryptInit_ex(&ctx, EVP_aes_256_cbc(), NULL, key, NULL);
++ EVP_CIPHER_CTX_set_padding(&ctx, 0);
++ EVP_EncryptUpdate(&ctx, ghash, &len, plaintext, 16);
++ EVP_EncryptFinal_ex(&ctx, ghash+len, &len1);
++ EVP_CIPHER_CTX_cleanup(&ctx);
++}
++
++/*
++ * Create key Context for receive/transmit and program on HW
++ */
++static int ssl_key_context(SSL *s, int rw, int state)
++{
++ const EVP_CIPHER *c;
++ const EVP_MD *m;
++ const SSL_CIPHER *sc;
++ unsigned int mac_key_size = 0, cipher_key_size, iv_size;
++ unsigned char *key;
++ unsigned char s_ipad_hash[MAX_MAC_KSZ]= {0x0}; /* blk sz for hashing */
++ unsigned char s_opad_hash[MAX_MAC_KSZ]= {0x0}; /* blk sz for hashing */
++ unsigned char c_ipad_hash[MAX_MAC_KSZ]= {0x0}; /* blk sz for hashing */
++ unsigned char c_opad_hash[MAX_MAC_KSZ]= {0x0}; /* blk sz for hashing */
++
++ unsigned char s_mac_key[MAX_MAC_KSZ] = {0x0};
++ unsigned char c_mac_key[MAX_MAC_KSZ] = {0x0};
++ unsigned char s_key[MAX_CIPHER_KSZ] = {0x0};
++ unsigned char c_key[MAX_CIPHER_KSZ] = {0x0};
++ unsigned char s_iv[MAX_CIPHER_KSZ] = {0x0};
++ unsigned char c_iv[MAX_CIPHER_KSZ] = {0x0};
++ unsigned char ghash[GHASH_SIZE] = {0x0};
++ int pad = 12;
++ int index = 0;
++ int ret = 0;
++ struct tls_key_context *kctx = s->chssl->key_context;
++
++ if (!tls_ofld_enc_mac(s)) {
++ return ret;
++ }
++
++ c = s->s3->tmp.new_sym_enc;
++ m = s->s3->tmp.new_hash;
++ sc = s->s3->tmp.new_cipher;
++ kctx->l_p_key = rw;
++
++ if (s->new_session)
++ kctx->l_p_key |= F_KEY_CLR_LOC;
++ key = s->s3->tmp.key_block;
++
++ if (s->version >= TLS1_VERSION)
++ mac_key_size = s->s3->tmp.new_mac_secret_size;
++ else
++ if (m) mac_key_size = m->md_size;
++ kctx->mac_secret_size = mac_key_size;
++
++ cipher_key_size = EVP_CIPHER_key_length(c);
++ kctx->cipher_secret_size = cipher_key_size;
++
++ iv_size = (EVP_CIPHER_mode(c) == EVP_CIPH_GCM_MODE) ?
++ EVP_GCM_TLS_FIXED_IV_LEN:
++ EVP_CIPHER_iv_length(c);
++ kctx->iv_size = iv_size;
++ kctx->iv_ctrl = 1;
++ kctx->iv_algo = 0;
++
++ if ((mac_key_size == SHA256_DIGEST_LENGTH) ||
++ (mac_key_size == SHA384_DIGEST_LENGTH))
++ pad = 0;
++
++ if (mac_key_size) {
++ memcpy(c_mac_key, key, mac_key_size);
++ key += mac_key_size;
++ memcpy(s_mac_key, key, mac_key_size);
++ key += mac_key_size;
++ }
++ memcpy(c_key, key, cipher_key_size);
++ key += cipher_key_size;
++ memcpy(s_key, key, cipher_key_size);
++ key += cipher_key_size;
++
++ memcpy(c_iv, key, iv_size);
++ key += iv_size;
++ memcpy(s_iv, key, iv_size);
++
++ if (s->chssl->ofld_mac) {
++ /* IPAD/OPAD for SHA384/512 calculated over 128B block */
++ if (mac_key_size >= SHA384_DIGEST_LENGTH) {
++ chssl_compute_ipad_opad_512(c_mac_key, c_ipad_hash,
++ c_opad_hash, mac_key_size);
++ chssl_compute_ipad_opad_512(s_mac_key, s_ipad_hash,
++ s_opad_hash, mac_key_size);
++ } else {
++ chssl_compute_ipad_opad(c_mac_key, c_ipad_hash,
++ c_opad_hash, mac_key_size);
++ chssl_compute_ipad_opad(s_mac_key, s_ipad_hash,
++ s_opad_hash, mac_key_size);
++ }
++ }
++
++ if (state == SSL_ST_ACCEPT) {
++ memcpy(kctx->tx.key, s_key, cipher_key_size);
++ memcpy(kctx->rx.key, c_key, cipher_key_size);
++ } else {
++ memcpy(kctx->tx.key, c_key, cipher_key_size);
++ memcpy(kctx->rx.key, s_key, cipher_key_size);
++ }
++
++ if (mac_key_size == SHA384_DIGEST_LENGTH) mac_key_size = MAX_MAC_KSZ;
++ index = cipher_key_size;
++ if (s->chssl->ofld_mac) {
++ if (mac_key_size) {
++ if (state == SSL_ST_ACCEPT)
++ memcpy(kctx->tx.key+index, s_ipad_hash, mac_key_size);
++ else
++ memcpy(kctx->tx.key+index, c_ipad_hash, mac_key_size);
++
++ index += (mac_key_size + pad);
++ if (state == SSL_ST_ACCEPT)
++ memcpy(kctx->tx.key+index, s_opad_hash, mac_key_size);
++ else
++ memcpy(kctx->tx.key+index, c_opad_hash, mac_key_size);
++
++ index += (mac_key_size + pad);
++ } else {
++ if (state == SSL_ST_ACCEPT) {
++ chssl_compute_cipher_key(s_key, cipher_key_size, ghash);
++ memcpy(kctx->tx.key+index, ghash, GHASH_SIZE);
++ } else {
++ chssl_compute_cipher_key(c_key, cipher_key_size, ghash);
++ memcpy(kctx->tx.key+index, ghash, GHASH_SIZE);
++ }
++ index += GHASH_SIZE;
++ }
++ }
++ kctx->tx_key_info_size = TLS_TX_HDR_SZ + index;
++
++ index = cipher_key_size;
++ if (s->chssl->ofld_mac) {
++ if (mac_key_size) {
++ if (state == SSL_ST_ACCEPT)
++ memcpy(kctx->rx.key+index, c_ipad_hash, mac_key_size);
++ else
++ memcpy(kctx->rx.key+index, s_ipad_hash, mac_key_size);
++
++ index += (mac_key_size + pad);
++ if (state == SSL_ST_ACCEPT)
++ memcpy(kctx->rx.key+index, c_opad_hash, mac_key_size);
++ else
++ memcpy(kctx->rx.key+index, s_opad_hash, mac_key_size);
++
++ index += (mac_key_size + pad);
++ } else {
++ if (state == SSL_ST_ACCEPT) {
++ chssl_compute_cipher_key(c_key, cipher_key_size, ghash);
++ memcpy(kctx->rx.key+index, ghash, GHASH_SIZE);
++ } else {
++ chssl_compute_cipher_key(s_key, cipher_key_size, ghash);
++ memcpy(kctx->rx.key+index, ghash, GHASH_SIZE);
++ }
++ index += GHASH_SIZE;
++ }
++ }
++
++ kctx->tx_key_info_size = TLS_RX_HDR_SZ + index;
++
++ if (EVP_CIPHER_mode(c) == EVP_CIPH_GCM_MODE) {
++ if (state == SSL_ST_ACCEPT) {
++ memcpy(kctx->tx.salt, s_iv, SALT_SIZE);
++ memcpy(kctx->rx.salt, c_iv, SALT_SIZE);
++ } else {
++ memcpy(kctx->tx.salt, c_iv, SALT_SIZE);
++ memcpy(kctx->rx.salt, s_iv, SALT_SIZE);
++ }
++ }
++
++ kctx->proto_ver = s->version;
++ kctx->state.auth_mode = get_auth_mode(s);
++ kctx->state.enc_mode = get_cipher_mode(s);
++ if (s->version == DTLS1_2_VERSION)
++ kctx->dtls_epoch = s->d1->r_epoch;
++
++ if (s->max_send_fragment)
++ kctx->frag_size = s->max_send_fragment;
++ else
++ kctx->frag_size = SSL3_RT_MAX_PLAIN_LENGTH;
++
++ /* handle renegotiation here */
++ if(!s->chssl->tx_keys_copied)
++ kctx->tx_seq_no = 0;
++ else
++ kctx->tx_seq_no = 1;
++
++ if(!s->chssl->rx_keys_copied)
++ kctx->rx_seq_no = 0;
++ else
++ kctx->rx_seq_no = 1;
++
++ if(EVP_CIPHER_mode(c) != EVP_CIPH_GCM_MODE) {
++ if (!SSL_mac(s) && SSL_enc(s))
++ kctx->hmac_ctrl = 0;
++ else
++ kctx->hmac_ctrl = 1;
++ }
++ kctx->sock_fd = s->chssl->sock_fd;
++
++ return 1;
++}
++
++void chssl_program_hwkey_context(SSL *s, int rw, int state)
++{
++ int ret = 0;
++
++ if (!s->chssl->key_context) {
++ s->chssl->key_context = (struct tls_key_context *)
++ OPENSSL_malloc(sizeof(struct tls_key_context));
++ if (s->chssl->key_context == NULL)
++ return;
++ }
++
++ memset(s->chssl->key_context, 0, sizeof(struct tls_key_context));
++ if((ret = ssl_key_context(s, rw, state)) <=0) {
++#ifdef CHSSL_TLS_RX
++ /* Clear quiesce after CCS receive */
++ if (rw == KEY_WRITE_RX) {
++ ret = chssl_clear_tom(s);
++ s->chssl->ofld_rx_enable = TLS_OFLD_FALSE;
++ s->chssl->ofld_tx_enable = TLS_OFLD_FALSE;
++ }
++#endif
++ goto end;
++ }
++
++#ifdef __linux__
++ ret = ioctl(s->chssl->sock_fd, IOCTL_TLSOM_SET_TLS_CONTEXT,
++ s->chssl->key_context);
++#else
++ ret = setsockopt(s->chssl->sock_fd, IPPROTO_TCP, TCP_TLSOM_SET_TLS_CONTEXT,
++ s->chssl->key_context, sizeof(struct tls_key_context));
++#endif
++ if (!ret) {
++ if (rw & KEY_WRITE_TX)
++ s->chssl->tx_keys_copied = 1;
++ else
++ s->chssl->rx_keys_copied = 1;
++ } else {
++ s->chssl->ofld_rx_enable = TLS_OFLD_FALSE;
++ s->chssl->ofld_tx_enable = TLS_OFLD_FALSE;
++ s->chssl->key_state = KEY_SPACE_NOTAVL;
++ }
++
++end:
++ free(s->chssl->key_context);
++ s->chssl->key_context = NULL;
++ return;
++}
++
++#ifdef CHSSL_TLS_RX
++int chssl_clear_quies(const SSL *s)
++{
++#ifdef __linux__
++ return ioctl(s->chssl->sock_fd, IOCTL_TLSOM_CLR_QUIES);
++#else
++ return setsockopt(s->chssl->sock_fd, IPPROTO_TCP, TCP_TLSOM_CLR_QUIES,
++ NULL, 0);
++#endif
++}
++
++int chssl_clear_tom(const SSL *s)
++{
++#ifdef __linux__
++ return ioctl(s->chssl->sock_fd, IOCTL_TLSOM_CLR_TLS_TOM);
++#else
++ return setsockopt(s->chssl->sock_fd, IPPROTO_TCP, TCP_TLSOM_CLR_TLS_TOM,
++ NULL, 0);
++#endif
++}
++#endif
++
++int chssl_process_cherror(SSL *s)
++{
++ const char *buf = (const char *)&(s->s3->rbuf.buf[0]);
++ unsigned int err = atoi(buf);
++
++ switch (err) {
++ case 0:
++ return SSL_AD_BAD_RECORD_MAC;
++ case 1:
++ case 2:
++ return SSL_AD_ILLEGAL_PARAMETER;
++ case 3:
++ return SSL_AD_RECORD_OVERFLOW;
++ case 4:
++ return SSL_AD_INTERNAL_ERROR;
++ }
++ return 0;
++}
++
++struct ch_ssl_st *chssl_new(SSL *s)
++{
++ if (s->chssl)
++ return s->chssl;
++ s->chssl = OPENSSL_malloc(sizeof(struct ch_ssl_st));
++ if (s->chssl)
++ memset(s->chssl, 0, sizeof(struct ch_ssl_st));
++ return s->chssl;
++}
++
++struct ch_ssl_st *chssl_free(SSL *s)
++{
++ if (!s->chssl)
++ return NULL;
++
++ free(s->chssl);
++ s->chssl = NULL;
++ return NULL;
++}
++#endif
+diff --git a/crypto/openssl/ssl/ssl_tom.h b/crypto/openssl/ssl/ssl_tom.h
+new file mode 100644
+index 000000000000..1381b8abeafd
+--- /dev/null
++++ b/crypto/openssl/ssl/ssl_tom.h
+@@ -0,0 +1,181 @@
++/*
++ * Common Header file TLSOM functionalities
++ *
++ * Copyright (C) 2011-2015 Chelsio Communications. All rights reserved.
++ *
++ * Written by Atul Gupta
++ *
++ * This program is distributed in the hope that it will be useful, but WITHOUT
++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
++ * FITNESS FOR A PARTICULAR PURPOSE. See the LICENSE file included in this
++ * release for licensing terms and conditions.
++ */
++#ifdef __linux__
++#include <linux/byteorder/little_endian.h>
++#endif
++#ifndef __TLSOM_CMN_H
++#define __TLSOM_CMN_H
++
++#define TLSOM_SUCCESS 0
++#define TLSOM_FAILURE -1
++
++#ifdef CHSSL_DEBUG
++ #define chssl_print(f,c) fprintf(f,c)
++#else
++ #define chssl_print(f,c) ;
++#endif
++
++#define MAX_MAC_KSZ 64 /*512 bits */
++#define SHA512_BLOCK 128 /* Block size for 512 */
++#define MAX_CIPHER_KSZ 32 /* 256 bits */
++#define CIPHER_BLOCK_SZ 16
++#define IV_SIZE (4+8) /*reserved 8 bytes */
++#define SALT_SIZE 4
++#define TLS_TX_HDR_SZ 16
++#define TLS_RX_HDR_SZ 16
++#define GHASH_SIZE 16
++#define MAX_TLS_KSZ (2*MAX_MAC_KSZ + MAX_CIPHER_KSZ)
++
++#ifdef __FreeBSD__
++#include <dev/cxgbe/tom/t4_tls.h>
++#endif
++#ifdef __linux__
++/* XXX: TCP_TLSKEY is not used */
++#define TCP_TLSKEY 291 /* Program Key Context on HW */
++#define IOCTL_TLSOM_SET_TLS_CONTEXT 201 /* Program Key Context on HW */
++#define IOCTL_TLSOM_GET_TLS_TOM 202 /* Query the TLS offload mode */
++#define IOCTL_TLSOM_CLR_TLS_TOM 203 /* Clear the Key */
++#define IOCTL_TLSOM_CLR_QUIES 204 /* Clear the Quiesec */
++#endif
++
++enum {
++ TLS_OFLD_FALSE = 0,
++ TLS_OFLD_TRUE,
++};
++
++#ifdef __linux__
++/* Can accomodate 16, 11-15 are reserved */
++enum {
++ CHSSL_SHA_NOP,
++ CHSSL_SHA1,
++ CHSSL_SHA224,
++ CHSSL_SHA256,
++ CHSSL_GHASH,
++ CHSSL_SHA512_224,
++ CHSSL_SHA512_256,
++ CHSSL_SHA512_384,
++ CHSSL_SHA512_512,
++ CHSSL_CBCMAC,
++ CHSSL_CMAC,
++};
++
++/* Can accomodate 16, 8-15 are reserved */
++enum {
++ CHSSL_CIPH_NOP,
++ CHSSL_AES_CBC,
++ CHSSL_AES_GCM,
++ CHSSL_AES_CTR,
++ CHSSL_AES_GEN,
++ CHSSL_IPSEC_ESP,
++ CHSSL_AES_XTS,
++ CHSSL_AES_CCM,
++};
++
++#define KEY_WRITE_RX 0x1 /* Program Receive Key */
++#define KEY_WRITE_TX 0x2 /* Program Transmit Key */
++#define KEY_DELETE_RX 0x4 /* Delete Receive Key */
++#define KEY_DELETE_TX 0x8 /* Delete Transmit Key */
++
++#define S_KEY_CLR_LOC 4
++#define M_KEY_CLR_LOC 0xf
++#define V_KEY_CLR_LOC(x) ((x) << S_KEY_CLR_LOC)
++#define G_FW_WR_EQUIQ(s) (((x) >> S_KEY_CLR_LOC) & M_KEY_CLR_LOC)
++#define F_KEY_CLR_LOC V_KEY_CLR_LOC(1U)
++
++/* XXX: Not used. */
++#define S_KEY_GET_LOC 0
++#define M_KEY_GET_LOC 0xf
++#define V_KEY_GET_LOC(x) ((x) << S_KEY_GET_LOC)
++#define G_KEY_GET_LOC(s) (((x) >> S_KEY_GET_LOC) & M_KEY_GET_LOC)
++
++/* XXX: Not used. */
++enum {
++ CHSSL_OFLDMODE_NONE,
++ CHSSL_OFLDMODE_ALLIN_HOST,
++ CHSSL_OFLDMODE_ALLIN_CARD,
++ CHSSL_OFLDMODE_MACIN_HOST,
++ CHSSL_OFLDMODE_FRAGMENTATIONIN_HOST,
++};
++
++/* XXX: Not used. */
++enum {
++ CHSSL_HOST_FRAGMENT,
++ CHSSL_CARD_FRAGMENT,
++};
++
++struct tls_ofld_state {
++ unsigned char enc_mode;
++ unsigned char mac_mode;
++ unsigned char key_loc;
++ unsigned char ofld_mode;
++ unsigned char auth_mode;
++ unsigned char resv[3];
++};
++
++struct tls_tx_ctxt {
++ unsigned char salt[SALT_SIZE];
++ unsigned char key[MAX_CIPHER_KSZ];
++ unsigned char ipad[MAX_MAC_KSZ];
++ unsigned char opad[MAX_MAC_KSZ];
++};
++
++struct tls_rx_ctxt {
++ unsigned char salt[SALT_SIZE];
++ unsigned char key[MAX_CIPHER_KSZ];
++ unsigned char ipad[MAX_MAC_KSZ];
++ unsigned char opad[MAX_MAC_KSZ];
++};
++
++struct tls_key_context {
++ struct tls_tx_ctxt tx;
++ struct tls_rx_ctxt rx;
++
++ unsigned char l_p_key;
++ unsigned char hmac_ctrl;
++ unsigned char mac_first;
++ unsigned char iv_size;
++ unsigned char iv_ctrl;
++ unsigned char iv_algo;
++ unsigned char tx_seq_no;
++ unsigned char rx_seq_no;
++
++ struct tls_ofld_state state;
++
++ unsigned int tx_key_info_size;
++ unsigned int rx_key_info_size;
++ unsigned int frag_size;
++ unsigned int mac_secret_size;
++ unsigned int cipher_secret_size;
++ int proto_ver;
++ unsigned int sock_fd;
++ unsigned short dtls_epoch;
++ unsigned short rsv;
++};
++#endif
++
++/* XXX: Not used. */
++struct tls_key_location {
++ unsigned int sock_fd;
++ unsigned int key_location;
++};
++
++struct ch_ssl_st *chssl_new(SSL *s);
++struct ch_ssl_st *chssl_free(SSL *s);
++int ssl_tls_offload(SSL *s);
++int SSL_ofld_vers(const SSL *s);
++#ifdef CHSSL_TLS_RX
++int SSL_ofld_rx(const SSL *s);
++int SSL_clr_quiesce(const SSL *s);
++#endif
++#endif
++
+diff --git a/crypto/openssl/ssl/t1_lib.c b/crypto/openssl/ssl/t1_lib.c
+index 1a4387b78eb9..c0dbb8a9cebf 100644
+--- a/crypto/openssl/ssl/t1_lib.c
++++ b/crypto/openssl/ssl/t1_lib.c
+@@ -121,6 +121,9 @@
+ #include <openssl/ocsp.h>
+ #include <openssl/rand.h>
+ #include "ssl_locl.h"
++#if defined(CHSSL_OFFLOAD) && defined(CHSSL_TLS_RX)
++#include "ssl_tom.h"
++#endif
+
+ const char tls1_version_str[] = "TLSv1" OPENSSL_VERSION_PTEXT;
+
+@@ -4051,6 +4054,10 @@ int tls1_process_heartbeat(SSL *s)
+ s->tlsext_hb_pending = 0;
+ }
+ }
++#if defined(CHSSL_OFFLOAD) && defined(CHSSL_TLS_RX)
++ if (SSL_ofld_rx(s))
++ chssl_clear_quies(s);
++#endif
+
+ return 0;
+ }
Index: security/openssl-chelsio/files/extra-patch-test_testssl
===================================================================
--- /dev/null
+++ security/openssl-chelsio/files/extra-patch-test_testssl
@@ -0,0 +1,15 @@
+Disable SSLv3 test when built without SSL3 option disabled
+
+ - Test for weak DH fails when enabled
+
+--- test/testssl.orig 2017-04-27 12:23:44 UTC
++++ test/testssl
+@@ -160,7 +160,7 @@ test_cipher() {
+ }
+ set -x
+ echo "Testing ciphersuites"
+-for protocol in TLSv1.2 SSLv3; do
++for protocol in TLSv1.2; do
+ echo "Testing ciphersuites for $protocol"
+ for cipher in `../util/shlib_wrap.sh ../apps/openssl ciphers "RSA+$protocol" | tr ':' ' '`; do
+ test_cipher $cipher $protocol
Index: security/openssl-chelsio/files/patch-Configure
===================================================================
--- /dev/null
+++ security/openssl-chelsio/files/patch-Configure
@@ -0,0 +1,45 @@
+--- Configure.orig 2015-06-11 15:50:11.000000000 +0200
++++ Configure 2015-06-12 16:20:39.000000000 +0200
+@@ -467,19 +467,20 @@
+ "android-mips","gcc:-mandroid -I\$(ANDROID_DEV)/include -B\$(ANDROID_DEV)/lib -O3 -Wall::-D_REENTRANT::-ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_INT DES_UNROLL BF_PTR:${mips32_asm}:o32:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
+
+ #### *BSD [do see comment about ${BSDthreads} above!]
+-"BSD-generic32","gcc:-O3 -fomit-frame-pointer -Wall::${BSDthreads}:::BN_LLONG RC2_CHAR RC4_INDEX DES_INT DES_UNROLL:${no_asm}:dlfcn:bsd-gcc-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
+-"BSD-x86", "gcc:-DL_ENDIAN -O3 -fomit-frame-pointer -Wall::${BSDthreads}:::BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_asm}:a.out:dlfcn:bsd-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
+-"BSD-x86-elf", "gcc:-DL_ENDIAN -O3 -fomit-frame-pointer -Wall::${BSDthreads}:::BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}:dlfcn:bsd-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
+-"debug-BSD-x86-elf", "gcc:-DL_ENDIAN -O3 -Wall -g::${BSDthreads}:::BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}:dlfcn:bsd-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
+-"BSD-sparcv8", "gcc:-DB_ENDIAN -O3 -mcpu=v8 -Wall::${BSDthreads}:::BN_LLONG RC2_CHAR RC4_INDEX DES_INT DES_UNROLL:${sparcv8_asm}:dlfcn:bsd-gcc-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
++"BSD-generic32","$ENV{'FREEBSDCC'}:-O3 -fomit-frame-pointer -Wall $ENV{'CFLAGS'}::${BSDthreads}:::BN_LLONG RC2_CHAR RC4_INDEX DES_INT DES_UNROLL:${no_asm}:dlfcn:bsd-gcc-shared:-fPIC::.so.\$(SHLIBVER)",
++"BSD-x86", "$ENV{'FREEBSDCC'}:-DL_ENDIAN -O3 -fomit-frame-pointer -Wall $ENV{'CFLAGS'}::${BSDthreads}:::BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_asm}:a.out:dlfcn:bsd-shared:-fPIC::.so.\$(SHLIBVER)",
++"BSD-x86-elf", "$ENV{'FREEBSDCC'}:-DL_ENDIAN -O3 -fomit-frame-pointer -Wall $ENV{'CFLAGS'}::${BSDthreads}:::BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}:dlfcn:bsd-shared:-fPIC::.so.\$(SHLIBVER)",
++"debug-BSD-x86-elf", "$ENV{'FREEBSDCC'}:-DL_ENDIAN -O3 -Wall -g $ENV{'CFLAGS'}::${BSDthreads}:::BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}:dlfcn:bsd-shared:-fPIC::.so.\$(SHLIBVER)",
++"BSD-sparcv8", "$ENV{'FREEBSDCC'}:-DB_ENDIAN -O3 -mcpu=v8 -Wall $ENV{'CFLAGS'}::${BSDthreads}:::BN_LLONG RC2_CHAR RC4_INDEX DES_INT DES_UNROLL:${sparcv8_asm}:dlfcn:bsd-gcc-shared:-fPIC::.so.\$(SHLIBVER)",
+
+-"BSD-generic64","gcc:-O3 -Wall::${BSDthreads}:::SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_INT DES_UNROLL:${no_asm}:dlfcn:bsd-gcc-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
++"BSD-generic64","$ENV{'FREEBSDCC'}:-O3 -Wall $ENV{'CFLAGS'}::${BSDthreads}:::SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_INT DES_UNROLL:${no_asm}:dlfcn:bsd-gcc-shared:-fPIC::.so.\$(SHLIBVER)",
+ # -DMD32_REG_T=int doesn't actually belong in sparc64 target, it
+ # simply *happens* to work around a compiler bug in gcc 3.3.3,
+ # triggered by RIPEMD160 code.
+-"BSD-sparc64", "gcc:-DB_ENDIAN -O3 -DMD32_REG_T=int -Wall::${BSDthreads}:::BN_LLONG RC2_CHAR RC4_CHUNK DES_INT DES_PTR DES_RISC2 BF_PTR:${sparcv9_asm}:dlfcn:bsd-gcc-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
+-"BSD-ia64", "gcc:-DL_ENDIAN -O3 -Wall::${BSDthreads}:::SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_UNROLL DES_INT:${ia64_asm}:dlfcn:bsd-gcc-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
+-"BSD-x86_64", "cc:-DL_ENDIAN -O3 -Wall::${BSDthreads}:::SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_INT DES_UNROLL:${x86_64_asm}:elf:dlfcn:bsd-gcc-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
++"BSD-sparc64", "$ENV{'FREEBSDCC'}:-DB_ENDIAN -O3 -DMD32_REG_T=int -Wall $ENV{'CFLAGS'}::${BSDthreads}:::BN_LLONG RC2_CHAR RC4_CHUNK DES_INT DES_PTR DES_RISC2 BF_PTR:${sparcv9_asm}:dlfcn:bsd-gcc-shared:-fPIC::.so.\$(SHLIBVER)",
++"BSD-ia64", "$ENV{'FREEBSDCC'}:-DL_ENDIAN -O3 -Wall $ENV{'CFLAGS'}::${BSDthreads}:::SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_UNROLL DES_INT:${ia64_asm}:dlfcn:bsd-gcc-shared:-fPIC::.so.\$(SHLIBVER)",
++"BSD-x86_64", "$ENV{'FREEBSDCC'}:-DL_ENDIAN -O3 -Wall $ENV{'CFLAGS'}::${BSDthreads}:::SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_INT DES_UNROLL:${x86_64_asm}:elf:dlfcn:bsd-gcc-shared:-fPIC::.so.\$(SHLIBVER)",
++"BSD-alpha", "$ENV{'FREEBSDCC'}:-DL_ENDIAN -O -Wall $ENV{'CFLAGS'}::${BSDthreads}:::SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_UNROLL DES_RISC1:${no_asm}:dlfcn:bsd-gcc-shared:-fPIC::.so.\$(SHLIBVER)",
+
+ "bsdi-elf-gcc", "gcc:-DPERL5 -DL_ENDIAN -fomit-frame-pointer -O3 -march=i486 -Wall::(unknown)::-ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}:dlfcn:bsd-gcc-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
+
+@@ -2019,10 +2020,12 @@
+ if ( $perl =~ m@^/@) {
+ &dofile("tools/c_rehash",$perl,'^#!/', '#!%s','^my \$dir;$', 'my $dir = "' . $openssldir . '";', '^my \$prefix;$', 'my $prefix = "' . $prefix . '";');
+ &dofile("apps/CA.pl",$perl,'^#!/', '#!%s');
++ &dofile("apps/tsget",$perl,'^#!/', '#!%s');
+ } else {
+ # No path for Perl known ...
+ &dofile("tools/c_rehash",'/usr/local/bin/perl','^#!/', '#!%s','^my \$dir;$', 'my $dir = "' . $openssldir . '";', '^my \$prefix;$', 'my $prefix = "' . $prefix . '";');
+ &dofile("apps/CA.pl",'/usr/local/bin/perl','^#!/', '#!%s');
++ &dofile("apps/tsget",'/usr/local/bin/perl',,'^#!/', '#!%s');
+ }
+ if ($depflags ne $default_depflags && !$make_depend) {
+ print <<EOF;
Index: security/openssl-chelsio/files/patch-Makefile
===================================================================
--- /dev/null
+++ security/openssl-chelsio/files/patch-Makefile
@@ -0,0 +1,11 @@
+--- apps/Makefile.orig Tue Aug 10 11:09:07 2004
++++ apps/Makefile Tue Oct 26 07:00:51 2004
+@@ -112,7 +112,7 @@
+ done
+ @cp openssl.cnf $(INSTALL_PREFIX)$(OPENSSLDIR)/openssl.cnf.new; \
+ chmod 644 $(INSTALL_PREFIX)$(OPENSSLDIR)/openssl.cnf.new; \
+- mv -f $(INSTALL_PREFIX)$(OPENSSLDIR)/openssl.cnf.new $(INSTALL_PREFIX)$(OPENSSLDIR)/openssl.cnf
++ mv -f $(INSTALL_PREFIX)$(OPENSSLDIR)/openssl.cnf.new $(INSTALL_PREFIX)$(OPENSSLDIR)/openssl.cnf.sample
+
+ tags:
+ ctags $(SRC)
Index: security/openssl-chelsio/files/patch-RFC-5705
===================================================================
--- /dev/null
+++ security/openssl-chelsio/files/patch-RFC-5705
@@ -0,0 +1,38 @@
+--- ssl/ssl.h 6 Jan 2010 17:37:38 -0000 1.221.2.24
++++ ssl/ssl.h 17 Jun 2010 12:25:35 -0000
+@@ -1806,6 +1806,10 @@
+ /* Pre-shared secret session resumption functions */
+ int SSL_set_session_secret_cb(SSL *s, tls_session_secret_cb_fn tls_session_secret_cb, void *arg);
+
++void SSL_tls1_key_exporter(SSL *s, unsigned char *label, int label_len,
++ unsigned char *context, int context_len,
++ unsigned char *out, int olen);
++
+ /* BEGIN ERROR CODES */
+ /* The following lines are auto generated by the script mkerr.pl. Any changes
+ * made after this point may be overwritten when the script is next run.
+
+--- ssl/t1_enc.c.orig 2015-01-22 15:58:32.000000000 +0100
++++ ssl/t1_enc.c 2015-03-10 07:21:12.000000000 +0100
+@@ -1261,6 +1261,21 @@
+ return (rv);
+ }
+
++void SSL_tls1_key_exporter(SSL *s, unsigned char *label, int label_len,
++ unsigned char *context, int context_len,
++ unsigned char *out, int olen)
++ {
++ unsigned char tmp[olen];
++
++ tls1_PRF(s->s3->tmp.new_cipher->algorithm2,
++ label, label_len,
++ s->s3->client_random,SSL3_RANDOM_SIZE,
++ s->s3->server_random,SSL3_RANDOM_SIZE,
++ context, context_len, NULL, 0,
++ s->session->master_key, s->session->master_key_length,
++ out, tmp, olen);
++ }
++
+ int tls1_alert_code(int code)
+ {
+ switch (code) {
Index: security/openssl-chelsio/files/patch-apps_s__client.c
===================================================================
--- /dev/null
+++ security/openssl-chelsio/files/patch-apps_s__client.c
@@ -0,0 +1,22 @@
+From 4e48c77572a9a96a301e362a3646cd3cc7eca0f9 Mon Sep 17 00:00:00 2001
+From: Carlos Alberto Lopez Perez <clopez@igalia.com>
+Date: Mon, 6 Aug 2012 01:45:51 +0200
+Subject: [PATCH] Fix XMPP code detection on s_client starttls xmpp
+
+ * Some XMPP Servers (OpenFire) use double quotes.
+ * This makes s_client starttls work with this servers.
+ * Tested with OpenFire servers from http://xmpp.net/ ::
+
+ openssl s_client -connect coderollers.com:5222 -starttls xmpp
+--- apps/s_client.c.orig 2017-05-25 12:54:38 UTC
++++ apps/s_client.c
+@@ -1663,7 +1663,8 @@ int MAIN(int argc, char **argv)
+ seen = BIO_read(sbio, mbuf, BUFSIZZ);
+ mbuf[seen] = 0;
+ while (!strstr
+- (mbuf, "<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'")) {
++ (mbuf, "<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'") &&
++ !strstr(mbuf, "<starttls xmlns=\"urn:ietf:params:xml:ns:xmpp-tls\"")) {
+ if (strstr(mbuf, "/stream:features>"))
+ goto shut;
+ seen = BIO_read(sbio, mbuf, BUFSIZZ);
Index: security/openssl-chelsio/files/patch-config
===================================================================
--- /dev/null
+++ security/openssl-chelsio/files/patch-config
@@ -0,0 +1,19 @@
+--- config.orig 2013-06-16 07:01:13.038797248 -0500
++++ config 2013-06-16 07:01:18.138794838 -0500
+@@ -734,14 +734,8 @@
+ sparc64-*-*bsd*) OUT="BSD-sparc64" ;;
+ ia64-*-*bsd*) OUT="BSD-ia64" ;;
+ amd64-*-*bsd*) OUT="BSD-x86_64" ;;
+- *86*-*-*bsd*) # mimic ld behaviour when it's looking for libc...
+- if [ -L /usr/lib/libc.so ]; then # [Free|Net]BSD
+- libc=/usr/lib/libc.so
+- else # OpenBSD
+- # ld searches for highest libc.so.* and so do we
+- libc=`(ls /usr/lib/libc.so.* /lib/libc.so.* | tail -1) 2>/dev/null`
+- fi
+- case "`(file -L $libc) 2>/dev/null`" in
++ *86*-*-*bsd*)
++ case "`(file -L /bin/sh) 2>/dev/null`" in
+ *ELF*) OUT="BSD-x86-elf" ;;
+ *) OUT="BSD-x86"; options="$options no-sse2" ;;
+ esac ;;
Index: security/openssl-chelsio/files/patch-ssl_fatalerrtest.c
===================================================================
--- /dev/null
+++ security/openssl-chelsio/files/patch-ssl_fatalerrtest.c
@@ -0,0 +1,48 @@
+From a4597f079bf2662e06d505538f83b6b610c41c7c Mon Sep 17 00:00:00 2001
+From: Matt Caswell <matt@openssl.org>
+Date: Thu, 7 Dec 2017 14:40:49 +0000
+Subject: [PATCH] Fix initialisation in fatalerrtest
+
+---
+ ssl/fatalerrtest.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/ssl/fatalerrtest.c b/ssl/fatalerrtest.c
+index 0288c33fa2e..749bc3697ea 100644
+--- ssl/fatalerrtest.c.orig
++++ ssl/fatalerrtest.c
+@@ -13,8 +13,8 @@
+
+ int main(int argc, char *argv[])
+ {
+- SSL_CTX *sctx, *cctx;
+- SSL *sssl, *cssl;
++ SSL_CTX *sctx = NULL, *cctx = NULL;
++ SSL *sssl = NULL, *cssl = NULL;
+ const char *msg = "Dummy";
+ BIO *err = NULL, *wbio = NULL;
+ int ret = 1, len;
+From b24e0573c6838e8d726fb16d558c562ce4e8f025 Mon Sep 17 00:00:00 2001
+From: Matt Caswell <matt@openssl.org>
+Date: Thu, 7 Dec 2017 14:41:21 +0000
+Subject: [PATCH] Fix the buffer sizing in the fatalerrtest
+
+Fixes #4865
+---
+ ssl/fatalerrtest.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/ssl/fatalerrtest.c b/ssl/fatalerrtest.c
+index 749bc3697ea..f9d66e27b30 100644
+--- ssl/fatalerrtest.c.orig
++++ ssl/fatalerrtest.c
+@@ -76,7 +76,7 @@ int main(int argc, char *argv[])
+ }
+
+ /* SSL_read()/SSL_write should fail because of a previous fatal error */
+- if ((len = SSL_read(sssl, buf, sizeof(buf - 1))) > 0) {
++ if ((len = SSL_read(sssl, buf, sizeof(buf) - 1)) > 0) {
+ buf[len] = '\0';
+ printf("Unexpected success reading data: %s\n", buf);
+ goto err;
+
Index: security/openssl-chelsio/files/pkg-message.in
===================================================================
--- /dev/null
+++ security/openssl-chelsio/files/pkg-message.in
@@ -0,0 +1 @@
+Edit %%PREFIX%%/openssl-chelsio/openssl.cnf to fit your needs.
Index: security/openssl-chelsio/pkg-descr
===================================================================
--- /dev/null
+++ security/openssl-chelsio/pkg-descr
@@ -0,0 +1,20 @@
+The OpenSSL Project is a collaborative effort to develop a robust,
+commercial-grade, full-featured, and Open Source toolkit implementing
+the Secure Sockets Layer (SSL v2/v3) and Transport Layer Security
+(TLS v1) protocols with full-strength cryptography world-wide. The
+project is managed by a worldwide community of volunteers that use
+the Internet to communicate, plan, and develop the OpenSSL tookit
+and its related documentation.
+
+OpenSSL is based on the excellent SSLeay library developed by Eric
+A. Young and Tim J. Hudson. The OpenSSL toolkit is licensed under
+an Apache-style licence, which basically means that you are free
+to get and use it for commercial and non-commercial purposes subject
+to some simple license conditions.
+
+This version of OpenSSL includes additional patches to support the
+use of TLS offload for offloaded TCP connections on Chelsio T6
+network adapters.
+
+WWW: http://www.openssl.org/
+WWW: http://sctp.fh-muenster.de/dtls-patches.html
Index: security/openssl-chelsio/pkg-plist
===================================================================
--- /dev/null
+++ security/openssl-chelsio/pkg-plist
@@ -0,0 +1,19 @@
+openssl-chelsio/lib/engines/lib4758cca.so
+openssl-chelsio/lib/engines/libaep.so
+openssl-chelsio/lib/engines/libatalla.so
+openssl-chelsio/lib/engines/libcapi.so
+openssl-chelsio/lib/engines/libchil.so
+openssl-chelsio/lib/engines/libcswift.so
+openssl-chelsio/lib/engines/libgmp.so
+openssl-chelsio/lib/engines/libgost.so
+openssl-chelsio/lib/engines/libnuron.so
+openssl-chelsio/lib/engines/libpadlock.so
+openssl-chelsio/lib/engines/libsureware.so
+openssl-chelsio/lib/engines/libubsec.so
+openssl-chelsio/lib/libcrypto.so
+openssl-chelsio/lib/libcrypto.so.%%SHLIBVER%%
+openssl-chelsio/lib/libssl.so
+openssl-chelsio/lib/libssl.so.%%SHLIBVER%%
+@dir openssl-chelsio/lib/engines
+@dir openssl-chelsio/lib
+@dir openssl-chelsio
Index: security/openssl-chelsio/version.mk
===================================================================
--- /dev/null
+++ security/openssl-chelsio/version.mk
@@ -0,0 +1,2 @@
+# Match FreeBSD 12's base version
+OPENSSL_SHLIBVER?= 8

File Metadata

Mime Type
text/plain
Expires
Thu, Jan 22, 8:38 AM (2 h, 57 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
27837734
Default Alt Text
D14634.id40111.diff (95 KB)

Event Timeline