|
Packit |
54873f |
/*
|
|
Packit |
54873f |
* Copyright (c) 2008-2012, Novell Inc.
|
|
Packit |
54873f |
*
|
|
Packit |
54873f |
* This program is licensed under the BSD license, read LICENSE.BSD
|
|
Packit |
54873f |
* for further information
|
|
Packit |
54873f |
*/
|
|
Packit |
54873f |
|
|
Packit |
54873f |
#include <sys/types.h>
|
|
Packit |
54873f |
#include <stdio.h>
|
|
Packit |
54873f |
#include <stdlib.h>
|
|
Packit |
54873f |
#include <string.h>
|
|
Packit |
54873f |
#include <unistd.h>
|
|
Packit |
54873f |
|
|
Packit |
54873f |
#include "pool.h"
|
|
Packit |
54873f |
#include "util.h"
|
|
Packit |
54873f |
#include "chksum.h"
|
|
Packit |
54873f |
|
|
Packit Service |
fbcc97 |
#ifdef WITH_OPENSSL
|
|
Packit Service |
fbcc97 |
|
|
Packit Service |
fbcc97 |
#include <openssl/md5.h>
|
|
Packit Service |
fbcc97 |
#include <openssl/sha.h>
|
|
Packit Service |
fbcc97 |
|
|
Packit Service |
fbcc97 |
typedef SHA_CTX SHA1_CTX;
|
|
Packit Service |
fbcc97 |
typedef SHA256_CTX SHA224_CTX;
|
|
Packit Service |
fbcc97 |
typedef SHA512_CTX SHA384_CTX;
|
|
Packit Service |
fbcc97 |
|
|
Packit Service |
fbcc97 |
#define solv_MD5_Init(ctx) MD5_Init(ctx)
|
|
Packit Service |
fbcc97 |
#define solv_MD5_Update(ctx, data, len) MD5_Update(ctx, data, len)
|
|
Packit Service |
fbcc97 |
#define solv_MD5_Final(md, ctx) MD5_Final(md, ctx)
|
|
Packit Service |
fbcc97 |
#define solv_SHA1_Init(ctx) SHA1_Init(ctx)
|
|
Packit Service |
fbcc97 |
#define solv_SHA1_Update(ctx, data, len) SHA1_Update(ctx, data, len)
|
|
Packit Service |
fbcc97 |
#define solv_SHA1_Final(ctx, md) SHA1_Final(md, ctx)
|
|
Packit Service |
fbcc97 |
#define solv_SHA224_Init(ctx) SHA224_Init(ctx)
|
|
Packit Service |
fbcc97 |
#define solv_SHA224_Update(ctx, data, len) SHA224_Update(ctx, data, len)
|
|
Packit Service |
fbcc97 |
#define solv_SHA224_Final(md, ctx) SHA224_Final(md, ctx)
|
|
Packit Service |
fbcc97 |
#define solv_SHA256_Init(ctx) SHA256_Init(ctx)
|
|
Packit Service |
fbcc97 |
#define solv_SHA256_Update(ctx, data, len) SHA256_Update(ctx, data, len)
|
|
Packit Service |
fbcc97 |
#define solv_SHA256_Final(md, ctx) SHA256_Final(md, ctx)
|
|
Packit Service |
fbcc97 |
#define solv_SHA384_Init(ctx) SHA384_Init(ctx)
|
|
Packit Service |
fbcc97 |
#define solv_SHA384_Update(ctx, data, len) SHA384_Update(ctx, data, len)
|
|
Packit Service |
fbcc97 |
#define solv_SHA384_Final(md, ctx) SHA384_Final(md, ctx)
|
|
Packit Service |
fbcc97 |
#define solv_SHA512_Init(ctx) SHA512_Init(ctx)
|
|
Packit Service |
fbcc97 |
#define solv_SHA512_Update(ctx, data, len) SHA512_Update(ctx, data, len)
|
|
Packit Service |
fbcc97 |
#define solv_SHA512_Final(md, ctx) SHA512_Final(md, ctx)
|
|
Packit Service |
fbcc97 |
|
|
Packit Service |
fbcc97 |
#else
|
|
Packit Service |
fbcc97 |
|
|
Packit |
54873f |
#include "md5.h"
|
|
Packit |
54873f |
#include "sha1.h"
|
|
Packit |
54873f |
#include "sha2.h"
|
|
Packit |
54873f |
|
|
Packit Service |
fbcc97 |
#endif
|
|
Packit Service |
fbcc97 |
|
|
Packit |
54873f |
#ifdef _WIN32
|
|
Packit |
54873f |
#include "strfncs.h"
|
|
Packit |
54873f |
#endif
|
|
Packit |
54873f |
|
|
Packit |
54873f |
struct s_Chksum {
|
|
Packit |
54873f |
Id type;
|
|
Packit |
54873f |
int done;
|
|
Packit |
54873f |
unsigned char result[64];
|
|
Packit |
54873f |
union {
|
|
Packit |
54873f |
MD5_CTX md5;
|
|
Packit |
54873f |
SHA1_CTX sha1;
|
|
Packit |
54873f |
SHA224_CTX sha224;
|
|
Packit |
54873f |
SHA256_CTX sha256;
|
|
Packit |
54873f |
SHA384_CTX sha384;
|
|
Packit |
54873f |
SHA512_CTX sha512;
|
|
Packit |
54873f |
} c;
|
|
Packit |
54873f |
};
|
|
Packit |
54873f |
|
|
Packit |
54873f |
Chksum *
|
|
Packit |
54873f |
solv_chksum_create(Id type)
|
|
Packit |
54873f |
{
|
|
Packit |
54873f |
Chksum *chk;
|
|
Packit |
54873f |
chk = solv_calloc(1, sizeof(*chk));
|
|
Packit |
54873f |
chk->type = type;
|
|
Packit |
54873f |
switch(type)
|
|
Packit |
54873f |
{
|
|
Packit |
54873f |
case REPOKEY_TYPE_MD5:
|
|
Packit |
54873f |
solv_MD5_Init(&chk->c.md5);
|
|
Packit |
54873f |
return chk;
|
|
Packit |
54873f |
case REPOKEY_TYPE_SHA1:
|
|
Packit |
54873f |
solv_SHA1_Init(&chk->c.sha1);
|
|
Packit |
54873f |
return chk;
|
|
Packit |
54873f |
case REPOKEY_TYPE_SHA224:
|
|
Packit |
54873f |
solv_SHA224_Init(&chk->c.sha224);
|
|
Packit |
54873f |
return chk;
|
|
Packit |
54873f |
case REPOKEY_TYPE_SHA256:
|
|
Packit |
54873f |
solv_SHA256_Init(&chk->c.sha256);
|
|
Packit |
54873f |
return chk;
|
|
Packit |
54873f |
case REPOKEY_TYPE_SHA384:
|
|
Packit |
54873f |
solv_SHA384_Init(&chk->c.sha384);
|
|
Packit |
54873f |
return chk;
|
|
Packit |
54873f |
case REPOKEY_TYPE_SHA512:
|
|
Packit |
54873f |
solv_SHA512_Init(&chk->c.sha512);
|
|
Packit |
54873f |
return chk;
|
|
Packit |
54873f |
default:
|
|
Packit |
54873f |
break;
|
|
Packit |
54873f |
}
|
|
Packit |
54873f |
free(chk);
|
|
Packit |
54873f |
return 0;
|
|
Packit |
54873f |
}
|
|
Packit |
54873f |
|
|
Packit |
54873f |
Chksum *
|
|
Packit |
54873f |
solv_chksum_create_clone(Chksum *chk)
|
|
Packit |
54873f |
{
|
|
Packit |
54873f |
return solv_memdup(chk, sizeof(*chk));
|
|
Packit |
54873f |
}
|
|
Packit |
54873f |
|
|
Packit |
54873f |
int
|
|
Packit |
54873f |
solv_chksum_len(Id type)
|
|
Packit |
54873f |
{
|
|
Packit |
54873f |
switch (type)
|
|
Packit |
54873f |
{
|
|
Packit |
54873f |
case REPOKEY_TYPE_MD5:
|
|
Packit |
54873f |
return 16;
|
|
Packit |
54873f |
case REPOKEY_TYPE_SHA1:
|
|
Packit |
54873f |
return 20;
|
|
Packit |
54873f |
case REPOKEY_TYPE_SHA224:
|
|
Packit |
54873f |
return 28;
|
|
Packit |
54873f |
case REPOKEY_TYPE_SHA256:
|
|
Packit |
54873f |
return 32;
|
|
Packit |
54873f |
case REPOKEY_TYPE_SHA384:
|
|
Packit |
54873f |
return 48;
|
|
Packit |
54873f |
case REPOKEY_TYPE_SHA512:
|
|
Packit |
54873f |
return 64;
|
|
Packit |
54873f |
default:
|
|
Packit |
54873f |
return 0;
|
|
Packit |
54873f |
}
|
|
Packit |
54873f |
}
|
|
Packit |
54873f |
|
|
Packit |
54873f |
Chksum *
|
|
Packit |
54873f |
solv_chksum_create_from_bin(Id type, const unsigned char *buf)
|
|
Packit |
54873f |
{
|
|
Packit |
54873f |
Chksum *chk;
|
|
Packit |
54873f |
int l = solv_chksum_len(type);
|
|
Packit |
54873f |
if (buf == 0 || l == 0)
|
|
Packit |
54873f |
return 0;
|
|
Packit |
54873f |
chk = solv_calloc(1, sizeof(*chk));
|
|
Packit |
54873f |
chk->type = type;
|
|
Packit |
54873f |
chk->done = 1;
|
|
Packit |
54873f |
memcpy(chk->result, buf, l);
|
|
Packit |
54873f |
return chk;
|
|
Packit |
54873f |
}
|
|
Packit |
54873f |
|
|
Packit |
54873f |
void
|
|
Packit |
54873f |
solv_chksum_add(Chksum *chk, const void *data, int len)
|
|
Packit |
54873f |
{
|
|
Packit |
54873f |
if (chk->done)
|
|
Packit |
54873f |
return;
|
|
Packit |
54873f |
switch(chk->type)
|
|
Packit |
54873f |
{
|
|
Packit |
54873f |
case REPOKEY_TYPE_MD5:
|
|
Packit |
54873f |
solv_MD5_Update(&chk->c.md5, (void *)data, len);
|
|
Packit |
54873f |
return;
|
|
Packit |
54873f |
case REPOKEY_TYPE_SHA1:
|
|
Packit |
54873f |
solv_SHA1_Update(&chk->c.sha1, data, len);
|
|
Packit |
54873f |
return;
|
|
Packit |
54873f |
case REPOKEY_TYPE_SHA224:
|
|
Packit |
54873f |
solv_SHA224_Update(&chk->c.sha224, data, len);
|
|
Packit |
54873f |
return;
|
|
Packit |
54873f |
case REPOKEY_TYPE_SHA256:
|
|
Packit |
54873f |
solv_SHA256_Update(&chk->c.sha256, data, len);
|
|
Packit |
54873f |
return;
|
|
Packit |
54873f |
case REPOKEY_TYPE_SHA384:
|
|
Packit |
54873f |
solv_SHA384_Update(&chk->c.sha384, data, len);
|
|
Packit |
54873f |
return;
|
|
Packit |
54873f |
case REPOKEY_TYPE_SHA512:
|
|
Packit |
54873f |
solv_SHA512_Update(&chk->c.sha512, data, len);
|
|
Packit |
54873f |
return;
|
|
Packit |
54873f |
default:
|
|
Packit |
54873f |
return;
|
|
Packit |
54873f |
}
|
|
Packit |
54873f |
}
|
|
Packit |
54873f |
|
|
Packit |
54873f |
const unsigned char *
|
|
Packit |
54873f |
solv_chksum_get(Chksum *chk, int *lenp)
|
|
Packit |
54873f |
{
|
|
Packit |
54873f |
if (chk->done)
|
|
Packit |
54873f |
{
|
|
Packit |
54873f |
if (lenp)
|
|
Packit |
54873f |
*lenp = solv_chksum_len(chk->type);
|
|
Packit |
54873f |
return chk->result;
|
|
Packit |
54873f |
}
|
|
Packit |
54873f |
switch(chk->type)
|
|
Packit |
54873f |
{
|
|
Packit |
54873f |
case REPOKEY_TYPE_MD5:
|
|
Packit |
54873f |
solv_MD5_Final(chk->result, &chk->c.md5);
|
|
Packit |
54873f |
chk->done = 1;
|
|
Packit |
54873f |
if (lenp)
|
|
Packit |
54873f |
*lenp = 16;
|
|
Packit |
54873f |
return chk->result;
|
|
Packit |
54873f |
case REPOKEY_TYPE_SHA1:
|
|
Packit |
54873f |
solv_SHA1_Final(&chk->c.sha1, chk->result);
|
|
Packit |
54873f |
chk->done = 1;
|
|
Packit |
54873f |
if (lenp)
|
|
Packit |
54873f |
*lenp = 20;
|
|
Packit |
54873f |
return chk->result;
|
|
Packit |
54873f |
case REPOKEY_TYPE_SHA224:
|
|
Packit |
54873f |
solv_SHA224_Final(chk->result, &chk->c.sha224);
|
|
Packit |
54873f |
chk->done = 1;
|
|
Packit |
54873f |
if (lenp)
|
|
Packit |
54873f |
*lenp = 28;
|
|
Packit |
54873f |
return chk->result;
|
|
Packit |
54873f |
case REPOKEY_TYPE_SHA256:
|
|
Packit |
54873f |
solv_SHA256_Final(chk->result, &chk->c.sha256);
|
|
Packit |
54873f |
chk->done = 1;
|
|
Packit |
54873f |
if (lenp)
|
|
Packit |
54873f |
*lenp = 32;
|
|
Packit |
54873f |
return chk->result;
|
|
Packit |
54873f |
case REPOKEY_TYPE_SHA384:
|
|
Packit |
54873f |
solv_SHA384_Final(chk->result, &chk->c.sha384);
|
|
Packit |
54873f |
chk->done = 1;
|
|
Packit |
54873f |
if (lenp)
|
|
Packit |
54873f |
*lenp = 48;
|
|
Packit |
54873f |
return chk->result;
|
|
Packit |
54873f |
case REPOKEY_TYPE_SHA512:
|
|
Packit |
54873f |
solv_SHA512_Final(chk->result, &chk->c.sha512);
|
|
Packit |
54873f |
chk->done = 1;
|
|
Packit |
54873f |
if (lenp)
|
|
Packit |
54873f |
*lenp = 64;
|
|
Packit |
54873f |
return chk->result;
|
|
Packit |
54873f |
default:
|
|
Packit |
54873f |
if (lenp)
|
|
Packit |
54873f |
*lenp = 0;
|
|
Packit |
54873f |
return 0;
|
|
Packit |
54873f |
}
|
|
Packit |
54873f |
}
|
|
Packit |
54873f |
|
|
Packit |
54873f |
Id
|
|
Packit |
54873f |
solv_chksum_get_type(Chksum *chk)
|
|
Packit |
54873f |
{
|
|
Packit |
54873f |
return chk->type;
|
|
Packit |
54873f |
}
|
|
Packit |
54873f |
|
|
Packit |
54873f |
int
|
|
Packit |
54873f |
solv_chksum_isfinished(Chksum *chk)
|
|
Packit |
54873f |
{
|
|
Packit |
54873f |
return chk->done != 0;
|
|
Packit |
54873f |
}
|
|
Packit |
54873f |
|
|
Packit |
54873f |
const char *
|
|
Packit |
54873f |
solv_chksum_type2str(Id type)
|
|
Packit |
54873f |
{
|
|
Packit |
54873f |
switch(type)
|
|
Packit |
54873f |
{
|
|
Packit |
54873f |
case REPOKEY_TYPE_MD5:
|
|
Packit |
54873f |
return "md5";
|
|
Packit |
54873f |
case REPOKEY_TYPE_SHA1:
|
|
Packit |
54873f |
return "sha1";
|
|
Packit |
54873f |
case REPOKEY_TYPE_SHA224:
|
|
Packit |
54873f |
return "sha224";
|
|
Packit |
54873f |
case REPOKEY_TYPE_SHA256:
|
|
Packit |
54873f |
return "sha256";
|
|
Packit |
54873f |
case REPOKEY_TYPE_SHA384:
|
|
Packit |
54873f |
return "sha384";
|
|
Packit |
54873f |
case REPOKEY_TYPE_SHA512:
|
|
Packit |
54873f |
return "sha512";
|
|
Packit |
54873f |
default:
|
|
Packit |
54873f |
return 0;
|
|
Packit |
54873f |
}
|
|
Packit |
54873f |
}
|
|
Packit |
54873f |
|
|
Packit |
54873f |
Id
|
|
Packit |
54873f |
solv_chksum_str2type(const char *str)
|
|
Packit |
54873f |
{
|
|
Packit |
54873f |
if (!strcasecmp(str, "md5"))
|
|
Packit |
54873f |
return REPOKEY_TYPE_MD5;
|
|
Packit |
54873f |
if (!strcasecmp(str, "sha") || !strcasecmp(str, "sha1"))
|
|
Packit |
54873f |
return REPOKEY_TYPE_SHA1;
|
|
Packit |
54873f |
if (!strcasecmp(str, "sha224"))
|
|
Packit |
54873f |
return REPOKEY_TYPE_SHA224;
|
|
Packit |
54873f |
if (!strcasecmp(str, "sha256"))
|
|
Packit |
54873f |
return REPOKEY_TYPE_SHA256;
|
|
Packit |
54873f |
if (!strcasecmp(str, "sha384"))
|
|
Packit |
54873f |
return REPOKEY_TYPE_SHA384;
|
|
Packit |
54873f |
if (!strcasecmp(str, "sha512"))
|
|
Packit |
54873f |
return REPOKEY_TYPE_SHA512;
|
|
Packit |
54873f |
return 0;
|
|
Packit |
54873f |
}
|
|
Packit |
54873f |
|
|
Packit |
54873f |
void *
|
|
Packit |
54873f |
solv_chksum_free(Chksum *chk, unsigned char *cp)
|
|
Packit |
54873f |
{
|
|
Packit |
54873f |
if (cp)
|
|
Packit |
54873f |
{
|
|
Packit |
54873f |
const unsigned char *res;
|
|
Packit |
54873f |
int l;
|
|
Packit |
54873f |
res = solv_chksum_get(chk, &l);
|
|
Packit |
54873f |
if (l && res)
|
|
Packit |
54873f |
memcpy(cp, res, l);
|
|
Packit |
54873f |
}
|
|
Packit |
54873f |
solv_free(chk);
|
|
Packit |
54873f |
return 0;
|
|
Packit |
54873f |
}
|
|
Packit |
54873f |
|
|
Packit |
54873f |
int
|
|
Packit |
54873f |
solv_chksum_cmp(Chksum *chk, Chksum *chk2)
|
|
Packit |
54873f |
{
|
|
Packit |
54873f |
int len;
|
|
Packit |
54873f |
const unsigned char *res1, *res2;
|
|
Packit |
54873f |
if (chk == chk2)
|
|
Packit |
54873f |
return 1;
|
|
Packit |
54873f |
if (!chk || !chk2 || chk->type != chk2->type)
|
|
Packit |
54873f |
return 0;
|
|
Packit |
54873f |
res1 = solv_chksum_get(chk, &len;;
|
|
Packit |
54873f |
res2 = solv_chksum_get(chk2, 0);
|
|
Packit |
54873f |
return memcmp(res1, res2, len) == 0 ? 1 : 0;
|
|
Packit |
54873f |
}
|