Licenced on the terms of the GNU General Public Licence version 3
To build:
-
+
gcc -o cfe_gen_pass cfe_generate_password.c
Or:
Broadcom Common Firmware Environment (CFE) bootbase which has a debug mode
that is enabled using the "ATEN 1 XXXXXXXX" command, where XXXXXXXX is an
eight digit hexadecimal 'password'.
-
+
It is NOT necessary to have the device generate a 'seed' using "ATSE [MODEL-ID]"
because this tool can generate the seed from the device's first (base) MAC address
*provided* the "ATSE" command has NOT been executed since the device last booted.
#include <stdarg.h>
#include <string.h>
-static const float VERSION = 1.0f;
+static const float VERSION = 1.1f;
static const size_t TIMESTAMP_SIZE = 6;
static const size_t SEED_SIZE = 12;
static const size_t PASSWORD_SIZE = 8;
static const size_t MESSAGE_SIZE = 128;
+static const size_t MAC_ADDR_SIZE = 17;
static void
pr_usage()
pr_error_exit(unsigned int usage, const char *error, ...)
{
va_list args;
- char error_message[MESSAGE_SIZE];
+ char error_message[MESSAGE_SIZE + 1];
if (!error) return;
va_start(args, error);
- (void) vsnprintf(error_message, MESSAGE_SIZE, error, args);
+ (void) vsnprintf(error_message, MESSAGE_SIZE + 1, error, args);
va_end(args);
fprintf(stderr, "Error: %s\n", error_message);
if (usage) pr_usage();
- exit(EXIT_FAILURE);
+ exit(EXIT_FAILURE);
}
static const unsigned int passwords[8] = {
generate_seed(char *mac, char *timestamp, char *seed)
{
unsigned int result = 0;
- if (mac && strlen(mac) == 17) {
+ if (mac && strlen(mac) == MAC_ADDR_SIZE) {
size_t i;
char *mac_ptr = mac + 9;
size_t ts_len = strlen(timestamp);
- for (i = 0; i <= SEED_SIZE; ++i) {
+ for (i = 0; i < SEED_SIZE; ++i) {
/* if no timestamp assume CFE get_time() returned 0 and CFE g_pw_timestamp == 0x00000000 */
- if (i < 6)
+ if (i < 6)
seed[i] = ts_len ? timestamp[i] : '0';
else {
if (*mac_ptr == ':' || *mac_ptr == '-')
}
result = 1;
} else
- pr_error_exit(0, "MAC-ADDR should be 17 characters, e.g: 00:01:02:03:04:05");
+ pr_error_exit(0, "MAC-ADDR should be %d characters, e.g: 00:01:02:03:04:05", MAC_ADDR_SIZE);
return result;
}
{
unsigned int result = 0;
- if (seed && strlen(seed) == 12) {
+ if (seed && strlen(seed) == SEED_SIZE) {
unsigned int timestamp, byte, key, pass;
timestamp = byte = 0;
if(! sscanf(seed, "%06x", ×tamp))
} else if (opt_pass == 1 && opt_seed == 0) {
if (arg_len != SEED_SIZE)
pr_error_exit(1, "seed length must be %d characters", SEED_SIZE);
-
+
strncpy(seed, argv[arg], SEED_SIZE);
++opt_pass;
} else if (opt_ts == 1) {
if (! generate_pass(seed, password))
pr_error_exit(0, "unable to generate password");
- printf("MAC address: %s Timestamp: %s Seed: %s Password: %s\n", MAC_ADDR, timestamp, seed, password);
+ if (opt_seed || opt_pass)
+ printf("MAC address: %s Timestamp: %s Seed: %s Password: %s\n", MAC_ADDR, timestamp, seed, password);
}
return result;