00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
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(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
00146 return md;
00147 }
00148
00149
00150
00151 GWEN_MDIGEST *GWEN_MDigest_Rmd160_new() {
00152 GWEN_MDIGEST *md;
00153 GWEN_MDIGEST_GC *xmd;
00154
00155 md=GWEN_MDigest_Gc_new(GWEN_Crypt_HashAlgoId_Rmd160);
00156 assert(md);
00157 xmd=GWEN_INHERIT_GETDATA(GWEN_MDIGEST, GWEN_MDIGEST_GC, md);
00158 assert(xmd);
00159
00160 xmd->algo=GCRY_MD_RMD160;
00161
00162 return md;
00163 }
00164
00165
00166
00167 GWEN_MDIGEST *GWEN_MDigest_Sha1_new() {
00168 GWEN_MDIGEST *md;
00169 GWEN_MDIGEST_GC *xmd;
00170
00171 md=GWEN_MDigest_Gc_new(GWEN_Crypt_HashAlgoId_Sha1);
00172 assert(md);
00173 xmd=GWEN_INHERIT_GETDATA(GWEN_MDIGEST, GWEN_MDIGEST_GC, md);
00174 assert(xmd);
00175
00176 xmd->algo=GCRY_MD_SHA1;
00177
00178 return md;
00179 }
00180
00181
00182
00183
00184
00185