Control: tags -1 + patch Hi,
attached is a patch for compatibility with OpenSSL 1.1. Regards, Reiner
diff --git a/debian/patches/openssl1.1.patch b/debian/patches/openssl1.1.patch new file mode 100644 index 0000000..960d827 --- /dev/null +++ b/debian/patches/openssl1.1.patch @@ -0,0 +1,400 @@ +Author: Reiner Herrmann <rei...@reiner-h.de> +Description: Fix compatibility with OpenSSL 1.1 +Bug-Debian: https://bugs.debian.org/844534 + +--- a/encrypt_openssl.c ++++ b/encrypt_openssl.c +@@ -349,7 +349,7 @@ + const unsigned char *src, unsigned int srclen, + unsigned char *dest, unsigned int *destlen) + { +- EVP_CIPHER_CTX ctx; ++ EVP_CIPHER_CTX *ctx; + const EVP_CIPHER *cipher = get_cipher(keytype); + int mode, len; + +@@ -358,32 +358,32 @@ + return 0; + } + mode = EVP_CIPHER_mode(cipher); +- EVP_CIPHER_CTX_init(&ctx); +- if (!EVP_EncryptInit_ex(&ctx, cipher, NULL, NULL, NULL)) { ++ ctx = EVP_CIPHER_CTX_new(); ++ if (!EVP_EncryptInit_ex(ctx, cipher, NULL, NULL, NULL)) { + log_ssl_err("EncryptInit for cipher failed"); + return 0; + } + #ifdef EVP_CIPH_GCM_MODE + if (mode == EVP_CIPH_GCM_MODE) { +- if (!EVP_CIPHER_CTX_ctrl(&ctx, EVP_CTRL_GCM_SET_IVLEN, GCM_IV_LEN, 0)) { ++ if (!EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_SET_IVLEN, GCM_IV_LEN, 0)) { + log_ssl_err("EVP_CIPHER_CTX_ctrl for IVLEN failed"); +- EVP_CIPHER_CTX_cleanup(&ctx); ++ EVP_CIPHER_CTX_free(ctx); + return 0; + } + } else if (mode == EVP_CIPH_CCM_MODE) { +- if (!EVP_CIPHER_CTX_ctrl(&ctx, EVP_CTRL_CCM_SET_IVLEN, CCM_IV_LEN, 0)) { ++ if (!EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_CCM_SET_IVLEN, CCM_IV_LEN, 0)) { + log_ssl_err("EVP_CIPHER_CTX_ctrl for IVLEN failed"); +- EVP_CIPHER_CTX_cleanup(&ctx); ++ EVP_CIPHER_CTX_free(ctx); + return 0; + } +- if (!EVP_CIPHER_CTX_ctrl(&ctx, EVP_CTRL_CCM_SET_TAG, CCM_TAG_LEN, 0)) { ++ if (!EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_CCM_SET_TAG, CCM_TAG_LEN, 0)) { + log_ssl_err("EVP_CIPHER_CTX_ctrl for tag len failed"); +- EVP_CIPHER_CTX_cleanup(&ctx); ++ EVP_CIPHER_CTX_free(ctx); + return 0; + } + } + #endif +- if (!EVP_EncryptInit_ex(&ctx, NULL, NULL, key, IV)) { ++ if (!EVP_EncryptInit_ex(ctx, NULL, NULL, key, IV)) { + log_ssl_err("EncryptInit for key/IV failed"); + return 0; + } +@@ -391,53 +391,53 @@ + #ifdef EVP_CIPH_GCM_MODE + if ((mode == EVP_CIPH_GCM_MODE) || (mode == EVP_CIPH_CCM_MODE)) { + if (mode == EVP_CIPH_CCM_MODE) { +- if (!EVP_EncryptUpdate(&ctx, NULL, &len, NULL, srclen)) { ++ if (!EVP_EncryptUpdate(ctx, NULL, &len, NULL, srclen)) { + log_ssl_err("EncryptUpdate for datalen failed"); +- EVP_CIPHER_CTX_cleanup(&ctx); ++ EVP_CIPHER_CTX_free(ctx); + return 0; + } + } + if ((aad != NULL) && (aadlen > 0)) { +- if (!EVP_EncryptUpdate(&ctx, NULL, &len, aad, aadlen)) { ++ if (!EVP_EncryptUpdate(ctx, NULL, &len, aad, aadlen)) { + log_ssl_err("EncryptUpdate for authdata failed"); +- EVP_CIPHER_CTX_cleanup(&ctx); ++ EVP_CIPHER_CTX_free(ctx); + return 0; + } + } + } + #endif +- if (!EVP_EncryptUpdate(&ctx, dest, &len, src, srclen)) { ++ if (!EVP_EncryptUpdate(ctx, dest, &len, src, srclen)) { + log_ssl_err("EncryptUpdate for data failed"); +- EVP_CIPHER_CTX_cleanup(&ctx); ++ EVP_CIPHER_CTX_free(ctx); + return 0; + } + *destlen = len; +- if (!EVP_EncryptFinal_ex(&ctx, dest + *destlen, &len)) { ++ if (!EVP_EncryptFinal_ex(ctx, dest + *destlen, &len)) { + log_ssl_err("EncryptFinal failed"); +- EVP_CIPHER_CTX_cleanup(&ctx); ++ EVP_CIPHER_CTX_free(ctx); + return 0; + } + #ifdef EVP_CIPH_GCM_MODE + if (mode == EVP_CIPH_GCM_MODE) { +- if (!EVP_CIPHER_CTX_ctrl(&ctx, EVP_CTRL_GCM_GET_TAG, GCM_TAG_LEN, ++ if (!EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_GET_TAG, GCM_TAG_LEN, + dest + *destlen)) { + log_ssl_err("EVP_CIPHER_CTX_ctrl for get tag failed"); +- EVP_CIPHER_CTX_cleanup(&ctx); ++ EVP_CIPHER_CTX_free(ctx); + return 0; + } + len += GCM_TAG_LEN; + } else if (mode == EVP_CIPH_CCM_MODE) { +- if (!EVP_CIPHER_CTX_ctrl(&ctx, EVP_CTRL_CCM_GET_TAG, CCM_TAG_LEN, ++ if (!EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_CCM_GET_TAG, CCM_TAG_LEN, + dest + *destlen)) { + log_ssl_err("EVP_CIPHER_CTX_ctrl for get tag failed"); +- EVP_CIPHER_CTX_cleanup(&ctx); ++ EVP_CIPHER_CTX_free(ctx); + return 0; + } + len += CCM_TAG_LEN; + } + #endif + *destlen += len; +- EVP_CIPHER_CTX_cleanup(&ctx); ++ EVP_CIPHER_CTX_free(ctx); + + return 1; + } +@@ -453,7 +453,7 @@ + unsigned char *src, unsigned int srclen, + unsigned char *dest, unsigned int *destlen) + { +- EVP_CIPHER_CTX ctx; ++ EVP_CIPHER_CTX *ctx; + const EVP_CIPHER *cipher = get_cipher(keytype); + int mode, len, l_srclen; + +@@ -462,36 +462,36 @@ + return 0; + } + mode = EVP_CIPHER_mode(cipher); +- EVP_CIPHER_CTX_init(&ctx); +- if (!EVP_DecryptInit_ex(&ctx, cipher, NULL, NULL, NULL)) { ++ ctx = EVP_CIPHER_CTX_new(); ++ if (!EVP_DecryptInit_ex(ctx, cipher, NULL, NULL, NULL)) { + log_ssl_err("DecryptInit for cipher failed"); + return 0; + } + #ifdef EVP_CIPH_GCM_MODE + if (mode == EVP_CIPH_GCM_MODE) { + l_srclen = srclen - GCM_TAG_LEN; +- if (!EVP_CIPHER_CTX_ctrl(&ctx, EVP_CTRL_GCM_SET_IVLEN, GCM_IV_LEN, 0)) { ++ if (!EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_SET_IVLEN, GCM_IV_LEN, 0)) { + log_ssl_err("EVP_CIPHER_CTX_ctrl for IVLEN failed"); +- EVP_CIPHER_CTX_cleanup(&ctx); ++ EVP_CIPHER_CTX_free(ctx); + return 0; + } +- if (!EVP_CIPHER_CTX_ctrl(&ctx, EVP_CTRL_GCM_SET_TAG, GCM_TAG_LEN, ++ if (!EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_SET_TAG, GCM_TAG_LEN, + (void *)(src + l_srclen))) { + log_ssl_err("EVP_CIPHER_CTX_ctrl for set tag failed"); +- EVP_CIPHER_CTX_cleanup(&ctx); ++ EVP_CIPHER_CTX_free(ctx); + return 0; + } + } else if (mode == EVP_CIPH_CCM_MODE) { + l_srclen = srclen - CCM_TAG_LEN; +- if (!EVP_CIPHER_CTX_ctrl(&ctx, EVP_CTRL_CCM_SET_IVLEN, CCM_IV_LEN, 0)) { ++ if (!EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_CCM_SET_IVLEN, CCM_IV_LEN, 0)) { + log_ssl_err("EVP_CIPHER_CTX_ctrl for IVLEN failed"); +- EVP_CIPHER_CTX_cleanup(&ctx); ++ EVP_CIPHER_CTX_free(ctx); + return 0; + } +- if (!EVP_CIPHER_CTX_ctrl(&ctx, EVP_CTRL_CCM_SET_TAG, CCM_TAG_LEN, ++ if (!EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_CCM_SET_TAG, CCM_TAG_LEN, + (void *)(src + l_srclen))) { + log_ssl_err("EVP_CIPHER_CTX_ctrl for set tag failed"); +- EVP_CIPHER_CTX_cleanup(&ctx); ++ EVP_CIPHER_CTX_free(ctx); + return 0; + } + } else { +@@ -500,7 +500,7 @@ + #else + l_srclen = srclen; + #endif +- if (!EVP_DecryptInit_ex(&ctx, NULL, NULL, key, IV)) { ++ if (!EVP_DecryptInit_ex(ctx, NULL, NULL, key, IV)) { + log_ssl_err("DecryptInit for key/IV failed"); + return 0; + } +@@ -508,40 +508,40 @@ + #ifdef EVP_CIPH_GCM_MODE + if ((mode == EVP_CIPH_GCM_MODE) || (mode == EVP_CIPH_CCM_MODE)) { + if (mode == EVP_CIPH_CCM_MODE) { +- if (!EVP_DecryptUpdate(&ctx, NULL, &len, NULL, l_srclen)) { ++ if (!EVP_DecryptUpdate(ctx, NULL, &len, NULL, l_srclen)) { + log_ssl_err("DecryptUpdate for datalen failed"); +- EVP_CIPHER_CTX_cleanup(&ctx); ++ EVP_CIPHER_CTX_free(ctx); + return 0; + } + } + if ((aad != NULL) && (aadlen > 0)) { +- if (!EVP_DecryptUpdate(&ctx, NULL, &len, aad, aadlen)) { ++ if (!EVP_DecryptUpdate(ctx, NULL, &len, aad, aadlen)) { + log_ssl_err("DecryptUpdate for authdata failed"); +- EVP_CIPHER_CTX_cleanup(&ctx); ++ EVP_CIPHER_CTX_free(ctx); + return 0; + } + } + } + #endif +- if (!EVP_DecryptUpdate(&ctx, dest, &len, src, l_srclen)) { ++ if (!EVP_DecryptUpdate(ctx, dest, &len, src, l_srclen)) { + log_ssl_err("DecryptUpdate for data failed"); +- EVP_CIPHER_CTX_cleanup(&ctx); ++ EVP_CIPHER_CTX_free(ctx); + return 0; + } + *destlen = len; + #ifdef EVP_CIPH_CCM_MODE + if (mode != EVP_CIPH_CCM_MODE) { + #endif +- if (!EVP_DecryptFinal_ex(&ctx, dest + *destlen, &len)) { ++ if (!EVP_DecryptFinal_ex(ctx, dest + *destlen, &len)) { + log_ssl_err("DecryptFinal failed"); +- EVP_CIPHER_CTX_cleanup(&ctx); ++ EVP_CIPHER_CTX_free(ctx); + return 0; + } + *destlen += len; + #ifdef EVP_CIPH_CCM_MODE + } + #endif +- EVP_CIPHER_CTX_cleanup(&ctx); ++ EVP_CIPHER_CTX_free(ctx); + + return 1; + } +@@ -569,30 +569,30 @@ + int hash(int hashtype, const unsigned char *src, unsigned int srclen, + unsigned char *dest, unsigned int *destlen) + { +- EVP_MD_CTX hashctx; ++ EVP_MD_CTX *hashctx; + const EVP_MD *hashptr = get_hash(hashtype); + + if (hashptr == NULL) { + log0(0, 0, 0, "Invalid hashtype"); + return 0; + } +- EVP_MD_CTX_init(&hashctx); +- if (!EVP_DigestInit_ex(&hashctx, hashptr, NULL)) { ++ hashctx = EVP_MD_CTX_new(); ++ if (!EVP_DigestInit_ex(hashctx, hashptr, NULL)) { + log_ssl_err("DigestInit failed"); +- EVP_MD_CTX_cleanup(&hashctx); ++ EVP_MD_CTX_free(hashctx); + return 0; + } +- if (!EVP_DigestUpdate(&hashctx, src, srclen)) { ++ if (!EVP_DigestUpdate(hashctx, src, srclen)) { + log_ssl_err("DigestUpdate failed"); +- EVP_MD_CTX_cleanup(&hashctx); ++ EVP_MD_CTX_free(hashctx); + return 0; + } +- if (!EVP_DigestFinal_ex(&hashctx, dest, (unsigned int *)destlen)) { ++ if (!EVP_DigestFinal_ex(hashctx, dest, (unsigned int *)destlen)) { + log_ssl_err("DigestUpdate failed"); +- EVP_MD_CTX_cleanup(&hashctx); ++ EVP_MD_CTX_free(hashctx); + return 0; + } +- EVP_MD_CTX_cleanup(&hashctx); ++ EVP_MD_CTX_free(hashctx); + + return 1; + } +@@ -770,6 +770,7 @@ + unsigned int meshashlen; + const EVP_MD *hashptr; + ECDSA_SIG *_sig; ++ const BIGNUM *r, *s; + uint16_t *rlen, *slen; + unsigned char *rval, *sval; + +@@ -790,14 +791,15 @@ + rlen = (uint16_t *)sig; + slen = (uint16_t *)(sig + sizeof(uint16_t)); + rval = (unsigned char *)slen + sizeof(uint16_t); +- sval = rval + BN_num_bytes(_sig->r); ++ ECDSA_SIG_get0(_sig, &r, &s); ++ sval = rval + BN_num_bytes(r); + + *siglen = ECDSA_siglen(ec); + memset(sig, 0, *siglen); +- *rlen = htons(BN_num_bytes(_sig->r)); +- *slen = htons(BN_num_bytes(_sig->s)); +- BN_bn2bin(_sig->r, rval); +- BN_bn2bin(_sig->s, sval); ++ *rlen = htons(BN_num_bytes(r)); ++ *slen = htons(BN_num_bytes(s)); ++ BN_bn2bin(r, rval); ++ BN_bn2bin(s, sval); + ECDSA_SIG_free(_sig); + return 1; + #else +@@ -818,6 +820,7 @@ + unsigned int meshashlen; + const EVP_MD *hashptr; + ECDSA_SIG *_sig; ++ BIGNUM *r, *s; + const uint16_t *rlen, *slen; + const unsigned char *rval, *sval; + +@@ -841,16 +844,19 @@ + } + + _sig = ECDSA_SIG_new(); +- if (BN_bin2bn(rval, ntohs(*rlen), _sig->r) == NULL) { ++ r = BN_bin2bn(rval, ntohs(*rlen), NULL); ++ if (r == NULL) { + log_ssl_err("BN_bn2bin failed for r"); + ECDSA_SIG_free(_sig); + return 0; + } +- if (BN_bin2bn(sval, ntohs(*slen), _sig->s) == NULL) { +- log_ssl_err("BN_bn2bin failed for r"); ++ s = BN_bin2bn(sval, ntohs(*slen), NULL); ++ if (s == NULL) { ++ log_ssl_err("BN_bn2bin failed for s"); + ECDSA_SIG_free(_sig); + return 0; + } ++ ECDSA_SIG_set0(_sig, r, s); + + if (!ECDSA_do_verify(meshash, meshashlen, _sig, ec)) { + log_ssl_err("ECDSA_do_verify failed"); +@@ -912,6 +918,7 @@ + { + const struct rsa_blob_t *rsablob; + const unsigned char *modulus; ++ BIGNUM *n, *e; + + rsablob = (const struct rsa_blob_t *)keyblob; + modulus = keyblob + sizeof(struct rsa_blob_t); +@@ -923,15 +930,20 @@ + + *rsa = RSA_new(); + +- if (((*rsa)->e = BN_bin2bn((const unsigned char *)&rsablob->exponent, +- 4, NULL)) == NULL) { ++ e = BN_bin2bn((const unsigned char *)&rsablob->exponent, 4, NULL); ++ if (e == NULL) { + log_ssl_err("BN_bin2bn failed for e"); + return 0; + } +- if (((*rsa)->n = BN_bin2bn(modulus, ntohs(rsablob->modlen),NULL)) == NULL) { ++ n = BN_bin2bn(modulus, ntohs(rsablob->modlen), NULL); ++ if (n == NULL) { + log_ssl_err("BN_bin2bn failed for n"); + return 0; + } ++ if (!RSA_set0_key(*rsa, n, e, NULL)) { ++ log_ssl_err("RSA_set0_key failed"); ++ return 0; ++ } + + return 1; + } +@@ -947,15 +959,17 @@ + unsigned char bin_exponent[4]; + uint32_t exponent; + int explen, modlen, i; ++ const BIGNUM *n, *e; + + rsablob = (struct rsa_blob_t *)keyblob; + modulus = keyblob + sizeof(struct rsa_blob_t); + +- if (BN_num_bytes(rsa->e) > sizeof(bin_exponent)) { ++ RSA_get0_key(rsa, &n, &e, NULL); ++ if (BN_num_bytes(e) > sizeof(bin_exponent)) { + log0(0, 0, 0, "exponent too big for export"); + return 0; + } +- if ((explen = BN_bn2bin(rsa->e, bin_exponent)) <= 0) { ++ if ((explen = BN_bn2bin(e, bin_exponent)) <= 0) { + log_ssl_err("BN_bn2bin failed for e"); + return 0; + } +@@ -968,7 +982,7 @@ + exponent |= bin_exponent[i] << (8 * (explen - i - 1)); + } + +- if ((modlen = BN_bn2bin(rsa->n, modulus)) <= 0) { ++ if ((modlen = BN_bn2bin(n, modulus)) <= 0) { + log_ssl_err("BN_bn2bin failed for n"); + return 0; + } diff --git a/debian/patches/series b/debian/patches/series index 83ea0ab..bd28ac0 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -3,3 +3,4 @@ use_buildflags.patch manpage_fold_lines.patch manpage_adjust_line.patch fix_manpage_style.patch +openssl1.1.patch
signature.asc
Description: PGP signature