Use EVP for digest signatures
This commit is contained in:
@@ -97,6 +97,7 @@ struct signature_alg {
|
|||||||
#define RA_RSA_USES_DIGEST_INFO 0x1000000
|
#define RA_RSA_USES_DIGEST_INFO 0x1000000
|
||||||
|
|
||||||
time_t best_before; /* refuse signature made after best before date */
|
time_t best_before; /* refuse signature made after best before date */
|
||||||
|
const EVP_MD *(*evp_md)(void);
|
||||||
int (*verify_signature)(hx509_context context,
|
int (*verify_signature)(hx509_context context,
|
||||||
const struct signature_alg *,
|
const struct signature_alg *,
|
||||||
const Certificate *,
|
const Certificate *,
|
||||||
@@ -641,7 +642,7 @@ rsa_verify_signature(hx509_context context,
|
|||||||
&di.digest);
|
&di.digest);
|
||||||
} else {
|
} else {
|
||||||
if (retsize != data->length ||
|
if (retsize != data->length ||
|
||||||
memcmp(to, data->data, retsize) != 0)
|
ct_memcmp(to, data->data, retsize) != 0)
|
||||||
{
|
{
|
||||||
ret = HX509_CRYPTO_SIG_INVALID_FORMAT;
|
ret = HX509_CRYPTO_SIG_INVALID_FORMAT;
|
||||||
hx509_set_error_string(context, 0, ret, "RSA Signature incorrect");
|
hx509_set_error_string(context, 0, ret, "RSA Signature incorrect");
|
||||||
@@ -1130,39 +1131,8 @@ dsa_parse_private_key(hx509_context context,
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
sha1_verify_signature(hx509_context context,
|
evp_md_create_signature(hx509_context context,
|
||||||
const struct signature_alg *sig_alg,
|
|
||||||
const Certificate *signer,
|
|
||||||
const AlgorithmIdentifier *alg,
|
|
||||||
const heim_octet_string *data,
|
|
||||||
const heim_octet_string *sig)
|
|
||||||
{
|
|
||||||
unsigned char digest[SHA_DIGEST_LENGTH];
|
|
||||||
SHA_CTX m;
|
|
||||||
|
|
||||||
if (sig->length != SHA_DIGEST_LENGTH) {
|
|
||||||
hx509_set_error_string(context, 0, HX509_CRYPTO_SIG_INVALID_FORMAT,
|
|
||||||
"SHA1 sigature have wrong length");
|
|
||||||
return HX509_CRYPTO_SIG_INVALID_FORMAT;
|
|
||||||
}
|
|
||||||
|
|
||||||
SHA1_Init(&m);
|
|
||||||
SHA1_Update(&m, data->data, data->length);
|
|
||||||
SHA1_Final (digest, &m);
|
|
||||||
|
|
||||||
if (memcmp(digest, sig->data, SHA_DIGEST_LENGTH) != 0) {
|
|
||||||
hx509_set_error_string(context, 0, HX509_CRYPTO_BAD_SIGNATURE,
|
|
||||||
"Bad SHA1 sigature");
|
|
||||||
return HX509_CRYPTO_BAD_SIGNATURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
sha256_create_signature(hx509_context context,
|
|
||||||
const struct signature_alg *sig_alg,
|
const struct signature_alg *sig_alg,
|
||||||
const hx509_private_key signer,
|
const hx509_private_key signer,
|
||||||
const AlgorithmIdentifier *alg,
|
const AlgorithmIdentifier *alg,
|
||||||
@@ -1170,7 +1140,8 @@ sha256_create_signature(hx509_context context,
|
|||||||
AlgorithmIdentifier *signatureAlgorithm,
|
AlgorithmIdentifier *signatureAlgorithm,
|
||||||
heim_octet_string *sig)
|
heim_octet_string *sig)
|
||||||
{
|
{
|
||||||
SHA256_CTX m;
|
size_t sigsize = EVP_MD_size(sig_alg->evp_md());
|
||||||
|
EVP_MD_CTX ctx;
|
||||||
|
|
||||||
memset(sig, 0, sizeof(*sig));
|
memset(sig, 0, sizeof(*sig));
|
||||||
|
|
||||||
@@ -1183,140 +1154,50 @@ sha256_create_signature(hx509_context context,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
sig->data = malloc(SHA256_DIGEST_LENGTH);
|
sig->data = malloc(sigsize);
|
||||||
if (sig->data == NULL) {
|
if (sig->data == NULL) {
|
||||||
sig->length = 0;
|
sig->length = 0;
|
||||||
return ENOMEM;
|
return ENOMEM;
|
||||||
}
|
}
|
||||||
sig->length = SHA256_DIGEST_LENGTH;
|
sig->length = sigsize;
|
||||||
|
|
||||||
|
EVP_MD_CTX_init(&ctx);
|
||||||
|
EVP_DigestInit_ex(&ctx, sig_alg->evp_md(), NULL);
|
||||||
|
EVP_DigestUpdate(&ctx, data->data, data->length);
|
||||||
|
EVP_DigestFinal_ex(&ctx, sig->data, NULL);
|
||||||
|
EVP_MD_CTX_cleanup(&ctx);
|
||||||
|
|
||||||
SHA256_Init(&m);
|
|
||||||
SHA256_Update(&m, data->data, data->length);
|
|
||||||
SHA256_Final (sig->data, &m);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
sha256_verify_signature(hx509_context context,
|
evp_md_verify_signature(hx509_context context,
|
||||||
const struct signature_alg *sig_alg,
|
const struct signature_alg *sig_alg,
|
||||||
const Certificate *signer,
|
const Certificate *signer,
|
||||||
const AlgorithmIdentifier *alg,
|
const AlgorithmIdentifier *alg,
|
||||||
const heim_octet_string *data,
|
const heim_octet_string *data,
|
||||||
const heim_octet_string *sig)
|
const heim_octet_string *sig)
|
||||||
{
|
{
|
||||||
unsigned char digest[SHA256_DIGEST_LENGTH];
|
unsigned char digest[EVP_MAX_MD_SIZE];
|
||||||
SHA256_CTX m;
|
EVP_MD_CTX ctx;
|
||||||
|
size_t sigsize = EVP_MD_size(sig_alg->evp_md());
|
||||||
|
|
||||||
if (sig->length != SHA256_DIGEST_LENGTH) {
|
if (sig->length != sigsize || sigsize > sizeof(digest)) {
|
||||||
hx509_set_error_string(context, 0, HX509_CRYPTO_SIG_INVALID_FORMAT,
|
hx509_set_error_string(context, 0, HX509_CRYPTO_SIG_INVALID_FORMAT,
|
||||||
"SHA256 sigature have wrong length");
|
"SHA256 sigature have wrong length");
|
||||||
return HX509_CRYPTO_SIG_INVALID_FORMAT;
|
return HX509_CRYPTO_SIG_INVALID_FORMAT;
|
||||||
}
|
}
|
||||||
|
|
||||||
SHA256_Init(&m);
|
EVP_MD_CTX_init(&ctx);
|
||||||
SHA256_Update(&m, data->data, data->length);
|
EVP_DigestInit_ex(&ctx, sig_alg->evp_md(), NULL);
|
||||||
SHA256_Final (digest, &m);
|
EVP_DigestUpdate(&ctx, data->data, data->length);
|
||||||
|
EVP_DigestFinal_ex(&ctx, digest, NULL);
|
||||||
|
EVP_MD_CTX_cleanup(&ctx);
|
||||||
|
|
||||||
if (memcmp(digest, sig->data, SHA256_DIGEST_LENGTH) != 0) {
|
if (ct_memcmp(digest, sig->data, sigsize) != 0) {
|
||||||
hx509_set_error_string(context, 0, HX509_CRYPTO_BAD_SIGNATURE,
|
hx509_set_error_string(context, 0, HX509_CRYPTO_BAD_SIGNATURE,
|
||||||
"Bad SHA256 sigature");
|
"Bad %s sigature", sig_alg->name);
|
||||||
return HX509_CRYPTO_BAD_SIGNATURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
sha1_create_signature(hx509_context context,
|
|
||||||
const struct signature_alg *sig_alg,
|
|
||||||
const hx509_private_key signer,
|
|
||||||
const AlgorithmIdentifier *alg,
|
|
||||||
const heim_octet_string *data,
|
|
||||||
AlgorithmIdentifier *signatureAlgorithm,
|
|
||||||
heim_octet_string *sig)
|
|
||||||
{
|
|
||||||
SHA_CTX m;
|
|
||||||
|
|
||||||
memset(sig, 0, sizeof(*sig));
|
|
||||||
|
|
||||||
if (signatureAlgorithm) {
|
|
||||||
int ret;
|
|
||||||
ret = set_digest_alg(signatureAlgorithm, sig_alg->sig_oid,
|
|
||||||
"\x05\x00", 2);
|
|
||||||
if (ret)
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
sig->data = malloc(SHA_DIGEST_LENGTH);
|
|
||||||
if (sig->data == NULL) {
|
|
||||||
sig->length = 0;
|
|
||||||
return ENOMEM;
|
|
||||||
}
|
|
||||||
sig->length = SHA_DIGEST_LENGTH;
|
|
||||||
|
|
||||||
SHA1_Init(&m);
|
|
||||||
SHA1_Update(&m, data->data, data->length);
|
|
||||||
SHA1_Final (sig->data, &m);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
md5_verify_signature(hx509_context context,
|
|
||||||
const struct signature_alg *sig_alg,
|
|
||||||
const Certificate *signer,
|
|
||||||
const AlgorithmIdentifier *alg,
|
|
||||||
const heim_octet_string *data,
|
|
||||||
const heim_octet_string *sig)
|
|
||||||
{
|
|
||||||
unsigned char digest[MD5_DIGEST_LENGTH];
|
|
||||||
MD5_CTX m;
|
|
||||||
|
|
||||||
if (sig->length != MD5_DIGEST_LENGTH) {
|
|
||||||
hx509_set_error_string(context, 0, HX509_CRYPTO_SIG_INVALID_FORMAT,
|
|
||||||
"MD5 sigature have wrong length");
|
|
||||||
return HX509_CRYPTO_SIG_INVALID_FORMAT;
|
|
||||||
}
|
|
||||||
|
|
||||||
MD5_Init(&m);
|
|
||||||
MD5_Update(&m, data->data, data->length);
|
|
||||||
MD5_Final (digest, &m);
|
|
||||||
|
|
||||||
if (memcmp(digest, sig->data, MD5_DIGEST_LENGTH) != 0) {
|
|
||||||
hx509_set_error_string(context, 0, HX509_CRYPTO_BAD_SIGNATURE,
|
|
||||||
"Bad MD5 sigature");
|
|
||||||
return HX509_CRYPTO_BAD_SIGNATURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
md2_verify_signature(hx509_context context,
|
|
||||||
const struct signature_alg *sig_alg,
|
|
||||||
const Certificate *signer,
|
|
||||||
const AlgorithmIdentifier *alg,
|
|
||||||
const heim_octet_string *data,
|
|
||||||
const heim_octet_string *sig)
|
|
||||||
{
|
|
||||||
unsigned char digest[MD2_DIGEST_LENGTH];
|
|
||||||
MD2_CTX m;
|
|
||||||
|
|
||||||
if (sig->length != MD2_DIGEST_LENGTH) {
|
|
||||||
hx509_set_error_string(context, 0, HX509_CRYPTO_SIG_INVALID_FORMAT,
|
|
||||||
"MD2 sigature have wrong length");
|
|
||||||
return HX509_CRYPTO_SIG_INVALID_FORMAT;
|
|
||||||
}
|
|
||||||
|
|
||||||
MD2_Init(&m);
|
|
||||||
MD2_Update(&m, data->data, data->length);
|
|
||||||
MD2_Final (digest, &m);
|
|
||||||
|
|
||||||
if (memcmp(digest, sig->data, MD2_DIGEST_LENGTH) != 0) {
|
|
||||||
hx509_set_error_string(context, 0, HX509_CRYPTO_BAD_SIGNATURE,
|
|
||||||
"Bad MD2 sigature");
|
|
||||||
return HX509_CRYPTO_BAD_SIGNATURE;
|
return HX509_CRYPTO_BAD_SIGNATURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1333,6 +1214,7 @@ static const struct signature_alg ecdsa_with_sha256_alg = {
|
|||||||
&_hx509_signature_sha256_data,
|
&_hx509_signature_sha256_data,
|
||||||
PROVIDE_CONF|REQUIRE_SIGNER|RA_RSA_USES_DIGEST_INFO|SIG_PUBLIC_SIG,
|
PROVIDE_CONF|REQUIRE_SIGNER|RA_RSA_USES_DIGEST_INFO|SIG_PUBLIC_SIG,
|
||||||
0,
|
0,
|
||||||
|
NULL,
|
||||||
ecdsa_verify_signature,
|
ecdsa_verify_signature,
|
||||||
ecdsa_create_signature,
|
ecdsa_create_signature,
|
||||||
32
|
32
|
||||||
@@ -1346,6 +1228,7 @@ static const struct signature_alg ecdsa_with_sha1_alg = {
|
|||||||
&_hx509_signature_sha1_data,
|
&_hx509_signature_sha1_data,
|
||||||
PROVIDE_CONF|REQUIRE_SIGNER|RA_RSA_USES_DIGEST_INFO|SIG_PUBLIC_SIG,
|
PROVIDE_CONF|REQUIRE_SIGNER|RA_RSA_USES_DIGEST_INFO|SIG_PUBLIC_SIG,
|
||||||
0,
|
0,
|
||||||
|
NULL,
|
||||||
ecdsa_verify_signature,
|
ecdsa_verify_signature,
|
||||||
ecdsa_create_signature,
|
ecdsa_create_signature,
|
||||||
20
|
20
|
||||||
@@ -1361,6 +1244,7 @@ static const struct signature_alg heim_rsa_pkcs1_x509 = {
|
|||||||
NULL,
|
NULL,
|
||||||
PROVIDE_CONF|REQUIRE_SIGNER|SIG_PUBLIC_SIG,
|
PROVIDE_CONF|REQUIRE_SIGNER|SIG_PUBLIC_SIG,
|
||||||
0,
|
0,
|
||||||
|
NULL,
|
||||||
rsa_verify_signature,
|
rsa_verify_signature,
|
||||||
rsa_create_signature
|
rsa_create_signature
|
||||||
};
|
};
|
||||||
@@ -1373,6 +1257,7 @@ static const struct signature_alg pkcs1_rsa_sha1_alg = {
|
|||||||
NULL,
|
NULL,
|
||||||
PROVIDE_CONF|REQUIRE_SIGNER|RA_RSA_USES_DIGEST_INFO|SIG_PUBLIC_SIG,
|
PROVIDE_CONF|REQUIRE_SIGNER|RA_RSA_USES_DIGEST_INFO|SIG_PUBLIC_SIG,
|
||||||
0,
|
0,
|
||||||
|
NULL,
|
||||||
rsa_verify_signature,
|
rsa_verify_signature,
|
||||||
rsa_create_signature
|
rsa_create_signature
|
||||||
};
|
};
|
||||||
@@ -1385,6 +1270,7 @@ static const struct signature_alg rsa_with_sha256_alg = {
|
|||||||
&_hx509_signature_sha256_data,
|
&_hx509_signature_sha256_data,
|
||||||
PROVIDE_CONF|REQUIRE_SIGNER|RA_RSA_USES_DIGEST_INFO|SIG_PUBLIC_SIG,
|
PROVIDE_CONF|REQUIRE_SIGNER|RA_RSA_USES_DIGEST_INFO|SIG_PUBLIC_SIG,
|
||||||
0,
|
0,
|
||||||
|
NULL,
|
||||||
rsa_verify_signature,
|
rsa_verify_signature,
|
||||||
rsa_create_signature
|
rsa_create_signature
|
||||||
};
|
};
|
||||||
@@ -1397,6 +1283,7 @@ static const struct signature_alg rsa_with_sha1_alg = {
|
|||||||
&_hx509_signature_sha1_data,
|
&_hx509_signature_sha1_data,
|
||||||
PROVIDE_CONF|REQUIRE_SIGNER|RA_RSA_USES_DIGEST_INFO|SIG_PUBLIC_SIG,
|
PROVIDE_CONF|REQUIRE_SIGNER|RA_RSA_USES_DIGEST_INFO|SIG_PUBLIC_SIG,
|
||||||
0,
|
0,
|
||||||
|
NULL,
|
||||||
rsa_verify_signature,
|
rsa_verify_signature,
|
||||||
rsa_create_signature
|
rsa_create_signature
|
||||||
};
|
};
|
||||||
@@ -1409,6 +1296,7 @@ static const struct signature_alg rsa_with_md5_alg = {
|
|||||||
&_hx509_signature_md5_data,
|
&_hx509_signature_md5_data,
|
||||||
PROVIDE_CONF|REQUIRE_SIGNER|RA_RSA_USES_DIGEST_INFO|SIG_PUBLIC_SIG,
|
PROVIDE_CONF|REQUIRE_SIGNER|RA_RSA_USES_DIGEST_INFO|SIG_PUBLIC_SIG,
|
||||||
1230739889,
|
1230739889,
|
||||||
|
NULL,
|
||||||
rsa_verify_signature,
|
rsa_verify_signature,
|
||||||
rsa_create_signature
|
rsa_create_signature
|
||||||
};
|
};
|
||||||
@@ -1421,6 +1309,7 @@ static const struct signature_alg rsa_with_md2_alg = {
|
|||||||
&_hx509_signature_md2_data,
|
&_hx509_signature_md2_data,
|
||||||
PROVIDE_CONF|REQUIRE_SIGNER|RA_RSA_USES_DIGEST_INFO|SIG_PUBLIC_SIG,
|
PROVIDE_CONF|REQUIRE_SIGNER|RA_RSA_USES_DIGEST_INFO|SIG_PUBLIC_SIG,
|
||||||
1230739889,
|
1230739889,
|
||||||
|
NULL,
|
||||||
rsa_verify_signature,
|
rsa_verify_signature,
|
||||||
rsa_create_signature
|
rsa_create_signature
|
||||||
};
|
};
|
||||||
@@ -1433,6 +1322,7 @@ static const struct signature_alg dsa_sha1_alg = {
|
|||||||
&_hx509_signature_sha1_data,
|
&_hx509_signature_sha1_data,
|
||||||
PROVIDE_CONF|REQUIRE_SIGNER|SIG_PUBLIC_SIG,
|
PROVIDE_CONF|REQUIRE_SIGNER|SIG_PUBLIC_SIG,
|
||||||
0,
|
0,
|
||||||
|
NULL,
|
||||||
dsa_verify_signature,
|
dsa_verify_signature,
|
||||||
/* create_signature */ NULL,
|
/* create_signature */ NULL,
|
||||||
};
|
};
|
||||||
@@ -1445,8 +1335,9 @@ static const struct signature_alg sha256_alg = {
|
|||||||
NULL,
|
NULL,
|
||||||
SIG_DIGEST,
|
SIG_DIGEST,
|
||||||
0,
|
0,
|
||||||
sha256_verify_signature,
|
EVP_sha256,
|
||||||
sha256_create_signature
|
evp_md_verify_signature,
|
||||||
|
evp_md_create_signature
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct signature_alg sha1_alg = {
|
static const struct signature_alg sha1_alg = {
|
||||||
@@ -1457,8 +1348,9 @@ static const struct signature_alg sha1_alg = {
|
|||||||
NULL,
|
NULL,
|
||||||
SIG_DIGEST,
|
SIG_DIGEST,
|
||||||
0,
|
0,
|
||||||
sha1_verify_signature,
|
EVP_sha1,
|
||||||
sha1_create_signature
|
evp_md_verify_signature,
|
||||||
|
evp_md_create_signature
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct signature_alg md5_alg = {
|
static const struct signature_alg md5_alg = {
|
||||||
@@ -1469,7 +1361,9 @@ static const struct signature_alg md5_alg = {
|
|||||||
NULL,
|
NULL,
|
||||||
SIG_DIGEST,
|
SIG_DIGEST,
|
||||||
0,
|
0,
|
||||||
md5_verify_signature
|
EVP_md5,
|
||||||
|
evp_md_verify_signature,
|
||||||
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct signature_alg md2_alg = {
|
static const struct signature_alg md2_alg = {
|
||||||
@@ -1480,7 +1374,9 @@ static const struct signature_alg md2_alg = {
|
|||||||
NULL,
|
NULL,
|
||||||
SIG_DIGEST,
|
SIG_DIGEST,
|
||||||
0,
|
0,
|
||||||
md2_verify_signature
|
EVP_md2,
|
||||||
|
evp_md_verify_signature,
|
||||||
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Reference in New Issue
Block a user