X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?a=blobdiff_plain;ds=sidebyside;f=rsa.c;h=bdacfe99d120099009f9e24c3452f1e856069630;hb=423936d35d7671fd017d2d611d418d1b8eeb6195;hp=2db03c9bbdf45453cc37e2e7b3cb910c1cde4448;hpb=9941ae2e1f8bd7cb5771527b41d6a2032cd6580f;p=secnet.git diff --git a/rsa.c b/rsa.c index 2db03c9..bdacfe9 100644 --- a/rsa.c +++ b/rsa.c @@ -177,7 +177,7 @@ static list_t *rsapub_apply(closure_t *self, struct cloc loc, dict_t *context, item_t *i; string_t e,n; - st=safe_malloc(sizeof(*st),"rsapub_apply"); + NEW(st); st->cl.description="rsapub"; st->cl.type=CL_RSAPUBKEY; st->cl.apply=NULL; @@ -199,6 +199,9 @@ static list_t *rsapub_apply(closure_t *self, struct cloc loc, dict_t *context, } else { cfgfatal(loc,"rsa-public","you must provide an encryption key\n"); } + if (mpz_sizeinbase(&st->e, 256) > RSA_MAX_MODBYTES) { + cfgfatal(loc, "rsa-public", "implausibly large public exponent\n"); + } i=list_elem(args,1); if (i) { @@ -213,6 +216,9 @@ static list_t *rsapub_apply(closure_t *self, struct cloc loc, dict_t *context, } else { cfgfatal(loc,"rsa-public","you must provide a modulus\n"); } + if (mpz_sizeinbase(&st->n, 256) > RSA_MAX_MODBYTES) { + cfgfatal(loc, "rsa-public", "implausibly large modulus\n"); + } return new_closure(&st->cl); } @@ -249,7 +255,7 @@ static list_t *rsapriv_apply(closure_t *self, struct cloc loc, dict_t *context, MP_INT e,d,iqmp,tmp,tmp2,tmp3; bool_t valid; - st=safe_malloc(sizeof(*st),"rsapriv_apply"); + NEW(st); st->cl.description="rsapriv"; st->cl.type=CL_RSAPRIVKEY; st->cl.apply=NULL;