MlDsaSigningMessage.fromBytes constructor
MlDsaSigningMessage.fromBytes(
- 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,
);
}