Imported Upstream version 0.7.5
[platform/upstream/libsolv.git] / src / chksum.c
index 2c6fa3e..1f8ab47 100644 (file)
 #include "sha1.h"
 #include "sha2.h"
 
-struct ctxhandle {
+#ifdef _WIN32
+  #include "strfncs.h"
+#endif
+
+struct s_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 *
+Chksum *
 solv_chksum_create(Id type)
 {
-  struct ctxhandle *h;
-  h = solv_calloc(1, sizeof(*h));
-  h->type = type;
+  Chksum *chk;
+  chk = solv_calloc(1, sizeof(*chk));
+  chk->type = type;
   switch(type)
     {
     case REPOKEY_TYPE_MD5:
-      solv_MD5_Init(&h->c.md5);
-      return h;
+      solv_MD5_Init(&chk->c.md5);
+      return chk;
     case REPOKEY_TYPE_SHA1:
-      solv_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:
-      solv_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; 
+      return 16;
     case REPOKEY_TYPE_SHA1:
-      return 20; 
+      return 20;
+    case REPOKEY_TYPE_SHA224:
+      return 28;
     case REPOKEY_TYPE_SHA256:
-      return 32; 
+      return 32;
+    case REPOKEY_TYPE_SHA384:
+      return 48;
+    case REPOKEY_TYPE_SHA512:
+      return 64;
     default:
       return 0;
-    }   
+    }
 }
 
-void *
+Chksum *
 solv_chksum_create_from_bin(Id type, const unsigned char *buf)
 {
-  struct ctxhandle *h;
+  Chksum *chk;
   int l = solv_chksum_len(type);
   if (buf == 0 || l == 0)
     return 0;
-  h = solv_calloc(1, sizeof(*h));
-  h->type = type;
-  h->done = 1;
-  memcpy(h->result, buf, l);
-  return h;
+  chk = solv_calloc(1, sizeof(*chk));
+  chk->type = type;
+  chk->done = 1;
+  memcpy(chk->result, buf, l);
+  return chk;
 }
 
 void
-solv_chksum_add(void *handle, const void *data, int len)
+solv_chksum_add(Chksum *chk, const void *data, int len)
 {
-  struct ctxhandle *h = handle;
-  if (h->done)
+  if (chk->done)
     return;
-  switch(h->type)
+  switch(chk->type)
     {
     case REPOKEY_TYPE_MD5:
-      solv_MD5_Update(&h->c.md5, (void *)data, len);
+      solv_MD5_Update(&chk->c.md5, (void *)data, len);
       return;
     case REPOKEY_TYPE_SHA1:
-      solv_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:
-      solv_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;
@@ -107,35 +143,52 @@ solv_chksum_add(void *handle, const void *data, int len)
 }
 
 const unsigned char *
-solv_chksum_get(void *handle, int *lenp)
+solv_chksum_get(Chksum *chk, int *lenp)
 {
-  struct ctxhandle *h = handle;
-  if (h->done)
+  if (chk->done)
     {
       if (lenp)
-        *lenp = solv_chksum_len(h->type);
-      return h->result;
+        *lenp = solv_chksum_len(chk->type);
+      return chk->result;
     }
-  switch(h->type)
+  switch(chk->type)
     {
     case REPOKEY_TYPE_MD5:
-      solv_MD5_Final(h->result, &h->c.md5);
-      h->done = 1;
+      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:
-      solv_SHA1_Final(&h->c.sha1, h->result);
-      h->done = 1;
+      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:
-      solv_SHA256_Final(h->result, &h->c.sha256);
-      h->done = 1;
+      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)
        *lenp = 0;
@@ -144,17 +197,15 @@ solv_chksum_get(void *handle, int *lenp)
 }
 
 Id
-solv_chksum_get_type(void *handle)
+solv_chksum_get_type(Chksum *chk)
 {
-  struct ctxhandle *h = handle;
-  return h->type;
+  return chk->type;
 }
 
 int
-solv_chksum_isfinished(void *handle)
+solv_chksum_isfinished(Chksum *chk)
 {
-  struct ctxhandle *h = handle;
-  return h->done != 0;
+  return chk->done != 0;
 }
 
 const char *
@@ -166,8 +217,14 @@ solv_chksum_type2str(Id type)
       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;
     }
@@ -180,23 +237,42 @@ solv_chksum_str2type(const char *str)
     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 *
-solv_chksum_free(void *handle, unsigned char *cp)
+solv_chksum_free(Chksum *chk, unsigned char *cp)
 {
   if (cp)
     {
       const unsigned char *res;
       int l;
-      res = solv_chksum_get(handle, &l);
+      res = solv_chksum_get(chk, &l);
       if (l && res)
         memcpy(cp, res, l);
     }
-  solv_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;
+}