* lib/gc.h (gc_sha256, gc_sha512): New declarations.
* lib/gc-gnulib.c: Include sha256.h, sha512.h.
(MAX_DIGEST_SIZE): Set to 64.
(_gc_hash_ctx, gc_hash_open, gc_hash_digest_length, gc_hash_write,
gc_hash_read, gc_hash_buffer): Add support for sha256 and sha512.
(gc_sha256, gc_sha512): New functions.
* lib/gc-libgcrypt.c (gc_sha256, gc_sha512): New functions.
* modules/crypto/gc-sha256: New file, based on modules/crypto/gc-sha1.
* modules/crypto/gc-sha512: New file, based on modules/crypto/gc-sha1.
+2019-08-24 Bruno Haible <bruno@clisp.org>
+
+ crypto/gc-sha256, crypto/gc-sha512: New modules.
+ * lib/gc.h (gc_sha256, gc_sha512): New declarations.
+ * lib/gc-gnulib.c: Include sha256.h, sha512.h.
+ (MAX_DIGEST_SIZE): Set to 64.
+ (_gc_hash_ctx, gc_hash_open, gc_hash_digest_length, gc_hash_write,
+ gc_hash_read, gc_hash_buffer): Add support for sha256 and sha512.
+ (gc_sha256, gc_sha512): New functions.
+ * lib/gc-libgcrypt.c (gc_sha256, gc_sha512): New functions.
+ * modules/crypto/gc-sha256: New file, based on modules/crypto/gc-sha1.
+ * modules/crypto/gc-sha512: New file, based on modules/crypto/gc-sha1.
+
2019-08-24 Bruno Haible <bruno@clisp.org>
crypto/gc-sha1 tests: Improve output when the test fails.
#if GNULIB_GC_SHA1
# include "sha1.h"
#endif
+#if GNULIB_GC_SHA256
+# include "sha256.h"
+#endif
+#if GNULIB_GC_SHA512
+# include "sha512.h"
+#endif
#if GNULIB_GC_SM3
# include "sm3.h"
#endif
/* Hashes. */
-#define MAX_DIGEST_SIZE 32
+#define MAX_DIGEST_SIZE 64
typedef struct _gc_hash_ctx
{
#if GNULIB_GC_SHA1
struct sha1_ctx sha1Context;
#endif
+#if GNULIB_GC_SHA256
+ struct sha256_ctx sha256Context;
+#endif
+#if GNULIB_GC_SHA512
+ struct sha512_ctx sha512Context;
+#endif
#if GNULIB_GC_SM3
struct sm3_ctx sm3Context;
#endif
break;
#endif
+#if GNULIB_GC_SHA256
+ case GC_SHA256:
+ sha256_init_ctx (&ctx->sha256Context);
+ break;
+#endif
+
+#if GNULIB_GC_SHA512
+ case GC_SHA512:
+ sha512_init_ctx (&ctx->sha512Context);
+ break;
+#endif
+
#if GNULIB_GC_SM3
case GC_SM3:
sm3_init_ctx (&ctx->sm3Context);
len = GC_SHA1_DIGEST_SIZE;
break;
+ case GC_SHA256:
+ len = GC_SHA256_DIGEST_SIZE;
+ break;
+
+ case GC_SHA512:
+ len = GC_SHA512_DIGEST_SIZE;
+ break;
+
case GC_SM3:
len = GC_SM3_DIGEST_SIZE;
break;
break;
#endif
+#if GNULIB_GC_SHA256
+ case GC_SHA256:
+ sha256_process_bytes (data, len, &ctx->sha256Context);
+ break;
+#endif
+
+#if GNULIB_GC_SHA512
+ case GC_SHA512:
+ sha512_process_bytes (data, len, &ctx->sha512Context);
+ break;
+#endif
+
#if GNULIB_GC_SM3
case GC_SM3:
sm3_process_bytes (data, len, &ctx->sm3Context);
break;
#endif
+#if GNULIB_GC_SHA256
+ case GC_SHA256:
+ sha256_finish_ctx (&ctx->sha256Context, ctx->hash);
+ ret = ctx->hash;
+ break;
+#endif
+
+#if GNULIB_GC_SHA512
+ case GC_SHA512:
+ sha512_finish_ctx (&ctx->sha512Context, ctx->hash);
+ ret = ctx->hash;
+ break;
+#endif
+
#if GNULIB_GC_SM3
case GC_SM3:
sm3_finish_ctx (&ctx->sm3Context, ctx->hash);
break;
#endif
+#if GNULIB_GC_SHA256
+ case GC_SHA256:
+ sha256_buffer (in, inlen, resbuf);
+ break;
+#endif
+
+#if GNULIB_GC_SHA512
+ case GC_SHA512:
+ sha512_buffer (in, inlen, resbuf);
+ break;
+#endif
+
#if GNULIB_GC_SM3
case GC_SM3:
sm3_buffer (in, inlen, resbuf);
}
#endif
+#if GNULIB_GC_SHA256
+Gc_rc
+gc_sha256 (const void *in, size_t inlen, void *resbuf)
+{
+ sha256_buffer (in, inlen, resbuf);
+ return GC_OK;
+}
+#endif
+
+#if GNULIB_GC_SHA512
+Gc_rc
+gc_sha512 (const void *in, size_t inlen, void *resbuf)
+{
+ sha512_buffer (in, inlen, resbuf);
+ return GC_OK;
+}
+#endif
+
#if GNULIB_GC_SM3
Gc_rc
gc_sm3 (const void *in, size_t inlen, void *resbuf)
}
#endif
+#if GNULIB_GC_SHA256
+Gc_rc
+gc_sha256 (const void *in, size_t inlen, void *resbuf)
+{
+ size_t outlen = gcry_md_get_algo_dlen (GCRY_MD_SHA256);
+ gcry_md_hd_t hd;
+ gpg_error_t err;
+ unsigned char *p;
+
+ assert (outlen == GC_SHA256_DIGEST_SIZE);
+
+ err = gcry_md_open (&hd, GCRY_MD_SHA256, 0);
+ if (err != GPG_ERR_NO_ERROR)
+ return GC_INVALID_HASH;
+
+ gcry_md_write (hd, in, inlen);
+
+ p = gcry_md_read (hd, GCRY_MD_SHA256);
+ if (p == NULL)
+ {
+ gcry_md_close (hd);
+ return GC_INVALID_HASH;
+ }
+
+ memcpy (resbuf, p, outlen);
+
+ gcry_md_close (hd);
+
+ return GC_OK;
+}
+#endif
+
+#if GNULIB_GC_SHA512
+Gc_rc
+gc_sha512 (const void *in, size_t inlen, void *resbuf)
+{
+ size_t outlen = gcry_md_get_algo_dlen (GCRY_MD_SHA512);
+ gcry_md_hd_t hd;
+ gpg_error_t err;
+ unsigned char *p;
+
+ assert (outlen == GC_SHA512_DIGEST_SIZE);
+
+ err = gcry_md_open (&hd, GCRY_MD_SHA512, 0);
+ if (err != GPG_ERR_NO_ERROR)
+ return GC_INVALID_HASH;
+
+ gcry_md_write (hd, in, inlen);
+
+ p = gcry_md_read (hd, GCRY_MD_SHA512);
+ if (p == NULL)
+ {
+ gcry_md_close (hd);
+ return GC_INVALID_HASH;
+ }
+
+ memcpy (resbuf, p, outlen);
+
+ gcry_md_close (hd);
+
+ return GC_OK;
+}
+#endif
+
#if GNULIB_GC_SM3
Gc_rc
gc_sm3 (const void *in, size_t inlen, void *resbuf)
extern Gc_rc gc_md4 (const void *in, size_t inlen, void *resbuf);
extern Gc_rc gc_md5 (const void *in, size_t inlen, void *resbuf);
extern Gc_rc gc_sha1 (const void *in, size_t inlen, void *resbuf);
+extern Gc_rc gc_sha256 (const void *in, size_t inlen, void *resbuf);
+extern Gc_rc gc_sha512 (const void *in, size_t inlen, void *resbuf);
extern Gc_rc gc_sm3 (const void *in, size_t inlen, void *resbuf);
extern Gc_rc gc_hmac_md5 (const void *key, size_t keylen,
const void *in, size_t inlen, char *resbuf);
--- /dev/null
+Description:
+Generic crypto wrappers for SHA-256 functions.
+
+Files:
+m4/gc-sha256.m4
+
+Depends-on:
+crypto/gc
+crypto/sha256 [test "$ac_cv_libgcrypt" != yes]
+
+configure.ac:
+gl_GC_SHA256
+gl_MODULE_INDICATOR([gc-sha256])
+
+Makefile.am:
+
+Include:
+"gc.h"
+
+License:
+LGPLv2+
+
+Maintainer:
+Simon Josefsson
--- /dev/null
+Description:
+Generic crypto wrappers for SHA-512 functions.
+
+Files:
+m4/gc-sha512.m4
+
+Depends-on:
+crypto/gc
+crypto/sha512 [test "$ac_cv_libgcrypt" != yes]
+
+configure.ac:
+gl_GC_SHA512
+gl_MODULE_INDICATOR([gc-sha512])
+
+Makefile.am:
+
+Include:
+"gc.h"
+
+License:
+LGPLv2+
+
+Maintainer:
+Simon Josefsson