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