package quic const ( V1 uint32 = 0x1 V2 uint32 = 0x6b3343cf hkdfLabelKeyV1 = "quic key" hkdfLabelKeyV2 = "quicv2 key" hkdfLabelIVV1 = "quic iv" hkdfLabelIVV2 = "quicv2 iv" hkdfLabelHPV1 = "quic hp" hkdfLabelHPV2 = "quicv2 hp" ) var ( quicSaltOld = []byte{0xaf, 0xbf, 0xec, 0x28, 0x99, 0x93, 0xd2, 0x4c, 0x9e, 0x97, 0x86, 0xf1, 0x9c, 0x61, 0x11, 0xe0, 0x43, 0x90, 0xa8, 0x99} // https://www.rfc-editor.org/rfc/rfc9001.html#name-initial-secrets quicSaltV1 = []byte{0x38, 0x76, 0x2c, 0xf7, 0xf5, 0x59, 0x34, 0xb3, 0x4d, 0x17, 0x9a, 0xe6, 0xa4, 0xc8, 0x0c, 0xad, 0xcc, 0xbb, 0x7f, 0x0a} // https://www.ietf.org/archive/id/draft-ietf-quic-v2-10.html#name-initial-salt-2 quicSaltV2 = []byte{0x0d, 0xed, 0xe3, 0xde, 0xf7, 0x00, 0xa6, 0xdb, 0x81, 0x93, 0x81, 0xbe, 0x6e, 0x26, 0x9d, 0xcb, 0xf9, 0xbd, 0x2e, 0xd9} ) // isLongHeader reports whether b is the first byte of a long header packet. func isLongHeader(b byte) bool { return b&0x80 > 0 } func getSalt(v uint32) []byte { switch v { case V1: return quicSaltV1 case V2: return quicSaltV2 } return quicSaltOld } func keyLabel(v uint32) string { kl := hkdfLabelKeyV1 if v == V2 { kl = hkdfLabelKeyV2 } return kl } func ivLabel(v uint32) string { ivl := hkdfLabelIVV1 if v == V2 { ivl = hkdfLabelIVV2 } return ivl } func headerProtectionLabel(v uint32) string { if v == V2 { return hkdfLabelHPV2 } return hkdfLabelHPV1 }