2 * Copyright (c) 2008-2012, Novell Inc.
4 * This program is licensed under the BSD license, read LICENSE.BSD
5 * for further information
25 unsigned char result[64];
37 solv_chksum_create(Id type)
40 chk = solv_calloc(1, sizeof(*chk));
44 case REPOKEY_TYPE_MD5:
45 solv_MD5_Init(&chk->c.md5);
47 case REPOKEY_TYPE_SHA1:
48 solv_SHA1_Init(&chk->c.sha1);
50 case REPOKEY_TYPE_SHA224:
51 solv_SHA224_Init(&chk->c.sha224);
53 case REPOKEY_TYPE_SHA256:
54 solv_SHA256_Init(&chk->c.sha256);
56 case REPOKEY_TYPE_SHA384:
57 solv_SHA384_Init(&chk->c.sha384);
59 case REPOKEY_TYPE_SHA512:
60 solv_SHA512_Init(&chk->c.sha512);
70 solv_chksum_create_clone(Chksum *chk)
72 return solv_memdup(chk, sizeof(*chk));
76 solv_chksum_len(Id type)
80 case REPOKEY_TYPE_MD5:
82 case REPOKEY_TYPE_SHA1:
84 case REPOKEY_TYPE_SHA224:
86 case REPOKEY_TYPE_SHA256:
88 case REPOKEY_TYPE_SHA384:
90 case REPOKEY_TYPE_SHA512:
98 solv_chksum_create_from_bin(Id type, const unsigned char *buf)
101 int l = solv_chksum_len(type);
102 if (buf == 0 || l == 0)
104 chk = solv_calloc(1, sizeof(*chk));
107 memcpy(chk->result, buf, l);
112 solv_chksum_add(Chksum *chk, const void *data, int len)
118 case REPOKEY_TYPE_MD5:
119 solv_MD5_Update(&chk->c.md5, (void *)data, len);
121 case REPOKEY_TYPE_SHA1:
122 solv_SHA1_Update(&chk->c.sha1, data, len);
124 case REPOKEY_TYPE_SHA224:
125 solv_SHA224_Update(&chk->c.sha224, data, len);
127 case REPOKEY_TYPE_SHA256:
128 solv_SHA256_Update(&chk->c.sha256, data, len);
130 case REPOKEY_TYPE_SHA384:
131 solv_SHA384_Update(&chk->c.sha384, data, len);
133 case REPOKEY_TYPE_SHA512:
134 solv_SHA512_Update(&chk->c.sha512, data, len);
141 const unsigned char *
142 solv_chksum_get(Chksum *chk, int *lenp)
147 *lenp = solv_chksum_len(chk->type);
152 case REPOKEY_TYPE_MD5:
153 solv_MD5_Final(chk->result, &chk->c.md5);
158 case REPOKEY_TYPE_SHA1:
159 solv_SHA1_Final(&chk->c.sha1, chk->result);
164 case REPOKEY_TYPE_SHA224:
165 solv_SHA224_Final(chk->result, &chk->c.sha224);
170 case REPOKEY_TYPE_SHA256:
171 solv_SHA256_Final(chk->result, &chk->c.sha256);
176 case REPOKEY_TYPE_SHA384:
177 solv_SHA384_Final(chk->result, &chk->c.sha384);
182 case REPOKEY_TYPE_SHA512:
183 solv_SHA512_Final(chk->result, &chk->c.sha512);
196 solv_chksum_get_type(Chksum *chk)
202 solv_chksum_isfinished(Chksum *chk)
204 return chk->done != 0;
208 solv_chksum_type2str(Id type)
212 case REPOKEY_TYPE_MD5:
214 case REPOKEY_TYPE_SHA1:
216 case REPOKEY_TYPE_SHA224:
218 case REPOKEY_TYPE_SHA256:
220 case REPOKEY_TYPE_SHA384:
222 case REPOKEY_TYPE_SHA512:
230 solv_chksum_str2type(const char *str)
232 if (!strcasecmp(str, "md5"))
233 return REPOKEY_TYPE_MD5;
234 if (!strcasecmp(str, "sha") || !strcasecmp(str, "sha1"))
235 return REPOKEY_TYPE_SHA1;
236 if (!strcasecmp(str, "sha224"))
237 return REPOKEY_TYPE_SHA224;
238 if (!strcasecmp(str, "sha256"))
239 return REPOKEY_TYPE_SHA256;
240 if (!strcasecmp(str, "sha384"))
241 return REPOKEY_TYPE_SHA384;
242 if (!strcasecmp(str, "sha512"))
243 return REPOKEY_TYPE_SHA512;
248 solv_chksum_free(Chksum *chk, unsigned char *cp)
252 const unsigned char *res;
254 res = solv_chksum_get(chk, &l);
263 solv_chksum_cmp(Chksum *chk, Chksum *chk2)
266 const unsigned char *res1, *res2;
269 if (!chk || !chk2 || chk->type != chk2->type)
271 res1 = solv_chksum_get(chk, &len);
272 res2 = solv_chksum_get(chk2, 0);
273 return memcmp(res1, res2, len) == 0 ? 1 : 0;