gwenhywfar 4.0.3
|
00001 /*************************************************************************** 00002 begin : Wed Mar 16 2005 00003 copyright : (C) 2005 by Martin Preuss 00004 email : martin@libchipcard.de 00005 00006 *************************************************************************** 00007 * Please see toplevel file COPYING for license details * 00008 ***************************************************************************/ 00009 00010 #ifdef HAVE_CONFIG_H 00011 # include <config.h> 00012 #endif 00013 00014 00015 #define DISABLE_DEBUGLOG 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