sha2.h 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. /*
  2. * FILE: sha2.h
  3. * AUTHOR: Aaron D. Gifford <[email protected]>
  4. *
  5. * Copyright (c) 2000-2001, Aaron D. Gifford
  6. * All rights reserved.
  7. *
  8. * Redistribution and use in source and binary forms, with or without
  9. * modification, are permitted provided that the following conditions
  10. * are met:
  11. * 1. Redistributions of source code must retain the above copyright
  12. * notice, this list of conditions and the following disclaimer.
  13. * 2. Redistributions in binary form must reproduce the above copyright
  14. * notice, this list of conditions and the following disclaimer in the
  15. * documentation and/or other materials provided with the distribution.
  16. * 3. Neither the name of the copyright holder nor the names of contributors
  17. * may be used to endorse or promote products derived from this software
  18. * without specific prior written permission.
  19. *
  20. * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTOR(S) ``AS IS'' AND
  21. * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  22. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  23. * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTOR(S) BE LIABLE
  24. * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  25. * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  26. * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  27. * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  28. * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  29. * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  30. * SUCH DAMAGE.
  31. *
  32. */
  33. #ifndef __SHA2_H__
  34. #define __SHA2_H__
  35. #ifdef __cplusplus
  36. extern "C" {
  37. #endif
  38. // Brandon: Added to cover Windows lack of these types
  39. #if defined (_WIN64) || (_WIN32)
  40. #define BYTE_ORDER LITTLE_ENDIAN
  41. typedef unsigned __int8 u_int8_t;
  42. typedef unsigned __int32 u_int32_t;
  43. typedef unsigned __int64 u_int64_t;
  44. #include <string.h>
  45. #endif
  46. /*
  47. * Import u_intXX_t size_t type definitions from system headers. You
  48. * may need to change this, or define these things yourself in this
  49. * file.
  50. */
  51. #include <sys/types.h>
  52. #ifdef SHA2_USE_INTTYPES_H
  53. #include <inttypes.h>
  54. #endif /* SHA2_USE_INTTYPES_H */
  55. /*** SHA-256/384/512 Various Length Definitions ***********************/
  56. #define SHA256_BLOCK_LENGTH 64
  57. #define SHA256_DIGEST_LENGTH 32
  58. #define SHA256_DIGEST_STRING_LENGTH (SHA256_DIGEST_LENGTH * 2 + 1)
  59. #define SHA384_BLOCK_LENGTH 128
  60. #define SHA384_DIGEST_LENGTH 48
  61. #define SHA384_DIGEST_STRING_LENGTH (SHA384_DIGEST_LENGTH * 2 + 1)
  62. #define SHA512_BLOCK_LENGTH 128
  63. #define SHA512_DIGEST_LENGTH 64
  64. #define SHA512_DIGEST_STRING_LENGTH (SHA512_DIGEST_LENGTH * 2 + 1)
  65. /*** SHA-256/384/512 Context Structures *******************************/
  66. /* NOTE: If your architecture does not define either u_intXX_t types or
  67. * uintXX_t (from inttypes.h), you may need to define things by hand
  68. * for your system:
  69. */
  70. #if 0
  71. typedef unsigned char u_int8_t; /* 1-byte (8-bits) */
  72. typedef unsigned int u_int32_t; /* 4-bytes (32-bits) */
  73. typedef unsigned long long u_int64_t; /* 8-bytes (64-bits) */
  74. #endif
  75. /*
  76. * Most BSD systems already define u_intXX_t types, as does Linux.
  77. * Some systems, however, like Compaq's Tru64 Unix instead can use
  78. * uintXX_t types defined by very recent ANSI C standards and included
  79. * in the file:
  80. *
  81. * #include <inttypes.h>
  82. *
  83. * If you choose to use <inttypes.h> then please define:
  84. *
  85. * #define SHA2_USE_INTTYPES_H
  86. *
  87. * Or on the command line during compile:
  88. *
  89. * cc -DSHA2_USE_INTTYPES_H ...
  90. */
  91. #ifdef SHA2_USE_INTTYPES_H
  92. typedef struct _SHA256_CTX {
  93. uint32_t state[8];
  94. uint64_t bitcount;
  95. uint8_t buffer[SHA256_BLOCK_LENGTH];
  96. } SHA256_CTX;
  97. typedef struct _SHA512_CTX {
  98. uint64_t state[8];
  99. uint64_t bitcount[2];
  100. uint8_t buffer[SHA512_BLOCK_LENGTH];
  101. } SHA512_CTX;
  102. #else /* SHA2_USE_INTTYPES_H */
  103. typedef struct _SHA256_CTX {
  104. u_int32_t state[8];
  105. u_int64_t bitcount;
  106. u_int8_t buffer[SHA256_BLOCK_LENGTH];
  107. } SHA256_CTX;
  108. typedef struct _SHA512_CTX {
  109. u_int64_t state[8];
  110. u_int64_t bitcount[2];
  111. u_int8_t buffer[SHA512_BLOCK_LENGTH];
  112. } SHA512_CTX;
  113. #endif /* SHA2_USE_INTTYPES_H */
  114. typedef SHA512_CTX SHA384_CTX;
  115. /*** SHA-256/384/512 Function Prototypes ******************************/
  116. #ifndef NOPROTO
  117. #ifdef SHA2_USE_INTTYPES_H
  118. void SHA256_Init(SHA256_CTX *);
  119. void SHA256_Update(SHA256_CTX*, const uint8_t*, size_t);
  120. void SHA256_Final(uint8_t[SHA256_DIGEST_LENGTH], SHA256_CTX*);
  121. char* SHA256_End(SHA256_CTX*, char[SHA256_DIGEST_STRING_LENGTH]);
  122. char* SHA256_Data(const uint8_t*, size_t, char[SHA256_DIGEST_STRING_LENGTH]);
  123. void SHA384_Init(SHA384_CTX*);
  124. void SHA384_Update(SHA384_CTX*, const uint8_t*, size_t);
  125. void SHA384_Final(uint8_t[SHA384_DIGEST_LENGTH], SHA384_CTX*);
  126. char* SHA384_End(SHA384_CTX*, char[SHA384_DIGEST_STRING_LENGTH]);
  127. char* SHA384_Data(const uint8_t*, size_t, char[SHA384_DIGEST_STRING_LENGTH]);
  128. void SHA512_Init(SHA512_CTX*);
  129. void SHA512_Update(SHA512_CTX*, const uint8_t*, size_t);
  130. void SHA512_Final(uint8_t[SHA512_DIGEST_LENGTH], SHA512_CTX*);
  131. char* SHA512_End(SHA512_CTX*, char[SHA512_DIGEST_STRING_LENGTH]);
  132. char* SHA512_Data(const uint8_t*, size_t, char[SHA512_DIGEST_STRING_LENGTH]);
  133. #else /* SHA2_USE_INTTYPES_H */
  134. void SHA256_Init(SHA256_CTX *);
  135. void SHA256_Update(SHA256_CTX*, const u_int8_t*, size_t);
  136. void SHA256_Final(u_int8_t[SHA256_DIGEST_LENGTH], SHA256_CTX*);
  137. char* SHA256_End(SHA256_CTX*, char[SHA256_DIGEST_STRING_LENGTH]);
  138. char* SHA256_Data(const u_int8_t*, size_t, char[SHA256_DIGEST_STRING_LENGTH]);
  139. void SHA384_Init(SHA384_CTX*);
  140. void SHA384_Update(SHA384_CTX*, const u_int8_t*, size_t);
  141. void SHA384_Final(u_int8_t[SHA384_DIGEST_LENGTH], SHA384_CTX*);
  142. char* SHA384_End(SHA384_CTX*, char[SHA384_DIGEST_STRING_LENGTH]);
  143. char* SHA384_Data(const u_int8_t*, size_t, char[SHA384_DIGEST_STRING_LENGTH]);
  144. void SHA512_Init(SHA512_CTX*);
  145. void SHA512_Update(SHA512_CTX*, const u_int8_t*, size_t);
  146. void SHA512_Final(u_int8_t[SHA512_DIGEST_LENGTH], SHA512_CTX*);
  147. char* SHA512_End(SHA512_CTX*, char[SHA512_DIGEST_STRING_LENGTH]);
  148. char* SHA512_Data(const u_int8_t*, size_t, char[SHA512_DIGEST_STRING_LENGTH]);
  149. #endif /* SHA2_USE_INTTYPES_H */
  150. #else /* NOPROTO */
  151. void SHA256_Init();
  152. void SHA256_Update();
  153. void SHA256_Final();
  154. char* SHA256_End();
  155. char* SHA256_Data();
  156. void SHA384_Init();
  157. void SHA384_Update();
  158. void SHA384_Final();
  159. char* SHA384_End();
  160. char* SHA384_Data();
  161. void SHA512_Init();
  162. void SHA512_Update();
  163. void SHA512_Final();
  164. char* SHA512_End();
  165. char* SHA512_Data();
  166. #endif /* NOPROTO */
  167. #ifdef __cplusplus
  168. }
  169. #endif /* __cplusplus */
  170. #endif /* __SHA2_H__ */