ssl_crypto_misc.h 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  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. /**
  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 "ssl/ssl_crypto.h"
  39. #include "ssl/ssl_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. /*
  54. * The Distinguished Name
  55. */
  56. #define X509_NUM_DN_TYPES 3
  57. #define X509_COMMON_NAME 0
  58. #define X509_ORGANIZATION 1
  59. #define X509_ORGANIZATIONAL_UNIT 2
  60. struct _x509_ctx
  61. {
  62. char *ca_cert_dn[X509_NUM_DN_TYPES];
  63. char *cert_dn[X509_NUM_DN_TYPES];
  64. char **subject_alt_dnsnames;
  65. time_t not_before;
  66. time_t not_after;
  67. uint8_t *signature;
  68. uint16_t sig_len;
  69. uint8_t sig_type;
  70. RSA_CTX *rsa_ctx;
  71. bigint *digest;
  72. struct _x509_ctx *next;
  73. };
  74. typedef struct _x509_ctx X509_CTX;
  75. #ifdef CONFIG_SSL_CERT_VERIFICATION
  76. typedef struct
  77. {
  78. X509_CTX *cert[CONFIG_X509_MAX_CA_CERTS];
  79. } CA_CERT_CTX;
  80. #endif
  81. int x509_new(const uint8_t *cert, int *len, X509_CTX **ctx);
  82. void x509_free(X509_CTX *x509_ctx);
  83. #ifdef CONFIG_SSL_CERT_VERIFICATION
  84. int x509_verify(const CA_CERT_CTX *ca_cert_ctx, const X509_CTX *cert);
  85. #endif
  86. #ifdef CONFIG_SSL_FULL_MODE
  87. void x509_print(const X509_CTX *cert, CA_CERT_CTX *ca_cert_ctx);
  88. const char * x509_display_error(int error);
  89. #endif
  90. /**************************************************************************
  91. * ASN1 declarations
  92. **************************************************************************/
  93. #define ASN1_INTEGER 0x02
  94. #define ASN1_BIT_STRING 0x03
  95. #define ASN1_OCTET_STRING 0x04
  96. #define ASN1_NULL 0x05
  97. #define ASN1_PRINTABLE_STR2 0x0C
  98. #define ASN1_OID 0x06
  99. #define ASN1_PRINTABLE_STR2 0x0C
  100. #define ASN1_PRINTABLE_STR 0x13
  101. #define ASN1_TELETEX_STR 0x14
  102. #define ASN1_IA5_STR 0x16
  103. #define ASN1_UTC_TIME 0x17
  104. #define ASN1_UNICODE_STR 0x1e
  105. #define ASN1_SEQUENCE 0x30
  106. #define ASN1_CONTEXT_DNSNAME 0x82
  107. #define ASN1_SET 0x31
  108. #define ASN1_V3_DATA 0xa3
  109. #define ASN1_IMPLICIT_TAG 0x80
  110. #define ASN1_CONTEXT_DNSNAME 0x82
  111. #define ASN1_EXPLICIT_TAG 0xa0
  112. #define ASN1_V3_DATA 0xa3
  113. #define SIG_TYPE_MD2 0x02
  114. #define SIG_TYPE_MD5 0x04
  115. #define SIG_TYPE_SHA1 0x05
  116. int get_asn1_length(const uint8_t *buf, int *offset);
  117. int asn1_get_private_key(const uint8_t *buf, int len, RSA_CTX **rsa_ctx);
  118. int asn1_next_obj(const uint8_t *buf, int *offset, int obj_type);
  119. int asn1_skip_obj(const uint8_t *buf, int *offset, int obj_type);
  120. int asn1_get_int(const uint8_t *buf, int *offset, uint8_t **object);
  121. int asn1_version(const uint8_t *cert, int *offset, X509_CTX *x509_ctx);
  122. int asn1_validity(const uint8_t *cert, int *offset, X509_CTX *x509_ctx);
  123. int asn1_name(const uint8_t *cert, int *offset, char *dn[]);
  124. int asn1_public_key(const uint8_t *cert, int *offset, X509_CTX *x509_ctx);
  125. #ifdef CONFIG_SSL_CERT_VERIFICATION
  126. int asn1_signature(const uint8_t *cert, int *offset, X509_CTX *x509_ctx);
  127. int asn1_find_subjectaltname(const uint8_t* cert, int offset);
  128. int asn1_compare_dn(char * const dn1[], char * const dn2[]);
  129. #endif /* CONFIG_SSL_CERT_VERIFICATION */
  130. int asn1_signature_type(const uint8_t *cert,
  131. int *offset, X509_CTX *x509_ctx);
  132. /**************************************************************************
  133. * MISC declarations
  134. **************************************************************************/
  135. #define SALT_SIZE 8
  136. extern const char * const unsupported_str;
  137. typedef void (*crypt_func)(void *, const uint8_t *, uint8_t *, int);
  138. typedef void (*hmac_func)(const uint8_t *msg, int length, const uint8_t *key,
  139. int key_len, uint8_t *digest);
  140. int get_file(const char *filename, uint8_t **buf);
  141. #if defined(CONFIG_SSL_FULL_MODE) || defined(WIN32) || defined(CONFIG_DEBUG)
  142. EXP_FUNC void STDCALL print_blob(const char *format, const uint8_t *data, int size, ...);
  143. #else
  144. #define print_blob(...)
  145. #endif
  146. EXP_FUNC int STDCALL base64_decode(const char *in, int len,
  147. uint8_t *out, int *outlen);
  148. #ifdef __cplusplus
  149. }
  150. #endif
  151. #endif