summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorjsing <>2025-01-19 07:51:41 +0000
committerjsing <>2025-01-19 07:51:41 +0000
commita2f6e4db5ee489ac3600ec5518e9914d017f85de (patch)
treeec020deb0d1f679179eab8c5f4643191d4e623cc /src
parent34423391bcc52ecedccc906e3945ef585e383920 (diff)
downloadopenbsd-a2f6e4db5ee489ac3600ec5518e9914d017f85de.tar.gz
openbsd-a2f6e4db5ee489ac3600ec5518e9914d017f85de.tar.bz2
openbsd-a2f6e4db5ee489ac3600ec5518e9914d017f85de.zip
Improve bit counter handling in MD5.
Like most hashes, MD5 needs to keep count of the number of bits in the message being processed. However, rather than using a 64 bit counter this is implemented using two 32 bit values (which is exposed in the public API). Even with this hurdle, we can still use 64 bit math and let the compiler figure out how to best handle the situation (hopefully avoiding compiler warnings on 16 bit platforms in the process!). On amd64 this code now requires two instructions, instead of the previous five. While here remove a comment that is excessively visible and no longer completely accurate (and if you're going to redefine types like MD5_WORD you kinda need to know what you're doing). ok tb@ (who's going to miss the dear diary style comments)
Diffstat (limited to 'src')
-rw-r--r--src/lib/libcrypto/crypto_internal.h12
-rw-r--r--src/lib/libcrypto/md5/md5.c12
-rw-r--r--src/lib/libcrypto/md5/md5.h13
3 files changed, 18 insertions, 19 deletions
diff --git a/src/lib/libcrypto/crypto_internal.h b/src/lib/libcrypto/crypto_internal.h
index c5de5b7b51..09ae7fa466 100644
--- a/src/lib/libcrypto/crypto_internal.h
+++ b/src/lib/libcrypto/crypto_internal.h
@@ -1,4 +1,4 @@
1/* $OpenBSD: crypto_internal.h,v 1.14 2024/11/08 14:05:43 jsing Exp $ */ 1/* $OpenBSD: crypto_internal.h,v 1.15 2025/01/19 07:51:41 jsing Exp $ */
2/* 2/*
3 * Copyright (c) 2023 Joel Sing <jsing@openbsd.org> 3 * Copyright (c) 2023 Joel Sing <jsing@openbsd.org>
4 * 4 *
@@ -256,6 +256,16 @@ crypto_store_htole32(uint8_t *dst, uint32_t v)
256} 256}
257#endif 257#endif
258 258
259#ifndef HAVE_CRYPTO_ADD_U32DW_U64
260static inline void
261crypto_add_u32dw_u64(uint32_t *h, uint32_t *l, uint64_t v)
262{
263 v += ((uint64_t)*h << 32) | *l;
264 *h = v >> 32;
265 *l = v;
266}
267#endif
268
259#ifndef HAVE_CRYPTO_ROL_U32 269#ifndef HAVE_CRYPTO_ROL_U32
260static inline uint32_t 270static inline uint32_t
261crypto_rol_u32(uint32_t v, size_t shift) 271crypto_rol_u32(uint32_t v, size_t shift)
diff --git a/src/lib/libcrypto/md5/md5.c b/src/lib/libcrypto/md5/md5.c
index 744c66f005..3bc558f0f2 100644
--- a/src/lib/libcrypto/md5/md5.c
+++ b/src/lib/libcrypto/md5/md5.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: md5.c,v 1.23 2024/06/01 07:36:16 tb Exp $ */ 1/* $OpenBSD: md5.c,v 1.24 2025/01/19 07:51:41 jsing Exp $ */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved. 3 * All rights reserved.
4 * 4 *
@@ -278,19 +278,13 @@ MD5_Update(MD5_CTX *c, const void *data_, size_t len)
278{ 278{
279 const unsigned char *data = data_; 279 const unsigned char *data = data_;
280 unsigned char *p; 280 unsigned char *p;
281 MD5_LONG l;
282 size_t n; 281 size_t n;
283 282
284 if (len == 0) 283 if (len == 0)
285 return 1; 284 return 1;
286 285
287 l = (c->Nl + (((MD5_LONG)len) << 3))&0xffffffffUL; 286 /* Update message bit counter. */
288 /* 95-05-24 eay Fixed a bug with the overflow handling, thanks to 287 crypto_add_u32dw_u64(&c->Nh, &c->Nl, (uint64_t)len << 3);
289 * Wei Dai <weidai@eskimo.com> for pointing it out. */
290 if (l < c->Nl) /* overflow */
291 c->Nh++;
292 c->Nh+=(MD5_LONG)(len>>29); /* might cause compiler warning on 16-bit */
293 c->Nl = l;
294 288
295 n = c->num; 289 n = c->num;
296 if (n != 0) { 290 if (n != 0) {
diff --git a/src/lib/libcrypto/md5/md5.h b/src/lib/libcrypto/md5/md5.h
index a3529f486d..99e71783b9 100644
--- a/src/lib/libcrypto/md5/md5.h
+++ b/src/lib/libcrypto/md5/md5.h
@@ -1,4 +1,4 @@
1/* $OpenBSD: md5.h,v 1.23 2024/06/01 07:44:11 tb Exp $ */ 1/* $OpenBSD: md5.h,v 1.24 2025/01/19 07:51:41 jsing Exp $ */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved. 3 * All rights reserved.
4 * 4 *
@@ -60,12 +60,13 @@
60 60
61#ifndef HEADER_MD5_H 61#ifndef HEADER_MD5_H
62#define HEADER_MD5_H 62#define HEADER_MD5_H
63
64#include <openssl/opensslconf.h>
65
63#if !defined(HAVE_ATTRIBUTE__BOUNDED__) && !defined(__OpenBSD__) 66#if !defined(HAVE_ATTRIBUTE__BOUNDED__) && !defined(__OpenBSD__)
64#define __bounded__(x, y, z) 67#define __bounded__(x, y, z)
65#endif 68#endif
66 69
67#include <openssl/opensslconf.h>
68
69#ifdef __cplusplus 70#ifdef __cplusplus
70extern "C" { 71extern "C" {
71#endif 72#endif
@@ -74,12 +75,6 @@ extern "C" {
74#error MD5 is disabled. 75#error MD5 is disabled.
75#endif 76#endif
76 77
77/*
78 * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
79 * ! MD5_LONG has to be at least 32 bits wide. !
80 * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
81 */
82
83#define MD5_LONG unsigned int 78#define MD5_LONG unsigned int
84 79
85#define MD5_CBLOCK 64 80#define MD5_CBLOCK 64