From 9153da3e762aef723d54111acc3f42b9f563f8c7 Mon Sep 17 00:00:00 2001 From: Jeff Connelly Date: Thu, 15 May 2008 11:52:19 -0700 Subject: [PATCH] Lookup pads when unpackaging messages. --- libotp.c | 37 +++++++++++++++++++++++++++++++------ libotp.h | 18 ++++++++++-------- try.c | 7 ------- 3 files changed, 41 insertions(+), 21 deletions(-) diff --git a/libotp.c b/libotp.c index 9d5e7c8..fe81fee 100644 --- a/libotp.c +++ b/libotp.c @@ -143,6 +143,23 @@ void load_pad(char *local_filename) } } +/** Find pad with given name. */ +PAD *find_pad(char *pad_name) +{ + PAD *p; + + /* Null or blank pad = default (first) pad. */ + if (!pad_name || !strcmp(pad_name, "")) + return pads; + + for (p = pads; p; p = p->next) { + if (!strcmp(p->name, pad_name)) + return p; + } + + return NULL; +} + /** Close all pads and free allocated memory. */ void free_pads() { @@ -169,8 +186,9 @@ void free_message(MESSAGE *msg) MESSAGE *unpackage(char *input) { MESSAGE *msg; - unsigned int at, raw_ct_len, i; - char *s, *end, *raw_ct, *b64_ct; + unsigned int at, i; + char *s, *end, *b64_ct; + char pad_name[PAD_NAME_LENGTH]; msg = malloc(sizeof(MESSAGE)); if (!msg) { @@ -220,7 +238,7 @@ MESSAGE *unpackage(char *input) } ++s; - memset(msg->pad_name, 0, PAD_NAME_LENGTH); + memset(pad_name, 0, PAD_NAME_LENGTH); /* Includes pad name? */ if (s[0] != '\n' && s[0] != '\r') { @@ -229,7 +247,7 @@ MESSAGE *unpackage(char *input) i = 0; /* v0.7+ message, includes pad name */ while(s[0] != '\n' && s[0] != '\r' && s[0] != ',' && s < end) { - msg->pad_name[i] = s[0]; + pad_name[i] = s[0]; ++s; ++i; if (i > PAD_NAME_LENGTH) { @@ -240,7 +258,13 @@ MESSAGE *unpackage(char *input) } } - printf("Pad name: |%s|\n", msg->pad_name); + printf("Pad name: |%s|\n", pad_name); + + msg->pad = find_pad(pad_name); + if (!msg->pad) { + fprintf(stderr, "No such pad by name '%s'\n", pad_name); + exit(EX_DATAERR); + } /* Go to next line */ while((s[0] == '\n' || s[0] == '\r' || s[0] == ',') && (s < end)) @@ -254,11 +278,12 @@ MESSAGE *unpackage(char *input) printf("b64_data=<%s>\n", b64_ct); + /* Decode base64 */ msg->cipher_text = malloc(strlen(b64_ct)); msg->length = base64_decode(b64_ct, msg->cipher_text); free(b64_ct); - printf("decoded to %d bytes\n", msg->length); + printf("decoded to %ld bytes\n", msg->length); for (i = 0; i < msg->length; ++i) printf("%c", msg->cipher_text[i]); diff --git a/libotp.h b/libotp.h index 3569c2d..7bda80f 100644 --- a/libotp.h +++ b/libotp.h @@ -13,14 +13,7 @@ #define PAD_NAME_LENGTH 4 -/** Packaged up encrypted message, ready for transport. */ -typedef struct _MESSAGE { - unsigned long offset; - char pad_name[PAD_NAME_LENGTH]; - unsigned long length; - char *cipher_text; -} MESSAGE; - +/* One-time pad. */ typedef struct _PAD { char *local_filename; char *name; @@ -29,6 +22,15 @@ typedef struct _PAD { /* Use read_offset() and write_offset() to access offset. */ } PAD; + +/** Packaged up encrypted message, ready for transport. */ +typedef struct _MESSAGE { + unsigned long offset; + PAD *pad; + unsigned long length; + char *cipher_text; +} MESSAGE; + void show_pads(); FILE *open_offset_file(PAD *p, char *mode); unsigned long read_offset(PAD *p); diff --git a/try.c b/try.c index a046299..3c89d34 100644 --- a/try.c +++ b/try.c @@ -21,13 +21,6 @@ int main() write_offset(pads, 1213475); printf("offset=%ld\n", read_offset(pads)); - m = unpackage("--EMOTP_BEGIN--0,\n" - "aGVsbG8gd29ybGQ=\n" - "--EMOTP_END--\n"); - - free_message(m); - - m = unpackage("--EMOTP_BEGIN--1213434,\n" "gK1O22FPbxLmxrROfFHDCsM1LTsOAjjbRlHVM1p+WG+s6yslYVfzvtc=\n" "--EMOTP_END--\n"); -- 2.11.4.GIT