1#ifndef CRYPTOPP_WORDS_H
2#define CRYPTOPP_WORDS_H
3
4#include "misc.h"
5
6NAMESPACE_BEGIN(CryptoPP)
7
8inline size_t CountWords(const word *X, size_t N)
9{
10	while (N && X[N-1]==0)
11		N--;
12	return N;
13}
14
15inline 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
21inline void CopyWords(word *r, const word *a, size_t n)
22{
23	if (r != a)
24		memcpy(r, a, n*WORD_SIZE);
25}
26
27inline 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
33inline 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
39inline 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
45inline 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
51inline 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
65inline 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
79inline 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
90inline 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
101NAMESPACE_END
102
103#endif
104