summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikos Mavrogiannopoulos <nmav@gnutls.org>2003-04-01 09:11:46 +0000
committerNikos Mavrogiannopoulos <nmav@gnutls.org>2003-04-01 09:11:46 +0000
commit9fce98e569983b9881c252b5b6dafd1247e719f7 (patch)
tree1ef0cbbcba212aac132ad23726d6c522ed1f351c
parenta6dc8fe502baf15f47a56e29a6c21f30d253855d (diff)
downloadgnutls-9fce98e569983b9881c252b5b6dafd1247e719f7.tar.gz
*** empty log message ***
-rw-r--r--lib/x509/common.c10
-rw-r--r--lib/x509/x509.c56
2 files changed, 40 insertions, 26 deletions
diff --git a/lib/x509/common.c b/lib/x509/common.c
index a2ce341cfb..3269e5e1dc 100644
--- a/lib/x509/common.c
+++ b/lib/x509/common.c
@@ -208,7 +208,15 @@ gnutls_pk_algorithm _gnutls_x509_oid2pk_algorithm( const char* oid)
return GNUTLS_PK_RSA;
else if (strcmp( oid, DSA_OID) == 0)
return GNUTLS_PK_DSA;
-
+ else if (strcmp( oid, RSA_MD5_OID) == 0)
+ return GNUTLS_PK_RSA;
+ else if (strcmp( oid, RSA_SHA1_OID) == 0)
+ return GNUTLS_PK_RSA;
+ else if (strcmp( oid, DSA_SHA1_OID) == 0)
+ return GNUTLS_PK_DSA;
+
+ _gnutls_x509_log("Unknown PK OID: '%s'\n", oid);
+
return GNUTLS_PK_UNKNOWN;
}
diff --git a/lib/x509/x509.c b/lib/x509/x509.c
index 2b429a219f..9cd1db77c1 100644
--- a/lib/x509/x509.c
+++ b/lib/x509/x509.c
@@ -522,42 +522,25 @@ int gnutls_x509_crt_get_serial(gnutls_x509_crt cert, char* result, int* result_s
int gnutls_x509_crt_get_pk_algorithm( gnutls_x509_crt cert, int* bits)
{
int result;
- opaque *str;
+ opaque *str = NULL;
int algo;
- int len = sizeof(str);
+ char oid[64];
+ int len;
GNUTLS_MPI params[MAX_PUBLIC_PARAMS_SIZE];
- len = 0;
+ len = sizeof(oid);
result =
asn1_read_value
(cert->cert,
"tbsCertificate.subjectPublicKeyInfo.algorithm.algorithm",
- NULL, &len);
-
- if (result != ASN1_MEM_ERROR) {
- gnutls_assert();
- return _gnutls_asn2err(result);
- }
-
- str = gnutls_malloc( len);
- if (str == NULL) {
- gnutls_assert();
- return GNUTLS_E_MEMORY_ERROR;
- }
-
- result =
- asn1_read_value
- (cert->cert,
- "tbsCertificate.subjectPublicKeyInfo.algorithm.algorithm",
- str, &len);
+ oid, &len);
if (result != ASN1_SUCCESS) {
gnutls_assert();
- gnutls_free(str);
return _gnutls_asn2err(result);
}
- algo = _gnutls_x509_oid2pk_algorithm( str);
+ algo = _gnutls_x509_oid2pk_algorithm( oid);
if ( bits==NULL) {
gnutls_free(str);
@@ -566,19 +549,42 @@ int gnutls_x509_crt_get_pk_algorithm( gnutls_x509_crt cert, int* bits)
/* Now read the parameters' bits */
- len = sizeof(str) - 1;
+ len = 0;
result =
asn1_read_value
(cert->cert, "tbsCertificate.subjectPublicKeyInfo.subjectPublicKey",
- str, &len);
+ NULL, &len);
+
+ if (result != ASN1_MEM_ERROR) {
+ gnutls_assert();
+ return _gnutls_asn2err(result);
+ }
+
+ if (len % 8 != 0) {
+ gnutls_assert();
+ return GNUTLS_E_CERTIFICATE_ERROR;
+ }
+
len /= 8;
+
+ str = gnutls_malloc( len);
+ if (str == NULL) {
+ gnutls_assert();
+ return GNUTLS_E_MEMORY_ERROR;
+ }
+ result =
+ asn1_read_value
+ (cert->cert, "tbsCertificate.subjectPublicKeyInfo.subjectPublicKey",
+ str, &len);
+
if (result != ASN1_SUCCESS) {
gnutls_assert();
gnutls_free(str);
return _gnutls_asn2err(result);
}
+ len /= 8;
if (algo==GNUTLS_PK_RSA) {
if ((result=_gnutls_x509_read_rsa_params( str, len, params)) < 0) {