crypto_misc.h 5.8 KB

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