aboutsummaryrefslogtreecommitdiffstats
path: root/cipher/md.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--cipher/md.c158
1 files changed, 158 insertions, 0 deletions
diff --git a/cipher/md.c b/cipher/md.c
new file mode 100644
index 000000000..a14d62f32
--- /dev/null
+++ b/cipher/md.c
@@ -0,0 +1,158 @@
+/* md.c - message digest dispatcher
+ * Copyright (c) 1997 by Werner Koch (dd9jn)
+ *
+ * This file is part of G10.
+ *
+ * G10 is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * G10 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU 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 <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+#include "util.h"
+#include "cipher.h"
+#include "errors.h"
+
+int
+md_okay( int algo )
+{
+ switch( algo ) {
+ case DIGEST_ALGO_MD5:
+ case DIGEST_ALGO_RMD160:
+ return 0;
+ default:
+ return G10ERR_DIGEST_ALGO;
+ }
+}
+
+
+MD_HANDLE *
+md_open( int algo, int secure )
+{
+ MD_HANDLE *hd;
+
+ hd = m_alloc( sizeof *hd + 19 );
+ hd->algo = algo;
+ hd->datalen = 0;
+ if( algo == DIGEST_ALGO_MD5 )
+ hd->u.md5 = md5_open( secure );
+ else if( algo == DIGEST_ALGO_RMD160 )
+ hd->u.rmd= rmd160_open( secure );
+ else
+ return NULL;
+
+ return hd;
+}
+
+
+MD_HANDLE *
+md_copy( MD_HANDLE *a )
+{
+ MD_HANDLE *hd;
+
+ hd = m_alloc( sizeof *hd + 19 );
+ hd->algo = a->algo;
+ hd->datalen = 0;
+ if( a->algo == DIGEST_ALGO_MD5 )
+ hd->u.md5 = md5_copy( a->u.md5 );
+ else if( a->algo == DIGEST_ALGO_RMD160 )
+ hd->u.rmd= rmd160_copy( a->u.rmd );
+ else
+ log_bug(NULL);
+ return hd;
+}
+
+
+/* used for a BAD Kludge in rmd160.c, md5.c */
+MD_HANDLE *
+md_makecontainer( int algo )
+{
+ MD_HANDLE *hd;
+
+ hd = m_alloc( sizeof *hd + 19 );
+ hd->algo = algo;
+ hd->datalen = 0;
+ if( algo == DIGEST_ALGO_MD5 )
+ ;
+ else if( algo == DIGEST_ALGO_RMD160 )
+ ;
+ else
+ log_bug(NULL);
+ return hd;
+}
+
+void
+md_close(MD_HANDLE *a)
+{
+ if( !a )
+ return;
+ if( a->algo == DIGEST_ALGO_MD5 )
+ md5_close( a->u.md5 );
+ else if( a->algo == DIGEST_ALGO_RMD160 )
+ rmd160_close( a->u.rmd );
+ else
+ log_bug(NULL);
+ m_free(a);
+}
+
+
+void
+md_write( MD_HANDLE *a, byte *inbuf, size_t inlen)
+{
+ if( a->algo == DIGEST_ALGO_MD5 )
+ md5_write( a->u.md5, inbuf, inlen );
+ else if( a->algo == DIGEST_ALGO_RMD160 )
+ rmd160_write( a->u.rmd, inbuf, inlen );
+ else
+ log_bug(NULL);
+}
+
+
+void
+md_putchar( MD_HANDLE *a, int c )
+{
+ if( a->algo == DIGEST_ALGO_MD5 )
+ md5_putchar( a->u.md5, c );
+ else if( a->algo == DIGEST_ALGO_RMD160 )
+ rmd160_putchar( a->u.rmd, c );
+ else
+ log_bug(NULL);
+}
+
+
+byte *
+md_final(MD_HANDLE *a)
+{
+ if( a->algo == DIGEST_ALGO_MD5 ) {
+ if( !a->datalen ) {
+ md5_final( a->u.md5 );
+ memcpy(a->data, md5_read( a->u.md5 ), 16);
+ a->datalen = 16;
+ }
+ return a->data;
+ }
+ else if( a->algo == DIGEST_ALGO_RMD160 ) {
+ if( !a->datalen ) {
+ memcpy(a->data, rmd160_final( a->u.rmd ), 20 );
+ a->datalen = 20;
+ }
+ return a->data;
+ }
+ else
+ log_bug(NULL);
+}
+
+