X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fchksum.c;h=1f8ab471e207f615ab32101fb9c709fd5e1dbdf3;hb=18ebbaf4f619e79231f5ad18a2ab8c135d22ef56;hp=81b8d57902f196a69f2370871891dcd51dc764a6;hpb=1aed650c8157abfd95c57646d8c8e4ffc488e084;p=platform%2Fupstream%2Flibsolv.git diff --git a/src/chksum.c b/src/chksum.c index 81b8d57..1f8ab47 100644 --- a/src/chksum.c +++ b/src/chksum.c @@ -19,14 +19,21 @@ #include "sha1.h" #include "sha2.h" -struct _Chksum { +#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; }; @@ -44,9 +51,18 @@ solv_chksum_create(Id type) case REPOKEY_TYPE_SHA1: 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(&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; } @@ -69,8 +85,14 @@ solv_chksum_len(Id type) 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; } @@ -103,9 +125,18 @@ solv_chksum_add(Chksum *chk, const void *data, int len) case REPOKEY_TYPE_SHA1: 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(&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; } @@ -134,12 +165,30 @@ solv_chksum_get(Chksum *chk, int *lenp) if (lenp) *lenp = 20; 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(chk->result, &chk->c.sha256); chk->done = 1; if (lenp) *lenp = 32; 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; @@ -168,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; } @@ -182,8 +237,14 @@ 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; } @@ -202,3 +263,16 @@ solv_chksum_free(Chksum *chk, unsigned char *cp) 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; +}