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