Git Product home page Git Product logo

header-quic's Introduction

header-quic

for quic learn and test,and maybe modify it later.

Thanks a million to https://github.com/lucas-clemente/quic-go

package main

import (
	"bytes"
	"fmt"
	"math/rand"

	"github.com/flyaways/header-quic/protocol"
	"github.com/flyaways/header-quic/wire"
)

func getRandomData(l int) []byte {
	b := make([]byte, l)
	rand.Read(b)
	return b
}

func main() {
	//func handlePacket(data []byte, shortHeaderConnIDLen int, sentBy protocol.Perspective, version protocol.VersionNumber) (*protocol.Header, error) {
	// Header is the header of a QUIC packet.
	// It contains fields that are only needed for the gQUIC Public Header and the IETF draft Header.
	// type Header struct {
	// 	IsPublicHeader bool

	// 	Raw []byte

	// 	Version protocol.VersionNumber

	// 	DestConnectionID     protocol.ConnectionID
	// 	SrcConnectionID      protocol.ConnectionID
	// 	OrigDestConnectionID protocol.ConnectionID // only needed in the Retry packet

	// 	PacketNumberLen protocol.PacketNumberLen
	// 	PacketNumber    protocol.PacketNumber

	// 	IsVersionNegotiation bool
	// 	SupportedVersions    []protocol.VersionNumber // Version Number sent in a Version Negotiation Packet by the server

	// 	// only needed for the gQUIC Public Header
	// 	VersionFlag          bool
	// 	ResetFlag            bool
	// 	DiversificationNonce []byte

	// 	// only needed for the IETF Header
	// 	Type         protocol.PacketType
	// 	IsLongHeader bool
	// 	KeyPhase     int
	// 	PayloadLen   protocol.ByteCount
	// 	Token        []byte
	// }
	const version = protocol.Version39

	headers := []wire.Header{
		wire.Header{ // Initial without token
			IsLongHeader:     true,
			DestConnectionID: protocol.ConnectionID(getRandomData(8)),
			Type:             protocol.PacketTypeInitial,
			Version:          version,
			PacketNumberLen:  protocol.PacketNumberLen4,
			PacketNumber:     protocol.PacketNumber(rand.Uint32()),
		},
		wire.Header{ // Handshake packet
			IsLongHeader:     true,
			DestConnectionID: protocol.ConnectionID(getRandomData(8)),
			Type:             protocol.PacketTypeHandshake,
			Version:          version,
			PacketNumberLen:  protocol.PacketNumberLen4,
			PacketNumber:     protocol.PacketNumber(rand.Uint32()),
		},
		wire.Header{ // 0-RTT packet
			IsLongHeader:     true,
			DestConnectionID: protocol.ConnectionID(getRandomData(8)),
			Type:             protocol.PacketType0RTT,
			Version:          version,
			PacketNumberLen:  protocol.PacketNumberLen4,
			PacketNumber:     protocol.PacketNumber(rand.Uint32()),
		},
		wire.Header{ // Retry Packet
			IsLongHeader:         true,
			DestConnectionID:     protocol.ConnectionID(getRandomData(8)),
			OrigDestConnectionID: protocol.ConnectionID(getRandomData(8)),
			Type:                 protocol.PacketTypeRetry,
			Token:                getRandomData(10),
			Version:              version,
			PacketNumberLen:      protocol.PacketNumberLen4,
			PacketNumber:         protocol.PacketNumber(rand.Uint32()),
		},
		wire.Header{ // Short-Header
			DestConnectionID: protocol.ConnectionID(getRandomData(8)),
			PacketNumberLen:  protocol.PacketNumberLen4,
			PacketNumber:     protocol.PacketNumber(rand.Uint32()),
		},
	}

	b := &bytes.Buffer{}
	for _, h := range headers {
		b.Reset()
		if err := h.Write(b, protocol.PerspectiveClient, version); err != nil {
			panic(err)
		}

		header, err := handlePacket(b.Bytes(), 4, protocol.PerspectiveClient, protocol.Version39)
		if err != nil {
			fmt.Println(err)
			return
		}

		fmt.Printf("%+v\n", *header)

	}
}

func handlePacket(data []byte, shortHeaderConnIDLen int, sentBy protocol.Perspective, version protocol.VersionNumber) (*wire.Header, error) {
	r := bytes.NewReader(data)
	iHdr, err := wire.ParseInvariantHeader(r, shortHeaderConnIDLen)
	// drop the packet if we can't parse the header
	if err != nil {
		return nil, fmt.Errorf("error parsing invariant header: %s", err)
	}

	hdr, err := iHdr.Parse(r, sentBy, version)
	if err != nil {
		return nil, fmt.Errorf("error parsing header: %s", err)
	}
	hdr.Raw = data[:len(data)-r.Len()]
	packetData := data[len(data)-r.Len():]

	if hdr.IsLongHeader && hdr.Version.UsesLengthInHeader() {
		if protocol.ByteCount(len(packetData)) < hdr.PayloadLen {
			return nil, fmt.Errorf("packet payload (%d bytes) is smaller than the expected payload length (%d bytes)", len(packetData), hdr.PayloadLen)
		}
	}

	return hdr, nil
}

header-quic's People

Contributors

flyaways avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.