MlDsaSigningMessage.fromBytes constructor

MlDsaSigningMessage.fromBytes(
  1. Uint8List bytes
)

Implementation

factory MlDsaSigningMessage.fromBytes(Uint8List bytes) {
  if (bytes.length < pqthHeaderLength + 1 + 16 + 2 + 32 + 4) {
    throw SerializationError('ML-DSA signing message too short');
  }
  for (var i = 0; i < pqthMagicBytes.length; i++) {
    if (bytes[i] != pqthMagicBytes[i]) {
      throw SerializationError('Invalid PQTH magic in ML-DSA message');
    }
  }
  final version = bytes[4];
  if (version != pqthFormatVersion) {
    throw SerializationError('Unsupported ML-DSA message version: $version');
  }
  final kind = bytes[5];
  if (kind != MlDsaWireKind.round1 &&
      kind != MlDsaWireKind.round2 &&
      kind != MlDsaWireKind.round3) {
    throw SerializationError('Invalid ML-DSA wire kind: 0x${kind.toRadixString(16)}');
  }
  final schemeOrdinal =
      bytes.buffer.asByteData(bytes.offsetInBytes).getUint16(6, Endian.big);
  final scheme = schemeIdFromWireOrdinal(schemeOrdinal);
  final subKind = bytes[8];
  final ceremonyId = Uint8List.sublistView(bytes, 9, 25);
  final senderIndex =
      bytes.buffer.asByteData(bytes.offsetInBytes).getUint16(25, Endian.big);
  final sessionId = Uint8List.sublistView(bytes, 27, 59);
  final payloadLen =
      bytes.buffer.asByteData(bytes.offsetInBytes).getUint32(59, Endian.big);
  const payloadStart = 63;
  if (bytes.length < payloadStart + payloadLen) {
    throw SerializationError('Truncated ML-DSA message payload');
  }
  final payload =
      Uint8List.sublistView(bytes, payloadStart, payloadStart + payloadLen);
  return MlDsaSigningMessage._(
    kind: kind,
    subKind: subKind,
    scheme: scheme,
    ceremonyId: ceremonyId,
    senderIndex: senderIndex,
    sessionId: sessionId,
    payload: payload,
    wireBytes: bytes,
  );
}