July 2003
Intermediate to advanced
790 pages
23h 35m
English
A user enters a textual representation of a key or other binary data (see Recipe 4.7). You need to convert it to binary.
Parse out the words, then look them up in the dictionary to reconstruct the actual bits, as shown in the code included in the next section.
This function
spc_words2bin(
)
uses the wordlist.h file provided on the
book’s web site, and it can be changed as described
in Recipe 4.7.
#include <stdlib.h> #include <string.h> #include <ctype.h> #include "wordlist.h" #define BITS_IN_LIST 11 #define MAX_WORDLEN 4 unsigned char *spc_words2bin(unsigned char *str, size_t *outlen) { int cmp, i; size_t bitsinword, curbits, needed, reslen; unsigned int ix, min, max; unsigned char *p = str, *r, *res, word[MAX_WORDLEN + 1]; curbits = reslen = *outlen = 0; if(!(r = res = (unsigned char *)malloc((strlen(str) + 1) / 2)) return 0; memset(res, 0, (strlen(str) + 1) / 2); for (;;) { while (isspace(*p)) p++; if (!*p) break; /* The +1 is because we expect to see a space or a NULL after each and every * word; otherwise, there's a syntax error. */ for (i = 0; i < MAX_WORDLEN + 1; i++) { if (!*p || isspace(*p)) break; if (islower(*p)) word[i] = *p++ - ' '; else if (isupper(*p)) word[i] = *p++; else { free(res); return 0; } } if (i = = MAX_WORDLEN + 1) { free(res); return 0; } word[i] = 0; min = 0; max = (1 << BITS_IN_LIST) - 1; do { if (max < min) { free(res); return 0; /* Word not in list! */ } ix = (max + min) / 2; cmp = strcmp(word, ...Read now
Unlock full access