// SPDX-License-Identifier: GPL-2.0-or-later1/* mpih-rshift.c - MPI helper functions2* Copyright (C) 1994, 1996, 1998, 1999,3* 2000, 2001 Free Software Foundation, Inc.4*5* This file is part of GNUPG6*7* Note: This code is heavily based on the GNU MP Library.8* Actually it's the same code with only minor changes in the9* way the data is stored; this is to support the abstraction10* of an optional secure memory allocation which may be used11* to avoid revealing of sensitive data due to paging etc.12* The GNU MP Library itself is published under the LGPL;13* however I decided to publish this code under the plain GPL.14*/1516#include "mpi-internal.h"1718/* Shift U (pointed to by UP and USIZE limbs long) CNT bits to the right19* and store the USIZE least significant limbs of the result at WP.20* The bits shifted out to the right are returned.21*22* Argument constraints:23* 1. 0 < CNT < BITS_PER_MP_LIMB24* 2. If the result is to be written over the input, WP must be <= UP.25*/2627mpi_limb_t28mpihelp_rshift(mpi_ptr_t wp, mpi_ptr_t up, mpi_size_t usize, unsigned cnt)29{30mpi_limb_t high_limb, low_limb;31unsigned sh_1, sh_2;32mpi_size_t i;33mpi_limb_t retval;3435sh_1 = cnt;36wp -= 1;37sh_2 = BITS_PER_MPI_LIMB - sh_1;38high_limb = up[0];39retval = high_limb << sh_2;40low_limb = high_limb;41for (i = 1; i < usize; i++) {42high_limb = up[i];43wp[i] = (low_limb >> sh_1) | (high_limb << sh_2);44low_limb = high_limb;45}46wp[i] = low_limb >> sh_1;4748return retval;49}505152