sha256.h 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. /*
  2. * FILE: sha256.h
  3. * AUTHOR: Aaron D. Gifford - http://www.aarongifford.com/
  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. * $Id: sha2.h,v 1.1 2001/11/08 00:02:01 adg Exp adg $
  33. */
  34. #ifndef __SHA2_H__
  35. #define __SHA2_H__
  36. #ifdef __cplusplus
  37. extern "C" {
  38. #endif
  39. /*
  40. * Import u_intXX_t size_t type definitions from system headers. You
  41. * may need to change this, or define these things yourself in this
  42. * file.
  43. */
  44. #include <sys/types.h>
  45. #ifdef SHA2_USE_INTTYPES_H
  46. #include <inttypes.h>
  47. #endif /* SHA2_USE_INTTYPES_H */
  48. /* fix types for Sun Solaris */
  49. #if defined(__SVR4) || defined(__sun)
  50. typedef uint8_t u_int8_t;
  51. typedef uint32_t u_int32_t;
  52. typedef uint64_t u_int64_t;
  53. #endif
  54. /*** SHA-256/384/512 Various Length Definitions ***********************/
  55. #define SHA256_BLOCK_LENGTH 64
  56. #define SHA256_DIGEST_LENGTH 32
  57. #define SHA256_DIGEST_STRING_LENGTH (SHA256_DIGEST_LENGTH * 2 + 1)
  58. #define SHA384_BLOCK_LENGTH 128
  59. #define SHA384_DIGEST_LENGTH 48
  60. #define SHA384_DIGEST_STRING_LENGTH (SHA384_DIGEST_LENGTH * 2 + 1)
  61. #define SHA512_BLOCK_LENGTH 128
  62. #define SHA512_DIGEST_LENGTH 64
  63. #define SHA512_DIGEST_STRING_LENGTH (SHA512_DIGEST_LENGTH * 2 + 1)
  64. /*** SHA-256/384/512 Context Structures *******************************/
  65. /* NOTE: If your architecture does not define either u_intXX_t types or
  66. * uintXX_t (from inttypes.h), you may need to define things by hand
  67. * for your system:
  68. */
  69. #if 0
  70. typedef unsigned char u_int8_t; /* 1-byte (8-bits) */
  71. typedef unsigned int u_int32_t; /* 4-bytes (32-bits) */
  72. typedef unsigned long long u_int64_t; /* 8-bytes (64-bits) */
  73. #endif
  74. /*
  75. * Most BSD systems already define u_intXX_t types, as does Linux.
  76. * Some systems, however, like Compaq's Tru64 Unix instead can use
  77. * uintXX_t types defined by very recent ANSI C standards and included
  78. * in the file:
  79. *
  80. * #include <inttypes.h>
  81. *
  82. * If you choose to use <inttypes.h> then please define:
  83. *
  84. * #define SHA2_USE_INTTYPES_H
  85. *
  86. * Or on the command line during compile:
  87. *
  88. * cc -DSHA2_USE_INTTYPES_H ...
  89. */
  90. #ifdef SHA2_USE_INTTYPES_H
  91. typedef struct _SHA256_CTX {
  92. uint32_t state[8];
  93. uint64_t bitcount;
  94. uint8_t buffer[SHA256_BLOCK_LENGTH];
  95. } SHA256_CTX;
  96. typedef struct _SHA512_CTX {
  97. uint64_t state[8];
  98. uint64_t bitcount[2];
  99. uint8_t buffer[SHA512_BLOCK_LENGTH];
  100. } SHA512_CTX;
  101. #else /* SHA2_USE_INTTYPES_H */
  102. typedef struct _SHA256_CTX {
  103. u_int32_t state[8];
  104. u_int64_t bitcount;
  105. u_int8_t buffer[SHA256_BLOCK_LENGTH];
  106. } SHA256_CTX;
  107. typedef struct _SHA512_CTX {
  108. u_int64_t state[8];
  109. u_int64_t bitcount[2];
  110. u_int8_t buffer[SHA512_BLOCK_LENGTH];
  111. } SHA512_CTX;
  112. #endif /* SHA2_USE_INTTYPES_H */
  113. typedef SHA512_CTX SHA384_CTX;
  114. /*** SHA-256/384/512 Function Prototypes ******************************/
  115. #ifndef NOPROTO
  116. #ifdef SHA2_USE_INTTYPES_H
  117. void SHA256_Init(SHA256_CTX *);
  118. void SHA256_Update(SHA256_CTX*, const uint8_t*, size_t);
  119. void SHA256_Final(uint8_t[SHA256_DIGEST_LENGTH], SHA256_CTX*);
  120. char* SHA256_End(SHA256_CTX*, char[SHA256_DIGEST_STRING_LENGTH]);
  121. char* SHA256_Data(const uint8_t*, size_t, char[SHA256_DIGEST_STRING_LENGTH]);
  122. void SHA384_Init(SHA384_CTX*);
  123. void SHA384_Update(SHA384_CTX*, const uint8_t*, size_t);
  124. void SHA384_Final(uint8_t[SHA384_DIGEST_LENGTH], SHA384_CTX*);
  125. char* SHA384_End(SHA384_CTX*, char[SHA384_DIGEST_STRING_LENGTH]);
  126. char* SHA384_Data(const uint8_t*, size_t, char[SHA384_DIGEST_STRING_LENGTH]);
  127. void SHA512_Init(SHA512_CTX*);
  128. void SHA512_Update(SHA512_CTX*, const uint8_t*, size_t);
  129. void SHA512_Final(uint8_t[SHA512_DIGEST_LENGTH], SHA512_CTX*);
  130. char* SHA512_End(SHA512_CTX*, char[SHA512_DIGEST_STRING_LENGTH]);
  131. char* SHA512_Data(const uint8_t*, size_t, char[SHA512_DIGEST_STRING_LENGTH]);
  132. #else /* SHA2_USE_INTTYPES_H */
  133. void SHA256_Init(SHA256_CTX *);
  134. void SHA256_Update(SHA256_CTX*, const u_int8_t*, size_t);
  135. void SHA256_Final(u_int8_t[SHA256_DIGEST_LENGTH], SHA256_CTX*);
  136. char* SHA256_End(SHA256_CTX*, char[SHA256_DIGEST_STRING_LENGTH]);
  137. char* SHA256_Data(const u_int8_t*, size_t, char[SHA256_DIGEST_STRING_LENGTH]);
  138. void SHA384_Init(SHA384_CTX*);
  139. void SHA384_Update(SHA384_CTX*, const u_int8_t*, size_t);
  140. void SHA384_Final(u_int8_t[SHA384_DIGEST_LENGTH], SHA384_CTX*);
  141. char* SHA384_End(SHA384_CTX*, char[SHA384_DIGEST_STRING_LENGTH]);
  142. char* SHA384_Data(const u_int8_t*, size_t, char[SHA384_DIGEST_STRING_LENGTH]);
  143. void SHA512_Init(SHA512_CTX*);
  144. void SHA512_Update(SHA512_CTX*, const u_int8_t*, size_t);
  145. void SHA512_Final(u_int8_t[SHA512_DIGEST_LENGTH], SHA512_CTX*);
  146. char* SHA512_End(SHA512_CTX*, char[SHA512_DIGEST_STRING_LENGTH]);
  147. char* SHA512_Data(const u_int8_t*, size_t, char[SHA512_DIGEST_STRING_LENGTH]);
  148. #endif /* SHA2_USE_INTTYPES_H */
  149. #else /* NOPROTO */
  150. void SHA256_Init();
  151. void SHA256_Update();
  152. void SHA256_Final();
  153. char* SHA256_End();
  154. char* SHA256_Data();
  155. void SHA384_Init();
  156. void SHA384_Update();
  157. void SHA384_Final();
  158. char* SHA384_End();
  159. char* SHA384_Data();
  160. void SHA512_Init();
  161. void SHA512_Update();
  162. void SHA512_Final();
  163. char* SHA512_End();
  164. char* SHA512_Data();
  165. #endif /* NOPROTO */
  166. #ifdef __cplusplus
  167. }
  168. #endif /* __cplusplus */
  169. #endif /* __SHA2_H__ */