diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-01-10 21:51:23 -0800 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-01-10 21:51:23 -0800 | 
| commit | e7691a1ce341c80ed9504244a36b31c025217391 (patch) | |
| tree | e9941bb350f64a726130e299c411821da6f41a53 /lib/mpi/generic_mpih-rshift.c | |
| parent | 5cd9599bba428762025db6027764f1c59d0b1e1b (diff) | |
| parent | 8fcc99549522fc7a0bbaeb5755855ab0d9a59ce8 (diff) | |
Merge branch 'for-linus' of git://selinuxproject.org/~jmorris/linux-security
* 'for-linus' of git://selinuxproject.org/~jmorris/linux-security: (32 commits)
  ima: fix invalid memory reference
  ima: free duplicate measurement memory
  security: update security_file_mmap() docs
  selinux: Casting (void *) value returned by kmalloc is useless
  apparmor: fix module parameter handling
  Security: tomoyo: add .gitignore file
  tomoyo: add missing rcu_dereference()
  apparmor: add missing rcu_dereference()
  evm: prevent racing during tfm allocation
  evm: key must be set once during initialization
  mpi/mpi-mpow: NULL dereference on allocation failure
  digsig: build dependency fix
  KEYS: Give key types their own lockdep class for key->sem
  TPM: fix transmit_cmd error logic
  TPM: NSC and TIS drivers X86 dependency fix
  TPM: Export wait_for_stat for other vendor specific drivers
  TPM: Use vendor specific function for status probe
  tpm_tis: add delay after aborting command
  tpm_tis: Check return code from getting timeouts/durations
  tpm: Introduce function to poll for result of self test
  ...
Fix up trivial conflict in lib/Makefile due to addition of CONFIG_MPI
and SIGSIG next to CONFIG_DQL addition.
Diffstat (limited to 'lib/mpi/generic_mpih-rshift.c')
| -rw-r--r-- | lib/mpi/generic_mpih-rshift.c | 63 | 
1 files changed, 63 insertions, 0 deletions
diff --git a/lib/mpi/generic_mpih-rshift.c b/lib/mpi/generic_mpih-rshift.c new file mode 100644 index 000000000000..ffa328818ca6 --- /dev/null +++ b/lib/mpi/generic_mpih-rshift.c @@ -0,0 +1,63 @@ +/* mpih-rshift.c  -  MPI helper functions + * Copyright (C) 1994, 1996, 1998, 1999, + *               2000, 2001 Free Software Foundation, Inc. + * + * This file is part of GNUPG + * + * GNUPG is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * GNUPG is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * Note: This code is heavily based on the GNU MP Library. + *	 Actually it's the same code with only minor changes in the + *	 way the data is stored; this is to support the abstraction + *	 of an optional secure memory allocation which may be used + *	 to avoid revealing of sensitive data due to paging etc. + *	 The GNU MP Library itself is published under the LGPL; + *	 however I decided to publish this code under the plain GPL. + */ + +#include "mpi-internal.h" + +/* Shift U (pointed to by UP and USIZE limbs long) CNT bits to the right + * and store the USIZE least significant limbs of the result at WP. + * The bits shifted out to the right are returned. + * + * Argument constraints: + * 1. 0 < CNT < BITS_PER_MP_LIMB + * 2. If the result is to be written over the input, WP must be <= UP. + */ + +mpi_limb_t +mpihelp_rshift(mpi_ptr_t wp, mpi_ptr_t up, mpi_size_t usize, unsigned cnt) +{ +	mpi_limb_t high_limb, low_limb; +	unsigned sh_1, sh_2; +	mpi_size_t i; +	mpi_limb_t retval; + +	sh_1 = cnt; +	wp -= 1; +	sh_2 = BITS_PER_MPI_LIMB - sh_1; +	high_limb = up[0]; +	retval = high_limb << sh_2; +	low_limb = high_limb; +	for (i = 1; i < usize; i++) { +		high_limb = up[i]; +		wp[i] = (low_limb >> sh_1) | (high_limb << sh_2); +		low_limb = high_limb; +	} +	wp[i] = low_limb >> sh_1; + +	return retval; +}  | 
