mirror of
				https://github.com/0xFEEDC0DE64/arduino-esp32.git
				synced 2025-10-31 06:01:39 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			124 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			124 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * X.509v3 certificate parsing and processing
 | |
|  * Copyright (c) 2006-2011, Jouni Malinen <j@w1.fi>
 | |
|  *
 | |
|  * This software may be distributed under the terms of the BSD license.
 | |
|  * See README for more details.
 | |
|  */
 | |
| 
 | |
| #ifndef X509V3_H
 | |
| #define X509V3_H
 | |
| 
 | |
| #include "asn1.h"
 | |
| 
 | |
| struct x509_algorithm_identifier {
 | |
| 	struct asn1_oid oid;
 | |
| };
 | |
| 
 | |
| struct x509_name_attr {
 | |
| 	enum x509_name_attr_type {
 | |
| 		X509_NAME_ATTR_NOT_USED,
 | |
| 		X509_NAME_ATTR_DC,
 | |
| 		X509_NAME_ATTR_CN,
 | |
| 		X509_NAME_ATTR_C,
 | |
| 		X509_NAME_ATTR_L,
 | |
| 		X509_NAME_ATTR_ST,
 | |
| 		X509_NAME_ATTR_O,
 | |
| 		X509_NAME_ATTR_OU
 | |
| 	} type;
 | |
| 	char *value;
 | |
| };
 | |
| 
 | |
| #define X509_MAX_NAME_ATTRIBUTES 20
 | |
| 
 | |
| struct x509_name {
 | |
| 	struct x509_name_attr attr[X509_MAX_NAME_ATTRIBUTES];
 | |
| 	size_t num_attr;
 | |
| 	char *email; /* emailAddress */
 | |
| 
 | |
| 	/* from alternative name extension */
 | |
| 	char *alt_email; /* rfc822Name */
 | |
| 	char *dns; /* dNSName */
 | |
| 	char *uri; /* uniformResourceIdentifier */
 | |
| 	u8 *ip; /* iPAddress */
 | |
| 	size_t ip_len; /* IPv4: 4, IPv6: 16 */
 | |
| 	struct asn1_oid rid; /* registeredID */
 | |
| };
 | |
| 
 | |
| struct x509_certificate {
 | |
| 	struct x509_certificate *next;
 | |
| 	enum { X509_CERT_V1 = 0, X509_CERT_V2 = 1, X509_CERT_V3 = 2 } version;
 | |
| 	unsigned long serial_number;
 | |
| 	struct x509_algorithm_identifier signature;
 | |
| 	struct x509_name issuer;
 | |
| 	struct x509_name subject;
 | |
| 	os_time_t not_before;
 | |
| 	os_time_t not_after;
 | |
| 	struct x509_algorithm_identifier public_key_alg;
 | |
| 	u8 *public_key;
 | |
| 	size_t public_key_len;
 | |
| 	struct x509_algorithm_identifier signature_alg;
 | |
| 	u8 *sign_value;
 | |
| 	size_t sign_value_len;
 | |
| 
 | |
| 	/* Extensions */
 | |
| 	unsigned int extensions_present;
 | |
| #define X509_EXT_BASIC_CONSTRAINTS		(1 << 0)
 | |
| #define X509_EXT_PATH_LEN_CONSTRAINT		(1 << 1)
 | |
| #define X509_EXT_KEY_USAGE			(1 << 2)
 | |
| #define X509_EXT_SUBJECT_ALT_NAME		(1 << 3)
 | |
| #define X509_EXT_ISSUER_ALT_NAME		(1 << 4)
 | |
| 
 | |
| 	/* BasicConstraints */
 | |
| 	int ca; /* cA */
 | |
| 	unsigned long path_len_constraint; /* pathLenConstraint */
 | |
| 
 | |
| 	/* KeyUsage */
 | |
| 	unsigned long key_usage;
 | |
| #define X509_KEY_USAGE_DIGITAL_SIGNATURE	(1 << 0)
 | |
| #define X509_KEY_USAGE_NON_REPUDIATION		(1 << 1)
 | |
| #define X509_KEY_USAGE_KEY_ENCIPHERMENT		(1 << 2)
 | |
| #define X509_KEY_USAGE_DATA_ENCIPHERMENT	(1 << 3)
 | |
| #define X509_KEY_USAGE_KEY_AGREEMENT		(1 << 4)
 | |
| #define X509_KEY_USAGE_KEY_CERT_SIGN		(1 << 5)
 | |
| #define X509_KEY_USAGE_CRL_SIGN			(1 << 6)
 | |
| #define X509_KEY_USAGE_ENCIPHER_ONLY		(1 << 7)
 | |
| #define X509_KEY_USAGE_DECIPHER_ONLY		(1 << 8)
 | |
| 
 | |
| 	/*
 | |
| 	 * The DER format certificate follows struct x509_certificate. These
 | |
| 	 * pointers point to that buffer.
 | |
| 	 */
 | |
| 	const u8 *cert_start;
 | |
| 	size_t cert_len;
 | |
| 	const u8 *tbs_cert_start;
 | |
| 	size_t tbs_cert_len;
 | |
| };
 | |
| 
 | |
| enum {
 | |
| 	X509_VALIDATE_OK,
 | |
| 	X509_VALIDATE_BAD_CERTIFICATE,
 | |
| 	X509_VALIDATE_UNSUPPORTED_CERTIFICATE,
 | |
| 	X509_VALIDATE_CERTIFICATE_REVOKED,
 | |
| 	X509_VALIDATE_CERTIFICATE_EXPIRED,
 | |
| 	X509_VALIDATE_CERTIFICATE_UNKNOWN,
 | |
| 	X509_VALIDATE_UNKNOWN_CA
 | |
| };
 | |
| 
 | |
| void x509_certificate_free(struct x509_certificate *cert);
 | |
| struct x509_certificate * x509_certificate_parse(const u8 *buf, size_t len);
 | |
| void x509_name_string(struct x509_name *name, char *buf, size_t len);
 | |
| int x509_name_compare(struct x509_name *a, struct x509_name *b);
 | |
| void x509_certificate_chain_free(struct x509_certificate *cert);
 | |
| int x509_certificate_check_signature(struct x509_certificate *issuer,
 | |
| 				     struct x509_certificate *cert);
 | |
| int x509_certificate_chain_validate(struct x509_certificate *trusted,
 | |
| 				    struct x509_certificate *chain,
 | |
| 				    int *reason, int disable_time_checks);
 | |
| struct x509_certificate *
 | |
| x509_certificate_get_subject(struct x509_certificate *chain,
 | |
| 			     struct x509_name *name);
 | |
| int x509_certificate_self_signed(struct x509_certificate *cert);
 | |
| 
 | |
| #endif /* X509V3_H */
 |