Provide EVP_MD_CTX_new(), EVP_MD_CTX_free() and EVP_MD_CTX_reset().
authorjsing <jsing@openbsd.org>
Sat, 17 Feb 2018 14:55:31 +0000 (14:55 +0000)
committerjsing <jsing@openbsd.org>
Sat, 17 Feb 2018 14:55:31 +0000 (14:55 +0000)
lib/libcrypto/Symbols.list
lib/libcrypto/evp/digest.c
lib/libcrypto/evp/evp.h

index 1da0493..d633575 100644 (file)
@@ -1274,8 +1274,11 @@ EVP_MD_CTX_copy_ex
 EVP_MD_CTX_create
 EVP_MD_CTX_ctrl
 EVP_MD_CTX_destroy
+EVP_MD_CTX_free
 EVP_MD_CTX_init
 EVP_MD_CTX_md
+EVP_MD_CTX_new
+EVP_MD_CTX_reset
 EVP_MD_CTX_set_flags
 EVP_MD_CTX_test_flags
 EVP_MD_block_size
index 7471c1e..b69a928 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: digest.c,v 1.28 2017/05/02 03:59:44 deraadt Exp $ */
+/* $OpenBSD: digest.c,v 1.29 2018/02/17 14:55:31 jsing Exp $ */
 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
  * All rights reserved.
  *
 #include <openssl/engine.h>
 #endif
 
-void
-EVP_MD_CTX_init(EVP_MD_CTX *ctx)
-{
-       memset(ctx, 0, sizeof *ctx);
-}
-
-EVP_MD_CTX *
-EVP_MD_CTX_create(void)
-{
-       return calloc(1, sizeof(EVP_MD_CTX));
-}
-
 int
 EVP_DigestInit(EVP_MD_CTX *ctx, const EVP_MD *type)
 {
@@ -339,20 +327,53 @@ EVP_Digest(const void *data, size_t count,
        return ret;
 }
 
+EVP_MD_CTX *
+EVP_MD_CTX_new(void)
+{
+       return calloc(1, sizeof(EVP_MD_CTX));
+}
+
+void
+EVP_MD_CTX_free(EVP_MD_CTX *ctx)
+{
+       if (ctx == NULL)
+               return;
+
+       EVP_MD_CTX_cleanup(ctx);
+
+       free(ctx);
+}
+
+void
+EVP_MD_CTX_init(EVP_MD_CTX *ctx)
+{
+       memset(ctx, 0, sizeof(*ctx));
+}
+
+int
+EVP_MD_CTX_reset(EVP_MD_CTX *ctx)
+{
+       return EVP_MD_CTX_cleanup(ctx);
+}
+
+EVP_MD_CTX *
+EVP_MD_CTX_create(void)
+{
+       return EVP_MD_CTX_new();
+}
+
 void
 EVP_MD_CTX_destroy(EVP_MD_CTX *ctx)
 {
-       if (ctx) {
-               EVP_MD_CTX_cleanup(ctx);
-               free(ctx);
-       }
+       EVP_MD_CTX_free(ctx);
 }
 
 /* This call frees resources associated with the context */
 int
 EVP_MD_CTX_cleanup(EVP_MD_CTX *ctx)
 {
-       /* Don't assume ctx->md_data was cleaned in EVP_Digest_Final,
+       /*
+        * Don't assume ctx->md_data was cleaned in EVP_Digest_Final,
         * because sometimes only copies of the context are ever finalised.
         */
        if (ctx->digest && ctx->digest->cleanup &&
@@ -368,7 +389,7 @@ EVP_MD_CTX_cleanup(EVP_MD_CTX *ctx)
                 * functional reference we held for this reason. */
                ENGINE_finish(ctx->engine);
 #endif
-       memset(ctx, 0, sizeof *ctx);
+       memset(ctx, 0, sizeof(*ctx));
 
        return 1;
 }
index c8da898..148e152 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: evp.h,v 1.55 2018/02/17 13:47:36 tb Exp $ */
+/* $OpenBSD: evp.h,v 1.56 2018/02/17 14:55:31 jsing Exp $ */
 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
  * All rights reserved.
  *
@@ -535,15 +535,19 @@ int EVP_Cipher(EVP_CIPHER_CTX *c, unsigned char *out, const unsigned char *in,
 #define EVP_delete_digest_alias(alias) \
        OBJ_NAME_remove(alias,OBJ_NAME_TYPE_MD_METH|OBJ_NAME_ALIAS);
 
+EVP_MD_CTX *EVP_MD_CTX_new(void);
+void EVP_MD_CTX_free(EVP_MD_CTX *ctx);
 void EVP_MD_CTX_init(EVP_MD_CTX *ctx);
-int EVP_MD_CTX_cleanup(EVP_MD_CTX *ctx);
+int EVP_MD_CTX_reset(EVP_MD_CTX *ctx);
 EVP_MD_CTX *EVP_MD_CTX_create(void);
 void EVP_MD_CTX_destroy(EVP_MD_CTX *ctx);
+int EVP_MD_CTX_cleanup(EVP_MD_CTX *ctx);
 int EVP_MD_CTX_copy_ex(EVP_MD_CTX *out, const EVP_MD_CTX *in);
 void EVP_MD_CTX_set_flags(EVP_MD_CTX *ctx, int flags);
 void EVP_MD_CTX_clear_flags(EVP_MD_CTX *ctx, int flags);
 int EVP_MD_CTX_ctrl(EVP_MD_CTX *ctx, int type, int arg, void *ptr);
 int EVP_MD_CTX_test_flags(const EVP_MD_CTX *ctx, int flags);
+
 int EVP_DigestInit_ex(EVP_MD_CTX *ctx, const EVP_MD *type, ENGINE *impl);
 int EVP_DigestUpdate(EVP_MD_CTX *ctx, const void *d, size_t cnt);
 int EVP_DigestFinal_ex(EVP_MD_CTX *ctx, unsigned char *md, unsigned int *s);