aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorJason A. Donenfeld <Jason@zx2c4.com>2018-12-20 18:30:21 +0100
committerJason A. Donenfeld <Jason@zx2c4.com>2018-12-20 18:32:40 +0100
commit53f9023e7e888a6d9d592a49e376fb75cb148563 (patch)
tree1cff807f005a352a8bd4ec6d35b616d85f2feb80
parentmakefile: use immediate expansion and use correct template patterns (diff)
downloadwireguard-tools-53f9023e7e888a6d9d592a49e376fb75cb148563.tar.xz
wireguard-tools-53f9023e7e888a6d9d592a49e376fb75cb148563.zip
wg: curve25519: handle unaligned loads/stores safely
Reported-by: Chris Hewitt <chris@chrishewitt.net> Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
Diffstat (limited to '')
-rw-r--r--src/curve25519.c22
-rw-r--r--src/pubkey.c2
2 files changed, 19 insertions, 5 deletions
diff --git a/src/curve25519.c b/src/curve25519.c
index c65b2ca..c733a35 100644
--- a/src/curve25519.c
+++ b/src/curve25519.c
@@ -39,9 +39,23 @@ typedef int64_t s64;
#define le32_to_cpup(a) (*(a))
#define cpu_to_le64(a) (a)
#endif
-#define get_unaligned_le32(a) le32_to_cpup((u32 *)(a))
-#define get_unaligned_le64(a) le64_to_cpup((u64 *)(a))
-#define put_unaligned_le64(s, d) *(u64 *)(d) = cpu_to_le64(s)
+static inline __le32 get_unaligned_le32(const u8 *a)
+{
+ __le32 l;
+ __builtin_memcpy(&l, a, sizeof(l));
+ return le32_to_cpup(&l);
+}
+static inline __le64 get_unaligned_le64(const u8 *a)
+{
+ __le64 l;
+ __builtin_memcpy(&l, a, sizeof(l));
+ return le64_to_cpup(&l);
+}
+static inline void put_unaligned_le64(u64 s, u8 *d)
+{
+ __le64 l = cpu_to_le64(s);
+ __builtin_memcpy(d, &l, sizeof(l));
+}
#ifndef __always_inline
#define __always_inline __inline __attribute__((__always_inline__))
#endif
@@ -70,7 +84,7 @@ static noinline void memzero_explicit(void *s, size_t count)
void curve25519_generate_public(uint8_t pub[static CURVE25519_KEY_SIZE], const uint8_t secret[static CURVE25519_KEY_SIZE])
{
- static const uint8_t basepoint[CURVE25519_KEY_SIZE] = { 9 };
+ static const uint8_t basepoint[CURVE25519_KEY_SIZE] __aligned(sizeof(uintptr_t)) = { 9 };
curve25519(pub, secret, basepoint);
}
diff --git a/src/pubkey.c b/src/pubkey.c
index cf8e256..9741bcf 100644
--- a/src/pubkey.c
+++ b/src/pubkey.c
@@ -13,7 +13,7 @@
int pubkey_main(int argc, char *argv[])
{
- uint8_t key[WG_KEY_LEN];
+ uint8_t key[WG_KEY_LEN] __attribute__((aligned(sizeof(uintptr_t))));
char base64[WG_KEY_LEN_BASE64];
int trailing_char;