Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

MPILIB: Reinstate mpi_cmp[_ui]() and export for RSA signature verification

Reinstate and export mpi_cmp() and mpi_cmp_ui() from the MPI library for use by
RSA signature verification as per RFC3447 section 5.2.2 step 1.

Signed-off-by: David Howells <dhowells@redhat.com>
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>

authored by

David Howells and committed by
Rusty Russell
12f008b6 4ae71c1d

+71
+1
lib/mpi/Makefile
··· 14 14 generic_mpih-add1.o \ 15 15 mpicoder.o \ 16 16 mpi-bit.o \ 17 + mpi-cmp.o \ 17 18 mpih-cmp.o \ 18 19 mpih-div.o \ 19 20 mpih-mul.o \
+70
lib/mpi/mpi-cmp.c
··· 1 + /* mpi-cmp.c - MPI functions 2 + * Copyright (C) 1998, 1999 Free Software Foundation, Inc. 3 + * 4 + * This file is part of GnuPG. 5 + * 6 + * GnuPG is free software; you can redistribute it and/or modify 7 + * it under the terms of the GNU General Public License as published by 8 + * the Free Software Foundation; either version 2 of the License, or 9 + * (at your option) any later version. 10 + * 11 + * GnuPG is distributed in the hope that it will be useful, 12 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 + * GNU General Public License for more details. 15 + * 16 + * You should have received a copy of the GNU General Public License 17 + * along with this program; if not, write to the Free Software 18 + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA 19 + */ 20 + 21 + #include "mpi-internal.h" 22 + 23 + int mpi_cmp_ui(MPI u, unsigned long v) 24 + { 25 + mpi_limb_t limb = v; 26 + 27 + mpi_normalize(u); 28 + if (!u->nlimbs && !limb) 29 + return 0; 30 + if (u->sign) 31 + return -1; 32 + if (u->nlimbs > 1) 33 + return 1; 34 + 35 + if (u->d[0] == limb) 36 + return 0; 37 + else if (u->d[0] > limb) 38 + return 1; 39 + else 40 + return -1; 41 + } 42 + EXPORT_SYMBOL_GPL(mpi_cmp_ui); 43 + 44 + int mpi_cmp(MPI u, MPI v) 45 + { 46 + mpi_size_t usize, vsize; 47 + int cmp; 48 + 49 + mpi_normalize(u); 50 + mpi_normalize(v); 51 + usize = u->nlimbs; 52 + vsize = v->nlimbs; 53 + if (!u->sign && v->sign) 54 + return 1; 55 + if (u->sign && !v->sign) 56 + return -1; 57 + if (usize != vsize && !u->sign && !v->sign) 58 + return usize - vsize; 59 + if (usize != vsize && u->sign && v->sign) 60 + return vsize + usize; 61 + if (!usize) 62 + return 0; 63 + cmp = mpihelp_cmp(u->d, v->d, usize); 64 + if (!cmp) 65 + return 0; 66 + if ((cmp < 0 ? 1 : 0) == (u->sign ? 1 : 0)) 67 + return 1; 68 + return -1; 69 + } 70 + EXPORT_SYMBOL_GPL(mpi_cmp);