Implement SHA256 in the default provider
authorMatt Caswell <matt@openssl.org>
Wed, 13 Mar 2019 17:26:17 +0000 (17:26 +0000)
committerMatt Caswell <matt@openssl.org>
Thu, 21 Mar 2019 09:23:38 +0000 (09:23 +0000)
Reviewed-by: Paul Dale <paul.dale@oracle.com>
(Merged from https://github.com/openssl/openssl/pull/8513)

crypto/evp/digest.c
providers/build.info
providers/common/build.info [new file with mode: 0644]
providers/common/digests/build.info [new file with mode: 0644]
providers/common/digests/sha2.c [new file with mode: 0644]
providers/default/defltprov.c

index 9e8aaf2..d4b4814 100644 (file)
@@ -140,6 +140,8 @@ int EVP_DigestInit_ex(EVP_MD_CTX *ctx, const EVP_MD *type, ENGINE *impl)
 
     if (type->prov == NULL) {
         switch(type->type) {
+        case NID_sha256:
+            break;
         default:
             goto legacy;
         }
index 29cc184..ec4162b 100644 (file)
@@ -1 +1 @@
-SUBDIRS=default
+SUBDIRS=common default
diff --git a/providers/common/build.info b/providers/common/build.info
new file mode 100644 (file)
index 0000000..5cb7e43
--- /dev/null
@@ -0,0 +1 @@
+SUBDIRS=digests
diff --git a/providers/common/digests/build.info b/providers/common/digests/build.info
new file mode 100644 (file)
index 0000000..a3c2369
--- /dev/null
@@ -0,0 +1,3 @@
+LIBS=../../../libcrypto
+SOURCE[../../../libcrypto]=\
+        sha2.c
diff --git a/providers/common/digests/sha2.c b/providers/common/digests/sha2.c
new file mode 100644 (file)
index 0000000..b538ab9
--- /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/sha.h>
+#include <openssl/crypto.h>
+#include <openssl/core_numbers.h>
+
+static int sha256_final(void *ctx, unsigned char *md, size_t *size)
+{
+    if (SHA256_Final(md, ctx)) {
+        *size = SHA256_DIGEST_LENGTH;
+        return 1;
+    }
+
+    return 0;
+}
+
+static void *sha256_newctx(void)
+{
+    SHA256_CTX *ctx = OPENSSL_zalloc(sizeof(*ctx));
+
+    return ctx;
+}
+
+static void sha256_freectx(void *vctx)
+{
+    SHA256_CTX *ctx = (SHA256_CTX *)vctx;
+
+    OPENSSL_clear_free(ctx,  sizeof(*ctx));
+}
+
+static void *sha256_dupctx(void *ctx)
+{
+    SHA256_CTX *in = (SHA256_CTX *)ctx;
+    SHA256_CTX *ret = OPENSSL_malloc(sizeof(*ret));
+
+    *ret = *in;
+
+    return ret;
+}
+
+static size_t sha256_size(void)
+{
+    return SHA256_DIGEST_LENGTH;
+}
+
+extern const OSSL_DISPATCH sha256_functions[];
+const OSSL_DISPATCH sha256_functions[] = {
+    { OSSL_FUNC_DIGEST_NEWCTX, (void (*)(void))sha256_newctx },
+    { OSSL_FUNC_DIGEST_INIT, (void (*)(void))SHA256_Init },
+    { OSSL_FUNC_DIGEST_UPDDATE, (void (*)(void))SHA256_Update },
+    { OSSL_FUNC_DIGEST_FINAL, (void (*)(void))sha256_final },
+    { OSSL_FUNC_DIGEST_FREECTX, (void (*)(void))sha256_freectx },
+    { OSSL_FUNC_DIGEST_DUPCTX, (void (*)(void))sha256_dupctx },
+    { OSSL_FUNC_DIGEST_SIZE, (void (*)(void))sha256_size },
+    { 0, NULL }
+};
index 2790309..9b52429 100644 (file)
@@ -49,10 +49,30 @@ static int deflt_get_params(const OSSL_PROVIDER *prov,
     return 1;
 }
 
+extern const OSSL_DISPATCH sha256_functions[];
+
+static const OSSL_ALGORITHM deflt_digests[] = {
+    { "SHA256", "default=yes", sha256_functions },
+    { NULL, NULL, NULL }
+};
+
+static const OSSL_ALGORITHM *deflt_query(OSSL_PROVIDER *prov,
+                                         int operation_id,
+                                         int *no_cache)
+{
+    *no_cache = 0;
+    switch (operation_id) {
+    case OSSL_OP_DIGEST:
+        return deflt_digests;
+    }
+    return NULL;
+}
+
 /* Functions we provide to the core */
 static const OSSL_DISPATCH deflt_dispatch_table[] = {
     { OSSL_FUNC_PROVIDER_GET_PARAM_TYPES, (void (*)(void))deflt_get_param_types },
     { OSSL_FUNC_PROVIDER_GET_PARAMS, (void (*)(void))deflt_get_params },
+    { OSSL_FUNC_PROVIDER_QUERY_OPERATION, (void (*)(void))deflt_query },
     { 0, NULL }
 };