-
Notifications
You must be signed in to change notification settings - Fork 0
/
utils_browser.go
115 lines (102 loc) · 3.45 KB
/
utils_browser.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
package device_utils
import (
"math/rand"
"sort"
"strconv"
"strings"
)
func mustInt(input string) int {
res, _ := strconv.Atoi(input)
return res
}
func mustString(input int) string {
return strconv.Itoa(input)
}
func ParseTLSFingerprint(fingerprint string) (*Browser_TLSFingerprint, error) {
result := &Browser_TLSFingerprint{}
ja3Split := strings.Split(fingerprint, ",")
for i, content := range ja3Split {
elements := strings.Split(content, "-")
switch i {
case 0:
result.Version = Browser_TLSFingerprint_ProtocolVersion(mustInt(content))
break
case 1:
result.CipherSuites = make([]Browser_TLSFingerprint_CipherSuite, len(elements))
for elementI, element := range elements {
result.CipherSuites[elementI] = Browser_TLSFingerprint_CipherSuite(mustInt(element))
}
break
case 2:
result.Extensions = make([]Browser_TLSFingerprint_Extension, len(elements))
for elementI, element := range elements {
result.Extensions[elementI] = Browser_TLSFingerprint_Extension(mustInt(element))
}
break
case 3:
result.EllipticCurves = make([]Browser_TLSFingerprint_EllipticCurve, len(elements))
for elementI, element := range elements {
result.EllipticCurves[elementI] = Browser_TLSFingerprint_EllipticCurve(mustInt(element))
}
break
case 4:
result.EllipticCurvePointFormats = make([]Browser_TLSFingerprint_EllipticCurvePointFormat, len(elements))
for elementI, element := range elements {
result.EllipticCurvePointFormats[elementI] = Browser_TLSFingerprint_EllipticCurvePointFormat(mustInt(element))
}
break
}
}
return result, nil
}
func (fp *Browser_TLSFingerprint) FormatTLSFingerprint(strict ...bool) string {
fmtStrict := false
if len(strict) > 0 {
fmtStrict = strict[0]
}
extensions := make([]Browser_TLSFingerprint_Extension, len(fp.Extensions))
copy(extensions, fp.Extensions)
if !fmtStrict {
rand.Shuffle(len(extensions), func(i, j int) {
extensions[i], extensions[j] = extensions[j], extensions[i]
})
}
result := []string{
mustString(int(fp.Version)),
"",
"",
"",
"",
}
cipherSuites := make([]string, len(fp.CipherSuites))
for cipherSuiteI, cipherSuite := range fp.CipherSuites {
cipherSuites[cipherSuiteI] = mustString(int(cipherSuite))
}
result[1] = strings.Join(cipherSuites, "-")
// Can be randomized except for the ending, needs to end on 21 or 41 or both (21-41)
extensionsTmp := make([]string, len(extensions))
extensionsEnd := []int{}
for extensionI, extension := range extensions {
if extension == 21 || extension == 41 {
extensionsEnd = append(extensionsEnd, int(extension))
} else {
extensionsTmp[extensionI-len(extensionsEnd)] = mustString(int(extension))
}
}
sort.Ints(extensionsEnd)
for extensionEndI, extensionEnd := range extensionsEnd {
extensionsTmp[len(extensionsTmp)-len(extensionsEnd)+extensionEndI] = mustString(extensionEnd)
}
result[2] = strings.Join(extensionsTmp, "-")
ellipticCurves := make([]string, len(fp.EllipticCurves))
for ellipticCurveI, ellipticCurve := range fp.EllipticCurves {
ellipticCurves[ellipticCurveI] = mustString(int(ellipticCurve))
}
result[3] = strings.Join(ellipticCurves, "-")
ellipticCurvesFormats := make([]string, len(fp.EllipticCurvePointFormats))
for ellipticCurvesFormatI, ellipticCurvesFormat := range fp.EllipticCurvePointFormats {
ellipticCurvesFormats[ellipticCurvesFormatI] = mustString(int(ellipticCurvesFormat))
}
result[4] = strings.Join(ellipticCurvesFormats, "-")
return strings.Join(result, ",")
}