| 809 | var _ = (*noiseServer)(nil).earlyNoise |
| 810 | |
| 811 | func (ns *noiseServer) earlyNoise(protocolVersion int, writer io.Writer) error { |
| 812 | ns.logger.Info("early noise") |
| 813 | if protocolVersion < earlyNoiseCapabilityVersion { |
| 814 | return nil |
| 815 | } |
| 816 | |
| 817 | earlyJSON, err := json.Marshal(&tailcfg.EarlyNoise{ |
| 818 | NodeKeyChallenge: ns.challenge.Public(), |
| 819 | }) |
| 820 | if err != nil { |
| 821 | return err |
| 822 | } |
| 823 | |
| 824 | // 5 bytes that won't be mistaken for an HTTP/2 frame: |
| 825 | // https://httpwg.org/specs/rfc7540.html#rfc.section.4.1 (Especially not |
| 826 | // an HTTP/2 settings frame, which isn't of type 'T') |
| 827 | var notH2Frame [5]byte |
| 828 | copy(notH2Frame[:], earlyPayloadMagic) |
| 829 | var lenBuf [4]byte |
| 830 | binary.BigEndian.PutUint32(lenBuf[:], uint32(len(earlyJSON))) |
| 831 | // These writes are all buffered by caller, so fine to do them |
| 832 | // separately: |
| 833 | if _, err := writer.Write(notH2Frame[:]); err != nil { |
| 834 | return err |
| 835 | } |
| 836 | if _, err := writer.Write(lenBuf[:]); err != nil { |
| 837 | return err |
| 838 | } |
| 839 | if _, err := writer.Write(earlyJSON); err != nil { |
| 840 | return err |
| 841 | } |
| 842 | |
| 843 | return nil |
| 844 | } |