Skip to content

Commit

Permalink
fix concatkdf failures on big endian architectures (cisco#78)
Browse files Browse the repository at this point in the history
Several of the elements used to compute the digest in ECDH-ES key
agreement computation are represented in binary form as a 32-bit
integer length followed by that number of octets. The 32-bit length
integer is represented in big endian format (the 8 most significant
bits are in the first octet.).

The conversion to a 4 byte big endian integer was being computed
in a manner that only worked on little endian architectures. The
function htonl() returns a 32-bit integer whose octet sequence given
the address of the integer is big endian. There is no need for any
further manipulation.

The existing code used bit shifting on a 32-bit value. In C bit
shifting is endian agnostic for multi-octet values, a right shift
moves most significant bits toward least significant bits. The result
of a bit shift of a multi-octet value on either big or little
archictures will always be the same provided you "view" it as the same
data type (e.g. 32-bit integer). But indexing the octets of that
mulit-octet value will be different depending on endianness, hence the
assembled octets differed depending on endianness.

Issue: cisco#77
Signed-off-by: John Dennis <[email protected]>
  • Loading branch information
John R. Dennis authored and linuxwolf committed Aug 3, 2018
1 parent 254ab05 commit 46d238b
Show file tree
Hide file tree
Showing 2 changed files with 5 additions and 16 deletions.
10 changes: 2 additions & 8 deletions src/concatkdf.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,15 +29,9 @@
////////////////////////////////////////////////////////////////////////////////
static uint8_t *_apply_uint32(const uint32_t value, uint8_t *buffer)
{
const uint32_t formatted = htonl(value);
const uint8_t data[4] = {
(formatted >> 0) & 0xff,
(formatted >> 8) & 0xff,
(formatted >> 16) & 0xff,
(formatted >> 24) & 0xff
};
memcpy(buffer, data, 4);
const uint32_t big_endian_int32 = htonl(value);

memcpy(buffer, &big_endian_int32, 4);
return buffer + 4;
}

Expand Down
11 changes: 3 additions & 8 deletions test/check_concatkdf.c
Original file line number Diff line number Diff line change
Expand Up @@ -60,14 +60,9 @@ static cjose_header_t *_create_otherinfo_header(const uint8_t *apu, const size_t

static bool _cmp_uint32(uint8_t **actual, uint32_t expected)
{
uint32_t value = htonl(expected);
uint8_t expectedData[] = {
(value >> 0) & 0xff,
(value >> 8) & 0xff,
(value >> 16) & 0xff,
(value >> 24) & 0xff
};
bool result = (0 == memcmp(*actual, expectedData, 4));
uint32_t big_endian_int32 = htonl(expected);

bool result = (0 == memcmp(*actual, &big_endian_int32, 4));
(*actual) += 4;
return result;
}
Expand Down

0 comments on commit 46d238b

Please sign in to comment.