X-Git-Url: https://git.distorted.org.uk/~mdw/secnet/blobdiff_plain/c215a4bc817daf7b5631236c3c7b6a509479b034..8fb3bdd70f72c67472d3ec32cb825ba00605f630:/dh.c diff --git a/dh.c b/dh.c index 4300a91..11f1d35 100644 --- a/dh.c +++ b/dh.c @@ -52,7 +52,7 @@ static string_t dh_makepublic(void *sst, uint8_t *secret, int32_t secretlen) read_mpbin(&a, secret, secretlen); - mpz_powm(&b, &st->g, &a, &st->p); + mpz_powm_sec(&b, &st->g, &a, &st->p); r=write_mpstring(&b); @@ -62,9 +62,9 @@ static string_t dh_makepublic(void *sst, uint8_t *secret, int32_t secretlen) } static dh_makeshared_fn dh_makeshared; -static void dh_makeshared(void *sst, uint8_t *secret, int32_t secretlen, - cstring_t rempublic, uint8_t *sharedsecret, - int32_t buflen) +static bool_t dh_makeshared(void *sst, uint8_t *secret, int32_t secretlen, + cstring_t rempublic, uint8_t *sharedsecret, + int32_t buflen) { struct dh *st=sst; MP_INT a, b, c; @@ -76,13 +76,15 @@ static void dh_makeshared(void *sst, uint8_t *secret, int32_t secretlen, read_mpbin(&a, secret, secretlen); mpz_set_str(&b, rempublic, 16); - mpz_powm(&c, &b, &a, &st->p); + mpz_powm_sec(&c, &b, &a, &st->p); write_mpbin(&c,sharedsecret,buflen); mpz_clear(&a); mpz_clear(&b); mpz_clear(&c); + + return True; } static list_t *dh_apply(closure_t *self, struct cloc loc, dict_t *context, @@ -90,7 +92,9 @@ static list_t *dh_apply(closure_t *self, struct cloc loc, dict_t *context, { struct dh *st; string_t p,g; + dict_t *dict = 0; item_t *i; + bool_t check = True; NEW(st); st->cl.description="dh"; @@ -101,40 +105,47 @@ static list_t *dh_apply(closure_t *self, struct cloc loc, dict_t *context, st->ops.makepublic=dh_makepublic; st->ops.makeshared=dh_makeshared; st->loc=loc; - /* We have two string arguments: the first is the modulus, and the - second is the generator. Both are in hex. */ + + /* We either have two string arguments and maybe a boolean, or a + * dictionary + */ i=list_elem(args,0); - if (i) { - if (i->type!=t_string) { - cfgfatal(i->loc,"diffie-hellman","first argument must be a " - "string\n"); - } - p=i->data.string; - if (mpz_init_set_str(&st->p,p,16)!=0) { - cfgfatal(i->loc,"diffie-hellman","\"%s\" is not a hex number " - "string\n",p); - } + if (i && i->type==t_dict) { + dict=i->data.dict; + p=dict_read_string(dict,"p",True,"diffie-hellman",loc); + g=dict_read_string(dict,"g",True,"diffie-hellman",loc); + check=dict_read_bool(dict,"check",False,"diffie-hellman",loc,True); } else { - cfgfatal(loc,"diffie-hellman","you must provide a prime modulus\n"); - } - - i=list_elem(args,1); - if (i) { - if (i->type!=t_string) { + if (!i) + cfgfatal(loc,"diffie-hellman","you must provide a prime modulus\n"); + else if (i->type!=t_string) + cfgfatal(i->loc,"diffie-hellman", + "first argument must be a string or a dictionary\n"); + p=i->data.string; + i=list_elem(args,1); + if (!i) + cfgfatal(loc,"diffie-hellman","you must provide a generator\n"); + else if (i->type!=t_string) cfgfatal(i->loc,"diffie-hellman","second argument must be a " "string\n"); - } g=i->data.string; - if (mpz_init_set_str(&st->g,g,16)!=0) { - cfgfatal(i->loc,"diffie-hellman","\"%s\" is not a hex number " - "string\n",g); + i=list_elem(args,2); + if (i) { + if (i->type!=t_bool) + cfgfatal(i->loc,"diffie-hellman", + "third argument must be boolean or omitted\n"); + check=i->data.bool; } - } else { - cfgfatal(loc,"diffie-hellman","you must provide a generator\n"); } - i=list_elem(args,2); - if (i && i->type==t_bool && i->data.bool==False) { + if (mpz_init_set_str(&st->p,p,16)!=0) + cfgfatal(loc,"diffie-hellman","\"%s\" is not a hex number " + "string\n",p); + if (mpz_init_set_str(&st->g,g,16)!=0) + cfgfatal(i->loc,"diffie-hellman","\"%s\" is not a hex number " + "string\n",g); + + if (!check) { Message(M_INFO,"diffie-hellman (%s:%d): skipping modulus " "primality check\n",loc.file,loc.line); } else { @@ -152,9 +163,9 @@ static list_t *dh_apply(closure_t *self, struct cloc loc, dict_t *context, cfgfatal(loc,"diffie-hellman","generator must be less than modulus\n"); } - st->ops.len=sz; + st->ops.secret_len=sz; - st->ops.ceil_len=(mpz_sizeinbase(&st->p,2)+7)/8; + st->ops.shared_len=(mpz_sizeinbase(&st->p,2)+7)/8; /* According to the docs, mpz_sizeinbase(,256) is allowed to return * an answer which is 1 too large. But mpz_sizeinbase(,2) isn't. */