You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

322 lines
10 KiB

  1. /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
  2. * All rights reserved.
  3. *
  4. * This package is an SSL implementation written
  5. * by Eric Young (eay@cryptsoft.com).
  6. * The implementation was written so as to conform with Netscapes SSL.
  7. *
  8. * This library is free for commercial and non-commercial use as long as
  9. * the following conditions are aheared to. The following conditions
  10. * apply to all code found in this distribution, be it the RC4, RSA,
  11. * lhash, DES, etc., code; not just the SSL code. The SSL documentation
  12. * included with this distribution is covered by the same copyright terms
  13. * except that the holder is Tim Hudson (tjh@cryptsoft.com).
  14. *
  15. * Copyright remains Eric Young's, and as such any Copyright notices in
  16. * the code are not to be removed.
  17. * If this package is used in a product, Eric Young should be given attribution
  18. * as the author of the parts of the library used.
  19. * This can be in the form of a textual message at program startup or
  20. * in documentation (online or textual) provided with the package.
  21. *
  22. * Redistribution and use in source and binary forms, with or without
  23. * modification, are permitted provided that the following conditions
  24. * are met:
  25. * 1. Redistributions of source code must retain the copyright
  26. * notice, this list of conditions and the following disclaimer.
  27. * 2. Redistributions in binary form must reproduce the above copyright
  28. * notice, this list of conditions and the following disclaimer in the
  29. * documentation and/or other materials provided with the distribution.
  30. * 3. All advertising materials mentioning features or use of this software
  31. * must display the following acknowledgement:
  32. * "This product includes cryptographic software written by
  33. * Eric Young (eay@cryptsoft.com)"
  34. * The word 'cryptographic' can be left out if the rouines from the library
  35. * being used are not cryptographic related :-).
  36. * 4. If you include any Windows specific code (or a derivative thereof) from
  37. * the apps directory (application code) you must include an acknowledgement:
  38. * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
  39. *
  40. * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
  41. * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  42. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  43. * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
  44. * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  45. * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  46. * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  47. * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  48. * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  49. * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  50. * SUCH DAMAGE.
  51. *
  52. * The licence and distribution terms for any publically available version or
  53. * derivative of this code cannot be changed. i.e. this code cannot simply be
  54. * copied and put under another distribution licence
  55. * [including the GNU Public Licence.] */
  56. #include <openssl/digest.h>
  57. #include <assert.h>
  58. #include <string.h>
  59. #include <openssl/md4.h>
  60. #include <openssl/md5.h>
  61. #include <openssl/obj.h>
  62. #include <openssl/sha.h>
  63. #include "internal.h"
  64. #if defined(NDEBUG)
  65. #define CHECK(x) (void) (x)
  66. #else
  67. #define CHECK(x) assert(x)
  68. #endif
  69. static void md4_init(EVP_MD_CTX *ctx) {
  70. CHECK(MD4_Init(ctx->md_data));
  71. }
  72. static void md4_update(EVP_MD_CTX *ctx, const void *data, size_t count) {
  73. CHECK(MD4_Update(ctx->md_data, data, count));
  74. }
  75. static void md4_final(EVP_MD_CTX *ctx, uint8_t *out) {
  76. CHECK(MD4_Final(out, ctx->md_data));
  77. }
  78. static const EVP_MD md4_md = {
  79. NID_md4, MD4_DIGEST_LENGTH, 0 /* flags */, md4_init,
  80. md4_update, md4_final, 64 /* block size */, sizeof(MD4_CTX),
  81. };
  82. const EVP_MD *EVP_md4(void) { return &md4_md; }
  83. static void md5_init(EVP_MD_CTX *ctx) {
  84. CHECK(MD5_Init(ctx->md_data));
  85. }
  86. static void md5_update(EVP_MD_CTX *ctx, const void *data, size_t count) {
  87. CHECK(MD5_Update(ctx->md_data, data, count));
  88. }
  89. static void md5_final(EVP_MD_CTX *ctx, uint8_t *out) {
  90. CHECK(MD5_Final(out, ctx->md_data));
  91. }
  92. static const EVP_MD md5_md = {
  93. NID_md5, MD5_DIGEST_LENGTH, 0 /* flags */, md5_init,
  94. md5_update, md5_final, 64 /* block size */, sizeof(MD5_CTX),
  95. };
  96. const EVP_MD *EVP_md5(void) { return &md5_md; }
  97. static void sha1_init(EVP_MD_CTX *ctx) {
  98. CHECK(SHA1_Init(ctx->md_data));
  99. }
  100. static void sha1_update(EVP_MD_CTX *ctx, const void *data, size_t count) {
  101. CHECK(SHA1_Update(ctx->md_data, data, count));
  102. }
  103. static void sha1_final(EVP_MD_CTX *ctx, uint8_t *md) {
  104. CHECK(SHA1_Final(md, ctx->md_data));
  105. }
  106. static const EVP_MD sha1_md = {
  107. NID_sha1, SHA_DIGEST_LENGTH, 0 /* flags */, sha1_init,
  108. sha1_update, sha1_final, 64 /* block size */, sizeof(SHA_CTX),
  109. };
  110. const EVP_MD *EVP_sha1(void) { return &sha1_md; }
  111. static void sha224_init(EVP_MD_CTX *ctx) {
  112. CHECK(SHA224_Init(ctx->md_data));
  113. }
  114. static void sha224_update(EVP_MD_CTX *ctx, const void *data, size_t count) {
  115. CHECK(SHA224_Update(ctx->md_data, data, count));
  116. }
  117. static void sha224_final(EVP_MD_CTX *ctx, uint8_t *md) {
  118. CHECK(SHA224_Final(md, ctx->md_data));
  119. }
  120. static const EVP_MD sha224_md = {
  121. NID_sha224, SHA224_DIGEST_LENGTH, 0 /* flags */,
  122. sha224_init, sha224_update, sha224_final,
  123. 64 /* block size */, sizeof(SHA256_CTX),
  124. };
  125. const EVP_MD *EVP_sha224(void) { return &sha224_md; }
  126. static void sha256_init(EVP_MD_CTX *ctx) {
  127. CHECK(SHA256_Init(ctx->md_data));
  128. }
  129. static void sha256_update(EVP_MD_CTX *ctx, const void *data, size_t count) {
  130. CHECK(SHA256_Update(ctx->md_data, data, count));
  131. }
  132. static void sha256_final(EVP_MD_CTX *ctx, uint8_t *md) {
  133. CHECK(SHA256_Final(md, ctx->md_data));
  134. }
  135. static const EVP_MD sha256_md = {
  136. NID_sha256, SHA256_DIGEST_LENGTH, 0 /* flags */,
  137. sha256_init, sha256_update, sha256_final,
  138. 64 /* block size */, sizeof(SHA256_CTX),
  139. };
  140. const EVP_MD *EVP_sha256(void) { return &sha256_md; }
  141. static void sha384_init(EVP_MD_CTX *ctx) {
  142. CHECK(SHA384_Init(ctx->md_data));
  143. }
  144. static void sha384_update(EVP_MD_CTX *ctx, const void *data, size_t count) {
  145. CHECK(SHA384_Update(ctx->md_data, data, count));
  146. }
  147. static void sha384_final(EVP_MD_CTX *ctx, uint8_t *md) {
  148. CHECK(SHA384_Final(md, ctx->md_data));
  149. }
  150. static const EVP_MD sha384_md = {
  151. NID_sha384, SHA384_DIGEST_LENGTH, 0 /* flags */,
  152. sha384_init, sha384_update, sha384_final,
  153. 128 /* block size */, sizeof(SHA512_CTX),
  154. };
  155. const EVP_MD *EVP_sha384(void) { return &sha384_md; }
  156. static void sha512_init(EVP_MD_CTX *ctx) {
  157. CHECK(SHA512_Init(ctx->md_data));
  158. }
  159. static void sha512_update(EVP_MD_CTX *ctx, const void *data, size_t count) {
  160. CHECK(SHA512_Update(ctx->md_data, data, count));
  161. }
  162. static void sha512_final(EVP_MD_CTX *ctx, uint8_t *md) {
  163. CHECK(SHA512_Final(md, ctx->md_data));
  164. }
  165. static const EVP_MD sha512_md = {
  166. NID_sha512, SHA512_DIGEST_LENGTH, 0 /* flags */,
  167. sha512_init, sha512_update, sha512_final,
  168. 128 /* block size */, sizeof(SHA512_CTX),
  169. };
  170. const EVP_MD *EVP_sha512(void) { return &sha512_md; }
  171. typedef struct {
  172. MD5_CTX md5;
  173. SHA_CTX sha1;
  174. } MD5_SHA1_CTX;
  175. static void md5_sha1_init(EVP_MD_CTX *md_ctx) {
  176. MD5_SHA1_CTX *ctx = md_ctx->md_data;
  177. CHECK(MD5_Init(&ctx->md5) && SHA1_Init(&ctx->sha1));
  178. }
  179. static void md5_sha1_update(EVP_MD_CTX *md_ctx, const void *data,
  180. size_t count) {
  181. MD5_SHA1_CTX *ctx = md_ctx->md_data;
  182. CHECK(MD5_Update(&ctx->md5, data, count) &&
  183. SHA1_Update(&ctx->sha1, data, count));
  184. }
  185. static void md5_sha1_final(EVP_MD_CTX *md_ctx, uint8_t *out) {
  186. MD5_SHA1_CTX *ctx = md_ctx->md_data;
  187. CHECK(MD5_Final(out, &ctx->md5) &&
  188. SHA1_Final(out + MD5_DIGEST_LENGTH, &ctx->sha1));
  189. }
  190. static const EVP_MD md5_sha1_md = {
  191. NID_md5_sha1,
  192. MD5_DIGEST_LENGTH + SHA_DIGEST_LENGTH,
  193. 0 /* flags */,
  194. md5_sha1_init,
  195. md5_sha1_update,
  196. md5_sha1_final,
  197. 64 /* block size */,
  198. sizeof(MD5_SHA1_CTX),
  199. };
  200. const EVP_MD *EVP_md5_sha1(void) { return &md5_sha1_md; }
  201. struct nid_to_digest {
  202. int nid;
  203. const EVP_MD* (*md_func)(void);
  204. const char *short_name;
  205. const char *long_name;
  206. };
  207. static const struct nid_to_digest nid_to_digest_mapping[] = {
  208. { NID_md4, EVP_md4, SN_md4, LN_md4 },
  209. { NID_md5, EVP_md5, SN_md5, LN_md5 },
  210. { NID_sha1, EVP_sha1, SN_sha1, LN_sha1 },
  211. { NID_sha224, EVP_sha224, SN_sha224, LN_sha224 },
  212. { NID_sha256, EVP_sha256, SN_sha256, LN_sha256 },
  213. { NID_sha384, EVP_sha384, SN_sha384, LN_sha384 },
  214. { NID_sha512, EVP_sha512, SN_sha512, LN_sha512 },
  215. { NID_md5_sha1, EVP_md5_sha1, SN_md5_sha1, LN_md5_sha1 },
  216. { NID_dsaWithSHA, EVP_sha1, SN_dsaWithSHA, LN_dsaWithSHA },
  217. { NID_dsaWithSHA1, EVP_sha1, SN_dsaWithSHA1, LN_dsaWithSHA1 },
  218. { NID_ecdsa_with_SHA1, EVP_sha1, SN_ecdsa_with_SHA1, NULL },
  219. { NID_md5WithRSAEncryption, EVP_md5, SN_md5WithRSAEncryption,
  220. LN_md5WithRSAEncryption },
  221. { NID_sha1WithRSAEncryption, EVP_sha1, SN_sha1WithRSAEncryption,
  222. LN_sha1WithRSAEncryption },
  223. { NID_sha224WithRSAEncryption, EVP_sha224, SN_sha224WithRSAEncryption,
  224. LN_sha224WithRSAEncryption },
  225. { NID_sha256WithRSAEncryption, EVP_sha256, SN_sha256WithRSAEncryption,
  226. LN_sha256WithRSAEncryption },
  227. { NID_sha384WithRSAEncryption, EVP_sha384, SN_sha384WithRSAEncryption,
  228. LN_sha384WithRSAEncryption },
  229. { NID_sha512WithRSAEncryption, EVP_sha512, SN_sha512WithRSAEncryption,
  230. LN_sha512WithRSAEncryption },
  231. };
  232. const EVP_MD* EVP_get_digestbynid(int nid) {
  233. unsigned i;
  234. for (i = 0; i < sizeof(nid_to_digest_mapping) / sizeof(struct nid_to_digest);
  235. i++) {
  236. if (nid_to_digest_mapping[i].nid == nid) {
  237. return nid_to_digest_mapping[i].md_func();
  238. }
  239. }
  240. return NULL;
  241. }
  242. const EVP_MD* EVP_get_digestbyobj(const ASN1_OBJECT *obj) {
  243. return EVP_get_digestbynid(OBJ_obj2nid(obj));
  244. }
  245. const EVP_MD *EVP_get_digestbyname(const char *name) {
  246. unsigned i;
  247. for (i = 0; i < sizeof(nid_to_digest_mapping) / sizeof(struct nid_to_digest);
  248. i++) {
  249. const char *short_name = nid_to_digest_mapping[i].short_name;
  250. const char *long_name = nid_to_digest_mapping[i].long_name;
  251. if ((short_name && strcmp(short_name, name) == 0) ||
  252. (long_name && strcmp(long_name, name) == 0)) {
  253. return nid_to_digest_mapping[i].md_func();
  254. }
  255. }
  256. return NULL;
  257. }