Crypto++
words.h
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