int
rsa_keypair_from_sexp_alist(struct rsa_public_key *pub,
struct rsa_private_key *priv,
+ unsigned limit,
struct sexp_iterator *i);
/* If PRIV is NULL, expect a public-key expression. If PUB is NULL,
int
rsa_keypair_from_sexp(struct rsa_public_key *pub,
struct rsa_private_key *priv,
+ unsigned limit,
unsigned length, const uint8_t *expr);
-/* sexp2rsa.h
+/* sexp2rsa.c
*
*/
#include <string.h>
-static int
-get_value(mpz_t x, struct sexp_iterator *i)
-{
- if (i->type == SEXP_ATOM
- && !i->display)
- {
- nettle_mpz_set_str_256(x, i->atom_length, i->atom);
- return 1;
- }
- else
- return 0;
-}
-
-#define GET(x, v) do { if (!get_value(x, v)) return 0; } while(0)
-
-/* FIXME: Pass in a maximum key size, to avoid denial-of-service
- * problems. */
+#define GET(x, l, v) \
+do { if (!nettle_mpz_set_sexp((x), (l), (v))) return 0; } while(0)
/* Iterator should point past the algorithm tag, e.g.
*
int
rsa_keypair_from_sexp_alist(struct rsa_public_key *pub,
struct rsa_private_key *priv,
+ unsigned limit,
struct sexp_iterator *i)
{
static const uint8_t *names[8]
if (priv)
{
- GET(priv->d, &values[2]);
- GET(priv->p, &values[3]);
- GET(priv->q, &values[4]);
- GET(priv->a, &values[5]);
- GET(priv->b, &values[6]);
- GET(priv->c, &values[7]);
+ GET(priv->d, limit, &values[2]);
+ GET(priv->p, limit, &values[3]);
+ GET(priv->q, limit, &values[4]);
+ GET(priv->a, limit, &values[5]);
+ GET(priv->b, limit, &values[6]);
+ GET(priv->c, limit, &values[7]);
if (!rsa_prepare_private_key(priv))
return 0;
if (pub)
{
- GET(pub->n, &values[0]);
- GET(pub->e, &values[1]);
+ GET(pub->n, limit, &values[0]);
+ GET(pub->e, limit, &values[1]);
if (!rsa_prepare_public_key(pub))
return 0;
int
rsa_keypair_from_sexp(struct rsa_public_key *pub,
struct rsa_private_key *priv,
+ unsigned limit,
unsigned length, const uint8_t *expr)
{
struct sexp_iterator i;
if (!sexp_iterator_check_types(&i, 3, names))
return 0;
- return rsa_keypair_from_sexp_alist(pub, priv, &i);
+ return rsa_keypair_from_sexp_alist(pub, priv, limit, &i);
}
#endif /* WITH_PUBLIC_KEY */