kodi
crypto_misc.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2007, Cameron Rich
3  *
4  * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions are met:
8  *
9  * * Redistributions of source code must retain the above copyright notice,
10  * this list of conditions and the following disclaimer.
11  * * Redistributions in binary form must reproduce the above copyright notice,
12  * this list of conditions and the following disclaimer in the documentation
13  * and/or other materials provided with the distribution.
14  * * Neither the name of the axTLS project nor the names of its contributors
15  * may be used to endorse or promote products derived from this software
16  * without specific prior written permission.
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
22  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
23  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
24  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
25  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
26  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
27  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */
30 
35 #ifndef HEADER_CRYPTO_MISC_H
36 #define HEADER_CRYPTO_MISC_H
37 
38 #ifdef __cplusplus
39 extern "C" {
40 #endif
41 
42 #include "crypto.h"
43 #include "bigint.h"
44 
45 /**************************************************************************
46  * X509 declarations
47  **************************************************************************/
48 #define X509_OK 0
49 #define X509_NOT_OK -1
50 #define X509_VFY_ERROR_NO_TRUSTED_CERT -2
51 #define X509_VFY_ERROR_BAD_SIGNATURE -3
52 #define X509_VFY_ERROR_NOT_YET_VALID -4
53 #define X509_VFY_ERROR_EXPIRED -5
54 #define X509_VFY_ERROR_SELF_SIGNED -6
55 #define X509_VFY_ERROR_INVALID_CHAIN -7
56 #define X509_VFY_ERROR_UNSUPPORTED_DIGEST -8
57 #define X509_INVALID_PRIV_KEY -9
58 
59 /*
60  * The Distinguished Name
61  */
62 #define X509_NUM_DN_TYPES 4
63 #define X509_COMMON_NAME 0
64 #define X509_ORGANIZATION 1
65 #define X509_ORGANIZATIONAL_UNIT 2
66 #define X509_GENERIC 3
67 
68 struct _x509_ctx
69 {
70  char *ca_cert_dn[X509_NUM_DN_TYPES];
71  char *cert_dn[X509_NUM_DN_TYPES];
72  char **subject_alt_dnsnames;
73  SSL_DateTime not_before;
74  SSL_DateTime not_after;
75  uint8_t *signature;
76  uint16_t sig_len;
77  uint8_t sig_type;
78  RSA_CTX *rsa_ctx;
79  bigint *digest;
80  struct {
81  unsigned char md5[MD5_SIZE];
82  unsigned char sha1[SHA1_SIZE];
83  } fingerprint;
84  struct _x509_ctx *next;
85 };
86 
87 typedef struct _x509_ctx X509_CTX;
88 
89 #ifdef CONFIG_SSL_CERT_VERIFICATION
90 #if 0 /* GBG: removed */
91 typedef struct
92 {
93  X509_CTX *cert[CONFIG_X509_MAX_CA_CERTS];
94 } CA_CERT_CTX;
95 #endif /* GBG */
96 #endif
97 
98 int x509_new(const uint8_t *cert, int *len, X509_CTX **ctx);
99 void x509_free(X509_CTX *x509_ctx);
100 #ifdef CONFIG_SSL_CERT_VERIFICATION
101 int x509_verify(X509_CTX* ca_certs /* GBG: changed */, const X509_CTX *cert, const SSL_DateTime* now);
102 #endif
103 #ifdef CONFIG_SSL_FULL_MODE
104 void x509_print(const X509_CTX *cert, CA_CERT_CTX *ca_cert_ctx);
105 const char * x509_display_error(int error);
106 #endif
107 
108 /**************************************************************************
109  * ASN1 declarations
110  **************************************************************************/
111 #define ASN1_INTEGER 0x02
112 #define ASN1_BIT_STRING 0x03
113 #define ASN1_OCTET_STRING 0x04
114 #define ASN1_NULL 0x05
115 #define ASN1_PRINTABLE_STR2 0x0C
116 #define ASN1_OID 0x06
117 #define ASN1_UNIVERSAL_STR 0x1C /* GBG */
118 #define ASN1_PRINTABLE_STR 0x13
119 #define ASN1_TELETEX_STR 0x14
120 #define ASN1_IA5_STR 0x16
121 #define ASN1_UTC_TIME 0x17
122 #define ASN1_GENERALIZED_TIME 0x18 /* GBG */
123 #define ASN1_UNICODE_STR 0x1e
124 #define ASN1_SEQUENCE 0x30
125 #define ASN1_CONTEXT_DNSNAME 0x82
126 #define ASN1_SET 0x31
127 #define ASN1_V3_DATA 0xa3
128 #define ASN1_IMPLICIT_TAG 0x80
129 #define ASN1_CONTEXT_DNSNAME 0x82
130 #define ASN1_EXPLICIT_TAG 0xa0
131 #define ASN1_V3_DATA 0xa3
132 
133 #define SIG_TYPE_MD2 0x02
134 #define SIG_TYPE_MD5 0x04
135 #define SIG_TYPE_SHA1 0x05
136 #define SIG_TYPE_SHA256 0x0B /* GBG */
137 
138 int get_asn1_length(const uint8_t *buf, int *offset);
139 int asn1_get_private_key(const uint8_t *buf, int len, RSA_CTX **rsa_ctx);
140 int asn1_next_obj(const uint8_t *buf, int *offset, int obj_type);
141 int asn1_skip_obj(const uint8_t *buf, int *offset, int obj_type);
142 int asn1_get_int(const uint8_t *buf, int *offset, uint8_t **object);
143 int asn1_version(const uint8_t *cert, int *offset, X509_CTX *x509_ctx);
144 int asn1_validity(const uint8_t *cert, int *offset, X509_CTX *x509_ctx);
145 int asn1_name(const uint8_t *cert, int *offset, char *dn[]);
146 int asn1_public_key(const uint8_t *cert, int *offset, X509_CTX *x509_ctx);
147 #ifdef CONFIG_SSL_CERT_VERIFICATION
148 int asn1_signature(const uint8_t *cert, int *offset, X509_CTX *x509_ctx);
149 int asn1_find_subjectaltname(const uint8_t* cert, int offset);
150 int asn1_compare_dn(char * const dn1[], char * const dn2[]);
151 #endif /* CONFIG_SSL_CERT_VERIFICATION */
152 int asn1_signature_type(const uint8_t *cert,
153  int *offset, X509_CTX *x509_ctx);
154 
155 /**************************************************************************
156  * MISC declarations
157  **************************************************************************/
158 #define SALT_SIZE 8
159 
160 extern const char * const unsupported_str;
161 
162 typedef void (*crypt_func)(void *, const uint8_t *, uint8_t *, int);
163 typedef void (*hmac_func)(const uint8_t *msg, int length, const uint8_t *key,
164  int key_len, uint8_t *digest);
165 
166 int get_file(const char *filename, uint8_t **buf);
167 
168 #if defined(CONFIG_SSL_FULL_MODE) || defined(WIN32) || defined(CONFIG_DEBUG)
169 EXP_FUNC void STDCALL print_blob(const char *format, const uint8_t *data, int size, ...);
170 #else
171 /*#define print_blob(...)*/
172 EXP_FUNC void STDCALL print_blob(const char *format, const uint8_t *data, int size, ...);
173 #endif
174 
175 EXP_FUNC int STDCALL base64_decode(const char *in, int len,
176  uint8_t *out, int *outlen);
177 
178 #ifdef __cplusplus
179 }
180 #endif
181 
182 #endif
int asn1_name(const uint8_t *cert, int *offset, char *dn[])
Get the subject name (or the issuer) of a certificate.
Definition: asn1.c:412
int asn1_public_key(const uint8_t *cert, int *offset, X509_CTX *x509_ctx)
Read the modulus and public exponent of a certificate.
Definition: asn1.c:492
int asn1_validity(const uint8_t *cert, int *offset, X509_CTX *x509_ctx)
Retrieve the notbefore and notafter certificate times.
Definition: asn1.c:266
int asn1_skip_obj(const uint8_t *buf, int *offset, int obj_type)
Skip over an ASN.1 object type completely.
Definition: asn1.c:106
int x509_new(const uint8_t *cert, int *len, X509_CTX **ctx)
Construct a new x509 object.
Definition: x509.c:72
Definition: crypto.h:170
void x509_free(X509_CTX *x509_ctx)
Free an X.509 object's resources.
Definition: x509.c:248
int asn1_version(const uint8_t *cert, int *offset, X509_CTX *x509_ctx)
Get the version type of a certificate (which we don't actually care about)
Definition: asn1.c:249
Definition: crypto_misc.h:68
int asn1_signature_type(const uint8_t *cert, int *offset, X509_CTX *x509_ctx)
Read the signature type of the certificate.
Definition: asn1.c:647
int asn1_get_int(const uint8_t *buf, int *offset, uint8_t **object)
Read an integer value for ASN.1 data Note: This function allocates memory which must be freed by the ...
Definition: asn1.c:122
int asn1_get_private_key(const uint8_t *buf, int len, RSA_CTX **rsa_ctx)
Get all the RSA private key specifics from an ASN.1 encoded file.
Definition: asn1.c:146
int asn1_next_obj(const uint8_t *buf, int *offset, int obj_type)
Skip the ASN1.1 object type and its length.
Definition: asn1.c:94
A big integer basic object.
Definition: bigint_impl.h:83
Definition: os_port.h:63