Blame lib/nettle/ecc/gostdsa-verify.c

Packit Service 991b93
/* gostdsa-verify.c
Packit Service 991b93
Packit Service 991b93
   Copyright (C) 2015 Dmitry Eremin-Solenikov
Packit Service 991b93
   Copyright (C) 2013 Niels Möller
Packit Service 991b93
Packit Service 991b93
   This file is part of GNU Nettle.
Packit Service 991b93
Packit Service 991b93
   GNU Nettle is free software: you can redistribute it and/or
Packit Service 991b93
   modify it under the terms of either:
Packit Service 991b93
Packit Service 991b93
     * the GNU Lesser General Public License as published by the Free
Packit Service 991b93
       Software Foundation; either version 3 of the License, or (at your
Packit Service 991b93
       option) any later version.
Packit Service 991b93
Packit Service 991b93
   or
Packit Service 991b93
Packit Service 991b93
     * the GNU General Public License as published by the Free
Packit Service 991b93
       Software Foundation; either version 2 of the License, or (at your
Packit Service 991b93
       option) any later version.
Packit Service 991b93
Packit Service 991b93
   or both in parallel, as here.
Packit Service 991b93
Packit Service 991b93
   GNU Nettle is distributed in the hope that it will be useful,
Packit Service 991b93
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 991b93
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service 991b93
   General Public License for more details.
Packit Service 991b93
Packit Service 991b93
   You should have received copies of the GNU General Public License and
Packit Service 991b93
   the GNU Lesser General Public License along with this program.  If
Packit Service 991b93
   not, see http://www.gnu.org/licenses/.
Packit Service 991b93
*/
Packit Service 991b93
Packit Service 991b93
#if HAVE_CONFIG_H
Packit Service 991b93
# include "config.h"
Packit Service 991b93
#endif
Packit Service 991b93
Packit Service 991b93
#include <stdlib.h>
Packit Service 991b93
Packit Service 991b93
#include "gostdsa.h"
Packit Service 991b93
Packit Service 991b93
#include "gmp-glue.h"
Packit Service 991b93
Packit Service 991b93
int
Packit Service 991b93
gostdsa_verify (const struct ecc_point *pub,
Packit Service 991b93
	      size_t length, const uint8_t *digest,
Packit Service 991b93
	      const struct dsa_signature *signature)
Packit Service 991b93
{
Packit Service 991b93
  mp_limb_t size = ecc_size (pub->ecc);
Packit Service 991b93
  mp_size_t itch = 2*size + ecc_gostdsa_verify_itch (pub->ecc);
Packit Service 991b93
  /* For ECC_MUL_A_WBITS == 0, at most 1512 bytes. With
Packit Service 991b93
     ECC_MUL_A_WBITS == 4, currently needs 67 * ecc->size, at most
Packit Service 991b93
     4824 bytes. Don't use stack allocation for this. */
Packit Service 991b93
  mp_limb_t *scratch;
Packit Service 991b93
  int res;
Packit Service 991b93
Packit Service 991b93
#define rp scratch
Packit Service 991b93
#define sp (scratch + size)
Packit Service 991b93
#define scratch_out (scratch + 2*size)
Packit Service 991b93
Packit Service 991b93
  if (mpz_sgn (signature->r) <= 0 || mpz_size (signature->r) > size
Packit Service 991b93
      || mpz_sgn (signature->s) <= 0 || mpz_size (signature->s) > size)
Packit Service 991b93
    return 0;
Packit Service 991b93
Packit Service 991b93
  scratch = gmp_alloc_limbs (itch);
Packit Service 991b93
Packit Service 991b93
  mpz_limbs_copy (rp, signature->r, size);
Packit Service 991b93
  mpz_limbs_copy (sp, signature->s, size);
Packit Service 991b93
Packit Service 991b93
  res = ecc_gostdsa_verify (pub->ecc, pub->p, length, digest, rp, sp, scratch_out);
Packit Service 991b93
Packit Service 991b93
  gmp_free_limbs (scratch, itch);
Packit Service 991b93
Packit Service 991b93
  return res;
Packit Service 991b93
#undef rp
Packit Service 991b93
#undef sp
Packit Service 991b93
#undef scratch_out
Packit Service 991b93
}