blob: dd8babd5df417ec11fa2d9367fdbaffe087066ec [file] [log] [blame]
khenaidood948f772021-08-11 17:49:24 -04001package crypto
2
3import (
4 "crypto/aes"
5 "crypto/hmac"
6 "crypto/sha1"
7 "hash"
8
9 "github.com/jcmturner/gokrb5/v8/crypto/common"
10 "github.com/jcmturner/gokrb5/v8/crypto/rfc3961"
11 "github.com/jcmturner/gokrb5/v8/crypto/rfc3962"
12 "github.com/jcmturner/gokrb5/v8/iana/chksumtype"
13 "github.com/jcmturner/gokrb5/v8/iana/etypeID"
14)
15
16// RFC 3962
17
18// Aes128CtsHmacSha96 implements Kerberos encryption type aes128-cts-hmac-sha1-96
19type Aes128CtsHmacSha96 struct {
20}
21
22// GetETypeID returns the EType ID number.
23func (e Aes128CtsHmacSha96) GetETypeID() int32 {
24 return etypeID.AES128_CTS_HMAC_SHA1_96
25}
26
27// GetHashID returns the checksum type ID number.
28func (e Aes128CtsHmacSha96) GetHashID() int32 {
29 return chksumtype.HMAC_SHA1_96_AES128
30}
31
32// GetKeyByteSize returns the number of bytes for key of this etype.
33func (e Aes128CtsHmacSha96) GetKeyByteSize() int {
34 return 128 / 8
35}
36
37// GetKeySeedBitLength returns the number of bits for the seed for key generation.
38func (e Aes128CtsHmacSha96) GetKeySeedBitLength() int {
39 return e.GetKeyByteSize() * 8
40}
41
42// GetHashFunc returns the hash function for this etype.
43func (e Aes128CtsHmacSha96) GetHashFunc() func() hash.Hash {
44 return sha1.New
45}
46
47// GetMessageBlockByteSize returns the block size for the etype's messages.
48func (e Aes128CtsHmacSha96) GetMessageBlockByteSize() int {
49 return 1
50}
51
52// GetDefaultStringToKeyParams returns the default key derivation parameters in string form.
53func (e Aes128CtsHmacSha96) GetDefaultStringToKeyParams() string {
54 return "00001000"
55}
56
57// GetConfounderByteSize returns the byte count for confounder to be used during cryptographic operations.
58func (e Aes128CtsHmacSha96) GetConfounderByteSize() int {
59 return aes.BlockSize
60}
61
62// GetHMACBitLength returns the bit count size of the integrity hash.
63func (e Aes128CtsHmacSha96) GetHMACBitLength() int {
64 return 96
65}
66
67// GetCypherBlockBitLength returns the bit count size of the cypher block.
68func (e Aes128CtsHmacSha96) GetCypherBlockBitLength() int {
69 return aes.BlockSize * 8
70}
71
72// StringToKey returns a key derived from the string provided.
73func (e Aes128CtsHmacSha96) StringToKey(secret string, salt string, s2kparams string) ([]byte, error) {
74 return rfc3962.StringToKey(secret, salt, s2kparams, e)
75}
76
77// RandomToKey returns a key from the bytes provided.
78func (e Aes128CtsHmacSha96) RandomToKey(b []byte) []byte {
79 return rfc3961.RandomToKey(b)
80}
81
82// EncryptData encrypts the data provided.
83func (e Aes128CtsHmacSha96) EncryptData(key, data []byte) ([]byte, []byte, error) {
84 return rfc3962.EncryptData(key, data, e)
85}
86
87// EncryptMessage encrypts the message provided and concatenates it with the integrity hash to create an encrypted message.
88func (e Aes128CtsHmacSha96) EncryptMessage(key, message []byte, usage uint32) ([]byte, []byte, error) {
89 return rfc3962.EncryptMessage(key, message, usage, e)
90}
91
92// DecryptData decrypts the data provided.
93func (e Aes128CtsHmacSha96) DecryptData(key, data []byte) ([]byte, error) {
94 return rfc3962.DecryptData(key, data, e)
95}
96
97// DecryptMessage decrypts the message provided and verifies the integrity of the message.
98func (e Aes128CtsHmacSha96) DecryptMessage(key, ciphertext []byte, usage uint32) ([]byte, error) {
99 return rfc3962.DecryptMessage(key, ciphertext, usage, e)
100}
101
102// DeriveKey derives a key from the protocol key based on the usage value.
103func (e Aes128CtsHmacSha96) DeriveKey(protocolKey, usage []byte) ([]byte, error) {
104 return rfc3961.DeriveKey(protocolKey, usage, e)
105}
106
107// DeriveRandom generates data needed for key generation.
108func (e Aes128CtsHmacSha96) DeriveRandom(protocolKey, usage []byte) ([]byte, error) {
109 return rfc3961.DeriveRandom(protocolKey, usage, e)
110}
111
112// VerifyIntegrity checks the integrity of the plaintext message.
113func (e Aes128CtsHmacSha96) VerifyIntegrity(protocolKey, ct, pt []byte, usage uint32) bool {
114 return rfc3961.VerifyIntegrity(protocolKey, ct, pt, usage, e)
115}
116
117// GetChecksumHash returns a keyed checksum hash of the bytes provided.
118func (e Aes128CtsHmacSha96) GetChecksumHash(protocolKey, data []byte, usage uint32) ([]byte, error) {
119 return common.GetHash(data, protocolKey, common.GetUsageKc(usage), e)
120}
121
122// VerifyChecksum compares the checksum of the message bytes is the same as the checksum provided.
123func (e Aes128CtsHmacSha96) VerifyChecksum(protocolKey, data, chksum []byte, usage uint32) bool {
124 c, err := e.GetChecksumHash(protocolKey, data, usage)
125 if err != nil {
126 return false
127 }
128 return hmac.Equal(chksum, c)
129}