2 * Copyright 2019-2020 The OpenSSL Project Authors. All Rights Reserved.
4 * Licensed under the Apache License 2.0 (the "License"). You may not use
5 * this file except in compliance with the License. You can obtain a copy
6 * in the file LICENSE in the source distribution or at
7 * https://www.openssl.org/source/license.html
11 * All SHA low level APIs are deprecated for public use, but still ok for
14 #include "internal/deprecated.h"
16 #include <openssl/sha.h> /* diverse SHA macros */
17 #include "internal/sha3.h" /* KECCAK1600_WIDTH */
18 #include "crypto/evp.h"
19 /* Used by legacy methods */
20 #include "crypto/sha.h"
21 #include "legacy_meth.h"
22 #include "evp_local.h"
25 * LEGACY methods for SHA.
26 * These only remain to support engines that can get these methods.
27 * Hardware support for SHA3 has been removed from these legacy cases.
29 #define IMPLEMENT_LEGACY_EVP_MD_METH_SHA3(nm, fn, tag) \
30 static int nm##_init(EVP_MD_CTX *ctx) \
32 return fn##_init(EVP_MD_CTX_md_data(ctx), tag, ctx->digest->md_size * 8); \
34 static int nm##_update(EVP_MD_CTX *ctx, const void *data, size_t count) \
36 return fn##_update(EVP_MD_CTX_md_data(ctx), data, count); \
38 static int nm##_final(EVP_MD_CTX *ctx, unsigned char *md) \
40 return fn##_final(md, EVP_MD_CTX_md_data(ctx)); \
42 #define IMPLEMENT_LEGACY_EVP_MD_METH_SHAKE(nm, fn, tag) \
43 static int nm##_init(EVP_MD_CTX *ctx) \
45 return fn##_init(EVP_MD_CTX_md_data(ctx), tag, ctx->digest->md_size * 8); \
48 #define sha512_224_Init sha512_224_init
49 #define sha512_256_Init sha512_256_init
51 #define sha512_224_Update SHA512_Update
52 #define sha512_224_Final SHA512_Final
53 #define sha512_256_Update SHA512_Update
54 #define sha512_256_Final SHA512_Final
56 IMPLEMENT_LEGACY_EVP_MD_METH(sha1
, SHA1
)
57 IMPLEMENT_LEGACY_EVP_MD_METH(sha224
, SHA224
)
58 IMPLEMENT_LEGACY_EVP_MD_METH(sha256
, SHA256
)
59 IMPLEMENT_LEGACY_EVP_MD_METH(sha384
, SHA384
)
60 IMPLEMENT_LEGACY_EVP_MD_METH(sha512
, SHA512
)
61 IMPLEMENT_LEGACY_EVP_MD_METH(sha512_224_int
, sha512_224
)
62 IMPLEMENT_LEGACY_EVP_MD_METH(sha512_256_int
, sha512_256
)
63 IMPLEMENT_LEGACY_EVP_MD_METH_SHA3(sha3_int
, sha3
, '\x06')
64 IMPLEMENT_LEGACY_EVP_MD_METH_SHAKE(shake
, sha3
, '\x1f')
66 static int sha1_int_ctrl(EVP_MD_CTX
*ctx
, int cmd
, int p1
, void *p2
)
68 return sha1_ctrl(ctx
!= NULL
? EVP_MD_CTX_md_data(ctx
) : NULL
, cmd
, p1
, p2
);
71 static int shake_ctrl(EVP_MD_CTX
*evp_ctx
, int cmd
, int p1
, void *p2
)
73 KECCAK1600_CTX
*ctx
= evp_ctx
->md_data
;
76 case EVP_MD_CTRL_XOF_LEN
:
86 static const EVP_MD sha1_md
= {
88 NID_sha1WithRSAEncryption
,
90 EVP_MD_FLAG_DIGALGID_ABSENT
,
91 LEGACY_EVP_MD_METH_TABLE(sha1_init
, sha1_update
, sha1_final
, sha1_int_ctrl
,
95 const EVP_MD
*EVP_sha1(void)
100 static const EVP_MD sha224_md
= {
102 NID_sha224WithRSAEncryption
,
103 SHA224_DIGEST_LENGTH
,
104 EVP_MD_FLAG_DIGALGID_ABSENT
,
105 LEGACY_EVP_MD_METH_TABLE(sha224_init
, sha224_update
, sha224_final
, NULL
,
109 const EVP_MD
*EVP_sha224(void)
114 static const EVP_MD sha256_md
= {
116 NID_sha256WithRSAEncryption
,
117 SHA256_DIGEST_LENGTH
,
118 EVP_MD_FLAG_DIGALGID_ABSENT
,
119 LEGACY_EVP_MD_METH_TABLE(sha256_init
, sha256_update
, sha256_final
, NULL
,
123 const EVP_MD
*EVP_sha256(void)
128 static const EVP_MD sha512_224_md
= {
130 NID_sha512_224WithRSAEncryption
,
131 SHA224_DIGEST_LENGTH
,
132 EVP_MD_FLAG_DIGALGID_ABSENT
,
133 LEGACY_EVP_MD_METH_TABLE(sha512_224_int_init
, sha512_224_int_update
,
134 sha512_224_int_final
, NULL
, SHA512_CBLOCK
),
137 const EVP_MD
*EVP_sha512_224(void)
139 return &sha512_224_md
;
142 static const EVP_MD sha512_256_md
= {
144 NID_sha512_256WithRSAEncryption
,
145 SHA256_DIGEST_LENGTH
,
146 EVP_MD_FLAG_DIGALGID_ABSENT
,
147 LEGACY_EVP_MD_METH_TABLE(sha512_256_int_init
, sha512_256_int_update
,
148 sha512_256_int_final
, NULL
, SHA512_CBLOCK
),
151 const EVP_MD
*EVP_sha512_256(void)
153 return &sha512_256_md
;
156 static const EVP_MD sha384_md
= {
158 NID_sha384WithRSAEncryption
,
159 SHA384_DIGEST_LENGTH
,
160 EVP_MD_FLAG_DIGALGID_ABSENT
,
161 LEGACY_EVP_MD_METH_TABLE(sha384_init
, sha384_update
, sha384_final
, NULL
,
165 const EVP_MD
*EVP_sha384(void)
170 static const EVP_MD sha512_md
= {
172 NID_sha512WithRSAEncryption
,
173 SHA512_DIGEST_LENGTH
,
174 EVP_MD_FLAG_DIGALGID_ABSENT
,
175 LEGACY_EVP_MD_METH_TABLE(sha512_init
, sha512_update
, sha512_final
, NULL
,
179 const EVP_MD
*EVP_sha512(void)
184 #define EVP_MD_SHA3(bitlen) \
185 const EVP_MD *EVP_sha3_##bitlen(void) \
187 static const EVP_MD sha3_##bitlen##_md = { \
189 NID_RSA_SHA3_##bitlen, \
191 EVP_MD_FLAG_DIGALGID_ABSENT, \
192 LEGACY_EVP_MD_METH_TABLE(sha3_int_init, sha3_int_update, \
193 sha3_int_final, NULL, \
194 (KECCAK1600_WIDTH - bitlen * 2) / 8), \
196 return &sha3_##bitlen##_md; \
198 #define EVP_MD_SHAKE(bitlen) \
199 const EVP_MD *EVP_shake##bitlen(void) \
201 static const EVP_MD shake##bitlen##_md = { \
206 LEGACY_EVP_MD_METH_TABLE(shake_init, sha3_int_update, sha3_int_final, \
207 shake_ctrl, (KECCAK1600_WIDTH - bitlen * 2) / 8), \
209 return &shake##bitlen##_md; \