@@ -45,8 +45,8 @@ static void getCMACSubK1(const uint8_t *bufferL, uint8_t blockSize, uint8_t poly
45
45
RotateArrayLeft (bufferL , bufferOut , blockSize );
46
46
if ((bufferL [0 ] & 0x80 ) != 0 ) {
47
47
for (int kidx = 0 ; kidx < blockSize ; kidx ++ ) {
48
- bufferOut [kidx ] = (uint8_t ) (bufferOut [kidx ] ^ _cmac_RB [kidx ]);
49
- }
48
+ bufferOut [kidx ] = (uint8_t )(bufferOut [kidx ] ^ _cmac_RB [kidx ]);
49
+ }
50
50
}
51
51
}
52
52
@@ -56,8 +56,8 @@ static void getCMACSubK2(const uint8_t *bufferK1, uint8_t blockSize, uint8_t pol
56
56
RotateArrayLeft (bufferK1 , bufferOut , blockSize );
57
57
if ((bufferK1 [0 ] & 0x80 ) != 0 ) {
58
58
for (int kidx = 0 ; kidx < blockSize ; kidx ++ ) {
59
- bufferOut [kidx ] = (uint8_t ) (bufferOut [kidx ] ^ _cmac_RB [kidx ]);
60
- }
59
+ bufferOut [kidx ] = (uint8_t )(bufferOut [kidx ] ^ _cmac_RB [kidx ]);
60
+ }
61
61
}
62
62
}
63
63
@@ -66,32 +66,32 @@ static bool appendBufferCMACSubroutine(uint8_t cryptoType, const uint8_t *keyDat
66
66
uint16_t newBlockSize = bufferSize ;
67
67
if (bufferSize == 0 ) {
68
68
memset (bufferOut , 0x00 , blockSize );
69
- bufferOut [0 ] = (uint8_t ) 0x80 ;
70
- newBlockSize = blockSize ;
69
+ bufferOut [0 ] = (uint8_t ) 0x80 ;
70
+ newBlockSize = blockSize ;
71
71
} else if ((bufferSize % blockSize ) != 0 ) {
72
- newBlockSize = bufferSize - (bufferSize % blockSize ) + blockSize ;
72
+ newBlockSize = bufferSize - (bufferSize % blockSize ) + blockSize ;
73
73
bufferOut [bufferSize ] = (uint8_t ) 0x80 ;
74
74
}
75
75
if (bufferSize != 0 && (bufferSize % blockSize ) == 0 ) {
76
76
// Complete block (use K1):
77
- for (int i = bufferSize - blockSize ; i < bufferSize ; i ++ ) {
77
+ for (int i = bufferSize - blockSize ; i < bufferSize ; i ++ ) {
78
78
bufferOut [i ] ^= bufferK1 [i - bufferSize + blockSize ];
79
- }
79
+ }
80
80
} else {
81
81
// Incomplete block (use K2):
82
- for (int i = bufferSize - blockSize ; i < bufferSize ; i ++ ) {
82
+ for (int i = bufferSize - blockSize ; i < bufferSize ; i ++ ) {
83
83
bufferOut [i ] ^= bufferK2 [i - bufferSize + blockSize ];
84
- }
84
+ }
85
85
}
86
86
switch (cryptoType ) {
87
87
case CRYPTO_TYPE_3K3DES :
88
- Encrypt3DESBuffer (newBlockSize , bufferOut , bufferOut + bufferSize , keyData , bufferIV );
89
- break ;
90
- case CRYPTO_TYPE_AES128 :
91
- CryptoAESEncryptBuffer (newBlockSize , bufferOut , bufferOut + bufferSize , keyData , bufferIV );
92
- break ;
88
+ Encrypt3DESBuffer (newBlockSize , bufferOut , & bufferOut [ bufferSize ] , keyData , bufferIV );
89
+ break ;
90
+ case CRYPTO_TYPE_AES128 :
91
+ CryptoAESEncryptBuffer (newBlockSize , bufferOut , & bufferOut [ bufferSize ] , keyData , bufferIV );
92
+ break ;
93
93
default :
94
- return false;
94
+ return false;
95
95
}
96
96
memmove (& bufferOut [0 ], & bufferOut [newBlockSize ], newBlockSize );
97
97
memcpy (_cmac_final , & bufferOut [newBlockSize - blockSize ], blockSize );
@@ -103,40 +103,90 @@ bool appendBufferCMAC(uint8_t cryptoType, const uint8_t *keyData, uint8_t *buffe
103
103
uint8_t blockSize , rb ;
104
104
uint8_t * nistL = _cmac_K2 ;
105
105
switch (cryptoType ) {
106
- case CRYPTO_TYPE_3K3DES :
106
+ case CRYPTO_TYPE_3K3DES :
107
107
blockSize = CRYPTO_3KTDEA_BLOCK_SIZE ;
108
- rb = CRYPTO_CMAC_RB64 ;
109
- memset (_cmac_zeros , 0x00 , blockSize );
110
- Encrypt3DESBuffer (blockSize , _cmac_zeros , nistL , _cmac_zeros , keyData );
111
- break ;
112
- case CRYPTO_TYPE_AES128 :
108
+ rb = CRYPTO_CMAC_RB64 ;
109
+ memset (_cmac_zeros , 0x00 , blockSize );
110
+ Encrypt3DESBuffer (blockSize , _cmac_zeros , nistL , _cmac_zeros , keyData );
111
+ break ;
112
+ case CRYPTO_TYPE_AES128 :
113
113
blockSize = CRYPTO_AES_BLOCK_SIZE ;
114
- rb = CRYPTO_CMAC_RB128 ;
115
- memset (_cmac_zeros , 0x00 , blockSize );
116
- CryptoAESEncryptBuffer (blockSize , _cmac_zeros , nistL , _cmac_zeros , keyData );
117
- break ;
114
+ rb = CRYPTO_CMAC_RB128 ;
115
+ memset (_cmac_zeros , 0x00 , blockSize );
116
+ CryptoAESEncryptBuffer (blockSize , _cmac_zeros , nistL , _cmac_zeros , keyData );
117
+ break ;
118
118
default :
119
- return false;
119
+ return false;
120
120
}
121
121
getCMACSubK1 (nistL , blockSize , rb , _cmac_K1 );
122
122
getCMACSubK2 (_cmac_K1 , blockSize , rb , _cmac_K2 );
123
123
if (IV == NULL ) {
124
124
IV = _cmac_zeros ;
125
- memset (IV , 0x00 , blockSize );
126
- return appendBufferCMACSubroutine (cryptoType , keyData , _cmac_K1 , _cmac_K2 , IV , blockSize , bufferData , bufferSize );
125
+ memset (IV , 0x00 , blockSize );
126
+ return appendBufferCMACSubroutine (cryptoType , keyData , _cmac_K1 , _cmac_K2 , IV , blockSize , bufferData , bufferSize );
127
127
} else {
128
128
return appendBufferCMACSubroutine (cryptoType , keyData , _cmac_K1 , _cmac_K2 , IV , blockSize , bufferData , bufferSize );
129
129
}
130
130
}
131
131
132
+ bool checkBufferCMAC (uint8_t * bufferData , uint16_t bufferSize , uint16_t checksumSize ) {
133
+ if (checksumSize > bufferSize ) {
134
+ return false;
135
+ }
136
+ if (checksumSize == CRYPTO_3KTDEA_BLOCK_SIZE ) {
137
+ appendBufferCMAC (CRYPTO_TYPE_3K3DES , SessionKey , & bufferData [bufferSize ], bufferSize - checksumSize , SessionIV );
138
+ memcpy (_cmac_zeros , & bufferData [bufferSize ], checksumSize );
139
+ if (memcmp (_cmac_zeros , & bufferData [bufferSize - checksumSize ], checksumSize )) {
140
+ return false;
141
+ }
142
+ return true;
143
+ } else if (checksumSize == CRYPTO_AES_BLOCK_SIZE ) {
144
+ appendBufferCMAC (CRYPTO_TYPE_AES128 , SessionKey , & bufferData [bufferSize ], bufferSize - checksumSize , SessionIV );
145
+ memcpy (_cmac_zeros , & bufferData [bufferSize ], checksumSize );
146
+ if (memcmp (_cmac_zeros , & bufferData [bufferSize - checksumSize ], checksumSize )) {
147
+ return false;
148
+ }
149
+ return true;
150
+ }
151
+ return false;
152
+ }
153
+
132
154
uint16_t appendBufferMAC (const uint8_t * keyData , uint8_t * bufferData , uint16_t bufferSize ) {
133
155
memcpy (& _mac_key24 [2 * CRYPTO_DES_BLOCK_SIZE ], keyData , CRYPTO_DES_BLOCK_SIZE );
134
156
memcpy (& _mac_key24 [CRYPTO_DES_BLOCK_SIZE ], keyData , CRYPTO_DES_BLOCK_SIZE );
135
157
memcpy (& _mac_key24 [0 ], keyData , CRYPTO_DES_BLOCK_SIZE );
136
158
memset (& _cmac_zeros [0 ], 0x00 , CRYPTO_DES_BLOCK_SIZE );
137
- Encrypt3DESBuffer (bufferSize , bufferData , & bufferData [3 * CRYPTO_DES_BLOCK_SIZE ], _cmac_zeros , keyData );
159
+ uint16_t paddedBufferSize = bufferSize ;
160
+ if ((bufferSize % CRYPTO_DES_BLOCK_SIZE ) != 0 ) {
161
+ paddedBufferSize = bufferSize + CRYPTO_DES_BLOCK_SIZE - (bufferSize % CRYPTO_DES_BLOCK_SIZE );
162
+ memset (& bufferData [bufferSize ], 0x00 , paddedBufferSize - bufferSize );
163
+ }
164
+ Encrypt3DESBuffer (paddedBufferSize , bufferData , & bufferData [paddedBufferSize ], _cmac_zeros , keyData );
138
165
// Copy the 4-byte MAC from the ciphertext (end of the bufferData array):
139
- memcpy (& _cmac_zeros [0 ], & bufferData [3 * CRYPTO_DES_BLOCK_SIZE + bufferSize - CRYPTO_DES_BLOCK_SIZE ], 4 );
166
+ memcpy (& _cmac_zeros [0 ], & bufferData [paddedBufferSize - CRYPTO_DES_BLOCK_SIZE ], 4 );
140
167
memcpy (& bufferData [bufferSize ], & _cmac_zeros [0 ], 4 );
141
168
return bufferSize + 4 ;
142
169
}
170
+
171
+ bool checkBufferMAC (uint8_t * bufferData , uint16_t bufferSize , uint16_t checksumSize ) {
172
+ if (checksumSize > bufferSize ) {
173
+ return false;
174
+ }
175
+ const uint8_t * keyData = SessionKey ;
176
+ memcpy (& _mac_key24 [2 * CRYPTO_DES_BLOCK_SIZE ], keyData , CRYPTO_DES_BLOCK_SIZE );
177
+ memcpy (& _mac_key24 [CRYPTO_DES_BLOCK_SIZE ], keyData , CRYPTO_DES_BLOCK_SIZE );
178
+ memcpy (& _mac_key24 [0 ], keyData , CRYPTO_DES_BLOCK_SIZE );
179
+ memset (& _cmac_zeros [0 ], 0x00 , CRYPTO_DES_BLOCK_SIZE );
180
+ uint16_t paddedBufferSize = bufferSize ;
181
+ if ((bufferSize % CRYPTO_DES_BLOCK_SIZE ) != 0 ) {
182
+ paddedBufferSize = bufferSize + CRYPTO_DES_BLOCK_SIZE - (bufferSize % CRYPTO_DES_BLOCK_SIZE );
183
+ memset (& bufferData [bufferSize ], 0x00 , paddedBufferSize - bufferSize );
184
+ }
185
+ Encrypt3DESBuffer (paddedBufferSize , bufferData , & bufferData [paddedBufferSize ], _cmac_zeros , keyData );
186
+ // Copy the 4-byte MAC from the ciphertext (end of the bufferData array):
187
+ memcpy (& _cmac_zeros [0 ], & bufferData [paddedBufferSize - CRYPTO_DES_BLOCK_SIZE ], 4 );
188
+ if (memcmp (& bufferData [bufferSize - checksumSize ], & _cmac_zeros [0 ], 4 )) {
189
+ return false;
190
+ }
191
+ return true;
192
+ }
0 commit comments