Skip to content

Commit 9d25c8e

Browse files
committed
Adding sam and bob
1 parent 5b1de2f commit 9d25c8e

File tree

3 files changed

+264
-0
lines changed

3 files changed

+264
-0
lines changed

Diff for: multiaddr_test.go

+100
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,70 @@ func TestConstructFails(t *testing.T) {
5959
"/garlic32/566niximlxdzpanmn4qouucvua3k7neniwss47li5r6ugoertzu:80",
6060
"/garlic32/566niximlxdzpanmn4qouucvua3k7neniwss47li5r6ugoertzuq:-1",
6161
"/garlic32/566niximlxdzpanmn4qouucvua3k7neniwss47li5r6ugoertzu@",
62+
"/sam3/8|7|6|6|2|2",
63+
"/sam3/0|8|6|6|2|2",
64+
"/sam3/0|2|0|6|2|2",
65+
"/sam3/0|2|6|0|2|2",
66+
"/sam3/0|2|7|6|2|2",
67+
"/sam3/0|2|6|7|2|2",
68+
"/sam3/0|7|6|6|-1|2",
69+
"/sam3/3|0|6|6|2|-1",
70+
"/sam3/3|0|6|6|3|2",
71+
"/sam3/3|0|6|6|2|3",
72+
"/sam3/-1|0|6|6|2|2",
73+
"/sam3/3|-1|6|6|2|2",
74+
"/sam3/3|2|6|6|-2|2",
75+
"/sam3/3|2|6|6|2|-2",
76+
"/sam3/3|2|6|6|2|2|7",
77+
"/sam3/3|2|6|6|2",
78+
"/sam2/8|7|6|6|2|2",
79+
"/sam2/0|8|6|6|2|2",
80+
"/sam2/0|2|0|6|2|2",
81+
"/sam2/0|2|6|0|2|2",
82+
"/sam2/0|2|7|6|2|2",
83+
"/sam2/0|2|6|7|2|2",
84+
"/sam2/0|7|6|6|-1|2",
85+
"/sam2/3|0|6|6|2|-1",
86+
"/sam2/3|0|6|6|3|2",
87+
"/sam2/3|0|6|6|2|3",
88+
"/sam2/-1|0|6|6|2|2",
89+
"/sam2/3|-1|6|6|2|2",
90+
"/sam2/3|2|6|6|-2|2",
91+
"/sam2/3|2|6|6|2|-2",
92+
"/sam2/3|2|6|6|2|2|7",
93+
"/sam2/3|2|6|6|2",
94+
"/sam1/8|7|6|6|2|2",
95+
"/sam1/0|8|6|6|2|2",
96+
"/sam1/0|2|0|6|2|2",
97+
"/sam1/0|2|6|0|2|2",
98+
"/sam1/0|2|7|6|2|2",
99+
"/sam1/0|2|6|7|2|2",
100+
"/sam1/0|7|6|6|-1|2",
101+
"/sam1/3|0|6|6|2|-1",
102+
"/sam1/3|0|6|6|3|2",
103+
"/sam1/3|0|6|6|2|3",
104+
"/sam1/-1|0|6|6|2|2",
105+
"/sam1/3|-1|6|6|2|2",
106+
"/sam1/3|2|6|6|-2|2",
107+
"/sam1/3|2|6|6|2|-2",
108+
"/sam1/3|2|6|6|2|2|7",
109+
"/sam1/3|2|6|6|2",
110+
"/bob/8|7|6|6|2|2",
111+
"/bob/0|8|6|6|2|2",
112+
"/bob/0|2|0|6|2|2",
113+
"/bob/0|2|6|0|2|2",
114+
"/bob/0|2|7|6|2|2",
115+
"/bob/0|2|6|7|2|2",
116+
"/bob/0|7|6|6|-1|2",
117+
"/bob/3|0|6|6|2|-1",
118+
"/bob/3|0|6|6|3|2",
119+
"/bob/3|0|6|6|2|3",
120+
"/bob/-1|0|6|6|2|2",
121+
"/bob/3|-1|6|6|2|2",
122+
"/bob/3|2|6|6|-2|2",
123+
"/bob/3|2|6|6|2|-2",
124+
"/bob/3|2|6|6|2|2|7",
125+
"/bob/3|2|6|6|2",
62126
"/udp/1234/sctp",
63127
"/udp/1234/udt/1234",
64128
"/udp/1234/utp/1234",
@@ -117,6 +181,18 @@ func TestConstructSucceeds(t *testing.T) {
117181
"/garlic32/566niximlxdzpanmn4qouucvua3k7neniwss47li5r6ugoertzuq/http",
118182
"/garlic32/566niximlxdzpanmn4qouucvua3k7neniwss47li5r6ugoertzuq/tcp/8080",
119183
"/garlic32/566niximlxdzpanmn4qouucvua3k7neniwss47li5r6ugoertzuq/udp/8080",
184+
"/sam3/0|0|1|1|0|0",
185+
"/sam3/4|4|6|6|-1|-1",
186+
"/sam3/3|3|6|6|2|2",
187+
"/sam2/0|0|1|1|0|0",
188+
"/sam2/4|4|6|6|-1|-1",
189+
"/sam2/3|3|6|6|2|2",
190+
"/sam1/0|0|1|1|0|0",
191+
"/sam1/4|4|6|6|-1|-1",
192+
"/sam1/3|3|6|6|2|2",
193+
"/bob/0|0|1|1|0|0",
194+
"/bob/4|4|6|6|-1|-1",
195+
"/bob/3|3|6|6|2|2",
120196
"/udp/0",
121197
"/tcp/0",
122198
"/sctp/0",
@@ -163,6 +239,14 @@ func TestEqual(t *testing.T) {
163239
m2 := newMultiaddr(t, "/ip4/127.0.0.1/tcp/1234")
164240
m3 := newMultiaddr(t, "/ip4/127.0.0.1/tcp/1234")
165241
m4 := newMultiaddr(t, "/ip4/127.0.0.1/tcp/1234/")
242+
m5 := newMultiaddr(t, "/sam3/4|4|6|6|-1|-1")
243+
m6 := newMultiaddr(t, "/sam3/3|3|6|6|2|2")
244+
m7 := newMultiaddr(t, "/sam2/4|4|6|6|-1|-1")
245+
m8 := newMultiaddr(t, "/sam2/3|3|6|6|2|2")
246+
m9 := newMultiaddr(t, "/sam1/4|4|6|6|-1|-1")
247+
m10 := newMultiaddr(t, "/sam1/3|3|6|6|2|2")
248+
m11 := newMultiaddr(t, "/bob/4|4|6|6|-1|-1")
249+
m12 := newMultiaddr(t, "/bob/3|3|6|6|2|2")
166250

167251
if m1.Equal(m2) {
168252
t.Error("should not be equal")
@@ -191,6 +275,22 @@ func TestEqual(t *testing.T) {
191275
if !m4.Equal(m3) {
192276
t.Error("should be equal")
193277
}
278+
279+
if !m5.Equal(m6) {
280+
t.Error("should be equal")
281+
}
282+
283+
if !m7.Equal(m8) {
284+
t.Error("should be equal")
285+
}
286+
287+
if !m9.Equal(m10) {
288+
t.Error("should be equal")
289+
}
290+
291+
if !m11.Equal(m12) {
292+
t.Error("should be equal")
293+
}
194294
}
195295

196296
func TestStringToBytes(t *testing.T) {

Diff for: protocols.go

+36
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,10 @@ const (
2222
P_ONION3 = 0x01BD
2323
P_GARLIC64 = 0x01BE
2424
P_GARLIC32 = 0x01BF
25+
P_BOB = 0x01FE
26+
P_SAM3 = 0x0205
27+
P_SAM2 = 0x0204
28+
P_SAM1 = 0x0203
2529
P_P2P_WEBRTC_DIRECT = 0x0114
2630
)
2731

@@ -109,6 +113,34 @@ var (
109113
Size: LengthPrefixedVarSize,
110114
Transcoder: TranscoderGarlic32,
111115
}
116+
protoBOB = Protocol{
117+
Name: "bob",
118+
Code: P_BOB,
119+
VCode: CodeToVarint(P_BOB),
120+
Size: LengthGarlicBridgeSize,
121+
Transcoder: TranscoderGarlicBridge,
122+
}
123+
protoSAM3 = Protocol{
124+
Name: "sam3",
125+
Code: P_SAM3,
126+
VCode: CodeToVarint(P_SAM3),
127+
Size: LengthGarlicBridgeSize,
128+
Transcoder: TranscoderGarlicBridge,
129+
}
130+
protoSAM2 = Protocol{
131+
Name: "sam2",
132+
Code: P_SAM2,
133+
VCode: CodeToVarint(P_SAM2),
134+
Size: LengthGarlicBridgeSize,
135+
Transcoder: TranscoderGarlicBridge,
136+
}
137+
protoSAM1 = Protocol{
138+
Name: "sam1",
139+
Code: P_SAM1,
140+
VCode: CodeToVarint(P_SAM1),
141+
Size: LengthGarlicBridgeSize,
142+
Transcoder: TranscoderGarlicBridge,
143+
}
112144
protoUTP = Protocol{
113145
Name: "utp",
114146
Code: P_UTP,
@@ -169,6 +201,10 @@ func init() {
169201
protoONION3,
170202
protoGARLIC64,
171203
protoGARLIC32,
204+
protoSAM3,
205+
protoSAM2,
206+
protoSAM1,
207+
protoBOB,
172208
protoUTP,
173209
protoUDT,
174210
protoQUIC,

Diff for: transcoders.go

+128
Original file line numberDiff line numberDiff line change
@@ -284,6 +284,134 @@ func garlic32Validate(b []byte) error {
284284
return nil
285285
}
286286

287+
var LengthGarlicBridgeSize = 2
288+
var TranscoderGarlicBridge = NewTranscoderFromFunctions(garlicBridgeStB, garlicBridgeBtS, garlicBridgeValidate)
289+
290+
var errorGarlicBridgeUpstreamNegativeHop = fmt.Errorf("A garlic bridge can't have a negative number of hops (your alterator is making this), check upstream.")
291+
var errorGarlicBridgeDownstreamNegativeHop = fmt.Errorf("A garlic bridge can't have a negative number of hops (your alterator is making this), check downstream.")
292+
293+
func garlicBridgeStB(s string) ([]byte, error) {
294+
sl := strings.SplitN(s, "|", 7)
295+
if len(sl) != 6 {
296+
return nil, fmt.Errorf("A garlic bridge should have 6 params separated by 5 \"|\", not %d.", len(sl))
297+
}
298+
v1, err := strconv.Atoi(sl[0])
299+
if err != nil {
300+
return nil, err
301+
}
302+
if v1 < 0 || v1 > 7 {
303+
return nil, fmt.Errorf("A garlic bridge can't have more than 7 hops, not %d, check upstream.", v1)
304+
}
305+
v2, err := strconv.Atoi(sl[1])
306+
if err != nil {
307+
return nil, err
308+
}
309+
if v2 < 0 || v2 > 7 {
310+
return nil, fmt.Errorf("A garlic bridge can't have more than 7 hops, not %d, check downstream.", v2)
311+
}
312+
v3, err := strconv.Atoi(sl[2])
313+
if err != nil {
314+
return nil, err
315+
}
316+
if v3 < 1 || v3 > 6 {
317+
return nil, fmt.Errorf("A garlic bridge must have 1 up to 6 tunnel, not %d, check upstream.", v3)
318+
}
319+
v4, err := strconv.Atoi(sl[3])
320+
if err != nil {
321+
return nil, err
322+
}
323+
if v4 < 1 || v4 > 6 {
324+
return nil, fmt.Errorf("A garlic bridge must have 1 up to 6 tunnel, not %d, check downstream.", v4)
325+
}
326+
v5, err := strconv.Atoi(sl[4])
327+
if err != nil {
328+
return nil, err
329+
}
330+
if v5 < -1 || v5 > 2 {
331+
return nil, fmt.Errorf("A garlic bridge alterator must be between -1 and 2 (included), not %d, check upstream.", v5)
332+
}
333+
if v5 == -1 {
334+
if v1 == 0 {
335+
return nil, errorGarlicBridgeUpstreamNegativeHop
336+
}
337+
v1 -= 1
338+
v5 = 2
339+
}
340+
v6, err := strconv.Atoi(sl[5])
341+
if err != nil {
342+
return nil, err
343+
}
344+
if v6 < -1 || v6 > 2 {
345+
return nil, fmt.Errorf("A garlic bridge alterator must be between -1 and 2 (included), not %d, check downstream.", v6)
346+
}
347+
if v6 == -1 {
348+
if v2 == 0 {
349+
return nil, errorGarlicBridgeDownstreamNegativeHop
350+
}
351+
v2 -= 1
352+
v6 = 2
353+
}
354+
355+
return []byte{
356+
byte((v1 << 5) + (v2 << 2) + (v3 >> 1)),
357+
byte((v3 << 7) + (v4 << 4) + (v5 << 2) + v6),
358+
}, nil
359+
}
360+
361+
func garlicExtractor(b []byte) [6]uint8 {
362+
// Don't transform the uint8 in a uint, this stricity is used to colide with
363+
// border in conversion.
364+
u := [2]uint8{uint8(b[0]), uint8(b[1])}
365+
var r [6]uint8
366+
r[5] = (u[1] << 6) >> 6
367+
r[4] = (u[1] << 4) >> 6
368+
r[3] = (u[1] << 1) >> 5
369+
r[2] = ((u[0] << 6) >> 5) + (u[1] >> 7)
370+
r[1] = (u[0] << 3) >> 5
371+
r[0] = u[0] >> 5
372+
373+
return r
374+
}
375+
376+
func garlicBridgeBtS(b []byte) (string, error) {
377+
var rs string
378+
for i, e := range garlicExtractor(b) {
379+
rs += strconv.Itoa(int(e))
380+
if i != 5 {
381+
rs += "|"
382+
}
383+
}
384+
return rs, nil
385+
}
386+
387+
func garlicBridgeValidate(b []byte) error {
388+
if len(b) != 2 {
389+
return fmt.Errorf("A garlic bridge compiled version length must be 2, not %d.", len(b))
390+
}
391+
lv := garlicExtractor(b)
392+
393+
if lv[0] > 7 {
394+
return fmt.Errorf("A garlic bridge can't have more than 7 hops, not %d, check upstream.", lv[0])
395+
}
396+
if lv[1] > 7 {
397+
return fmt.Errorf("A garlic bridge can't have more than 7 hops, not %d, check downstream.", lv[1])
398+
}
399+
if lv[2] < 1 || lv[2] > 6 {
400+
return fmt.Errorf("A garlic bridge must have 1 up to 6 tunnel, not %d, check upstream.", lv[2])
401+
}
402+
if lv[3] < 1 || lv[3] > 6 {
403+
return fmt.Errorf("A garlic bridge must have 1 up to 6 tunnel, not %d, check downstream.", lv[3])
404+
}
405+
if lv[4] > 2 {
406+
return fmt.Errorf("A garlic bridge alterator compiled can't be bigger than 2, not %d, check upstream.", lv[4])
407+
}
408+
if lv[5] > 2 {
409+
return fmt.Errorf("A garlic bridge alterator compiled can't be bigger than 2, not %d, check downstream.", lv[5])
410+
}
411+
412+
return nil
413+
}
414+
287415
var TranscoderP2P = NewTranscoderFromFunctions(p2pStB, p2pBtS, p2pVal)
288416

289417
func p2pStB(s string) ([]byte, error) {

0 commit comments

Comments
 (0)