sha256.h 6.3 KB

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