xref: /linux/lib/crypto/mpi/mpi-cmp.c (revision 9e47a758)
12a598d0bSHerbert Xu /* mpi-cmp.c  -  MPI functions
22a598d0bSHerbert Xu  * Copyright (C) 1998, 1999 Free Software Foundation, Inc.
32a598d0bSHerbert Xu  *
42a598d0bSHerbert Xu  * This file is part of GnuPG.
52a598d0bSHerbert Xu  *
62a598d0bSHerbert Xu  * GnuPG is free software; you can redistribute it and/or modify
72a598d0bSHerbert Xu  * it under the terms of the GNU General Public License as published by
82a598d0bSHerbert Xu  * the Free Software Foundation; either version 2 of the License, or
92a598d0bSHerbert Xu  * (at your option) any later version.
102a598d0bSHerbert Xu  *
112a598d0bSHerbert Xu  * GnuPG is distributed in the hope that it will be useful,
122a598d0bSHerbert Xu  * but WITHOUT ANY WARRANTY; without even the implied warranty of
132a598d0bSHerbert Xu  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
142a598d0bSHerbert Xu  * GNU General Public License for more details.
152a598d0bSHerbert Xu  *
162a598d0bSHerbert Xu  * You should have received a copy of the GNU General Public License
172a598d0bSHerbert Xu  * along with this program; if not, write to the Free Software
182a598d0bSHerbert Xu  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
192a598d0bSHerbert Xu  */
202a598d0bSHerbert Xu 
212a598d0bSHerbert Xu #include "mpi-internal.h"
222a598d0bSHerbert Xu 
mpi_cmp_ui(MPI u,unsigned long v)232a598d0bSHerbert Xu int mpi_cmp_ui(MPI u, unsigned long v)
242a598d0bSHerbert Xu {
252a598d0bSHerbert Xu 	mpi_limb_t limb = v;
262a598d0bSHerbert Xu 
272a598d0bSHerbert Xu 	mpi_normalize(u);
28*9e47a758SMark O'Donovan 	if (u->nlimbs == 0) {
29*9e47a758SMark O'Donovan 		if (v == 0)
302a598d0bSHerbert Xu 			return 0;
31*9e47a758SMark O'Donovan 		else
32*9e47a758SMark O'Donovan 			return -1;
33*9e47a758SMark O'Donovan 	}
342a598d0bSHerbert Xu 	if (u->sign)
352a598d0bSHerbert Xu 		return -1;
362a598d0bSHerbert Xu 	if (u->nlimbs > 1)
372a598d0bSHerbert Xu 		return 1;
382a598d0bSHerbert Xu 
392a598d0bSHerbert Xu 	if (u->d[0] == limb)
402a598d0bSHerbert Xu 		return 0;
412a598d0bSHerbert Xu 	else if (u->d[0] > limb)
422a598d0bSHerbert Xu 		return 1;
432a598d0bSHerbert Xu 	else
442a598d0bSHerbert Xu 		return -1;
452a598d0bSHerbert Xu }
462a598d0bSHerbert Xu EXPORT_SYMBOL_GPL(mpi_cmp_ui);
472a598d0bSHerbert Xu 
do_mpi_cmp(MPI u,MPI v,int absmode)482a598d0bSHerbert Xu static int do_mpi_cmp(MPI u, MPI v, int absmode)
492a598d0bSHerbert Xu {
502a598d0bSHerbert Xu 	mpi_size_t usize;
512a598d0bSHerbert Xu 	mpi_size_t vsize;
522a598d0bSHerbert Xu 	int usign;
532a598d0bSHerbert Xu 	int vsign;
542a598d0bSHerbert Xu 	int cmp;
552a598d0bSHerbert Xu 
562a598d0bSHerbert Xu 	mpi_normalize(u);
572a598d0bSHerbert Xu 	mpi_normalize(v);
582a598d0bSHerbert Xu 
592a598d0bSHerbert Xu 	usize = u->nlimbs;
602a598d0bSHerbert Xu 	vsize = v->nlimbs;
612a598d0bSHerbert Xu 	usign = absmode ? 0 : u->sign;
622a598d0bSHerbert Xu 	vsign = absmode ? 0 : v->sign;
632a598d0bSHerbert Xu 
642a598d0bSHerbert Xu 	/* Compare sign bits.  */
652a598d0bSHerbert Xu 
662a598d0bSHerbert Xu 	if (!usign && vsign)
672a598d0bSHerbert Xu 		return 1;
682a598d0bSHerbert Xu 	if (usign && !vsign)
692a598d0bSHerbert Xu 		return -1;
702a598d0bSHerbert Xu 
712a598d0bSHerbert Xu 	/* U and V are either both positive or both negative.  */
722a598d0bSHerbert Xu 
732a598d0bSHerbert Xu 	if (usize != vsize && !usign && !vsign)
742a598d0bSHerbert Xu 		return usize - vsize;
752a598d0bSHerbert Xu 	if (usize != vsize && usign && vsign)
762a598d0bSHerbert Xu 		return vsize + usize;
772a598d0bSHerbert Xu 	if (!usize)
782a598d0bSHerbert Xu 		return 0;
792a598d0bSHerbert Xu 	cmp = mpihelp_cmp(u->d, v->d, usize);
802a598d0bSHerbert Xu 	if (!cmp)
812a598d0bSHerbert Xu 		return 0;
822a598d0bSHerbert Xu 	if ((cmp < 0?1:0) == (usign?1:0))
832a598d0bSHerbert Xu 		return 1;
842a598d0bSHerbert Xu 
852a598d0bSHerbert Xu 	return -1;
862a598d0bSHerbert Xu }
872a598d0bSHerbert Xu 
mpi_cmp(MPI u,MPI v)882a598d0bSHerbert Xu int mpi_cmp(MPI u, MPI v)
892a598d0bSHerbert Xu {
902a598d0bSHerbert Xu 	return do_mpi_cmp(u, v, 0);
912a598d0bSHerbert Xu }
922a598d0bSHerbert Xu EXPORT_SYMBOL_GPL(mpi_cmp);
932a598d0bSHerbert Xu 
mpi_cmpabs(MPI u,MPI v)942a598d0bSHerbert Xu int mpi_cmpabs(MPI u, MPI v)
952a598d0bSHerbert Xu {
962a598d0bSHerbert Xu 	return do_mpi_cmp(u, v, 1);
972a598d0bSHerbert Xu }
982a598d0bSHerbert Xu EXPORT_SYMBOL_GPL(mpi_cmpabs);
99