~ubuntu-branches/debian/jessie/armory/jessie

« back to all changes in this revision

Viewing changes to cppForSwig/cryptopp/hmac.cpp

  • Committer: Package Import Robot
  • Author(s): Joseph Bisch
  • Date: 2014-10-07 10:22:45 UTC
  • Revision ID: package-import@ubuntu.com-20141007102245-2s3x3rhjxg689hek
Tags: upstream-0.92.3
ImportĀ upstreamĀ versionĀ 0.92.3

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
// hmac.cpp - written and placed in the public domain by Wei Dai
 
2
 
 
3
#include "pch.h"
 
4
 
 
5
#ifndef CRYPTOPP_IMPORTS
 
6
 
 
7
#include "hmac.h"
 
8
 
 
9
NAMESPACE_BEGIN(CryptoPP)
 
10
 
 
11
void HMAC_Base::UncheckedSetKey(const byte *userKey, unsigned int keylength, const NameValuePairs &)
 
12
{
 
13
        AssertValidKeyLength(keylength);
 
14
 
 
15
        Restart();
 
16
 
 
17
        HashTransformation &hash = AccessHash();
 
18
        unsigned int blockSize = hash.BlockSize();
 
19
 
 
20
        if (!blockSize)
 
21
                throw InvalidArgument("HMAC: can only be used with a block-based hash function");
 
22
 
 
23
        m_buf.resize(2*AccessHash().BlockSize() + AccessHash().DigestSize());
 
24
 
 
25
        if (keylength <= blockSize)
 
26
                memcpy(AccessIpad(), userKey, keylength);
 
27
        else
 
28
        {
 
29
                AccessHash().CalculateDigest(AccessIpad(), userKey, keylength);
 
30
                keylength = hash.DigestSize();
 
31
        }
 
32
 
 
33
        assert(keylength <= blockSize);
 
34
        memset(AccessIpad()+keylength, 0, blockSize-keylength);
 
35
 
 
36
        for (unsigned int i=0; i<blockSize; i++)
 
37
        {
 
38
                AccessOpad()[i] = AccessIpad()[i] ^ 0x5c;
 
39
                AccessIpad()[i] ^= 0x36;
 
40
        }
 
41
}
 
42
 
 
43
void HMAC_Base::KeyInnerHash()
 
44
{
 
45
        assert(!m_innerHashKeyed);
 
46
        HashTransformation &hash = AccessHash();
 
47
        hash.Update(AccessIpad(), hash.BlockSize());
 
48
        m_innerHashKeyed = true;
 
49
}
 
50
 
 
51
void HMAC_Base::Restart()
 
52
{
 
53
        if (m_innerHashKeyed)
 
54
        {
 
55
                AccessHash().Restart();
 
56
                m_innerHashKeyed = false;
 
57
        }
 
58
}
 
59
 
 
60
void HMAC_Base::Update(const byte *input, size_t length)
 
61
{
 
62
        if (!m_innerHashKeyed)
 
63
                KeyInnerHash();
 
64
        AccessHash().Update(input, length);
 
65
}
 
66
 
 
67
void HMAC_Base::TruncatedFinal(byte *mac, size_t size)
 
68
{
 
69
        ThrowIfInvalidTruncatedSize(size);
 
70
 
 
71
        HashTransformation &hash = AccessHash();
 
72
 
 
73
        if (!m_innerHashKeyed)
 
74
                KeyInnerHash();
 
75
        hash.Final(AccessInnerHash());
 
76
 
 
77
        hash.Update(AccessOpad(), hash.BlockSize());
 
78
        hash.Update(AccessInnerHash(), hash.DigestSize());
 
79
        hash.TruncatedFinal(mac, size);
 
80
 
 
81
        m_innerHashKeyed = false;
 
82
}
 
83
 
 
84
NAMESPACE_END
 
85
 
 
86
#endif