Control: tags -1 + upstream patch
Hello!
Please see attached patch which has (only) been compile-tested against
openssl 1.1.0. No runtime testing. No compile-testing against older
versions. No guarantees. Please review carefully.
Regards,
Andreas Henriksson
diff -urip libapache2-mod-auth-openidc-1.8.10.1/src/jose/apr_jwe.c libapache2-mod-auth-openidc-1.8.10.1.openssl110/src/jose/apr_jwe.c
--- libapache2-mod-auth-openidc-1.8.10.1/src/jose/apr_jwe.c 2016-04-03 18:34:49.000000000 +0000
+++ libapache2-mod-auth-openidc-1.8.10.1.openssl110/src/jose/apr_jwe.c 2016-11-01 18:26:39.773097593 +0000
@@ -175,10 +175,14 @@ static RSA* apr_jwe_jwk_to_openssl_rsa_k
jwk->key.rsa->private_exponent_len, private_exp);
}
+#if OPENSSL_VERSION_NUMBER >= 0x10100000L
+ RSA_set0_key(key, modulus, exponent, private_exp);
+#else
key->n = modulus;
key->e = exponent;
/* private_exp is NULL for public keys */
key->d = private_exp;
+#endif
return key;
}
@@ -489,10 +493,15 @@ apr_byte_t apr_jwe_decrypt_content_aescb
unsigned char *plaintext = apr_palloc(pool, p_len + AES_BLOCK_SIZE);
/* initialize decryption context */
- EVP_CIPHER_CTX decrypt_ctx;
- EVP_CIPHER_CTX_init(&decrypt_ctx);
+#if OPENSSL_VERSION_NUMBER >= 0x10100000L
+ EVP_CIPHER_CTX *decrypt_ctx = EVP_CIPHER_CTX_new();
+#else
+ EVP_CIPHER_CTX my_decrypt_ctx;
+ EVP_CIPHER_CTX *decrypt_ctx = &my_decrypt_ctx;
+ EVP_CIPHER_CTX_init(decrypt_ctx);
+#endif
/* pass the extracted encryption key and Initialization Vector */
- if (!EVP_DecryptInit_ex(&decrypt_ctx,
+ if (!EVP_DecryptInit_ex(decrypt_ctx,
apr_jwe_enc_to_openssl_cipher(header->enc), NULL, enc_key,
(const unsigned char *) iv->value)) {
apr_jwt_error_openssl(err, "EVP_DecryptInit_ex");
@@ -500,14 +509,14 @@ apr_byte_t apr_jwe_decrypt_content_aescb
}
/* decrypt the ciphertext in to the plaintext */
- if (!EVP_DecryptUpdate(&decrypt_ctx, plaintext, &p_len,
+ if (!EVP_DecryptUpdate(decrypt_ctx, plaintext, &p_len,
(const unsigned char *) cipher_text->value, cipher_text->len)) {
apr_jwt_error_openssl(err, "EVP_DecryptUpdate");
return FALSE;
}
/* decrypt the remaining bits/padding */
- if (!EVP_DecryptFinal_ex(&decrypt_ctx, plaintext + p_len, &f_len)) {
+ if (!EVP_DecryptFinal_ex(decrypt_ctx, plaintext + p_len, &f_len)) {
apr_jwt_error_openssl(err, "EVP_DecryptFinal_ex");
return FALSE;
}
@@ -516,7 +525,11 @@ apr_byte_t apr_jwe_decrypt_content_aescb
*decrypted = (char *) plaintext;
/* cleanup */
- EVP_CIPHER_CTX_cleanup(&decrypt_ctx);
+#if OPENSSL_VERSION_NUMBER >= 0x10100000L
+ EVP_CIPHER_CTX_free(decrypt_ctx);
+#else
+ EVP_CIPHER_CTX_cleanup(decrypt_ctx);
+#endif
/* if we got here, all must be fine */
return TRUE;
diff -urip libapache2-mod-auth-openidc-1.8.10.1/src/jose/apr_jwk.c libapache2-mod-auth-openidc-1.8.10.1.openssl110/src/jose/apr_jwk.c
--- libapache2-mod-auth-openidc-1.8.10.1/src/jose/apr_jwk.c 2016-01-08 20:50:19.000000000 +0000
+++ libapache2-mod-auth-openidc-1.8.10.1.openssl110/src/jose/apr_jwk.c 2016-11-01 18:07:47.809111822 +0000
@@ -122,6 +122,7 @@ static apr_byte_t apr_jwk_rsa_bio_to_key
X509 *x509 = NULL;
EVP_PKEY *pkey = NULL;
apr_byte_t rv = FALSE;
+ const BIGNUM *n, *e, *d;
if (is_private_key) {
/* get the private key struct from the BIO */
@@ -153,21 +154,29 @@ static apr_byte_t apr_jwk_rsa_bio_to_key
goto end;
}
+#if OPENSSL_VERSION_NUMBER >= 0x10100000L
+ RSA_get0_key(rsa, &n, &e, &d);
+#else
+ n = rsa->n;
+ e = rsa->e;
+ d = rsa->d;
+#endif
+
/* convert the modulus bignum in to a key/len */
- key->modulus_len = BN_num_bytes(rsa->n);
+ key->modulus_len = BN_num_bytes(n);
key->modulus = apr_pcalloc(pool, key->modulus_len);
- BN_bn2bin(rsa->n, key->modulus);
+ BN_bn2bin(n, key->modulus);
/* convert the exponent bignum in to a key/len */
- key->exponent_len = BN_num_bytes(rsa->e);
+ key->exponent_len = BN_num_bytes(e);
key->exponent = apr_pcalloc(pool, key->exponent_len);
- BN_bn2bin(rsa->e, key->exponent);
+ BN_bn2bin(e, key->exponent);
/* convert the private exponent bignum in to a key/len */
- if (rsa->d != NULL) {
- key->private_exponent_len = BN_num_bytes(rsa->d);
+ if (d != NULL) {
+ key->private_exponent_len = BN_num_bytes(d);
key->private_exponent = apr_pcalloc(pool, key->private_exponent_len);
- BN_bn2bin(rsa->d, key->private_exponent);
+ BN_bn2bin(d, key->private_exponent);
}
RSA_free(rsa);
diff -urip libapache2-mod-auth-openidc-1.8.10.1/src/jose/apr_jws.c libapache2-mod-auth-openidc-1.8.10.1.openssl110/src/jose/apr_jws.c
--- libapache2-mod-auth-openidc-1.8.10.1/src/jose/apr_jws.c 2016-07-11 13:18:18.000000000 +0000
+++ libapache2-mod-auth-openidc-1.8.10.1.openssl110/src/jose/apr_jws.c 2016-11-01 18:23:44.993099790 +0000
@@ -219,8 +219,14 @@ apr_byte_t apr_jws_hash_bytes(apr_pool_t
unsigned char **output, unsigned int *output_len, apr_jwt_error_t *err) {
unsigned char md_value[EVP_MAX_MD_SIZE];
- EVP_MD_CTX ctx;
- EVP_MD_CTX_init(&ctx);
+#if OPENSSL_VERSION_NUMBER >= 0x10100000L
+ EVP_MD_CTX *ctx;
+ ctx = EVP_MD_CTX_new();
+#else
+ EVP_MD_CTX my_ctx;
+ EVP_MD_CTX *ctx = &my_ctx;
+ EVP_MD_CTX_init(ctx);
+#endif
const EVP_MD *evp_digest = NULL;
if ((evp_digest = EVP_get_digestbyname(s_digest)) == NULL) {
@@ -230,20 +236,24 @@ apr_byte_t apr_jws_hash_bytes(apr_pool_t
return FALSE;
}
- if (!EVP_DigestInit_ex(&ctx, evp_digest, NULL)) {
+ if (!EVP_DigestInit_ex(ctx, evp_digest, NULL)) {
apr_jwt_error_openssl(err, "EVP_DigestInit_ex");
return FALSE;
}
- if (!EVP_DigestUpdate(&ctx, input, input_len)) {
+ if (!EVP_DigestUpdate(ctx, input, input_len)) {
apr_jwt_error_openssl(err, "EVP_DigestUpdate");
return FALSE;
}
- if (!EVP_DigestFinal_ex(&ctx, md_value, output_len)) {
+ if (!EVP_DigestFinal_ex(ctx, md_value, output_len)) {
apr_jwt_error_openssl(err, "EVP_DigestFinal_ex");
return FALSE;
}
- EVP_MD_CTX_cleanup(&ctx);
+#if OPENSSL_VERSION_NUMBER >= 0x10100000L
+ EVP_MD_CTX_free(ctx);
+#else
+ EVP_MD_CTX_cleanup(ctx);
+#endif
*output = apr_pcalloc(pool, *output_len);
memcpy(*output, md_value, *output_len);
@@ -303,8 +313,13 @@ apr_byte_t apr_jws_calculate_rsa(apr_poo
if ((digest = apr_jws_crypto_alg_to_evp(pool, jwt->header.alg, err)) == NULL)
return FALSE;
- EVP_MD_CTX ctx;
+#if OPENSSL_VERSION_NUMBER >= 0x10100000L
+ EVP_MD_CTX *ctx = EVP_MD_CTX_new();
+#else
+ EVP_MD_CTX my_ctx;
+ EVP_MD_CTX *ctx = &my_ctx;
EVP_MD_CTX_init(&ctx);
+#endif
RSA * privkey = RSA_new();
@@ -317,9 +332,13 @@ apr_byte_t apr_jws_calculate_rsa(apr_poo
BN_bin2bn(jwk->key.rsa->private_exponent,
jwk->key.rsa->private_exponent_len, private_exponent);
+#if OPENSSL_VERSION_NUMBER >= 0x10100000L
+ RSA_set0_key(privkey, modulus, exponent, private_exponent);
+#else
privkey->n = modulus;
privkey->e = exponent;
privkey->d = private_exponent;
+#endif
EVP_PKEY* pRsaKey = EVP_PKEY_new();
if (!EVP_PKEY_assign_RSA(pRsaKey, privkey)) {
@@ -333,15 +352,15 @@ apr_byte_t apr_jws_calculate_rsa(apr_poo
unsigned char *pDigest = apr_pcalloc(pool, RSA_size(privkey));
unsigned int uDigestLen = RSA_size(privkey);
- if (!EVP_DigestInit(&ctx, digest)) {
+ if (!EVP_DigestInit(ctx, digest)) {
apr_jwt_error_openssl(err, "EVP_DigestInit");
goto end;
}
- if (!EVP_DigestUpdate(&ctx, jwt->message, strlen(jwt->message))) {
+ if (!EVP_DigestUpdate(ctx, jwt->message, strlen(jwt->message))) {
apr_jwt_error_openssl(err, "EVP_DigestUpdate");
goto end;
}
- if (!EVP_DigestFinal(&ctx, pDigest, &uDigestLen)) {
+ if (!EVP_DigestFinal(ctx, pDigest, &uDigestLen)) {
apr_jwt_error_openssl(err, "wrong key? EVP_DigestFinal");
goto end;
}
@@ -371,17 +390,17 @@ apr_byte_t apr_jws_calculate_rsa(apr_poo
} else {
- if (!EVP_SignInit_ex(&ctx, digest, NULL)) {
+ if (!EVP_SignInit_ex(ctx, digest, NULL)) {
apr_jwt_error_openssl(err, "EVP_SignInit_ex");
goto end;
}
- if (!EVP_SignUpdate(&ctx, jwt->message, strlen(jwt->message))) {
+ if (!EVP_SignUpdate(ctx, jwt->message, strlen(jwt->message))) {
apr_jwt_error_openssl(err, "EVP_SignUpdate");
goto end;
}
- if (!EVP_SignFinal(&ctx, (unsigned char *) jwt->signature.bytes,
+ if (!EVP_SignFinal(ctx, (unsigned char *) jwt->signature.bytes,
(unsigned int *) &jwt->signature.length, pRsaKey)) {
apr_jwt_error_openssl(err, "wrong key? EVP_SignFinal");
goto end;
@@ -398,7 +417,11 @@ apr_byte_t apr_jws_calculate_rsa(apr_poo
} else if (privkey) {
RSA_free(privkey);
}
- EVP_MD_CTX_cleanup(&ctx);
+#if OPENSSL_VERSION_NUMBER >= 0x10100000L
+ EVP_MD_CTX_free(ctx);
+#else
+ EVP_MD_CTX_cleanup(ctx);
+#endif
return rc;
}
@@ -416,8 +439,13 @@ static apr_byte_t apr_jws_verify_rsa(apr
if ((digest = apr_jws_crypto_alg_to_evp(pool, jwt->header.alg, err)) == NULL)
return FALSE;
- EVP_MD_CTX ctx;
- EVP_MD_CTX_init(&ctx);
+#if OPENSSL_VERSION_NUMBER >= 0x10100000L
+ EVP_MD_CTX *ctx = EVP_MD_CTX_new();
+#else
+ EVP_MD_CTX my_ctx;
+ EVP_MD_CTX *ctx = &my_ctx;
+ EVP_MD_CTX_init(ctx);
+#endif
RSA * pubkey = RSA_new();
@@ -427,8 +455,12 @@ static apr_byte_t apr_jws_verify_rsa(apr
BN_bin2bn(jwk->key.rsa->modulus, jwk->key.rsa->modulus_len, modulus);
BN_bin2bn(jwk->key.rsa->exponent, jwk->key.rsa->exponent_len, exponent);
+#if OPENSSL_VERSION_NUMBER >= 0x10100000L
+ RSA_set0_key(pubkey, modulus, exponent, NULL);
+#else
pubkey->n = modulus;
pubkey->e = exponent;
+#endif
EVP_PKEY* pRsaKey = EVP_PKEY_new();
if (!EVP_PKEY_assign_RSA(pRsaKey, pubkey)) {
@@ -451,15 +483,15 @@ static apr_byte_t apr_jws_verify_rsa(apr
unsigned char *pDigest = apr_pcalloc(pool, RSA_size(pubkey));
unsigned int uDigestLen = RSA_size(pubkey);
- if (!EVP_DigestInit(&ctx, digest)) {
+ if (!EVP_DigestInit(ctx, digest)) {
apr_jwt_error_openssl(err, "EVP_DigestInit");
goto end;
}
- if (!EVP_DigestUpdate(&ctx, jwt->message, strlen(jwt->message))) {
+ if (!EVP_DigestUpdate(ctx, jwt->message, strlen(jwt->message))) {
apr_jwt_error_openssl(err, "EVP_DigestUpdate");
goto end;
}
- if (!EVP_DigestFinal(&ctx, pDigest, &uDigestLen)) {
+ if (!EVP_DigestFinal(ctx, pDigest, &uDigestLen)) {
apr_jwt_error_openssl(err, "wrong key? EVP_DigestFinal");
goto end;
}
@@ -477,16 +509,16 @@ static apr_byte_t apr_jws_verify_rsa(apr
} else if (apr_jws_signature_starts_with(pool, jwt->header.alg,
"RS") == TRUE) {
- if (!EVP_VerifyInit_ex(&ctx, digest, NULL)) {
+ if (!EVP_VerifyInit_ex(ctx, digest, NULL)) {
apr_jwt_error_openssl(err, "EVP_VerifyInit_ex");
goto end;
}
- if (!EVP_VerifyUpdate(&ctx, jwt->message, strlen(jwt->message))) {
+ if (!EVP_VerifyUpdate(ctx, jwt->message, strlen(jwt->message))) {
apr_jwt_error_openssl(err, "EVP_VerifyUpdate");
goto end;
}
- int rv = EVP_VerifyFinal(&ctx, (const unsigned char *) jwt->signature.bytes,
+ int rv = EVP_VerifyFinal(ctx, (const unsigned char *) jwt->signature.bytes,
jwt->signature.length, pRsaKey);
if (rv < 0) {
@@ -508,7 +540,11 @@ end:
} else if (pubkey) {
RSA_free(pubkey);
}
- EVP_MD_CTX_cleanup(&ctx);
+#if OPENSSL_VERSION_NUMBER >= 0x10100000L
+ EVP_MD_CTX_free(ctx);
+#else
+ EVP_MD_CTX_cleanup(ctx);
+#endif
return rc;
}