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