parse static method

ServerHello parse(
  1. QuicBuffer buf
)

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