parse static method
Implementation
static ServerHello parse(QuicBuffer buf) {
final legacyVersion = buf.pullUint16();
final random = buf.pullBytes(32);
final sidLen = buf.pullUint8();
final sessionId = buf.pullBytes(sidLen);
final cipherSuite = buf.pullUint16();
final compression = buf.pullUint8();
// ----------------------------
// Parse extensions block
// ----------------------------
final extLen = buf.pullUint16();
final extEnd = buf.readOffset + extLen;
int? version;
ParsedKeyShare? keyShare;
final raw = <int, Uint8List>{};
while (buf.readOffset < extEnd) {
final extType = buf.pullUint16();
final eLen = buf.pullUint16();
final extData = buf.pullBytes(eLen);
raw[extType] = extData;
final extBuf = QuicBuffer(data: extData);
switch (extType) {
// supported_versions
case 0x002B:
if (eLen == 2) version = extBuf.pullUint16(); // should be 0x0304
break;
// key_share
case 0x0033:
final group = extBuf.pullUint16();
final keyLen = extBuf.pullUint16();
final key = extBuf.pullBytes(keyLen);
keyShare = ParsedKeyShare(group, key);
break;
default:
// leave extension data in raw[]
break;
}
}
return ServerHello(
legacyVersion: legacyVersion,
random: random,
sessionId: sessionId,
cipherSuite: cipherSuite,
compressionMethod: compression,
extensionsRaw: raw,
keyShareEntry: keyShare,
selectedVersion: version,
msgType: 0x02,
rawBytes: buf.data.sublist(0, buf.readOffset),
);
}