#include <libDER/DER_Digest.h>
static const unsigned char encodedSha1Digest[] =
{
0x30, 0x21,
0x30, 0x09,
0x06, 0x05,
0x2b, 0x0e, 0x03, 0x02, 0x1a,
0x05, 0x00,
0x04, 0x14
};
DERReturn DEREncodeSHA1DigestInfo(
const DERByte *sha1Digest,
DERSize sha1DigestLen,
DERByte *result,
DERSize *resultLen)
{
DERSize totalLen = sizeof(encodedSha1Digest) + DER_SHA1_DIGEST_LEN;
if((sha1Digest == NULL) || (sha1DigestLen != DER_SHA1_DIGEST_LEN) ||
(result == NULL) || (resultLen == NULL)) {
return DR_ParamErr;
}
if(*resultLen < DER_SHA1_DIGEST_INFO_LEN) {
return DR_BufOverflow;
}
DERMemmove(result, encodedSha1Digest, sizeof(encodedSha1Digest));
DERMemmove(result + sizeof(encodedSha1Digest), sha1Digest, DER_SHA1_DIGEST_LEN);
*resultLen = totalLen;
return DR_Success;
}
static const unsigned char encodedSha256Digest[] =
{
0x30, 0x31,
0x30, 0x0d,
0x06, 0x09,
0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01,
0x05, 0x00,
0x04, 0x20
};
DERReturn DEREncodeSHA256DigestInfo(
const DERByte *sha256Digest,
DERSize sha256DigestLen,
DERByte *result,
DERSize *resultLen)
{
DERSize totalLen = sizeof(encodedSha256Digest) + DER_SHA256_DIGEST_LEN;
if((sha256Digest == NULL) || (sha256DigestLen != DER_SHA256_DIGEST_LEN) ||
(result == NULL) || (resultLen == NULL)) {
return DR_ParamErr;
}
if(*resultLen < DER_SHA256_DIGEST_INFO_LEN) {
return DR_BufOverflow;
}
DERMemmove(result, encodedSha256Digest, sizeof(encodedSha256Digest));
DERMemmove(result + sizeof(encodedSha256Digest), sha256Digest, DER_SHA256_DIGEST_LEN);
*resultLen = totalLen;
return DR_Success;
}
static const unsigned char encodedMdDigest[] =
{
0x30, 0x20,
0x30, 0x0c,
0x06, 0x08,
0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x02,
0x05,
0x05, 0x00,
0x04, 0x10
};
#define WHICH_DIGEST_INDEX 13
#define WHICH_DIGEST_MD2 2
#define WHICH_DIGEST_MD5 5
DERReturn DEREncodeMDDigestInfo(
WhichDigest whichDigest,
const DERByte *mdDigest,
DERSize mdDigestLen,
DERByte *result,
DERSize *resultLen)
{
DERSize totalLen = sizeof(encodedMdDigest) + DER_MD_DIGEST_LEN;
if((mdDigest == NULL) || (mdDigestLen != DER_MD_DIGEST_LEN) ||
(result == NULL) || (resultLen == NULL)) {
return DR_ParamErr;
}
if(*resultLen < totalLen) {
return DR_BufOverflow;
}
DERMemmove(result, encodedMdDigest, sizeof(encodedMdDigest));
DERMemmove(result + sizeof(encodedMdDigest), mdDigest, DER_MD_DIGEST_LEN);
switch(whichDigest) {
case WD_MD2:
result[WHICH_DIGEST_INDEX] = WHICH_DIGEST_MD2;
break;
case WD_MD5:
result[WHICH_DIGEST_INDEX] = WHICH_DIGEST_MD5;
break;
default:
return DR_ParamErr;
}
*resultLen = totalLen;
return DR_Success;
}