+/*
+ * Copyright (c) 2008-2012, Novell Inc.
+ *
+ * This program is licensed under the BSD license, read LICENSE.BSD
+ * for further information
+ */
+
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include "sha1.h"
#include "sha2.h"
-struct ctxhandle {
+struct _Chksum {
Id type;
int done;
unsigned char result[64];
union {
MD5_CTX md5;
SHA1_CTX sha1;
+ SHA224_CTX sha224;
SHA256_CTX sha256;
+ SHA384_CTX sha384;
+ SHA512_CTX sha512;
} c;
};
-void *
-sat_chksum_create(Id type)
+Chksum *
+solv_chksum_create(Id type)
{
- struct ctxhandle *h;
- h = sat_calloc(1, sizeof(*h));
- h->type = type;
+ Chksum *chk;
+ chk = solv_calloc(1, sizeof(*chk));
+ chk->type = type;
switch(type)
{
case REPOKEY_TYPE_MD5:
- sat_MD5_Init(&h->c.md5);
- return h;
+ solv_MD5_Init(&chk->c.md5);
+ return chk;
case REPOKEY_TYPE_SHA1:
- sat_SHA1_Init(&h->c.sha1);
- return h;
+ solv_SHA1_Init(&chk->c.sha1);
+ return chk;
+ case REPOKEY_TYPE_SHA224:
+ solv_SHA224_Init(&chk->c.sha224);
+ return chk;
case REPOKEY_TYPE_SHA256:
- sat_SHA256_Init(&h->c.sha256);
- return h;
+ solv_SHA256_Init(&chk->c.sha256);
+ return chk;
+ case REPOKEY_TYPE_SHA384:
+ solv_SHA384_Init(&chk->c.sha384);
+ return chk;
+ case REPOKEY_TYPE_SHA512:
+ solv_SHA512_Init(&chk->c.sha512);
+ return chk;
+ default:
+ break;
}
- free(h);
+ free(chk);
return 0;
}
+Chksum *
+solv_chksum_create_clone(Chksum *chk)
+{
+ return solv_memdup(chk, sizeof(*chk));
+}
+
+int
+solv_chksum_len(Id type)
+{
+ switch (type)
+ {
+ case REPOKEY_TYPE_MD5:
+ return 16;
+ case REPOKEY_TYPE_SHA1:
+ return 20;
+ case REPOKEY_TYPE_SHA224:
+ return 28;
+ case REPOKEY_TYPE_SHA256:
+ return 32;
+ case REPOKEY_TYPE_SHA384:
+ return 48;
+ case REPOKEY_TYPE_SHA512:
+ return 64;
+ default:
+ return 0;
+ }
+}
+
+Chksum *
+solv_chksum_create_from_bin(Id type, const unsigned char *buf)
+{
+ Chksum *chk;
+ int l = solv_chksum_len(type);
+ if (buf == 0 || l == 0)
+ return 0;
+ chk = solv_calloc(1, sizeof(*chk));
+ chk->type = type;
+ chk->done = 1;
+ memcpy(chk->result, buf, l);
+ return chk;
+}
+
void
-sat_chksum_add(void *handle, const void *data, int len)
+solv_chksum_add(Chksum *chk, const void *data, int len)
{
- struct ctxhandle *h = handle;
- switch(h->type)
+ if (chk->done)
+ return;
+ switch(chk->type)
{
case REPOKEY_TYPE_MD5:
- sat_MD5_Update(&h->c.md5, (void *)data, len);
+ solv_MD5_Update(&chk->c.md5, (void *)data, len);
return;
case REPOKEY_TYPE_SHA1:
- sat_SHA1_Update(&h->c.sha1, data, len);
+ solv_SHA1_Update(&chk->c.sha1, data, len);
+ return;
+ case REPOKEY_TYPE_SHA224:
+ solv_SHA224_Update(&chk->c.sha224, data, len);
return;
case REPOKEY_TYPE_SHA256:
- sat_SHA256_Update(&h->c.sha256, data, len);
+ solv_SHA256_Update(&chk->c.sha256, data, len);
+ return;
+ case REPOKEY_TYPE_SHA384:
+ solv_SHA384_Update(&chk->c.sha384, data, len);
+ return;
+ case REPOKEY_TYPE_SHA512:
+ solv_SHA512_Update(&chk->c.sha512, data, len);
return;
default:
return;
}
}
-unsigned char *
-sat_chksum_get(void *handle, int *lenp)
+const unsigned char *
+solv_chksum_get(Chksum *chk, int *lenp)
{
- struct ctxhandle *h = handle;
- if (h->done)
- return h->result;
- switch(h->type)
+ if (chk->done)
+ {
+ if (lenp)
+ *lenp = solv_chksum_len(chk->type);
+ return chk->result;
+ }
+ switch(chk->type)
{
case REPOKEY_TYPE_MD5:
- sat_MD5_Final(h->result, &h->c.md5);
- h->done = 1;
- if (*lenp)
+ solv_MD5_Final(chk->result, &chk->c.md5);
+ chk->done = 1;
+ if (lenp)
*lenp = 16;
- return h->result;
+ return chk->result;
case REPOKEY_TYPE_SHA1:
- sat_SHA1_Final(&h->c.sha1, h->result);
- h->done = 1;
- if (*lenp)
+ solv_SHA1_Final(&chk->c.sha1, chk->result);
+ chk->done = 1;
+ if (lenp)
*lenp = 20;
- return h->result;
+ return chk->result;
+ case REPOKEY_TYPE_SHA224:
+ solv_SHA224_Final(chk->result, &chk->c.sha224);
+ chk->done = 1;
+ if (lenp)
+ *lenp = 28;
+ return chk->result;
case REPOKEY_TYPE_SHA256:
- sat_SHA256_Final(h->result, &h->c.sha256);
- h->done = 1;
- if (*lenp)
+ solv_SHA256_Final(chk->result, &chk->c.sha256);
+ chk->done = 1;
+ if (lenp)
*lenp = 32;
- return h->result;
+ return chk->result;
+ case REPOKEY_TYPE_SHA384:
+ solv_SHA384_Final(chk->result, &chk->c.sha384);
+ chk->done = 1;
+ if (lenp)
+ *lenp = 48;
+ return chk->result;
+ case REPOKEY_TYPE_SHA512:
+ solv_SHA512_Final(chk->result, &chk->c.sha512);
+ chk->done = 1;
+ if (lenp)
+ *lenp = 64;
+ return chk->result;
default:
- if (*lenp)
+ if (lenp)
*lenp = 0;
return 0;
}
}
+Id
+solv_chksum_get_type(Chksum *chk)
+{
+ return chk->type;
+}
+
+int
+solv_chksum_isfinished(Chksum *chk)
+{
+ return chk->done != 0;
+}
+
+const char *
+solv_chksum_type2str(Id type)
+{
+ switch(type)
+ {
+ case REPOKEY_TYPE_MD5:
+ return "md5";
+ case REPOKEY_TYPE_SHA1:
+ return "sha1";
+ case REPOKEY_TYPE_SHA224:
+ return "sha224";
+ case REPOKEY_TYPE_SHA256:
+ return "sha256";
+ case REPOKEY_TYPE_SHA384:
+ return "sha384";
+ case REPOKEY_TYPE_SHA512:
+ return "sha512";
+ default:
+ return 0;
+ }
+}
+
+Id
+solv_chksum_str2type(const char *str)
+{
+ if (!strcasecmp(str, "md5"))
+ return REPOKEY_TYPE_MD5;
+ if (!strcasecmp(str, "sha") || !strcasecmp(str, "sha1"))
+ return REPOKEY_TYPE_SHA1;
+ if (!strcasecmp(str, "sha224"))
+ return REPOKEY_TYPE_SHA224;
+ if (!strcasecmp(str, "sha256"))
+ return REPOKEY_TYPE_SHA256;
+ if (!strcasecmp(str, "sha384"))
+ return REPOKEY_TYPE_SHA384;
+ if (!strcasecmp(str, "sha512"))
+ return REPOKEY_TYPE_SHA512;
+ return 0;
+}
+
void *
-sat_chksum_free(void *handle, unsigned char *cp)
+solv_chksum_free(Chksum *chk, unsigned char *cp)
{
if (cp)
{
- unsigned char *res;
+ const unsigned char *res;
int l;
- res = sat_chksum_get(handle, &l);
- memcpy(cp, res, l);
+ res = solv_chksum_get(chk, &l);
+ if (l && res)
+ memcpy(cp, res, l);
}
- sat_free(handle);
+ solv_free(chk);
return 0;
}
+int
+solv_chksum_cmp(Chksum *chk, Chksum *chk2)
+{
+ int len;
+ const unsigned char *res1, *res2;
+ if (chk == chk2)
+ return 1;
+ if (!chk || !chk2 || chk->type != chk2->type)
+ return 0;
+ res1 = solv_chksum_get(chk, &len);
+ res2 = solv_chksum_get(chk2, 0);
+ return memcmp(res1, res2, len) == 0 ? 1 : 0;
+}