@@ -152,30 +152,48 @@ uint16_t DesfirePreprocessAPDU(uint8_t CommMode, uint8_t *Buffer, uint16_t Buffe
152
152
// Remove the CRCA bytes at the end of the buffer:
153
153
return MAX (0 , BufferSize - 2 );
154
154
case DESFIRE_COMMS_PLAINTEXT_MAC : {
155
- // TODO: We are not checking the MAC/CMAC bytes for consistency yet ...
156
155
uint16_t ChecksumBytes = 0 ;
157
156
if (DesfireCommandState .CryptoMethodType == CRYPTO_TYPE_DES || DesfireCommandState .CryptoMethodType == CRYPTO_TYPE_2KTDEA ) {
158
157
ChecksumBytes = 4 ;
158
+ if (!checkBufferMAC (Buffer , BufferSize , ChecksumBytes )) {
159
+ return 0 ;
160
+ }
159
161
}
160
162
else if (DesfireCommandState .CryptoMethodType == CRYPTO_TYPE_3K3DES ) {
161
163
ChecksumBytes = CRYPTO_3KTDEA_BLOCK_SIZE ;
164
+ if (!checkBufferCMAC (Buffer , BufferSize , ChecksumBytes )) {
165
+ return 0 ;
166
+ }
162
167
} else {
163
- ChecksumBytes = CRYPTO_AES128_BLOCK_SIZE ;
168
+ ChecksumBytes = CRYPTO_AES_BLOCK_SIZE ;
169
+ if (!checkBufferCMAC (Buffer , BufferSize , ChecksumBytes )) {
170
+ return 0 ;
171
+ }
164
172
}
165
173
return MAX (0 , BufferSize - ChecksumBytes );
166
174
}
167
175
case DESFIRE_COMMS_CIPHERTEXT_DES : {
168
- // TODO ...
169
- break ;
176
+ Decrypt3DESBuffer (BufferSize , Buffer , & Buffer [BufferSize ], SessionIV , SessionKey );
177
+ memmove (& Buffer [0 ], & Buffer [BufferSize ], BufferSize );
178
+ uint16_t ChecksumBytes = CRYPTO_3KTDEA_BLOCK_SIZE ;
179
+ if (!checkBufferCMAC (Buffer , BufferSize , ChecksumBytes )) {
180
+ return 0 ;
181
+ }
182
+ return MAX (0 , BufferSize - ChecksumBytes );
170
183
}
171
184
case DESFIRE_COMMS_CIPHERTEXT_AES128 : {
172
- // TODO ...
173
- break ;
185
+ CryptoAESDecryptBuffer (BufferSize , Buffer , & Buffer [BufferSize ], SessionIV , SessionKey );
186
+ memmove (& Buffer [0 ], & Buffer [BufferSize ], BufferSize );
187
+ uint16_t ChecksumBytes = CRYPTO_AES_BLOCK_SIZE ;
188
+ if (!checkBufferCMAC (Buffer , BufferSize , ChecksumBytes )) {
189
+ return 0 ;
190
+ }
191
+ return MAX (0 , BufferSize - ChecksumBytes );
174
192
}
175
193
default :
176
194
break ;
177
195
}
178
- return BufferSize ;
196
+ return 0 ;
179
197
}
180
198
181
199
uint16_t DesfirePostprocessAPDU (uint8_t CommMode , uint8_t * Buffer , uint16_t BufferSize ) {
@@ -224,7 +242,7 @@ uint16_t DesfirePostprocessAPDU(uint8_t CommMode, uint8_t *Buffer, uint16_t Buff
224
242
default :
225
243
break ;
226
244
}
227
- return BufferSize ;
245
+ return 0 ;
228
246
}
229
247
230
248
#endif /* CONFIG_MF_DESFIRE_SUPPORT */
0 commit comments