mirror of
https://github.com/clearml/dropbear
synced 2025-01-31 10:57:01 +00:00
Constant time memcmp for the hmac and password crypt
This commit is contained in:
parent
69a165db86
commit
d1dec41f76
13
dbutil.c
13
dbutil.c
@ -884,3 +884,16 @@ int m_str_to_uint(const char* str, unsigned int *val) {
|
|||||||
return DROPBEAR_SUCCESS;
|
return DROPBEAR_SUCCESS;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int constant_time_memcmp(const void* a, const void *b, size_t n)
|
||||||
|
{
|
||||||
|
const char *xa = a, *xb = b;
|
||||||
|
uint8_t c = 0;
|
||||||
|
size_t i;
|
||||||
|
for (i = 0; i < n; i++)
|
||||||
|
{
|
||||||
|
c |= (xa[i] ^ xb[i]);
|
||||||
|
}
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
3
dbutil.h
3
dbutil.h
@ -94,4 +94,7 @@ int m_str_to_uint(const char* str, unsigned int *val);
|
|||||||
/* Dropbear assertion */
|
/* Dropbear assertion */
|
||||||
#define dropbear_assert(X) do { if (!(X)) { fail_assert(#X, __FILE__, __LINE__); } } while (0)
|
#define dropbear_assert(X) do { if (!(X)) { fail_assert(#X, __FILE__, __LINE__); } } while (0)
|
||||||
|
|
||||||
|
/* Returns 0 if a and b have the same contents */
|
||||||
|
int constant_time_memcmp(const void* a, const void *b, size_t n);
|
||||||
|
|
||||||
#endif /* _DBUTIL_H_ */
|
#endif /* _DBUTIL_H_ */
|
||||||
|
2
packet.c
2
packet.c
@ -376,7 +376,7 @@ static int checkmac() {
|
|||||||
|
|
||||||
/* compare the hash */
|
/* compare the hash */
|
||||||
buf_setpos(ses.readbuf, contents_len);
|
buf_setpos(ses.readbuf, contents_len);
|
||||||
if (memcmp(mac_bytes, buf_getptr(ses.readbuf, mac_size), mac_size) != 0) {
|
if (constant_time_memcmp(mac_bytes, buf_getptr(ses.readbuf, mac_size), mac_size) != 0) {
|
||||||
return DROPBEAR_FAILURE;
|
return DROPBEAR_FAILURE;
|
||||||
} else {
|
} else {
|
||||||
return DROPBEAR_SUCCESS;
|
return DROPBEAR_SUCCESS;
|
||||||
|
@ -33,6 +33,17 @@
|
|||||||
|
|
||||||
#ifdef ENABLE_SVR_PASSWORD_AUTH
|
#ifdef ENABLE_SVR_PASSWORD_AUTH
|
||||||
|
|
||||||
|
static int constant_time_strcmp(const char* a, const char* b) {
|
||||||
|
size_t la = strlen(a);
|
||||||
|
size_t lb = strlen(b);
|
||||||
|
|
||||||
|
if (la != lb) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return constant_time_memcmp(a, b, la);
|
||||||
|
}
|
||||||
|
|
||||||
/* Process a password auth request, sending success or failure messages as
|
/* Process a password auth request, sending success or failure messages as
|
||||||
* appropriate */
|
* appropriate */
|
||||||
void svr_auth_password() {
|
void svr_auth_password() {
|
||||||
@ -82,7 +93,7 @@ void svr_auth_password() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (strcmp(testcrypt, passwdcrypt) == 0) {
|
if (constant_time_strcmp(testcrypt, passwdcrypt) == 0) {
|
||||||
/* successful authentication */
|
/* successful authentication */
|
||||||
dropbear_log(LOG_NOTICE,
|
dropbear_log(LOG_NOTICE,
|
||||||
"Password auth succeeded for '%s' from %s",
|
"Password auth succeeded for '%s' from %s",
|
||||||
|
Loading…
Reference in New Issue
Block a user