Skip to content

Commit 83fb50c

Browse files
committed
[NUC472/M487] Fix SHA H/W is not stopped in corner case
Take SHA1 for example, without the fix, SHA H/W is not stopped in either case: (1) ctx->total == 0 in mbedtls_sha1_hw_finish() (2) mbedtls_sha1_hw_finish() is not called by upper layer
1 parent a0a8a95 commit 83fb50c

File tree

2 files changed

+20
-10
lines changed

2 files changed

+20
-10
lines changed

features/mbedtls/targets/TARGET_NUVOTON/TARGET_M480/sha/sha_alt_hw.c

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@ void mbedtls_sha1_hw_free(crypto_sha_context *ctx)
5050
return;
5151
}
5252

53+
CRPT->HMAC_CTL |= CRPT_HMAC_CTL_STOP_Msk;
54+
5355
/* Uninit crypto module */
5456
crypto_uninit();
5557
crypto_zeroize(ctx, sizeof(crypto_sha_context));
@@ -91,8 +93,6 @@ void mbedtls_sha1_hw_finish(crypto_sha_context *ctx, unsigned char output[20])
9193
crypto_sha_update_nobuf(ctx, ctx->buffer, ctx->buffer_left, 1);
9294
ctx->buffer_left = 0;
9395
crypto_sha_getinternstate(output, 20);
94-
95-
CRPT->HMAC_CTL |= CRPT_HMAC_CTL_STOP_Msk;
9696
} else {
9797
mbedtls_sha1_sw_context ctx_sw;
9898

@@ -101,6 +101,8 @@ void mbedtls_sha1_hw_finish(crypto_sha_context *ctx, unsigned char output[20])
101101
mbedtls_sha1_sw_finish(&ctx_sw, output);
102102
mbedtls_sha1_sw_free(&ctx_sw);
103103
}
104+
105+
CRPT->HMAC_CTL |= CRPT_HMAC_CTL_STOP_Msk;
104106
}
105107

106108
void mbedtls_sha1_hw_process(crypto_sha_context *ctx, const unsigned char data[64])
@@ -127,6 +129,8 @@ void mbedtls_sha256_hw_free(crypto_sha_context *ctx)
127129
return;
128130
}
129131

132+
CRPT->HMAC_CTL |= CRPT_HMAC_CTL_STOP_Msk;
133+
130134
/* Uninit crypto module */
131135
crypto_uninit();
132136
crypto_zeroize(ctx, sizeof(crypto_sha_context));
@@ -169,8 +173,6 @@ void mbedtls_sha256_hw_finish(crypto_sha_context *ctx, unsigned char output[32])
169173
crypto_sha_update_nobuf(ctx, ctx->buffer, ctx->buffer_left, 1);
170174
ctx->buffer_left = 0;
171175
crypto_sha_getinternstate(output, ctx->is224_384 ? 28 : 32);
172-
173-
CRPT->HMAC_CTL |= CRPT_HMAC_CTL_STOP_Msk;
174176
} else {
175177
mbedtls_sha256_sw_context ctx_sw;
176178

@@ -179,6 +181,8 @@ void mbedtls_sha256_hw_finish(crypto_sha_context *ctx, unsigned char output[32])
179181
mbedtls_sha256_sw_finish(&ctx_sw, output);
180182
mbedtls_sha256_sw_free(&ctx_sw);
181183
}
184+
185+
CRPT->HMAC_CTL |= CRPT_HMAC_CTL_STOP_Msk;
182186
}
183187

184188
void mbedtls_sha256_hw_process(crypto_sha_context *ctx, const unsigned char data[64])
@@ -206,6 +210,8 @@ void mbedtls_sha512_hw_free(crypto_sha_context *ctx)
206210
return;
207211
}
208212

213+
CRPT->HMAC_CTL |= CRPT_HMAC_CTL_STOP_Msk;
214+
209215
/* Uninit crypto module */
210216
crypto_uninit();
211217
crypto_zeroize(ctx, sizeof(crypto_sha_context));
@@ -248,8 +254,6 @@ void mbedtls_sha512_hw_finish(crypto_sha_context *ctx, unsigned char output[64])
248254
crypto_sha_update_nobuf(ctx, ctx->buffer, ctx->buffer_left, 1);
249255
ctx->buffer_left = 0;
250256
crypto_sha_getinternstate(output, ctx->is224_384 ? 48 : 64);
251-
252-
CRPT->HMAC_CTL |= CRPT_HMAC_CTL_STOP_Msk;
253257
} else {
254258
mbedtls_sha512_sw_context ctx_sw;
255259

@@ -258,6 +262,8 @@ void mbedtls_sha512_hw_finish(crypto_sha_context *ctx, unsigned char output[64])
258262
mbedtls_sha512_sw_finish(&ctx_sw, output);
259263
mbedtls_sha512_sw_free(&ctx_sw);
260264
}
265+
266+
CRPT->HMAC_CTL |= CRPT_HMAC_CTL_STOP_Msk;
261267
}
262268

263269
void mbedtls_sha512_hw_process(crypto_sha_context *ctx, const unsigned char data[128])

features/mbedtls/targets/TARGET_NUVOTON/TARGET_NUC472/sha/sha_alt_hw.c

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@ void mbedtls_sha1_hw_free(crypto_sha_context *ctx)
5050
return;
5151
}
5252

53+
CRPT->SHA_CTL |= CRPT_SHA_CTL_STOP_Msk;
54+
5355
/* Uninit crypto module */
5456
crypto_uninit();
5557
crypto_zeroize(ctx, sizeof(crypto_sha_context));
@@ -91,8 +93,6 @@ void mbedtls_sha1_hw_finish(crypto_sha_context *ctx, unsigned char output[20])
9193
crypto_sha_update_nobuf(ctx, ctx->buffer, ctx->buffer_left, 1);
9294
ctx->buffer_left = 0;
9395
crypto_sha_getinternstate(output, 20);
94-
95-
CRPT->SHA_CTL |= CRPT_SHA_CTL_STOP_Msk;
9696
} else {
9797
mbedtls_sha1_sw_context ctx_sw;
9898

@@ -101,6 +101,8 @@ void mbedtls_sha1_hw_finish(crypto_sha_context *ctx, unsigned char output[20])
101101
mbedtls_sha1_sw_finish(&ctx_sw, output);
102102
mbedtls_sha1_sw_free(&ctx_sw);
103103
}
104+
105+
CRPT->SHA_CTL |= CRPT_SHA_CTL_STOP_Msk;
104106
}
105107

106108
void mbedtls_sha1_hw_process(crypto_sha_context *ctx, const unsigned char data[64])
@@ -127,6 +129,8 @@ void mbedtls_sha256_hw_free(crypto_sha_context *ctx)
127129
return;
128130
}
129131

132+
CRPT->SHA_CTL |= CRPT_SHA_CTL_STOP_Msk;
133+
130134
/* Uninit crypto module */
131135
crypto_uninit();
132136
crypto_zeroize(ctx, sizeof(crypto_sha_context));
@@ -169,8 +173,6 @@ void mbedtls_sha256_hw_finish(crypto_sha_context *ctx, unsigned char output[32])
169173
crypto_sha_update_nobuf(ctx, ctx->buffer, ctx->buffer_left, 1);
170174
ctx->buffer_left = 0;
171175
crypto_sha_getinternstate(output, ctx->is224 ? 28 : 32);
172-
173-
CRPT->SHA_CTL |= CRPT_SHA_CTL_STOP_Msk;
174176
} else {
175177
mbedtls_sha256_sw_context ctx_sw;
176178

@@ -179,6 +181,8 @@ void mbedtls_sha256_hw_finish(crypto_sha_context *ctx, unsigned char output[32])
179181
mbedtls_sha256_sw_finish(&ctx_sw, output);
180182
mbedtls_sha256_sw_free(&ctx_sw);
181183
}
184+
185+
CRPT->SHA_CTL |= CRPT_SHA_CTL_STOP_Msk;
182186
}
183187

184188
void mbedtls_sha256_hw_process(crypto_sha_context *ctx, const unsigned char data[64])

0 commit comments

Comments
 (0)