mdigestgc.c
Go to the documentation of this file.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(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