Crypto++
words.h
1 #ifndef CRYPTOPP_WORDS_H
2 #define CRYPTOPP_WORDS_H
3 
4 #include "misc.h"
5 
6 NAMESPACE_BEGIN(CryptoPP)
7 
8 inline size_t CountWords(const word *X, size_t N)
9 {
10  while (N && X[N-1]==0)
11  N--;
12  return N;
13 }
14 
15 inline void SetWords(word *r, word a, size_t n)
16 {
17  for (size_t i=0; i<n; i++)
18  r[i] = a;
19 }
20 
21 inline void CopyWords(word *r, const word *a, size_t n)
22 {
23  if (r != a)
24  memcpy(r, a, n*WORD_SIZE);
25 }
26 
27 inline void XorWords(word *r, const word *a, const word *b, size_t n)
28 {
29  for (size_t i=0; i<n; i++)
30  r[i] = a[i] ^ b[i];
31 }
32 
33 inline void XorWords(word *r, const word *a, size_t n)
34 {
35  for (size_t i=0; i<n; i++)
36  r[i] ^= a[i];
37 }
38 
39 inline void AndWords(word *r, const word *a, const word *b, size_t n)
40 {
41  for (size_t i=0; i<n; i++)
42  r[i] = a[i] & b[i];
43 }
44 
45 inline void AndWords(word *r, const word *a, size_t n)
46 {
47  for (size_t i=0; i<n; i++)
48  r[i] &= a[i];
49 }
50 
51 inline word ShiftWordsLeftByBits(word *r, size_t n, unsigned int shiftBits)
52 {
53  assert (shiftBits<WORD_BITS);
54  word u, carry=0;
55  if (shiftBits)
56  for (size_t i=0; i<n; i++)
57  {
58  u = r[i];
59  r[i] = (u << shiftBits) | carry;
60  carry = u >> (WORD_BITS-shiftBits);
61  }
62  return carry;
63 }
64 
65 inline word ShiftWordsRightByBits(word *r, size_t n, unsigned int shiftBits)
66 {
67  assert (shiftBits<WORD_BITS);
68  word u, carry=0;
69  if (shiftBits)
70  for (size_t i=n; i>0; i--)
71  {
72  u = r[i-1];
73  r[i-1] = (u >> shiftBits) | carry;
74  carry = u << (WORD_BITS-shiftBits);
75  }
76  return carry;
77 }
78 
79 inline void ShiftWordsLeftByWords(word *r, size_t n, size_t shiftWords)
80 {
81  shiftWords = STDMIN(shiftWords, n);
82  if (shiftWords)
83  {
84  for (size_t i=n-1; i>=shiftWords; i--)
85  r[i] = r[i-shiftWords];
86  SetWords(r, 0, shiftWords);
87  }
88 }
89 
90 inline void ShiftWordsRightByWords(word *r, size_t n, size_t shiftWords)
91 {
92  shiftWords = STDMIN(shiftWords, n);
93  if (shiftWords)
94  {
95  for (size_t i=0; i+shiftWords<n; i++)
96  r[i] = r[i+shiftWords];
97  SetWords(r+n-shiftWords, 0, shiftWords);
98  }
99 }
100 
101 NAMESPACE_END
102 
103 #endif