[git] GCRYPT - branch, master, updated. libgcrypt-1.6.0-59-g5a8e150
by Dmitry Eremin-Solenikov
cvs at cvs.gnupg.org
Tue Mar 11 22:08:51 CET 2014
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "The GNU crypto library".
The branch, master has been updated
via 5a8e1504bf8a2ffbc018be576dea77b685200444 (commit)
from 2b5403c408dfbd71be24c7635f5fa0b61ab4c9bb (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit 5a8e1504bf8a2ffbc018be576dea77b685200444
Author: Dmitry Eremin-Solenikov <dbaryshkov at gmail.com>
Date: Tue Mar 11 21:53:05 2014 +0400
Add MD2 message digest implementation
* cipher/md2.c: New.
* cipher/md.c (digest_list): add _gcry_digest_spec_md2.
* tests/basic.c (check_digests): add MD2 test vectors.
* configure.ac (default_digests): disable md2 by default.
--
Signed-off-by: Dmitry Eremin-Solenikov <dbaryshkov at gmail.com>
Some minor indentation fixes by wk.
diff --git a/cipher/md.c b/cipher/md.c
index a332e03..461ad64 100644
--- a/cipher/md.c
+++ b/cipher/md.c
@@ -75,6 +75,9 @@ static gcry_md_spec_t *digest_list[] =
#if USE_MD4
&_gcry_digest_spec_md4,
#endif
+#if USE_MD2
+ &_gcry_digest_spec_md2,
+#endif
NULL
};
diff --git a/cipher/md2.c b/cipher/md2.c
new file mode 100644
index 0000000..97682e5
--- /dev/null
+++ b/cipher/md2.c
@@ -0,0 +1,182 @@
+/* md2.c - MD2 Message-Digest Algorithm
+ * Copyright (C) 2014 Dmitry Eremin-Solenikov
+ *
+ * This file is part of Libgcrypt.
+ *
+ * Libgcrypt is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * Libgcrypt is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#include <config.h>
+
+#include "g10lib.h"
+#include "cipher.h"
+
+#include "bithelp.h"
+#include "bufhelp.h"
+#include "hash-common.h"
+
+typedef struct {
+ gcry_md_block_ctx_t bctx;
+ unsigned char C[16];
+ unsigned char L;
+ unsigned char X[48];
+} MD2_CONTEXT;
+
+static const unsigned char S[] =
+ {
+ 0x29, 0x2E, 0x43, 0xC9, 0xA2, 0xD8, 0x7C, 0x01,
+ 0x3D, 0x36, 0x54, 0xA1, 0xEC, 0xF0, 0x06, 0x13,
+ 0x62, 0xA7, 0x05, 0xF3, 0xC0, 0xC7, 0x73, 0x8C,
+ 0x98, 0x93, 0x2B, 0xD9, 0xBC, 0x4C, 0x82, 0xCA,
+ 0x1E, 0x9B, 0x57, 0x3C, 0xFD, 0xD4, 0xE0, 0x16,
+ 0x67, 0x42, 0x6F, 0x18, 0x8A, 0x17, 0xE5, 0x12,
+ 0xBE, 0x4E, 0xC4, 0xD6, 0xDA, 0x9E, 0xDE, 0x49,
+ 0xA0, 0xFB, 0xF5, 0x8E, 0xBB, 0x2F, 0xEE, 0x7A,
+ 0xA9, 0x68, 0x79, 0x91, 0x15, 0xB2, 0x07, 0x3F,
+ 0x94, 0xC2, 0x10, 0x89, 0x0B, 0x22, 0x5F, 0x21,
+ 0x80, 0x7F, 0x5D, 0x9A, 0x5A, 0x90, 0x32, 0x27,
+ 0x35, 0x3E, 0xCC, 0xE7, 0xBF, 0xF7, 0x97, 0x03,
+ 0xFF, 0x19, 0x30, 0xB3, 0x48, 0xA5, 0xB5, 0xD1,
+ 0xD7, 0x5E, 0x92, 0x2A, 0xAC, 0x56, 0xAA, 0xC6,
+ 0x4F, 0xB8, 0x38, 0xD2, 0x96, 0xA4, 0x7D, 0xB6,
+ 0x76, 0xFC, 0x6B, 0xE2, 0x9C, 0x74, 0x04, 0xF1,
+ 0x45, 0x9D, 0x70, 0x59, 0x64, 0x71, 0x87, 0x20,
+ 0x86, 0x5B, 0xCF, 0x65, 0xE6, 0x2D, 0xA8, 0x02,
+ 0x1B, 0x60, 0x25, 0xAD, 0xAE, 0xB0, 0xB9, 0xF6,
+ 0x1C, 0x46, 0x61, 0x69, 0x34, 0x40, 0x7E, 0x0F,
+ 0x55, 0x47, 0xA3, 0x23, 0xDD, 0x51, 0xAF, 0x3A,
+ 0xC3, 0x5C, 0xF9, 0xCE, 0xBA, 0xC5, 0xEA, 0x26,
+ 0x2C, 0x53, 0x0D, 0x6E, 0x85, 0x28, 0x84, 0x09,
+ 0xD3, 0xDF, 0xCD, 0xF4, 0x41, 0x81, 0x4D, 0x52,
+ 0x6A, 0xDC, 0x37, 0xC8, 0x6C, 0xC1, 0xAB, 0xFA,
+ 0x24, 0xE1, 0x7B, 0x08, 0x0C, 0xBD, 0xB1, 0x4A,
+ 0x78, 0x88, 0x95, 0x8B, 0xE3, 0x63, 0xE8, 0x6D,
+ 0xE9, 0xCB, 0xD5, 0xFE, 0x3B, 0x00, 0x1D, 0x39,
+ 0xF2, 0xEF, 0xB7, 0x0E, 0x66, 0x58, 0xD0, 0xE4,
+ 0xA6, 0x77, 0x72, 0xF8, 0xEB, 0x75, 0x4B, 0x0A,
+ 0x31, 0x44, 0x50, 0xB4, 0x8F, 0xED, 0x1F, 0x1A,
+ 0xDB, 0x99, 0x8D, 0x33, 0x9F, 0x11, 0x83, 0x14
+};
+
+
+static void
+permute (unsigned char *X, const unsigned char *buf)
+{
+ int i, j;
+ unsigned char t;
+
+ memcpy (X+16, buf, 16);
+ for (i = 0; i < 16; i++)
+ X[32+i] = X[16+i] ^ X[i];
+ t = 0;
+ for (i = 0; i < 18; i++)
+ {
+ for (j = 0; j < 48; j++)
+ {
+ t = X[j] ^ S[t];
+ X[j] = t;
+ }
+ t += i;
+ }
+}
+
+
+static unsigned int
+transform_blk (void *c, const unsigned char *data)
+{
+ MD2_CONTEXT *ctx = c;
+ int j;
+
+ for (j = 0; j < 16; j++)
+ {
+ ctx->C[j] ^= S[data[j] ^ ctx->L];
+ ctx->L = ctx->C[j];
+ }
+
+ permute(ctx->X, data);
+
+ return /* burn stack */ 4 + 5 * sizeof(void*);
+}
+
+
+static unsigned int
+transform ( void *c, const unsigned char *data, size_t nblks )
+{
+ unsigned int burn;
+
+ do
+ {
+ burn = transform_blk (c, data);
+ data += 64;
+ }
+ while (--nblks);
+
+ return burn;
+}
+
+
+static void
+md2_init (void *context, unsigned int flags)
+{
+ MD2_CONTEXT *ctx = context;
+
+ (void)flags;
+
+ memset (ctx, 0, sizeof(*ctx));
+ ctx->bctx.blocksize = 16;
+ ctx->bctx.bwrite = transform;
+}
+
+
+static void
+md2_final (void *context)
+{
+ MD2_CONTEXT *hd = context;
+ unsigned int burn;
+
+ _gcry_md_block_write(hd, NULL, 0); /* flush */;
+
+ /* pad */
+ memset (hd->bctx.buf + hd->bctx.count,
+ 16 - hd->bctx.count, 16 - hd->bctx.count);
+ burn = transform_blk (hd, hd->bctx.buf);
+ permute (hd->X, hd->C);
+}
+
+static byte *
+md2_read (void *context)
+{
+ MD2_CONTEXT *hd = (MD2_CONTEXT *) context;
+ return hd->X;
+}
+
+static byte asn[18] = /* Object ID is 1.2.840.113549.2.2 */
+ { 0x30, 0x20, 0x30, 0x0c, 0x06, 0x08, 0x2a, 0x86,0x48,
+ 0x86, 0xf7, 0x0d, 0x02, 0x02, 0x05, 0x00, 0x04, 0x10 };
+
+static gcry_md_oid_spec_t oid_spec_md2[] =
+ {
+ /* iso.member-body.us.rsadsi.digestAlgorithm.md2 */
+ { "1.2.840.113549.2.2" },
+ { NULL },
+ };
+
+gcry_md_spec_t _gcry_digest_spec_md2 =
+ {
+ GCRY_MD_MD2, {0, 0},
+ "MD2", asn, DIM (asn), oid_spec_md2, 16,
+ md2_init, _gcry_md_block_write, md2_final, md2_read,
+ sizeof (MD2_CONTEXT)
+ };
diff --git a/configure.ac b/configure.ac
index a447859..a0f75a5 100644
--- a/configure.ac
+++ b/configure.ac
@@ -194,7 +194,7 @@ available_pubkey_ciphers="dsa elgamal rsa ecc"
enabled_pubkey_ciphers=""
# Definitions for message digests.
-available_digests="crc gostr3411-94 md4 md5 rmd160 sha1 sha256"
+available_digests="crc gostr3411-94 md2 md4 md5 rmd160 sha1 sha256"
available_digests_64="sha512 tiger whirlpool stribog"
enabled_digests=""
@@ -377,6 +377,8 @@ default_ciphers="$available_ciphers"
default_pubkey_ciphers="$available_pubkey_ciphers"
default_digests="$available_digests"
default_kdfs="$available_kdfs"
+# Blacklist MD2 by default
+default_digests=`echo $default_digests | sed -e 's/md2//g'`
# Substitutions to set generated files in a Emacs buffer to read-only.
AC_SUBST(emacs_local_vars_begin, ['Local Variables:'])
@@ -1845,6 +1847,12 @@ if test "$found" = "1" ; then
AC_DEFINE(USE_GOST_R_3411_12, 1, [Defined if this module should be included])
fi
+LIST_MEMBER(md2, $enabled_digests)
+if test "$found" = "1" ; then
+ GCRYPT_DIGESTS="$GCRYPT_DIGESTS md2.lo"
+ AC_DEFINE(USE_MD2, 1, [Defined if this module should be included])
+fi
+
LIST_MEMBER(md4, $enabled_digests)
if test "$found" = "1" ; then
GCRYPT_DIGESTS="$GCRYPT_DIGESTS md4.lo"
diff --git a/src/cipher.h b/src/cipher.h
index 26ffddc..cd981b3 100644
--- a/src/cipher.h
+++ b/src/cipher.h
@@ -246,6 +246,7 @@ extern gcry_md_spec_t _gcry_digest_spec_crc24_rfc2440;
extern gcry_md_spec_t _gcry_digest_spec_gost3411_94;
extern gcry_md_spec_t _gcry_digest_spec_stribog_256;
extern gcry_md_spec_t _gcry_digest_spec_stribog_512;
+extern gcry_md_spec_t _gcry_digest_spec_md2;
extern gcry_md_spec_t _gcry_digest_spec_md4;
extern gcry_md_spec_t _gcry_digest_spec_md5;
extern gcry_md_spec_t _gcry_digest_spec_rmd160;
diff --git a/tests/basic.c b/tests/basic.c
index e21e055..0eb0f77 100644
--- a/tests/basic.c
+++ b/tests/basic.c
@@ -3784,6 +3784,12 @@ check_digests (void)
const char *expect;
} algos[] =
{
+ { GCRY_MD_MD2, "",
+ "\x83\x50\xe5\xa3\xe2\x4c\x15\x3d\xf2\x27\x5c\x9f\x80\x69\x27\x73" },
+ { GCRY_MD_MD2, "a",
+ "\x32\xec\x01\xec\x4a\x6d\xac\x72\xc0\xab\x96\xfb\x34\xc0\xb5\xd1" },
+ { GCRY_MD_MD2, "message digest",
+ "\xab\x4f\x49\x6b\xfb\x2a\x53\x0b\x21\x9f\xf3\x30\x31\xfe\x06\xb0" },
{ GCRY_MD_MD4, "",
"\x31\xD6\xCF\xE0\xD1\x6A\xE9\x31\xB7\x3C\x59\xD7\xE0\xC0\x89\xC0" },
{ GCRY_MD_MD4, "a",
-----------------------------------------------------------------------
Summary of changes:
cipher/md.c | 3 +
cipher/md2.c | 182 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
configure.ac | 10 +++-
src/cipher.h | 1 +
tests/basic.c | 6 ++
5 files changed, 201 insertions(+), 1 deletion(-)
create mode 100644 cipher/md2.c
hooks/post-receive
--
The GNU crypto library
http://git.gnupg.org
_______________________________________________
Gnupg-commits mailing list
Gnupg-commits at gnupg.org
http://lists.gnupg.org/mailman/listinfo/gnupg-commits
More information about the Gcrypt-devel
mailing list