source: git/src-cryptopp/words.h

Last change on this file was e230cb0, checked in by David Stainton <dstainton415@…>, at 2016-10-12T13:27:29Z

Add cryptopp from tag CRYPTOPP_5_6_5

  • Property mode set to 100644
File size: 2.1 KB
Line 
1#ifndef CRYPTOPP_WORDS_H
2#define CRYPTOPP_WORDS_H
3
4#include "config.h"
5#include "misc.h"
6
7NAMESPACE_BEGIN(CryptoPP)
8
9inline size_t CountWords(const word *X, size_t N)
10{
11        while (N && X[N-1]==0)
12                N--;
13        return N;
14}
15
16inline void SetWords(word *r, word a, size_t n)
17{
18        for (size_t i=0; i<n; i++)
19                r[i] = a;
20}
21
22inline void CopyWords(word *r, const word *a, size_t n)
23{
24        if (r != a)
25#if CRYPTOPP_MSC_VERSION
26                memcpy_s(r, n*WORD_SIZE, a, n*WORD_SIZE);
27#else
28                memcpy(r, a, n*WORD_SIZE);
29#endif
30}
31
32inline void XorWords(word *r, const word *a, const word *b, size_t n)
33{
34        for (size_t i=0; i<n; i++)
35                r[i] = a[i] ^ b[i];
36}
37
38inline void XorWords(word *r, const word *a, size_t n)
39{
40        for (size_t i=0; i<n; i++)
41                r[i] ^= a[i];
42}
43
44inline void AndWords(word *r, const word *a, const word *b, size_t n)
45{
46        for (size_t i=0; i<n; i++)
47                r[i] = a[i] & b[i];
48}
49
50inline void AndWords(word *r, const word *a, size_t n)
51{
52        for (size_t i=0; i<n; i++)
53                r[i] &= a[i];
54}
55
56inline word ShiftWordsLeftByBits(word *r, size_t n, unsigned int shiftBits)
57{
58        CRYPTOPP_ASSERT (shiftBits<WORD_BITS);
59        word u, carry=0;
60        if (shiftBits)
61                for (size_t i=0; i<n; i++)
62                {
63                        u = r[i];
64                        r[i] = (u << shiftBits) | carry;
65                        carry = u >> (WORD_BITS-shiftBits);
66                }
67        return carry;
68}
69
70inline word ShiftWordsRightByBits(word *r, size_t n, unsigned int shiftBits)
71{
72        CRYPTOPP_ASSERT (shiftBits<WORD_BITS);
73        word u, carry=0;
74        if (shiftBits)
75                for (size_t i=n; i>0; i--)
76                {
77                        u = r[i-1];
78                        r[i-1] = (u >> shiftBits) | carry;
79                        carry = u << (WORD_BITS-shiftBits);
80                }
81        return carry;
82}
83
84inline void ShiftWordsLeftByWords(word *r, size_t n, size_t shiftWords)
85{
86        shiftWords = STDMIN(shiftWords, n);
87        if (shiftWords)
88        {
89                for (size_t i=n-1; i>=shiftWords; i--)
90                        r[i] = r[i-shiftWords];
91                SetWords(r, 0, shiftWords);
92        }
93}
94
95inline void ShiftWordsRightByWords(word *r, size_t n, size_t shiftWords)
96{
97        shiftWords = STDMIN(shiftWords, n);
98        if (shiftWords)
99        {
100                for (size_t i=0; i+shiftWords<n; i++)
101                        r[i] = r[i+shiftWords];
102                SetWords(r+n-shiftWords, 0, shiftWords);
103        }
104}
105
106NAMESPACE_END
107
108#endif
Note: See TracBrowser for help on using the repository browser.