00001 #ifndef CRYPTOPP_WORDS_H 00002 #define CRYPTOPP_WORDS_H 00003 00004 #include "misc.h" 00005 00006 NAMESPACE_BEGIN(CryptoPP) 00007 00008 inline size_t CountWords(const word *X, size_t N) 00009 { 00010 while (N && X[N-1]==0) 00011 N--; 00012 return N; 00013 } 00014 00015 inline void SetWords(word *r, word a, size_t n) 00016 { 00017 for (size_t i=0; i<n; i++) 00018 r[i] = a; 00019 } 00020 00021 inline void CopyWords(word *r, const word *a, size_t n) 00022 { 00023 if (r != a) 00024 memcpy(r, a, n*WORD_SIZE); 00025 } 00026 00027 inline void XorWords(word *r, const word *a, const word *b, size_t n) 00028 { 00029 for (size_t i=0; i<n; i++) 00030 r[i] = a[i] ^ b[i]; 00031 } 00032 00033 inline void XorWords(word *r, const word *a, size_t n) 00034 { 00035 for (size_t i=0; i<n; i++) 00036 r[i] ^= a[i]; 00037 } 00038 00039 inline void AndWords(word *r, const word *a, const word *b, size_t n) 00040 { 00041 for (size_t i=0; i<n; i++) 00042 r[i] = a[i] & b[i]; 00043 } 00044 00045 inline void AndWords(word *r, const word *a, size_t n) 00046 { 00047 for (size_t i=0; i<n; i++) 00048 r[i] &= a[i]; 00049 } 00050 00051 inline word ShiftWordsLeftByBits(word *r, size_t n, unsigned int shiftBits) 00052 { 00053 assert (shiftBits<WORD_BITS); 00054 word u, carry=0; 00055 if (shiftBits) 00056 for (size_t i=0; i<n; i++) 00057 { 00058 u = r[i]; 00059 r[i] = (u << shiftBits) | carry; 00060 carry = u >> (WORD_BITS-shiftBits); 00061 } 00062 return carry; 00063 } 00064 00065 inline word ShiftWordsRightByBits(word *r, size_t n, unsigned int shiftBits) 00066 { 00067 assert (shiftBits<WORD_BITS); 00068 word u, carry=0; 00069 if (shiftBits) 00070 for (size_t i=n; i>0; i--) 00071 { 00072 u = r[i-1]; 00073 r[i-1] = (u >> shiftBits) | carry; 00074 carry = u << (WORD_BITS-shiftBits); 00075 } 00076 return carry; 00077 } 00078 00079 inline void ShiftWordsLeftByWords(word *r, size_t n, size_t shiftWords) 00080 { 00081 shiftWords = STDMIN(shiftWords, n); 00082 if (shiftWords) 00083 { 00084 for (size_t i=n-1; i>=shiftWords; i--) 00085 r[i] = r[i-shiftWords]; 00086 SetWords(r, 0, shiftWords); 00087 } 00088 } 00089 00090 inline void ShiftWordsRightByWords(word *r, size_t n, size_t shiftWords) 00091 { 00092 shiftWords = STDMIN(shiftWords, n); 00093 if (shiftWords) 00094 { 00095 for (size_t i=0; i+shiftWords<n; i++) 00096 r[i] = r[i+shiftWords]; 00097 SetWords(r+n-shiftWords, 0, shiftWords); 00098 } 00099 } 00100 00101 NAMESPACE_END 00102 00103 #endif