summaryrefslogtreecommitdiff
path: root/common/rma_auth.c
diff options
context:
space:
mode:
Diffstat (limited to 'common/rma_auth.c')
-rw-r--r--common/rma_auth.c35
1 files changed, 32 insertions, 3 deletions
diff --git a/common/rma_auth.c b/common/rma_auth.c
index 5b932235c9..8ff7f1aa06 100644
--- a/common/rma_auth.c
+++ b/common/rma_auth.c
@@ -7,6 +7,7 @@
#include "common.h"
#include "base32.h"
+#include "byteorder.h"
#include "chip/g/board_id.h"
#include "curve25519.h"
#include "rma_auth.h"
@@ -49,6 +50,18 @@ static void get_hmac_sha256(void *hmac_out, const uint8_t *secret,
#endif
}
+static void hash_buffer(void *dest, size_t dest_size,
+ const void *buffer, size_t buf_size)
+{
+ /* We know that the destination is no larger than 32 bytes. */
+ uint8_t temp[32];
+
+ get_hmac_sha256(temp, buffer, buf_size, buffer, buf_size);
+
+ /* Or should we do XOR of the temp modulo dest size? */
+ memcpy(dest, temp, dest_size);
+}
+
/**
* Create a new RMA challenge/response
*
@@ -64,6 +77,7 @@ int rma_create_challenge(void)
uint8_t *device_id;
uint8_t *cptr = (uint8_t *)&c;
uint64_t t;
+ int unique_device_id_size;
/* Clear the current challenge and authcode, if any */
memset(challenge, 0, sizeof(challenge));
@@ -81,11 +95,26 @@ int rma_create_challenge(void)
if (read_board_id(&bid))
return EC_ERROR_UNKNOWN;
+
+ /* The server wants this as a string, not a number. */
+ bid.type = htobe32(bid.type);
memcpy(c.board_id, &bid.type, sizeof(c.board_id));
- if (system_get_chip_unique_id(&device_id) != sizeof(c.device_id))
- return EC_ERROR_UNKNOWN;
- memcpy(c.device_id, device_id, sizeof(c.device_id));
+ unique_device_id_size = system_get_chip_unique_id(&device_id);
+
+ /* Smaller unique device IDs will fill c.device_id only partially. */
+ if (unique_device_id_size <= sizeof(c.device_id)) {
+ /* The size matches, let's just copy it as is. */
+ memcpy(c.device_id, device_id, unique_device_id_size);
+ } else {
+ /*
+ * The unique device ID size exceeds space allotted in
+ * rma_challenge:device_id, let's use first few bytes of
+ * its hash.
+ */
+ hash_buffer(c.device_id, sizeof(c.device_id),
+ device_id, unique_device_id_size);
+ }
/* Calculate a new ephemeral key pair */
X25519_keypair(c.device_pub_key, temp);