int gnutls_x509_certificate_get_pk_algorithm( gnutls_x509_certificate cert, int* bits);
int gnutls_x509_certificate_get_subject_alt_name(gnutls_x509_certificate cert,
- int seq, char *ret, int *ret_size);
-int gnutls_x509_certificate_get_ca_status(gnutls_x509_certificate cert);
+ int seq, char *ret, int *ret_size, int* critical);
+int gnutls_x509_certificate_get_ca_status(gnutls_x509_certificate cert, int* critical);
-int gnutls_x509_certificate_get_key_usage( gnutls_x509_certificate cert, unsigned int* key_usage);
+int gnutls_x509_certificate_get_key_usage( gnutls_x509_certificate cert, unsigned int* key_usage,
+ int* critical);
/* key_usage will be an OR of the following values:
*/
#define GNUTLS_KEY_DECIPHER_ONLY 1
int gnutls_x509_certificate_get_extension_by_oid(gnutls_x509_certificate cert, const char* oid,
- unsigned char* buf, int * sizeof_buf);
+ unsigned char* buf, int * sizeof_buf, int * critical);
int gnutls_x509_certificate_to_xml(gnutls_x509_certificate cert, gnutls_datum* res, int detail);
return result;
}
- result = gnutls_x509_certificate_get_subject_alt_name( xcert, seq, ret, ret_size);
+ result = gnutls_x509_certificate_get_subject_alt_name( xcert, seq, ret, ret_size, NULL);
gnutls_x509_certificate_deinit( xcert);
return result;
}
- result = gnutls_x509_certificate_get_ca_status( xcert);
+ result = gnutls_x509_certificate_get_ca_status( xcert, NULL);
gnutls_x509_certificate_deinit( xcert);
/* This function will attempt to return the requested extension found in
* the given X509v3 certificate. The return value is allocated and stored into
* ret.
+ *
+ * Critical will be either 0 or 1.
*/
int _gnutls_x509_certificate_get_extension( gnutls_x509_certificate cert, const char* extension_id,
- gnutls_datum* ret)
+ gnutls_datum* ret, int * _critical)
{
int k, result, len;
char name[128], name2[128], counter[MAX_INT_DIGITS];
char str[1024];
- char critical[10];
+ char str_critical[10];
+ int critical = 0;
char extnID[128];
char extnValue[256];
_gnutls_str_cpy(name2, sizeof(name2), name);
_gnutls_str_cat(name2, sizeof(name2), ".critical");
- len = sizeof(critical) - 1;
+ len = sizeof(str_critical);
result =
- asn1_read_value(cert->cert, name2, critical, &len);
+ asn1_read_value(cert->cert, name2, str_critical, &len);
if (result == ASN1_ELEMENT_NOT_FOUND) {
gnutls_assert();
return _gnutls_asn2err(result);
}
+ if (strcmp( str_critical, "TRUE")==0)
+ critical = 1;
+ else critical = 0;
+
_gnutls_str_cpy(name2, sizeof(name2), name);
_gnutls_str_cat(name2, sizeof(name2), ".extnValue");
break;
else {
if (result == ASN1_MEM_ERROR
- && strcmp(critical, "FALSE") == 0) {
+ && critical == 0) {
_gnutls_x509_log
("X509_EXT: Cannot parse extension: %s. Too small buffer.",
ret->size = len;
memcpy( ret->data, extnValue, len);
+ if (_critical)
+ *_critical = critical;
+
return 0;
}
int _gnutls_x509_certificate_get_extension( gnutls_x509_certificate cert, const char* extension_id,
- gnutls_datum* ret);
+ gnutls_datum* ret, int* critical);
int _gnutls_x509_ext_extract_keyUsage(uint16 *keyUsage, opaque * extnValue,
int extnValueLen);
int _gnutls_x509_ext_extract_basicConstraints(int *CA, opaque * extnValue,
dnsnamesize = sizeof(dnsname);
ret =
gnutls_x509_certificate_get_subject_alt_name(cert, i,
- dnsname,
- &dnsnamesize);
+ dnsname, &dnsnamesize, NULL);
if (ret == GNUTLS_SAN_DNSNAME) {
found_dnsname = 1;
* @seq: specifies the sequence number of the alt name (0 for the first one, 1 for the second etc.)
* @ret: is the place where the alternative name will be copied to
* @ret_size: holds the size of ret.
+ * @critical: will be non zero if the extension is marked as critical (may be null)
*
* This function will return the alternative names, contained in the
* given certificate.
*
**/
int gnutls_x509_certificate_get_subject_alt_name(gnutls_x509_certificate cert,
- int seq, char *ret, int *ret_size)
+ int seq, char *ret, int *ret_size, int *critical)
{
int result;
gnutls_datum dnsname;
memset(ret, 0, *ret_size);
if ((result =
- _gnutls_x509_certificate_get_extension(cert, "2 5 29 17", &dnsname)) < 0) {
+ _gnutls_x509_certificate_get_extension(cert, "2 5 29 17", &dnsname, critical)) < 0) {
gnutls_assert();
return result;
}
/**
* gnutls_x509_certificate_get_ca_status - This function returns the certificate CA status
* @cert: should contain a gnutls_x509_certificate structure
+ * @critical: will be non zero if the extension is marked as critical
*
* This function will return certificates CA status, by reading the
* basicConstraints X.509 extension. If the certificate is a CA a positive
* GNUTLS_E_REQUESTED_DATA_NOT_AVAILABLE will be returned.
*
**/
-int gnutls_x509_certificate_get_ca_status(gnutls_x509_certificate cert)
+int gnutls_x509_certificate_get_ca_status(gnutls_x509_certificate cert, int* critical)
{
int result;
gnutls_datum basicConstraints;
int ca;
if ((result =
- _gnutls_x509_certificate_get_extension(cert, "2 5 29 19", &basicConstraints)) < 0) {
+ _gnutls_x509_certificate_get_extension(cert, "2 5 29 19", &basicConstraints, critical)) < 0) {
gnutls_assert();
return result;
}
* gnutls_x509_certificate_get_key_usage - This function returns the certificate's key usage
* @cert: should contain a gnutls_x509_certificate structure
* @key_usage: where the key usage bits will be stored
+ * @critical: will be non zero if the extension is marked as critical
*
* This function will return certificate's key usage, by reading the
* keyUsage X.509 extension. The key usage value will ORed values of the:
* GNUTLS_E_REQUESTED_DATA_NOT_AVAILABLE will be returned.
*
**/
-int gnutls_x509_certificate_get_key_usage(gnutls_x509_certificate cert, unsigned int *key_usage)
+int gnutls_x509_certificate_get_key_usage(gnutls_x509_certificate cert, unsigned int *key_usage,
+ int *critical)
{
int result;
gnutls_datum keyUsage;
uint16 _usage;
if ((result =
- _gnutls_x509_certificate_get_extension(cert, "2 5 29 15", &keyUsage)) < 0) {
+ _gnutls_x509_certificate_get_extension(cert, "2 5 29 15", &keyUsage, critical)) < 0) {
gnutls_assert();
return result;
}
* @oid: holds an Object Identified in null terminated string
* @buf: a pointer to a structure to hold the name (may be null)
* @sizeof_buf: initialy holds the size of 'buf'
+ * @critical: will be non zero if the extension is marked as critical
*
* This function will return the extension specified by the OID in the certificate.
* The extensions will be returned as binary data DER encoded, in the provided
*
**/
int gnutls_x509_certificate_get_extension_by_oid(gnutls_x509_certificate cert, const char* oid,
- unsigned char* buf, int * sizeof_buf)
+ unsigned char* buf, int * sizeof_buf, int * critical)
{
int result;
gnutls_datum output;
if ((result =
- _gnutls_x509_certificate_get_extension(cert, oid, &output)) < 0) {
+ _gnutls_x509_certificate_get_extension(cert, oid, &output, critical)) < 0) {
gnutls_assert();
return result;
}
int gnutls_x509_certificate_get_issuer_dn_by_oid(gnutls_x509_certificate cert, const char* oid, char *buf,
int *sizeof_buf);
int gnutls_x509_certificate_get_subject_alt_name(gnutls_x509_certificate cert,
- int seq, char *ret, int *ret_size);
+ int seq, char *ret, int *ret_size, int* critical);
int gnutls_x509_certificate_get_dn_by_oid(gnutls_x509_certificate cert, const char* oid, char *buf,
int *sizeof_buf);