X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?a=blobdiff_plain;f=transform.c;h=012f6186a5072516b3069a70f40c658a4c2adfd7;hb=5ad34db2ccbbfbc936cd16121bed2110b70594ba;hp=000170c52b727e0a046b5ea5356dced5d20a4f30;hpb=389070fed67552c613ce5afd3cdb436f8f8c538f;p=secnet.git diff --git a/transform.c b/transform.c index 000170c..012f618 100644 --- a/transform.c +++ b/transform.c @@ -19,7 +19,6 @@ struct transform { closure_t cl; - uint32_t line; struct transform_if ops; uint32_t max_seq_skew; }; @@ -38,7 +37,7 @@ struct transform_inst { #define PKCS5_MASK 15 -static bool_t transform_setkey(void *sst, uint8_t *key, uint32_t keylen) +static bool_t transform_setkey(void *sst, uint8_t *key, int32_t keylen) { struct transform_inst *ti=sst; @@ -69,12 +68,19 @@ static bool_t transform_setkey(void *sst, uint8_t *key, uint32_t keylen) return True; } +static bool_t transform_valid(void *sst) +{ + struct transform_inst *ti=sst; + + return ti->keyed; +} + static void transform_delkey(void *sst) { struct transform_inst *ti=sst; - memset(&ti->cryptkey,0,sizeof(ti->cryptkey)); - memset(&ti->mackey,0,sizeof(ti->mackey)); + FILLZERO(ti->cryptkey); + FILLZERO(ti->mackey); ti->keyed=False; } @@ -157,7 +163,7 @@ static uint32_t transform_reverse(void *sst, struct buffer_if *buf, { struct transform_inst *ti=sst; uint8_t *padp; - unsigned padlen; + int padlen; int i; uint32_t seqnum, skew; uint8_t iv[16]; @@ -172,6 +178,10 @@ static uint32_t transform_reverse(void *sst, struct buffer_if *buf, return 1; } + if (buf->size < 4 + 16 + 16) { + *errmsg="msg too short"; + return 1; + } /* CBC */ memset(iv,0,16); @@ -182,6 +192,7 @@ static uint32_t transform_reverse(void *sst, struct buffer_if *buf, /* Assert bufsize is multiple of blocksize */ if (buf->size&0xf) { *errmsg="msg not multiple of cipher blocksize"; + return 1; } serpent_encrypt(&ti->cryptkey,iv,iv); for (n=buf->start; nstart+buf->size; n+=16) @@ -209,7 +220,7 @@ static uint32_t transform_reverse(void *sst, struct buffer_if *buf, serpent_encrypt(&ti->mackey,macplain,macacc); } serpent_encrypt(&ti->mackey,macacc,macacc); - if (memcmp(macexpected,macacc,16)!=0) { + if (!consttime_memeq(macexpected,macacc,16)!=0) { *errmsg="invalid MAC"; return 1; } @@ -243,7 +254,7 @@ static uint32_t transform_reverse(void *sst, struct buffer_if *buf, } else { /* Too much skew */ *errmsg="seqnum: too much skew"; - return 1; + return 2; } return 0; @@ -253,7 +264,7 @@ static void transform_destroy(void *sst) { struct transform_inst *st=sst; - memset(st,0,sizeof(*st)); /* Destroy key material */ + FILLZERO(*st); /* Destroy key material */ free(st); } @@ -267,6 +278,7 @@ static struct transform_inst_if *transform_create(void *sst) ti->ops.st=ti; ti->ops.setkey=transform_setkey; + ti->ops.valid=transform_valid; ti->ops.delkey=transform_delkey; ti->ops.forwards=transform_forward; ti->ops.reverse=transform_reverse;