protect method
Implementation
@override
CommandAPDU protect(final CommandAPDU cmd) {
_log.debug("Protecting APDU");
_log.verbose(" header=${cmd.rawHeader().hex()}");
_log.sdVerbose(" data=${cmd.data?.hex()}");
_log.verbose(" Le=${cmd.ne}");
// Increment SSC should be made before encrypting data
_ssc.increment();
final pcmd = maskCmd(cmd);
_log.verbose("masked APDU header=${pcmd.rawHeader().hex()}");
final dataDO = generateDataDO(pcmd);
_log.verbose("Generated data DO=${dataDO.hex()}");
final do97 = SecureMessaging.do97(pcmd.ne);
_log.verbose("Generated data DO97=${do97.hex()}, size=${do97.length}");
final M = generateM(cmd: pcmd, dataDO: dataDO, do97: do97);
_log.verbose("Generated M=${M.hex()} size=${M.length}");
final N = generateN(M: M);
_log.verbose("Generated N=${N.hex()} size=${N.length}");
_log.verbose(" used SSC=${_ssc.toBytes().hex()}");
final CC = cipher.mac(N);
final do8E = SecureMessaging.do8E(CC);
_log.verbose("Calculated CC=${CC.hex()}");
_log.verbose("Generated data DO8E=${do8E.hex()}");
pcmd.data = Uint8List.fromList(dataDO + do97 + do8E);
// The protected APDU uses 256 as the transport envelope. The requested
// plaintext read length is already preserved in DO97 above.
pcmd.ne = 256; // serialized as 0x00
return pcmd;
}