crypto_misc.h 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. /*
  2. * Copyright (c) 2007-2015, 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. /**
  31. * @file crypto_misc.h
  32. */
  33. #ifndef HEADER_CRYPTO_MISC_H
  34. #define HEADER_CRYPTO_MISC_H
  35. #ifdef __cplusplus
  36. extern "C" {
  37. #endif
  38. #include "crypto.h"
  39. #include "bigint.h"
  40. /**************************************************************************
  41. * X509 declarations
  42. **************************************************************************/
  43. #define X509_OK 0
  44. #define X509_NOT_OK -1
  45. #define X509_VFY_ERROR_NO_TRUSTED_CERT -2
  46. #define X509_VFY_ERROR_BAD_SIGNATURE -3
  47. #define X509_VFY_ERROR_NOT_YET_VALID -4
  48. #define X509_VFY_ERROR_EXPIRED -5
  49. #define X509_VFY_ERROR_SELF_SIGNED -6
  50. #define X509_VFY_ERROR_INVALID_CHAIN -7
  51. #define X509_VFY_ERROR_UNSUPPORTED_DIGEST -8
  52. #define X509_INVALID_PRIV_KEY -9
  53. #define X509_MAX_CERTS -10
  54. /*
  55. * The Distinguished Name
  56. */
  57. #define X509_NUM_DN_TYPES 3
  58. #define X509_COMMON_NAME 0
  59. #define X509_ORGANIZATION 1
  60. #define X509_ORGANIZATIONAL_UNIT 2
  61. struct _x509_ctx
  62. {
  63. char *ca_cert_dn[X509_NUM_DN_TYPES];
  64. char *cert_dn[X509_NUM_DN_TYPES];
  65. char **subject_alt_dnsnames;
  66. time_t not_before;
  67. time_t not_after;
  68. uint8_t *signature;
  69. uint16_t sig_len;
  70. uint8_t sig_type;
  71. RSA_CTX *rsa_ctx;
  72. bigint *digest;
  73. struct _x509_ctx *next;
  74. };
  75. typedef struct _x509_ctx X509_CTX;
  76. #ifdef CONFIG_SSL_CERT_VERIFICATION
  77. typedef struct
  78. {
  79. //X509_CTX *cert[CONFIG_X509_MAX_CA_CERTS];
  80. X509_CTX **cert;
  81. } CA_CERT_CTX;
  82. #endif
  83. int x509_new(const uint8_t *cert, int *len, X509_CTX **ctx);
  84. void x509_free(X509_CTX *x509_ctx);
  85. #ifdef CONFIG_SSL_CERT_VERIFICATION
  86. int x509_verify(const CA_CERT_CTX *ca_cert_ctx, const X509_CTX *cert);
  87. #endif
  88. #ifdef CONFIG_SSL_FULL_MODE
  89. void x509_print(const X509_CTX *cert, CA_CERT_CTX *ca_cert_ctx);
  90. const char * x509_display_error(int error);
  91. #endif
  92. /**************************************************************************
  93. * ASN1 declarations
  94. **************************************************************************/
  95. #define ASN1_INTEGER 0x02
  96. #define ASN1_BIT_STRING 0x03
  97. #define ASN1_OCTET_STRING 0x04
  98. #define ASN1_NULL 0x05
  99. #define ASN1_PRINTABLE_STR2 0x0C
  100. #define ASN1_OID 0x06
  101. #define ASN1_PRINTABLE_STR2 0x0C
  102. #define ASN1_PRINTABLE_STR 0x13
  103. #define ASN1_TELETEX_STR 0x14
  104. #define ASN1_IA5_STR 0x16
  105. #define ASN1_UTC_TIME 0x17
  106. #define ASN1_GENERALIZED_TIME 0x18
  107. #define ASN1_UNICODE_STR 0x1e
  108. #define ASN1_SEQUENCE 0x30
  109. #define ASN1_CONTEXT_DNSNAME 0x82
  110. #define ASN1_SET 0x31
  111. #define ASN1_V3_DATA 0xa3
  112. #define ASN1_IMPLICIT_TAG 0x80
  113. #define ASN1_CONTEXT_DNSNAME 0x82
  114. #define ASN1_EXPLICIT_TAG 0xa0
  115. #define ASN1_V3_DATA 0xa3
  116. #define SIG_TYPE_MD2 0x02
  117. #define SIG_TYPE_MD5 0x04
  118. #define SIG_TYPE_SHA1 0x05
  119. #define SIG_TYPE_SHA256 0x0b
  120. #define SIG_TYPE_SHA384 0x0c
  121. #define SIG_TYPE_SHA512 0x0d
  122. uint32_t get_asn1_length(const uint8_t *buf, int *offset);
  123. int asn1_get_private_key(const uint8_t *buf, int len, RSA_CTX **rsa_ctx);
  124. int asn1_next_obj(const uint8_t *buf, int *offset, int obj_type);
  125. int asn1_skip_obj(const uint8_t *buf, int *offset, int obj_type);
  126. int asn1_get_int(const uint8_t *buf, int *offset, uint8_t **object);
  127. int asn1_version(const uint8_t *cert, int *offset, X509_CTX *x509_ctx);
  128. int asn1_validity(const uint8_t *cert, int *offset, X509_CTX *x509_ctx);
  129. int asn1_name(const uint8_t *cert, int *offset, char *dn[]);
  130. int asn1_public_key(const uint8_t *cert, int *offset, X509_CTX *x509_ctx);
  131. #ifdef CONFIG_SSL_CERT_VERIFICATION
  132. int asn1_signature(const uint8_t *cert, int *offset, X509_CTX *x509_ctx);
  133. int asn1_find_subjectaltname(const uint8_t* cert, int offset);
  134. int asn1_compare_dn(char * const dn1[], char * const dn2[]);
  135. #endif /* CONFIG_SSL_CERT_VERIFICATION */
  136. int asn1_signature_type(const uint8_t *cert,
  137. int *offset, X509_CTX *x509_ctx);
  138. /**************************************************************************
  139. * MISC declarations
  140. **************************************************************************/
  141. #define SALT_SIZE 8
  142. extern const char * const unsupported_str;
  143. typedef void (*crypt_func)(void *, const uint8_t *, uint8_t *, int);
  144. typedef void (*hmac_func)(const uint8_t *msg, int length, const uint8_t *key,
  145. int key_len, uint8_t *digest);
  146. int get_file(const char *filename, uint8_t **buf);
  147. #if defined(CONFIG_SSL_FULL_MODE) || defined(WIN32) || defined(CONFIG_DEBUG)
  148. EXP_FUNC void STDCALL print_blob(const char *format, const uint8_t *data, int size, ...);
  149. #else
  150. #define print_blob(...)
  151. #endif
  152. EXP_FUNC int STDCALL base64_decode(const char *in, int len,
  153. uint8_t *out, int *outlen);
  154. #ifdef __cplusplus
  155. }
  156. #endif
  157. #endif