Coverage Report

Created: 2022-12-08 06:09

/src/libgcrypt/mpi/mpi-scan.c
Line
Count
Source (jump to first uncovered line)
1
/* mpi-scan.c  -  MPI functions
2
 *  Copyright (C) 1998, 2001, 2002, 2003 Free Software Foundation, Inc.
3
 *
4
 * This file is part of Libgcrypt.
5
 *
6
 * Libgcrypt is free software; you can redistribute it and/or modify
7
 * it under the terms of the GNU Lesser General Public License as
8
 * published by the Free Software Foundation; either version 2.1 of
9
 * the License, or (at your option) any later version.
10
 *
11
 * Libgcrypt 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 Lesser General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU Lesser General Public
17
 * License 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 <config.h>
22
#include <stdio.h>
23
#include <stdlib.h>
24
#include "mpi-internal.h"
25
#include "longlong.h"
26
27
/****************
28
 * Scan through an mpi and return byte for byte. a -1 is returned to indicate
29
 * the end of the mpi. Scanning is done from the lsb to the msb, returned
30
 * values are in the range of 0 .. 255.
31
 *
32
 * FIXME: This code is VERY ugly!
33
 */
34
/* int */
35
/* _gcry_mpi_getbyte( gcry_mpi_t a, unsigned idx ) */
36
/* { */
37
/*     int i, j; */
38
/*     unsigned n; */
39
/*     mpi_ptr_t ap; */
40
/*     mpi_limb_t limb; */
41
42
/*     ap = a->d; */
43
/*     for(n=0,i=0; i < a->nlimbs; i++ ) { */
44
/*  limb = ap[i]; */
45
/*  for( j=0; j < BYTES_PER_MPI_LIMB; j++, n++ ) */
46
/*      if( n == idx ) */
47
/*    return (limb >> j*8) & 0xff; */
48
/*     } */
49
/*     return -1; */
50
/* } */
51
52
53
/****************
54
 * Put a value at position IDX into A. idx counts from lsb to msb
55
 */
56
/* void */
57
/* _gcry_mpi_putbyte( gcry_mpi_t a, unsigned idx, int xc ) */
58
/* { */
59
/*     int i, j; */
60
/*     unsigned n; */
61
/*     mpi_ptr_t ap; */
62
/*     mpi_limb_t limb, c; */
63
64
/*     c = xc & 0xff; */
65
/*     ap = a->d; */
66
/*     for(n=0,i=0; i < a->alloced; i++ ) { */
67
/*  limb = ap[i]; */
68
/*  for( j=0; j < BYTES_PER_MPI_LIMB; j++, n++ ) */
69
/*      if( n == idx ) { */
70
/*        #if BYTES_PER_MPI_LIMB == 4 */
71
/*    if( j == 0 ) */
72
/*        limb = (limb & 0xffffff00) | c; */
73
/*    else if( j == 1 ) */
74
/*        limb = (limb & 0xffff00ff) | (c<<8); */
75
/*    else if( j == 2 ) */
76
/*        limb = (limb & 0xff00ffff) | (c<<16); */
77
/*    else */
78
/*        limb = (limb & 0x00ffffff) | (c<<24); */
79
/*        #elif BYTES_PER_MPI_LIMB == 8 */
80
/*    if( j == 0 ) */
81
/*        limb = (limb & 0xffffffffffffff00) | c; */
82
/*    else if( j == 1 ) */
83
/*        limb = (limb & 0xffffffffffff00ff) | (c<<8); */
84
/*    else if( j == 2 ) */
85
/*        limb = (limb & 0xffffffffff00ffff) | (c<<16); */
86
/*    else if( j == 3 ) */
87
/*        limb = (limb & 0xffffffff00ffffff) | (c<<24); */
88
/*    else if( j == 4 ) */
89
/*        limb = (limb & 0xffffff00ffffffff) | (c<<32); */
90
/*    else if( j == 5 ) */
91
/*        limb = (limb & 0xffff00ffffffffff) | (c<<40); */
92
/*    else if( j == 6 ) */
93
/*        limb = (limb & 0xff00ffffffffffff) | (c<<48); */
94
/*    else */
95
/*        limb = (limb & 0x00ffffffffffffff) | (c<<56); */
96
/*        #else */
97
/*     #error please enhance this function, its ugly - i know. */
98
/*        #endif */
99
/*    if( a->nlimbs <= i ) */
100
/*        a->nlimbs = i+1; */
101
/*    ap[i] = limb; */
102
/*    return; */
103
/*      } */
104
/*     } */
105
/*     abort(); /\* index out of range *\/ */
106
/* } */
107
108
109
/****************
110
 * Count the number of zerobits at the low end of A
111
 */
112
unsigned
113
_gcry_mpi_trailing_zeros( gcry_mpi_t a )
114
0
{
115
0
    unsigned n, count = 0;
116
117
0
    for(n=0; n < a->nlimbs; n++ ) {
118
0
  if( a->d[n] ) {
119
0
      unsigned nn;
120
0
      mpi_limb_t alimb = a->d[n];
121
122
0
      count_trailing_zeros( nn, alimb );
123
0
      count += nn;
124
0
      break;
125
0
  }
126
0
  count += BITS_PER_MPI_LIMB;
127
0
    }
128
0
    return count;
129
130
0
}