satsolver 0.16.3
|
00001 #include <sys/types.h> 00002 #include <stdio.h> 00003 #include <stdlib.h> 00004 #include <string.h> 00005 #include <unistd.h> 00006 00007 #include "pool.h" 00008 #include "util.h" 00009 #include "chksum.h" 00010 00011 #include "md5.h" 00012 #include "sha1.h" 00013 #include "sha2.h" 00014 00015 struct ctxhandle { 00016 Id type; 00017 int done; 00018 unsigned char result[64]; 00019 union { 00020 MD5_CTX md5; 00021 SHA1_CTX sha1; 00022 SHA256_CTX sha256; 00023 } c; 00024 }; 00025 00026 void * 00027 sat_chksum_create(Id type) 00028 { 00029 struct ctxhandle *h; 00030 h = sat_calloc(1, sizeof(*h)); 00031 h->type = type; 00032 switch(type) 00033 { 00034 case REPOKEY_TYPE_MD5: 00035 sat_MD5_Init(&h->c.md5); 00036 return h; 00037 case REPOKEY_TYPE_SHA1: 00038 sat_SHA1_Init(&h->c.sha1); 00039 return h; 00040 case REPOKEY_TYPE_SHA256: 00041 sat_SHA256_Init(&h->c.sha256); 00042 return h; 00043 } 00044 free(h); 00045 return 0; 00046 } 00047 00048 void 00049 sat_chksum_add(void *handle, const void *data, int len) 00050 { 00051 struct ctxhandle *h = handle; 00052 switch(h->type) 00053 { 00054 case REPOKEY_TYPE_MD5: 00055 sat_MD5_Update(&h->c.md5, (void *)data, len); 00056 return; 00057 case REPOKEY_TYPE_SHA1: 00058 sat_SHA1_Update(&h->c.sha1, data, len); 00059 return; 00060 case REPOKEY_TYPE_SHA256: 00061 sat_SHA256_Update(&h->c.sha256, data, len); 00062 return; 00063 default: 00064 return; 00065 } 00066 } 00067 00068 unsigned char * 00069 sat_chksum_get(void *handle, int *lenp) 00070 { 00071 struct ctxhandle *h = handle; 00072 if (h->done) 00073 return h->result; 00074 switch(h->type) 00075 { 00076 case REPOKEY_TYPE_MD5: 00077 sat_MD5_Final(h->result, &h->c.md5); 00078 h->done = 1; 00079 if (lenp) 00080 *lenp = 16; 00081 return h->result; 00082 case REPOKEY_TYPE_SHA1: 00083 sat_SHA1_Final(&h->c.sha1, h->result); 00084 h->done = 1; 00085 if (lenp) 00086 *lenp = 20; 00087 return h->result; 00088 case REPOKEY_TYPE_SHA256: 00089 sat_SHA256_Final(h->result, &h->c.sha256); 00090 h->done = 1; 00091 if (lenp) 00092 *lenp = 32; 00093 return h->result; 00094 default: 00095 if (lenp) 00096 *lenp = 0; 00097 return 0; 00098 } 00099 } 00100 00101 void * 00102 sat_chksum_free(void *handle, unsigned char *cp) 00103 { 00104 if (cp) 00105 { 00106 unsigned char *res; 00107 int l; 00108 res = sat_chksum_get(handle, &l); 00109 memcpy(cp, res, l); 00110 } 00111 sat_free(handle); 00112 return 0; 00113 } 00114