From 896fd169388f783a8b669e035b4c01fdc9840fc5 Mon Sep 17 00:00:00 2001 From: Andy Wang Date: Mon, 11 Jul 2022 23:25:42 +0200 Subject: [PATCH] Refactor Browser fingerprint modules --- internal/client/browsers/browser.go | 41 +++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 internal/client/browsers/browser.go diff --git a/internal/client/browsers/browser.go b/internal/client/browsers/browser.go new file mode 100644 index 0000000..3e89875 --- /dev/null +++ b/internal/client/browsers/browser.go @@ -0,0 +1,41 @@ +package browsers + +import "encoding/binary" + +type ClientHelloFields struct { + Random []byte + SessionId []byte + X25519KeyShare []byte + ServerName string +} + +// Browser represents the signature of a browser at a particular version +type Browser interface { + // ComposeClientHello produces the ClientHello message (without TLS record layer) as the mimicking browser would + ComposeClientHello(ClientHelloFields) []byte +} + +// addExtensionRecord, add type, length to extension data +func addExtRec(typ []byte, data []byte) []byte { + length := make([]byte, 2) + binary.BigEndian.PutUint16(length, uint16(len(data))) + ret := make([]byte, 2+2+len(data)) + copy(ret[0:2], typ) + copy(ret[2:4], length) + copy(ret[4:], data) + return ret +} + +func generateSNI(serverName string) []byte { + serverNameListLength := make([]byte, 2) + binary.BigEndian.PutUint16(serverNameListLength, uint16(len(serverName)+3)) + serverNameType := []byte{0x00} // host_name + serverNameLength := make([]byte, 2) + binary.BigEndian.PutUint16(serverNameLength, uint16(len(serverName))) + ret := make([]byte, 2+1+2+len(serverName)) + copy(ret[0:2], serverNameListLength) + copy(ret[2:3], serverNameType) + copy(ret[3:5], serverNameLength) + copy(ret[5:], serverName) + return ret +}