X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=rsa.c;h=b633f72d9eca65aae395609688a7596bdf7f47ed;hb=8e4308946bcdb5e62380cff7373d558518745eec;hp=78dfb99d6d79cbc1d08ec06fd752c28b10b9cc9d;hpb=7bc98088613be17894eba5313bb953244c48d458;p=secnet.git diff --git a/rsa.c b/rsa.c index 78dfb99..b633f72 100644 --- a/rsa.c +++ b/rsa.c @@ -356,10 +356,10 @@ static struct rsapub *rsa_loadpub_core(RSAPUB_BNS(RSAPUB_LOADCORE_DEFBN) #define RSAPUB_LOADCORE_GETBN(ix,en,what) \ if (mpz_init_set_str(&st->en,en##s,10)!=0) { \ LDPUBFATAL(&en##_loc, what " \"%s\" is not a " \ - "decimal number string\n",en##s); \ + "decimal number string",en##s); \ } \ if (mpz_sizeinbase(&st->en, 256) > RSA_MAX_MODBYTES) { \ - LDPUBFATAL(&en##_loc, "implausibly large " what "\n"); \ + LDPUBFATAL(&en##_loc, "implausibly large " what); \ } RSAPUB_BNS(RSAPUB_LOADCORE_GETBN) @@ -401,6 +401,46 @@ static list_t *rsapub_apply(closure_t *self, struct cloc loc, dict_t *context, return new_closure(&st->cl); } +bool_t rsa1_loadpub(const struct sigscheme_info *algo, + struct buffer_if *pubkeydata, + struct sigpubkey_if **sigpub_r, + struct log_if *log, struct cloc loc) +{ + struct rsapub *st=0; + + struct load_ctx l[1]; + l->verror=verror_tryload; + l->postreadcheck=0; + l->what="rsa1_loadpub"; + l->loc=loc; + l->u.tryload.log=log; + + char *nul=buf_append(pubkeydata,1); + if (!nul) LDPUBFATAL(0,"rsa1 public key data too long for extra nul"); + *nul=0; + + const char *delim=" \t\n"; + char *saveptr; + /*unused*/ strtok_r(pubkeydata->start,delim,&saveptr); + +#define RSAPUB_TRYLOAD_GETBN(ix,en,what) \ + struct cloc en##_loc=loc; \ + const char *en##s=strtok_r(0,delim,&saveptr); \ + if (!en##s) LDPUBFATAL(0,"end of pubkey data looking for " what); + + RSAPUB_BNS(RSAPUB_TRYLOAD_GETBN); + + st=rsa_loadpub_core(RSAPUB_BNS(RSAPUB_LOADCORE_PASSBN) l); + if (!st) goto error_out; + + *sigpub_r=&st->ops; + return True; + + error_out: + rsapub_dispose(st); + return False; +} + #define LDFATAL(...) ({ load_err(l,0,0,0,__VA_ARGS__); goto error_out; }) #define LDUNSUP(...) ({ load_err(l,0,0,1,__VA_ARGS__); goto error_out; }) #define LDFATAL_FILE(...) ({ load_err(l,0,f,0,__VA_ARGS__); goto error_out; })