/* * Name: parse_macro * Purpose: separate literals from keys in a macro definition * Date: June 5, 1992 * Passed: macro_key: key that we are a assigning a macro to * residue: pointer to macro defs * Notes: for each token in macro def, find out if it's a literal or a * function key. * a literal begins with a ". to put a " in a macro def, precede * a " with a ". */ void parse_macro( int macro_key, char *residue ) { int rc; char literal[1042]; char *l; int key_no; /* * reset any previous macro def. */ initialize_macro( macro_key ); while (residue != NULL) { /* * skip over any leading spaces. */ while (*residue == ' ') ++residue; /* * done if we hit a comment */ if (*residue == ';') residue = NULL; /* * check for a literal. */ else if (*residue == '\"') { rc = parse_literal( macro_key, residue, literal, &residue ); if (rc == OK) { l = literal; while (*l != '\0' && rc == OK) { rc = record_keys( macro_key, *l ); ++l; } } else { printf( "==> %s", line_in ); printf( "Literal not recognized: line %u : literal %s\n", line_no, literal ); } /* * check for a function key. */ } else { residue = parse_token( residue, literal ); key_no = search( literal, valid_keys, AVAIL_KEYS ); if (key_no != ERROR) record_keys( macro_key, key_no+256 ); else { printf( "==> %s", line_in ); printf( "Unrecognized key: line %u : key %s\n", line_no, literal ); } } } check_macro( macro_key ); }
bool write_keys (int fd, struct key_container *keys, struct octet_buffer *data_zone) { assert (NULL != data_zone); assert (STATE_INITIALIZED == get_device_state (fd)); bool free_keys = false; #define KEY_LEN 32 const unsigned int TEST_KEY_1 = 14; const unsigned int TEST_KEY_2 = 15; struct octet_buffer test_key_14 = make_buffer (KEY_LEN); memset(test_key_14.ptr, 0xAA, KEY_LEN); struct octet_buffer test_key_15 = make_buffer (KEY_LEN); memset(test_key_15.ptr, 0xBB, KEY_LEN); int x = 0; /* If there are no keys, which is the case when we are personalizing a device from scratch, create some new keys */ if (NULL == keys) { keys = make_key_container (); for (x=0; x < get_max_keys (); x++) { if (TEST_KEY_1 == x) { keys->keys[x] = test_key_14; } else if (TEST_KEY_2 == x) { keys->keys[x] = test_key_15; } else { keys->keys[x] = get_random (fd, false); } } free_keys = true; } bool status = true; for (x=0; x < get_max_keys () && status; x++) { const unsigned int WORD_OFFSET = 8; unsigned int addr = WORD_OFFSET * x; status = write32 (fd, DATA_ZONE, addr, keys->keys[x], NULL); } if (status) { data_zone->len = get_max_keys () * keys->keys[0].len; data_zone->ptr = malloc_wipe (data_zone->len); for (x=0; x < get_max_keys (); x++) { CTX_LOG(DEBUG, "Writing key %u", x); unsigned int offset = x * keys->keys[x].len; memcpy(data_zone->ptr + offset, keys->keys[x].ptr, keys->keys[x].len); } status = record_keys (keys); } if (free_keys) free_key_container (keys); return status; }