sha.h
1 /* sha.h
2  *
3  * Copyright (C) 2006-2020 wolfSSL Inc.
4  *
5  * This file is part of wolfSSL.
6  *
7  * wolfSSL is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * wolfSSL is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
20  */
21 
22 /* sha.h for openssl */
23 
24 
25 #ifndef WOLFSSL_SHA_H_
26 #define WOLFSSL_SHA_H_
27 
28 #include <wolfssl/wolfcrypt/settings.h>
30 
31 #ifdef WOLFSSL_PREFIX
32 #include "prefix_sha.h"
33 #endif
34 
35 #ifdef __cplusplus
36  extern "C" {
37 #endif
38 
39 
40 typedef struct WOLFSSL_SHA_CTX {
41  /* big enough to hold wolfcrypt Sha, but check on init */
42 #if defined(STM32_HASH)
43  void* holder[(112 + WC_ASYNC_DEV_SIZE + sizeof(STM32_HASH_Context)) / sizeof(void*)];
44 #else
45  void* holder[(112 + WC_ASYNC_DEV_SIZE) / sizeof(void*)];
46 #endif
47  #ifdef WOLF_CRYPTO_CB
48  void* cryptocb_holder[(sizeof(int) + sizeof(void*) + 4) / sizeof(void*)];
49  #endif
50 } WOLFSSL_SHA_CTX;
51 
52 WOLFSSL_API int wolfSSL_SHA_Init(WOLFSSL_SHA_CTX*);
53 WOLFSSL_API int wolfSSL_SHA_Update(WOLFSSL_SHA_CTX*, const void*, unsigned long);
54 WOLFSSL_API int wolfSSL_SHA_Final(unsigned char*, WOLFSSL_SHA_CTX*);
55 
56 /* SHA1 points to above, shouldn't use SHA0 ever */
57 WOLFSSL_API int wolfSSL_SHA1_Init(WOLFSSL_SHA_CTX*);
58 WOLFSSL_API int wolfSSL_SHA1_Update(WOLFSSL_SHA_CTX*, const void*, unsigned long);
59 WOLFSSL_API int wolfSSL_SHA1_Final(unsigned char*, WOLFSSL_SHA_CTX*);
60 
61 enum {
62  SHA_DIGEST_LENGTH = 20
63 };
64 
65 
66 typedef WOLFSSL_SHA_CTX SHA_CTX;
67 
68 #define SHA_Init wolfSSL_SHA_Init
69 #define SHA_Update wolfSSL_SHA_Update
70 #define SHA_Final wolfSSL_SHA_Final
71 
72 #define SHA1_Init wolfSSL_SHA1_Init
73 #define SHA1_Update wolfSSL_SHA1_Update
74 #define SHA1_Final wolfSSL_SHA1_Final
75 
76 
77 #ifdef WOLFSSL_SHA224
78 
79 /* Using ALIGN16 because when AES-NI is enabled digest and buffer in Sha256
80  * struct are 16 byte aligned. Any dereference to those elements after casting
81  * to Sha224, is expected to also be 16 byte aligned addresses. */
82 typedef struct WOLFSSL_SHA224_CTX {
83  /* big enough to hold wolfcrypt Sha224, but check on init */
84  ALIGN16 void* holder[(272 + WC_ASYNC_DEV_SIZE) / sizeof(void*)];
86 
87 WOLFSSL_API int wolfSSL_SHA224_Init(WOLFSSL_SHA224_CTX*);
88 WOLFSSL_API int wolfSSL_SHA224_Update(WOLFSSL_SHA224_CTX*, const void*,
89  unsigned long);
90 WOLFSSL_API int wolfSSL_SHA224_Final(unsigned char*, WOLFSSL_SHA224_CTX*);
91 
92 enum {
93  SHA224_DIGEST_LENGTH = 28
94 };
95 
96 
98 
99 #define SHA224_Init wolfSSL_SHA224_Init
100 #define SHA224_Update wolfSSL_SHA224_Update
101 #define SHA224_Final wolfSSL_SHA224_Final
102 
103 #endif /* WOLFSSL_SHA224 */
104 
105 
106 /* Using ALIGN16 because when AES-NI is enabled digest and buffer in Sha256
107  * struct are 16 byte aligned. Any dereference to those elements after casting
108  * to Sha256, is expected to also be 16 byte aligned addresses. */
109 typedef struct WOLFSSL_SHA256_CTX {
110  /* big enough to hold wolfcrypt Sha256, but check on init */
111  ALIGN16 void* holder[(272 + WC_ASYNC_DEV_SIZE) / sizeof(void*)];
113 
114 WOLFSSL_API int wolfSSL_SHA256_Init(WOLFSSL_SHA256_CTX*);
115 WOLFSSL_API int wolfSSL_SHA256_Update(WOLFSSL_SHA256_CTX*, const void*,
116  unsigned long);
117 WOLFSSL_API int wolfSSL_SHA256_Final(unsigned char*, WOLFSSL_SHA256_CTX*);
118 
119 enum {
120  SHA256_DIGEST_LENGTH = 32
121 };
122 
123 
125 
126 #define SHA256_Init wolfSSL_SHA256_Init
127 #define SHA256_Update wolfSSL_SHA256_Update
128 #define SHA256_Final wolfSSL_SHA256_Final
129 #if defined(NO_OLD_SHA_NAMES) && !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
130  /* SHA256 is only available in non-fips mode because of SHA256 enum in FIPS
131  * build. */
132  #define SHA256 wolfSSL_SHA256
133 #endif
134 
135 
136 #ifdef WOLFSSL_SHA384
137 
138 typedef struct WOLFSSL_SHA384_CTX {
139  /* big enough to hold wolfCrypt Sha384, but check on init */
140  void* holder[(256 + WC_ASYNC_DEV_SIZE) / sizeof(void*)];
142 
143 WOLFSSL_API int wolfSSL_SHA384_Init(WOLFSSL_SHA384_CTX*);
144 WOLFSSL_API int wolfSSL_SHA384_Update(WOLFSSL_SHA384_CTX*, const void*,
145  unsigned long);
146 WOLFSSL_API int wolfSSL_SHA384_Final(unsigned char*, WOLFSSL_SHA384_CTX*);
147 
148 enum {
149  SHA384_DIGEST_LENGTH = 48
150 };
151 
152 
154 
155 #define SHA384_Init wolfSSL_SHA384_Init
156 #define SHA384_Update wolfSSL_SHA384_Update
157 #define SHA384_Final wolfSSL_SHA384_Final
158 #if defined(NO_OLD_SHA_NAMES) && !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
159  /* SHA384 is only available in non-fips mode because of SHA384 enum in FIPS
160  * build. */
161  #define SHA384 wolfSSL_SHA384
162 #endif
163 #endif /* WOLFSSL_SHA384 */
164 
165 #ifdef WOLFSSL_SHA512
166 
167 typedef struct WOLFSSL_SHA512_CTX {
168  /* big enough to hold wolfCrypt Sha384, but check on init */
169  void* holder[(288 + WC_ASYNC_DEV_SIZE) / sizeof(void*)];
171 
172 WOLFSSL_API int wolfSSL_SHA512_Init(WOLFSSL_SHA512_CTX*);
173 WOLFSSL_API int wolfSSL_SHA512_Update(WOLFSSL_SHA512_CTX*, const void*,
174  unsigned long);
175 WOLFSSL_API int wolfSSL_SHA512_Final(unsigned char*, WOLFSSL_SHA512_CTX*);
176 
177 enum {
178  SHA512_DIGEST_LENGTH = 64
179 };
180 
181 
183 
184 #define SHA512_Init wolfSSL_SHA512_Init
185 #define SHA512_Update wolfSSL_SHA512_Update
186 #define SHA512_Final wolfSSL_SHA512_Final
187 #if defined(NO_OLD_SHA_NAMES) && !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
188  /* SHA512 is only available in non-fips mode because of SHA512 enum in FIPS
189  * build. */
190  #define SHA512 wolfSSL_SHA512
191 #endif
192 #endif /* WOLFSSL_SHA512 */
193 
194 
195 
196 
197 #ifdef __cplusplus
198  } /* extern "C" */
199 #endif
200 
201 
202 #endif /* WOLFSSL_SHA_H_ */
203 
Definition: stm32.h:67
Definition: sha.h:167
Definition: sha.h:82
Definition: sha.h:109
Definition: sha.h:138