mdigestgc.c

Go to the documentation of this file.
00001 /***************************************************************************
00002  $RCSfile$
00003                              -------------------
00004     cvs         : $Id: crypttoken.h 1113 2007-01-10 09:14:16Z martin $
00005     begin       : Wed Mar 16 2005
00006     copyright   : (C) 2005 by Martin Preuss
00007     email       : martin@libchipcard.de
00008 
00009  ***************************************************************************
00010  *          Please see toplevel file COPYING for license details           *
00011  ***************************************************************************/
00012 
00013 #ifdef HAVE_CONFIG_H
00014 # include <config.h>
00015 #endif
00016 
00017 
00018 #include "mdigestgc_p.h"
00019 #include <gwenhywfar/misc.h>
00020 #include <gwenhywfar/debug.h>
00021 
00022 
00023 
00024 GWEN_INHERIT(GWEN_MDIGEST, GWEN_MDIGEST_GC)
00025 
00026 
00027 
00028 
00029 int GWEN_MDigest_Gc_Begin(GWEN_MDIGEST *md) {
00030   GWEN_MDIGEST_GC *xmd;
00031   int err;
00032 
00033   assert(md);
00034   xmd=GWEN_INHERIT_GETDATA(GWEN_MDIGEST, GWEN_MDIGEST_GC, md);
00035   assert(xmd);
00036 
00037   err=gcry_md_open(&xmd->handle, xmd->algo, xmd->flags);
00038   if (err) {
00039     DBG_INFO(GWEN_LOGDOMAIN, "gcry_md_open(): %d", err);
00040     return GWEN_ERROR_GENERIC;
00041   }
00042 
00043   xmd->isOpen=1;
00044 
00045   return 0;
00046 }
00047 
00048 
00049 
00050 int GWEN_MDigest_Gc_End(GWEN_MDIGEST *md) {
00051   GWEN_MDIGEST_GC *xmd;
00052   uint8_t *p;
00053   unsigned int len;
00054 
00055   assert(md);
00056   xmd=GWEN_INHERIT_GETDATA(GWEN_MDIGEST, GWEN_MDIGEST_GC, md);
00057   assert(xmd);
00058 
00059   gcry_md_final(xmd->handle);
00060 
00061   len=gcry_md_get_algo_dlen(xmd->algo);
00062   if (len<1) {
00063     DBG_INFO(GWEN_LOGDOMAIN, "gcry_md_get_algo_dlen(): %d", len);
00064     gcry_md_close(xmd->handle);
00065     xmd->isOpen=0;
00066     return GWEN_ERROR_GENERIC;
00067   }
00068 
00069   p=(uint8_t*)malloc(len);
00070   assert(p);
00071   memmove(p, gcry_md_read(xmd->handle, xmd->algo), len);
00072 
00073   GWEN_MDigest_SetDigestBuffer(md, p, len);
00074 
00075   gcry_md_close(xmd->handle);
00076   xmd->isOpen=0;
00077   return 0;
00078 }
00079 
00080 
00081 
00082 int GWEN_MDigest_Gc_Update(GWEN_MDIGEST *md, const uint8_t *buf, unsigned int l) {
00083   GWEN_MDIGEST_GC *xmd;
00084 
00085   assert(md);
00086   xmd=GWEN_INHERIT_GETDATA(GWEN_MDIGEST, GWEN_MDIGEST_GC, md);
00087   assert(xmd);
00088 
00089   if (xmd->isOpen==0) {
00090     DBG_INFO(GWEN_LOGDOMAIN, "MDigest not open");
00091     return GWEN_ERROR_NOT_OPEN;
00092   }
00093   gcry_md_write(xmd->handle, buf, l);
00094 
00095   return 0;
00096 }
00097 
00098 
00099 
00100 GWENHYWFAR_CB
00101 void GWEN_Digest_Gc_freeData(GWEN_UNUSED void *bp, void *p) {
00102   GWEN_MDIGEST_GC *xmd;
00103 
00104   xmd=(GWEN_MDIGEST_GC*) p;
00105   if (xmd->isOpen) {
00106     gcry_md_close(xmd->handle);
00107     xmd->isOpen=0;
00108   }
00109   GWEN_FREE_OBJECT(xmd);
00110 }
00111 
00112 
00113 
00114 GWEN_MDIGEST *GWEN_MDigest_Gc_new(GWEN_CRYPT_HASHALGOID a) {
00115   GWEN_MDIGEST *md;
00116   GWEN_MDIGEST_GC *xmd;
00117 
00118   GWEN_NEW_OBJECT(GWEN_MDIGEST_GC, xmd)
00119   md=GWEN_MDigest_new(a);
00120   assert(md);
00121   GWEN_INHERIT_SETDATA(GWEN_MDIGEST, GWEN_MDIGEST_GC, md, xmd, GWEN_Digest_Gc_freeData)
00122 
00123   GWEN_MDigest_SetBeginFn(md, GWEN_MDigest_Gc_Begin);
00124   GWEN_MDigest_SetEndFn(md, GWEN_MDigest_Gc_End);
00125   GWEN_MDigest_SetUpdateFn(md, GWEN_MDigest_Gc_Update);
00126 
00127   return md;
00128 }
00129 
00130 
00131 
00132 
00133 
00134 
00135 GWEN_MDIGEST *GWEN_MDigest_Md5_new() {
00136   GWEN_MDIGEST *md;
00137   GWEN_MDIGEST_GC *xmd;
00138 
00139   md=GWEN_MDigest_Gc_new(GWEN_Crypt_HashAlgoId_Md5);
00140   assert(md);
00141   xmd=GWEN_INHERIT_GETDATA(GWEN_MDIGEST, GWEN_MDIGEST_GC, md);
00142   assert(xmd);
00143 
00144   xmd->algo=GCRY_MD_MD5;
00145   GWEN_MDigest_SetDigestLen(md, gcry_md_get_algo_dlen(xmd->algo));
00146 
00147   return md;
00148 }
00149 
00150 
00151 
00152 GWEN_MDIGEST *GWEN_MDigest_Rmd160_new() {
00153   GWEN_MDIGEST *md;
00154   GWEN_MDIGEST_GC *xmd;
00155 
00156   md=GWEN_MDigest_Gc_new(GWEN_Crypt_HashAlgoId_Rmd160);
00157   assert(md);
00158   xmd=GWEN_INHERIT_GETDATA(GWEN_MDIGEST, GWEN_MDIGEST_GC, md);
00159   assert(xmd);
00160 
00161   xmd->algo=GCRY_MD_RMD160;
00162   GWEN_MDigest_SetDigestLen(md, gcry_md_get_algo_dlen(xmd->algo));
00163 
00164   return md;
00165 }
00166 
00167 
00168 
00169 GWEN_MDIGEST *GWEN_MDigest_Sha1_new() {
00170   GWEN_MDIGEST *md;
00171   GWEN_MDIGEST_GC *xmd;
00172 
00173   md=GWEN_MDigest_Gc_new(GWEN_Crypt_HashAlgoId_Sha1);
00174   assert(md);
00175   xmd=GWEN_INHERIT_GETDATA(GWEN_MDIGEST, GWEN_MDIGEST_GC, md);
00176   assert(xmd);
00177 
00178   xmd->algo=GCRY_MD_SHA1;
00179   GWEN_MDigest_SetDigestLen(md, gcry_md_get_algo_dlen(xmd->algo));
00180 
00181   return md;
00182 }
00183 
00184 
00185 
00186 GWEN_MDIGEST *GWEN_MDigest_Sha256_new() {
00187   GWEN_MDIGEST *md;
00188   GWEN_MDIGEST_GC *xmd;
00189 
00190   md=GWEN_MDigest_Gc_new(GWEN_Crypt_HashAlgoId_Sha256);
00191   assert(md);
00192   xmd=GWEN_INHERIT_GETDATA(GWEN_MDIGEST, GWEN_MDIGEST_GC, md);
00193   assert(xmd);
00194 
00195   xmd->algo=GCRY_MD_SHA256;
00196   xmd->flags=GCRY_MD_FLAG_SECURE;
00197   GWEN_MDigest_SetDigestLen(md, gcry_md_get_algo_dlen(xmd->algo));
00198 
00199   return md;
00200 }
00201 
00202 
00203 
00204 
00205 
00206 

Generated on Mon Jan 25 12:56:02 2010 for gwenhywfar by  doxygen 1.5.6