[R-pkg-team] Bug#1007172: r-cran-pki incompatible with OpenSSL 3

Steve Langasek steve.langasek at canonical.com
Sat Mar 12 18:37:24 GMT 2022


Package: r-cran-pki
Version: 0.1-9-1
Severity: serious
Tags: patch experimental
User: ubuntu-devel at lists.ubuntu.com
Usertags: origin-ubuntu jammy ubuntu-patch

Hi Andreas,

r-cran-pki is incompatible with OpenSSL 3, which is currently in
experimental.  This shows up as an autopkgtest failure:

[...]
>  -- Ciphers
info("Ciphers")
> skey <- PKI.random(256)
> for (cipher in c("aes256ecb", "aes256ofb", "bfcbc", "bfecb", "bfofb", "bfcfb"))
+     assert(cipher, all(PKI.decrypt(PKI.encrypt(charToRaw("foo!"), skey, cipher), skey, cipher)[1:4] == charToRaw("foo!")))
   .  aes256ecb 
   .  aes256ofb 
   .  bfcbc 
Error in PKI.encrypt(charToRaw("foo!"), skey, cipher) : 
  error:0308010C:digital envelope routines::unsupported
Calls: assert -> stopifnot -> PKI.decrypt -> PKI.encrypt
Execution halted
autopkgtest [09:48:31]: test run-unit-test: -----------------------]
[...]

  (https://autopkgtest.ubuntu.com/results/autopkgtest-jammy/jammy/amd64/r/r-cran-pki/20220223_094913_a5969@/log.gz)

The issue is that r-cran-pki exposes use of various older, insecure
algorithms which are no longer available in the default crypto provider in
openssl, so additional steps are required in the code in order to enable use
of these algorithms.

I've prepared the attached patch which fixes the issue, and have uploaded it
to Ubuntu, since we are shipping OpenSSL 3 for the upcoming release.  Please
consider including it in Debian as well (and forwarding upstream).

-- 
Steve Langasek                   Give me a lever long enough and a Free OS
Debian Developer                   to set it on, and I can move the world.
Ubuntu Developer                                   https://www.debian.org/
slangasek at ubuntu.com                                     vorlon at debian.org
-------------- next part --------------
diff -Nru r-cran-pki-0.1-9/debian/patches/openssl3-compat.patch r-cran-pki-0.1-9/debian/patches/openssl3-compat.patch
--- r-cran-pki-0.1-9/debian/patches/openssl3-compat.patch	1969-12-31 16:00:00.000000000 -0800
+++ r-cran-pki-0.1-9/debian/patches/openssl3-compat.patch	2022-03-12 00:09:19.000000000 -0800
@@ -0,0 +1,85 @@
+Description: Fix compatibility with OpenSSL 3
+ Some algorithms exposed by PKI are now 'legacy' in OpenSSL and require
+ explicit enablement.
+Author: Steve Langasek <steve.langasek at ubuntu.com>
+Last-Update: 2022-03-12
+Forwarded: no
+
+Index: r-cran-pki-0.1-9/src/pki.h
+===================================================================
+--- r-cran-pki-0.1-9.orig/src/pki.h
++++ r-cran-pki-0.1-9/src/pki.h
+@@ -20,6 +20,10 @@
+ #include <openssl/x509_vfy.h>
+ #include <openssl/x509v3.h>
+ 
++#if OPENSSL_VERSION_NUMBER >= 0x30000000L
++#include <openssl/provider.h>
++#endif
++
+ #if __APPLE__
+ #if defined MAC_OS_X_VERSION_10_7 && MAC_OS_X_VERSION_MIN_REQUIRED >= 1070
+ /* use accelerated crypto on OS X instead of OpenSSL crypto */
+Index: r-cran-pki-0.1-9/src/pki-x509.c
+===================================================================
+--- r-cran-pki-0.1-9.orig/src/pki-x509.c
++++ r-cran-pki-0.1-9/src/pki-x509.c
+@@ -225,6 +225,28 @@
+ static EVP_CIPHER_CTX *get_cipher(SEXP sKey, SEXP sCipher, int enc, int *transient, SEXP sIV) {
+     EVP_CIPHER_CTX *ctx;
+     PKI_init();
++
++#if OPENSSL_VERSION_NUMBER >= 0x30000000L
++    static OSSL_PROVIDER *legacy_provider = NULL;
++    static OSSL_PROVIDER *default_provider = NULL;
++    static OSSL_LIB_CTX *ossl_ctx = NULL;
++
++    if (!ossl_ctx)
++	ossl_ctx = OSSL_LIB_CTX_new();
++    if (!ossl_ctx)
++	Rf_error("OSSL_LIB_CTX_new failed\n");
++
++    if (!legacy_provider)
++	legacy_provider = OSSL_PROVIDER_load(ossl_ctx, "legacy");
++    if (!legacy_provider)
++	Rf_error("OSSL_PROVIDER_load(legacy) failed\n");
++
++    if (!default_provider)
++	default_provider = OSSL_PROVIDER_load(ossl_ctx, "default");
++    if (!default_provider)
++	Rf_error("OSSL_PROVIDER_load(default) failed\n");
++#endif
++
+     if (inherits(sKey, "symmeric.cipher")) {
+ 	if (transient) transient[0] = 0;
+ 	return (EVP_CIPHER_CTX*) R_ExternalPtrAddr(sCipher);
+@@ -265,13 +287,29 @@
+ 	else if (!strcmp(cipher, "aes256ofb"))
+ 	    type = EVP_aes_256_ofb();
+ 	else if (!strcmp(cipher, "blowfish") || !strcmp(cipher, "bfcbc"))
++#if OPENSSL_VERSION_NUMBER >= 0x30000000L
++	    type = EVP_CIPHER_fetch(ossl_ctx, "BF-CBC", NULL);
++#else
+ 	    type = EVP_bf_cbc();
++#endif
+ 	else if (!strcmp(cipher, "bfecb"))
++#if OPENSSL_VERSION_NUMBER >= 0x30000000L
++	    type = EVP_CIPHER_fetch(ossl_ctx, "BF-ECB", NULL);
++#else
+ 	    type = EVP_bf_ecb();
++#endif
+ 	else if (!strcmp(cipher, "bfofb"))
++#if OPENSSL_VERSION_NUMBER >= 0x30000000L
++	    type = EVP_CIPHER_fetch(ossl_ctx, "BF-OFB", NULL);
++#else
+ 	    type = EVP_bf_ofb();
++#endif
+ 	else if (!strcmp(cipher, "bfcfb"))
++#if OPENSSL_VERSION_NUMBER >= 0x30000000L
++	    type = EVP_CIPHER_fetch(ossl_ctx, "BF-CFB", NULL);
++#else
+ 	    type = EVP_bf_cfb();
++#endif
+ 	else Rf_error("unknown cipher `%s'", CHAR(STRING_ELT(sCipher, 0)));
+ 
+ 	if (TYPEOF(sIV) == STRSXP) {
diff -Nru r-cran-pki-0.1-9/debian/patches/series r-cran-pki-0.1-9/debian/patches/series
--- r-cran-pki-0.1-9/debian/patches/series	1969-12-31 16:00:00.000000000 -0800
+++ r-cran-pki-0.1-9/debian/patches/series	2022-03-12 00:09:19.000000000 -0800
@@ -0,0 +1 @@
+openssl3-compat.patch


More information about the R-pkg-team mailing list