Add a legacy provider and put MD2 in it
authorMatt Caswell <matt@openssl.org>
Fri, 5 Apr 2019 09:47:05 +0000 (10:47 +0100)
committerMatt Caswell <matt@openssl.org>
Tue, 9 Apr 2019 09:24:43 +0000 (10:24 +0100)
Reviewed-by: Richard Levitte <levitte@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/8541)

Configure
INSTALL
crypto/evp/digest.c
crypto/property/property_parse.c
providers/build.info
providers/legacy/build.info [new file with mode: 0644]
providers/legacy/digests/build.info [new file with mode: 0644]
providers/legacy/digests/md2.c [new file with mode: 0644]
providers/legacy/legacyprov.c [new file with mode: 0644]
test/md2test.c
test/recipes/05-test_md2.t

index 6702bc6..3b7ca36 100755 (executable)
--- a/Configure
+++ b/Configure
@@ -374,6 +374,7 @@ my @disablables = (
     "fuzz-afl",
     "gost",
     "idea",
+    "legacy",
     "makedepend",
     "md2",
     "md4",
@@ -513,7 +514,7 @@ my @disable_cascades = (
     # or modules.
     "pic"               => [ "shared", "module" ],
 
-    "module"            => [ "fips" ],
+    "module"            => [ "fips", "legacy" ],
 
     "engine"            => [ grep /eng$/, @disablables ],
     "hw"                => [ "padlockeng" ],
@@ -532,6 +533,7 @@ my @disable_cascades = (
     sub { !$disabled{"msan"} } => [ "asm" ],
 
     sub { $disabled{cmac}; } => [ "siv" ],
+    "legacy"                 => [ "md2" ],
     );
 
 # Avoid protocol support holes.  Also disable all versions below N, if version
@@ -1226,7 +1228,7 @@ foreach my $what (sort keys %disabled) {
 
     if (!grep { $what eq $_ } ( 'buildtest-c++', 'fips', 'threads', 'shared',
                                 'module', 'pic', 'dynamic-engine', 'makedepend',
-                                'zlib-dynamic', 'zlib', 'sse2' )) {
+                                'zlib-dynamic', 'zlib', 'sse2', 'legacy' )) {
         (my $WHAT = uc $what) =~ s|-|_|g;
         my $skipdir = $what;
 
diff --git a/INSTALL b/INSTALL
index c496e79..50722a1 100644 (file)
--- a/INSTALL
+++ b/INSTALL
                    available if the GOST algorithms are also available through
                    loading an externally supplied engine.
 
+  no-legacy
+                   Don't build the legacy provider. Disabling this also disables
+                   the legacy algorithms: MD2 (already disabled by default).
+
   no-makedepend
                    Don't generate dependencies.
 
index 1af8d82..527c5d6 100644 (file)
@@ -145,6 +145,7 @@ int EVP_DigestInit_ex(EVP_MD_CTX *ctx, const EVP_MD *type, ENGINE *impl)
     if (type->prov == NULL) {
         switch(type->type) {
         case NID_sha256:
+        case NID_md2:
             break;
         default:
             goto legacy;
index 074da51..faaaee8 100644 (file)
@@ -523,6 +523,7 @@ int ossl_property_parse_init(void)
 {
     static const char *const predefined_names[] = {
         "default",      /* Being provided by the default built-in provider */
+        "legacy",       /* Provided by the legacy provider */
         "provider",     /* Name of provider (default, fips) */
         "version",      /* Version number of this provider */
         "fips",         /* FIPS supporting provider */
index b2b5384..1628e1f 100644 (file)
@@ -10,3 +10,14 @@ IF[{- !$disabled{fips} -}]
   INCLUDE[fips]=.. ../include ../crypto/include
   DEFINE[fips]=FIPS_MODE
 ENDIF
+
+IF[{- !$disabled{legacy} -}]
+  SUBDIRS=legacy
+  MODULES=legacy
+  IF[{- defined $target{shared_defflag} -}]
+    SOURCE[legacy]=legacy.ld
+    GENERATE[legacy.ld]=../util/providers.num
+  ENDIF
+  INCLUDE[legacy]=.. ../include ../crypto/include
+  DEPEND[legacy]=../libcrypto
+ENDIF
diff --git a/providers/legacy/build.info b/providers/legacy/build.info
new file mode 100644 (file)
index 0000000..df7e9ac
--- /dev/null
@@ -0,0 +1,4 @@
+SUBDIRS=digests
+
+SOURCE[../legacy]=\
+        legacyprov.c
diff --git a/providers/legacy/digests/build.info b/providers/legacy/digests/build.info
new file mode 100644 (file)
index 0000000..c4e1278
--- /dev/null
@@ -0,0 +1,4 @@
+IF[{- !$disabled{md2} -}]
+  SOURCE[../../legacy]=\
+          md2.c
+ENDIF
diff --git a/providers/legacy/digests/md2.c b/providers/legacy/digests/md2.c
new file mode 100644 (file)
index 0000000..c941dd7
--- /dev/null
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2019 The OpenSSL Project Authors. All Rights Reserved.
+ *
+ * Licensed under the Apache License 2.0 (the "License").  You may not use
+ * this file except in compliance with the License.  You can obtain a copy
+ * in the file LICENSE in the source distribution or at
+ * https://www.openssl.org/source/license.html
+ */
+
+#include <openssl/md2.h>
+#include <openssl/crypto.h>
+#include <openssl/core_numbers.h>
+
+static int md2_final(void *ctx, unsigned char *md, size_t *size)
+{
+    if (MD2_Final(md, ctx)) {
+        *size = MD2_DIGEST_LENGTH;
+        return 1;
+    }
+
+    return 0;
+}
+
+static void *md2_newctx(void)
+{
+    MD2_CTX *ctx = OPENSSL_zalloc(sizeof(*ctx));
+
+    return ctx;
+}
+
+static void md2_freectx(void *vctx)
+{
+    MD2_CTX *ctx = (MD2_CTX *)vctx;
+
+    OPENSSL_clear_free(ctx,  sizeof(*ctx));
+}
+
+static void *md2_dupctx(void *ctx)
+{
+    MD2_CTX *in = (MD2_CTX *)ctx;
+    MD2_CTX *ret = OPENSSL_malloc(sizeof(*ret));
+
+    *ret = *in;
+
+    return ret;
+}
+
+static size_t md2_size(void)
+{
+    return MD2_DIGEST_LENGTH;
+}
+
+extern const OSSL_DISPATCH md2_functions[];
+const OSSL_DISPATCH md2_functions[] = {
+    { OSSL_FUNC_DIGEST_NEWCTX, (void (*)(void))md2_newctx },
+    { OSSL_FUNC_DIGEST_INIT, (void (*)(void))MD2_Init },
+    { OSSL_FUNC_DIGEST_UPDDATE, (void (*)(void))MD2_Update },
+    { OSSL_FUNC_DIGEST_FINAL, (void (*)(void))md2_final },
+    { OSSL_FUNC_DIGEST_FREECTX, (void (*)(void))md2_freectx },
+    { OSSL_FUNC_DIGEST_DUPCTX, (void (*)(void))md2_dupctx },
+    { OSSL_FUNC_DIGEST_SIZE, (void (*)(void))md2_size },
+    { 0, NULL }
+};
diff --git a/providers/legacy/legacyprov.c b/providers/legacy/legacyprov.c
new file mode 100644 (file)
index 0000000..48e8933
--- /dev/null
@@ -0,0 +1,101 @@
+/*
+ * Copyright 2019 The OpenSSL Project Authors. All Rights Reserved.
+ *
+ * Licensed under the Apache License 2.0 (the "License").  You may not use
+ * this file except in compliance with the License.  You can obtain a copy
+ * in the file LICENSE in the source distribution or at
+ * https://www.openssl.org/source/license.html
+ */
+
+#include <string.h>
+#include <stdio.h>
+#include <openssl/core.h>
+#include <openssl/core_numbers.h>
+#include <openssl/core_names.h>
+#include <openssl/params.h>
+
+/* Functions provided by the core */
+static OSSL_core_get_param_types_fn *c_get_param_types = NULL;
+static OSSL_core_get_params_fn *c_get_params = NULL;
+
+/* Parameters we provide to the core */
+static const OSSL_ITEM legacy_param_types[] = {
+    { OSSL_PARAM_UTF8_PTR, OSSL_PROV_PARAM_NAME },
+    { OSSL_PARAM_UTF8_PTR, OSSL_PROV_PARAM_VERSION },
+    { OSSL_PARAM_UTF8_PTR, OSSL_PROV_PARAM_BUILDINFO },
+    { 0, NULL }
+};
+
+static const OSSL_ITEM *legacy_get_param_types(const OSSL_PROVIDER *prov)
+{
+    return legacy_param_types;
+}
+
+static int legacy_get_params(const OSSL_PROVIDER *prov,
+                            const OSSL_PARAM params[])
+{
+    const OSSL_PARAM *p;
+
+    p = OSSL_PARAM_locate(params, OSSL_PROV_PARAM_NAME);
+    if (p != NULL && !OSSL_PARAM_set_utf8_ptr(p, "OpenSSL Legacy Provider"))
+        return 0;
+    p = OSSL_PARAM_locate(params, OSSL_PROV_PARAM_VERSION);
+    if (p != NULL && !OSSL_PARAM_set_utf8_ptr(p, OPENSSL_VERSION_STR))
+        return 0;
+    p = OSSL_PARAM_locate(params, OSSL_PROV_PARAM_BUILDINFO);
+    if (p != NULL && !OSSL_PARAM_set_utf8_ptr(p, OPENSSL_FULL_VERSION_STR))
+        return 0;
+
+    return 1;
+}
+
+extern const OSSL_DISPATCH md2_functions[];
+
+static const OSSL_ALGORITHM legacy_digests[] = {
+#ifndef OPENSSL_NO_MD2
+    { "MD2", "legacy=yes", md2_functions },
+#endif
+    { NULL, NULL, NULL }
+};
+
+static const OSSL_ALGORITHM *legacy_query(OSSL_PROVIDER *prov,
+                                          int operation_id,
+                                          int *no_cache)
+{
+    *no_cache = 0;
+    switch (operation_id) {
+    case OSSL_OP_DIGEST:
+        return legacy_digests;
+    }
+    return NULL;
+}
+
+/* Functions we provide to the core */
+static const OSSL_DISPATCH legacy_dispatch_table[] = {
+    { OSSL_FUNC_PROVIDER_GET_PARAM_TYPES, (void (*)(void))legacy_get_param_types },
+    { OSSL_FUNC_PROVIDER_GET_PARAMS, (void (*)(void))legacy_get_params },
+    { OSSL_FUNC_PROVIDER_QUERY_OPERATION, (void (*)(void))legacy_query },
+    { 0, NULL }
+};
+
+int OSSL_provider_init(const OSSL_PROVIDER *provider,
+                       const OSSL_DISPATCH *in,
+                       const OSSL_DISPATCH **out)
+{
+    for (; in->function_id != 0; in++) {
+        switch (in->function_id) {
+        case OSSL_FUNC_CORE_GET_PARAM_TYPES:
+            c_get_param_types = OSSL_get_core_get_param_types(in);
+            break;
+        case OSSL_FUNC_CORE_GET_PARAMS:
+            c_get_params = OSSL_get_core_get_params(in);
+            break;
+        /* Just ignore anything we don't understand */
+        default:
+            break;
+        }
+    }
+
+    *out = legacy_dispatch_table;
+    return 1;
+}
index 3491e13..47f55b7 100644 (file)
@@ -9,9 +9,12 @@
 
 #include <string.h>
 
+#include <openssl/provider.h>
 #include "internal/nelem.h"
 #include "testutil.h"
 
+static OSSL_PROVIDER *prov = NULL;
+
 #ifndef OPENSSL_NO_MD2
 # include <openssl/evp.h>
 # include <openssl/md2.h>
@@ -58,6 +61,17 @@ static int test_md2(int n)
 }
 #endif
 
+int global_init(void)
+{
+    prov = OSSL_PROVIDER_load(NULL, "legacy");
+
+    return prov != NULL;
+}
+void cleanup_tests(void)
+{
+    OSSL_PROVIDER_unload(prov);
+}
+
 int setup_tests(void)
 {
 #ifndef OPENSSL_NO_MD2
index 8ac4f38..e60e791 100644 (file)
@@ -8,5 +8,10 @@
 
 
 use OpenSSL::Test::Simple;
+use OpenSSL::Test qw/:DEFAULT bldtop_dir/;
+
+setup("test_md2");
+
+$ENV{OPENSSL_MODULES} = bldtop_dir("providers");
 
 simple_test("test_md2", "md2test", "md2");