60 #include "../internal.h"
62 #include "../fipsmodule/cipher/internal.h"
67 size_t block_size,
size_t mac_size) {
68 const size_t overhead = 1 + mac_size;
75 size_t padding_length =
in[in_len - 1];
87 size_t to_check = 256;
88 if (to_check > in_len) {
92 for (
size_t i = 0;
i < to_check;
i++) {
97 good &= ~(mask & (padding_length ^
b));
108 padding_length = good & (padding_length + 1);
109 *out_len = in_len - padding_length;
110 *out_padding_ok = good;
115 size_t in_len,
size_t orig_len) {
117 uint8_t *rotated_mac = rotated_mac1;
118 uint8_t *rotated_mac_tmp = rotated_mac2;
121 size_t mac_end = in_len;
122 size_t mac_start = mac_end - md_size;
124 assert(orig_len >= in_len);
125 assert(in_len >= md_size);
131 size_t scan_start = 0;
133 if (orig_len > md_size + 255 + 1) {
134 scan_start = orig_len - (md_size + 255 + 1);
137 size_t rotate_offset = 0;
140 for (
size_t i = scan_start, j = 0;
i < orig_len;
i++, j++) {
145 mac_started |= is_mac_start;
147 rotated_mac[j] |=
in[
i] & mac_started & ~mac_ended;
149 rotate_offset |= j & is_mac_start;
157 const uint8_t skip_rotate = (rotate_offset & 1) - 1;
158 for (
size_t i = 0, j =
offset;
i < md_size;
i++, j++) {
170 rotated_mac = rotated_mac_tmp;
171 rotated_mac_tmp =
tmp;
184 size_t max_len_bits = max_len << 3;
186 (max_len_bits >> 3) != max_len ||
187 ctx->Nl + max_len_bits < max_len_bits ||
200 size_t last_block = num_blocks - 1;
201 size_t max_blocks = (
ctx->num + max_len + 1 + 8 +
SHA_CBLOCK - 1) >> 6;
204 size_t total_bits =
ctx->Nl + (
len << 3);
206 length_bytes[0] = (
uint8_t)(total_bits >> 24);
207 length_bytes[1] = (
uint8_t)(total_bits >> 16);
208 length_bytes[2] = (
uint8_t)(total_bits >> 8);
209 length_bytes[3] = (
uint8_t)total_bits;
217 size_t input_idx = 0;
218 for (
size_t i = 0;
i < max_blocks;
i++) {
221 size_t block_start = 0;
224 block_start =
ctx->num;
226 if (input_idx < max_len) {
228 if (to_copy > max_len - input_idx) {
229 to_copy = max_len - input_idx;
235 for (
size_t j = block_start; j <
SHA_CBLOCK; j++) {
237 size_t idx = input_idx + j - block_start;
244 block[j] &= is_in_bounds;
245 block[j] |= 0x80 & is_padding_byte;
252 for (
size_t j = 0; j < 4; j++) {
258 for (
size_t j = 0; j < 5; j++) {
264 for (
size_t i = 0;
i < 5;
i++) {
277 size_t data_plus_mac_plus_padding_size,
279 unsigned mac_secret_length) {
310 size_t min_data_size = 0;
322 &
ctx, mac_out,
data + min_data_size, data_size - min_data_size,
323 data_plus_mac_plus_padding_size - min_data_size)) {