Implement digest algorithm support.

This commit is contained in:
Giovanni Bajo
2012-05-02 03:28:59 +02:00
committed by Simon Kelley
parent 32b826e2a0
commit f5adbb90a1
2 changed files with 51 additions and 0 deletions

View File

@@ -49,4 +49,11 @@ VerifyAlgCtx* verifyalg_alloc(int algo);
void verifyalg_free(VerifyAlgCtx *a);
int verifyalg_algonum(VerifyAlgCtx *a);
/* Functions to calculate the digest of a key */
int digestalg_supported(int algo);
int digestalg_begin(int algo);
void digestalg_add_data(void *data, unsigned len);
void digestalg_add_keydata(struct keydata *key, size_t len);
int digestalg_final(struct keydata *digest);
#endif /* DNSSEC_CRYPTO_H */

View File

@@ -281,3 +281,47 @@ int verifyalg_algonum(VerifyAlgCtx *a)
return -1;
return num;
}
static EVP_MD_CTX digctx;
int digestalg_supported(int algo)
{
return (algo == 1 || algo == 2);
}
int digestalg_begin(int algo)
{
EVP_MD_CTX_init(&digctx);
if (algo == 1)
EVP_DigestInit_ex(&digctx, EVP_sha1(), NULL);
else if (algo == 2)
EVP_DigestInit_ex(&digctx, EVP_sha256(), NULL);
else
return 0;
return 1;
}
void digestalg_add_data(void *data, unsigned len)
{
EVP_DigestUpdate(&digctx, data, len);
}
void digestalg_add_keydata(struct keydata *key, size_t len)
{
size_t cnt; unsigned char *p = NULL;
while (len)
{
cnt = keydata_walk(&key, &p, len);
EVP_DigestUpdate(&digctx, p, cnt);
p += cnt;
len -= cnt;
}
}
int digestalg_final(struct keydata *expected)
{
unsigned char digest[32];
EVP_DigestFinal(&digctx, digest, NULL);
/* FIXME: why EVP_MD_CTX_size() crashes? */
return (memcmp(digest, expected->key, 20) == 0);
}