handle strong SHA-2 signatures in X.509 certificates

This commit is contained in:
Andreas Steffen
2007-02-21 13:08:45 +00:00
parent cd3958f86a
commit 9f6a17a444
2 changed files with 52 additions and 13 deletions
+3 -3
View File
@@ -155,9 +155,9 @@
0x03 "csor" 0x03 "csor"
0x04 "nistalgorithm" 0x04 "nistalgorithm"
0x02 "hashalgs" 0x02 "hashalgs"
0x01 "id-SHA-256" 0x01 "id-SHA-256" OID_SHA256
0x02 "id-SHA-384" 0x02 "id-SHA-384" OID_SHA384
0x03 "id-SHA-512" 0x03 "id-SHA-512" OID_SHA512
0x86 "" 0x86 ""
0xf8 "" 0xf8 ""
0x42 "netscape" 0x42 "netscape"
+49 -10
View File
@@ -21,6 +21,7 @@
#include <string.h> #include <string.h>
#include <freeswan.h> #include <freeswan.h>
#include <libsha2/sha2.h>
#include "constants.h" #include "constants.h"
#include "defs.h" #include "defs.h"
@@ -290,29 +291,31 @@ compute_digest(chunk_t tbs, int alg, chunk_t *digest)
{ {
switch (alg) switch (alg)
{ {
case OID_MD2: case OID_MD2:
case OID_MD2_WITH_RSA: case OID_MD2_WITH_RSA:
{ {
MD2_CTX context; MD2_CTX context;
MD2Init(&context); MD2Init(&context);
MD2Update(&context, tbs.ptr, tbs.len); MD2Update(&context, tbs.ptr, tbs.len);
MD2Final(digest->ptr, &context); MD2Final(digest->ptr, &context);
digest->len = MD2_DIGEST_SIZE; digest->len = MD2_DIGEST_SIZE;
return TRUE; return TRUE;
} }
case OID_MD5: case OID_MD5:
case OID_MD5_WITH_RSA: case OID_MD5_WITH_RSA:
{ {
MD5_CTX context; MD5_CTX context;
MD5Init(&context); MD5Init(&context);
MD5Update(&context, tbs.ptr, tbs.len); MD5Update(&context, tbs.ptr, tbs.len);
MD5Final(digest->ptr, &context); MD5Final(digest->ptr, &context);
digest->len = MD5_DIGEST_SIZE; digest->len = MD5_DIGEST_SIZE;
return TRUE; return TRUE;
} }
case OID_SHA1: case OID_SHA1:
case OID_SHA1_WITH_RSA: case OID_SHA1_WITH_RSA:
case OID_SHA1_WITH_RSA_OIW: case OID_SHA1_WITH_RSA_OIW:
{ {
SHA1_CTX context; SHA1_CTX context;
@@ -322,9 +325,45 @@ compute_digest(chunk_t tbs, int alg, chunk_t *digest)
digest->len = SHA1_DIGEST_SIZE; digest->len = SHA1_DIGEST_SIZE;
return TRUE; return TRUE;
} }
default: case OID_SHA256:
digest->len = 0; case OID_SHA256_WITH_RSA:
return FALSE; {
sha256_context context;
sha256_init(&context);
sha256_write(&context, tbs.ptr, tbs.len);
sha256_final(&context);
memcpy(digest->ptr, context.sha_out, SHA2_256_DIGEST_SIZE);
digest->len = SHA2_256_DIGEST_SIZE;
return TRUE;
}
case OID_SHA384:
case OID_SHA384_WITH_RSA:
{
sha512_context context;
sha384_init(&context);
sha512_write(&context, tbs.ptr, tbs.len);
sha512_final(&context);
memcpy(digest->ptr, context.sha_out, SHA2_384_DIGEST_SIZE);
digest->len = SHA2_384_DIGEST_SIZE;
return TRUE;
}
case OID_SHA512:
case OID_SHA512_WITH_RSA:
{
sha512_context context;
sha512_init(&context);
sha512_write(&context, tbs.ptr, tbs.len);
sha512_final(&context);
memcpy(digest->ptr, context.sha_out, SHA2_512_DIGEST_SIZE);
digest->len = SHA2_512_DIGEST_SIZE;
return TRUE;
}
default:
digest->len = 0;
return FALSE;
} }
} }