protect method

  1. @override
CommandAPDU protect(
  1. CommandAPDU cmd
)
override

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;
}