diff options
author | Bastian Krause <bst@pengutronix.de> | 2019-09-27 11:59:52 +0200 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2019-09-30 20:39:04 +0200 |
commit | aada84e72e150e0d0abc835f5b2237d64499f9e0 (patch) | |
tree | e4c7d46eba389edbdec0a46fbb4d26f1ca661cc5 /common/machine_id.c | |
parent | 0ef90e6b42aa38e07623d37583d30caab2582cd6 (diff) | |
download | barebox-aada84e72e150e0d0abc835f5b2237d64499f9e0.tar.gz |
common: machine_id: introduce machine id generation
This patch adds functionality to pass device-specific information that
will be hashed to generate a persistent unique machine id. It is then
available as global.machine_id. It can be overwritten with
nv.machine_id if necessary. Passing the machine id to the kernel is
done in a separate patch.
Note: if multiple sources provide hashable device-specific information
(via machine_id_set_hashable()) the information provided by the last call
prior to the late initcall set_machine_id() is used to generate the
machine id from. Thus when updating barebox the machine id might change.
Signed-off-by: Bastian Krause <bst@pengutronix.de>
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'common/machine_id.c')
-rw-r--r-- | common/machine_id.c | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/common/machine_id.c b/common/machine_id.c new file mode 100644 index 0000000000..e678bb7fe8 --- /dev/null +++ b/common/machine_id.c @@ -0,0 +1,69 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Copyright (C) 2019 Pengutronix, Bastian Krause <kernel@pengutronix.de> + */ + +#include <common.h> +#include <init.h> +#include <digest.h> +#include <globalvar.h> +#include <magicvar.h> +#include <crypto/sha.h> +#include <machine_id.h> + +#define MACHINE_ID_LENGTH 32 + +static void *__machine_id_hashable; +static size_t __machine_id_hashable_length; + + +void machine_id_set_hashable(const void *hashable, size_t len) +{ + + __machine_id_hashable = xmemdup(hashable, len); + __machine_id_hashable_length = len; +} + +static int machine_id_set_bootarg(void) +{ + struct digest *digest = NULL; + unsigned char machine_id[SHA1_DIGEST_SIZE]; + char hex_machine_id[MACHINE_ID_LENGTH]; + char *env_machine_id; + int ret = 0; + + /* nothing to do if no hashable information provided */ + if (!__machine_id_hashable) + goto out; + + digest = digest_alloc_by_algo(HASH_ALGO_SHA1); + ret = digest_init(digest); + if (ret) + goto out; + + ret = digest_update(digest, __machine_id_hashable, + __machine_id_hashable_length); + if (ret) + goto out; + + ret = digest_final(digest, machine_id); + if (ret) + goto out; + + /* use the first 16 bytes of the sha1 hash as the machine id */ + bin2hex(hex_machine_id, machine_id, MACHINE_ID_LENGTH/2); + + env_machine_id = basprintf("%.*s", MACHINE_ID_LENGTH, hex_machine_id); + globalvar_add_simple("machine_id", env_machine_id); + free(env_machine_id); + +out: + globalvar_add_simple("machine_id", NULL); + + digest_free(digest); + return ret; + +} +late_initcall(machine_id_set_bootarg); + +BAREBOX_MAGICVAR_NAMED(global_machine_id, global.machine_id, "Persistent device-specific, hexadecimal, 32-character id"); |