Skip to content

Commit 76dd513

Browse files
committed
initial curve support
1 parent 826b120 commit 76dd513

File tree

12 files changed

+825
-28
lines changed

12 files changed

+825
-28
lines changed

conn.go

Lines changed: 34 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ func (c *Conn) SendCmd(name string, body []byte) error {
169169
if err != nil {
170170
return err
171171
}
172-
return c.send(true, buf, 0)
172+
return c.send(true, buf, 0, false)
173173
}
174174

175175
// SendMsg sends a ZMTP message over the wire.
@@ -184,10 +184,12 @@ func (c *Conn) SendMsg(msg Msg) error {
184184
nframes := len(msg.Frames)
185185
for i, frame := range msg.Frames {
186186
var flag byte
187+
var more bool
187188
if i < nframes-1 {
188189
flag ^= hasMoreBitFlag
190+
more = true
189191
}
190-
err := c.send(false, frame, flag)
192+
err := c.send(false, frame, flag, more)
191193
if err != nil {
192194
return fmt.Errorf("zmq4: error sending frame %d/%d: %w", i+1, nframes, err)
193195
}
@@ -286,8 +288,18 @@ func (c *Conn) sendMulti(msg Msg) error {
286288
nframes := len(msg.Frames)
287289
for i, frame := range msg.Frames {
288290
var flag byte
291+
var more bool
289292
if i < nframes-1 {
290293
flag ^= hasMoreBitFlag
294+
more = true
295+
}
296+
297+
if c.sec.Type() == CurveSecurity {
298+
var secBuf bytes.Buffer
299+
if _, err := c.sec.Encrypt(&secBuf, frame, more); err != nil {
300+
return err
301+
}
302+
frame = secBuf.Bytes()
291303
}
292304

293305
size := len(frame)
@@ -308,16 +320,7 @@ func (c *Conn) sendMulti(msg Msg) error {
308320
hdr[1] = uint8(size)
309321
}
310322

311-
switch c.sec.Type() {
312-
case NullSecurity:
313-
buffers = append(buffers, hdr[:hsz], frame)
314-
default:
315-
var secBuf bytes.Buffer
316-
if _, err := c.sec.Encrypt(&secBuf, frame); err != nil {
317-
return err
318-
}
319-
buffers = append(buffers, hdr[:hsz], secBuf.Bytes())
320-
}
323+
buffers = append(buffers, hdr[:hsz], frame)
321324
}
322325

323326
if _, err := buffers.WriteTo(c.rw); err != nil {
@@ -328,7 +331,18 @@ func (c *Conn) sendMulti(msg Msg) error {
328331
return nil
329332
}
330333

331-
func (c *Conn) send(isCommand bool, body []byte, flag byte) error {
334+
func (c *Conn) send(isCommand bool, body []byte, flag byte, more bool) error {
335+
336+
// commands should not be encrypted.
337+
if !isCommand && c.sec.Type() == CurveSecurity {
338+
var secBuf bytes.Buffer
339+
if _, err := c.sec.Encrypt(&secBuf, body, more); err != nil {
340+
c.checkIO(err)
341+
return err
342+
}
343+
body = secBuf.Bytes()
344+
}
345+
332346
// Long flag
333347
size := len(body)
334348
isLong := size > 255
@@ -358,7 +372,7 @@ func (c *Conn) send(isCommand bool, body []byte, flag byte) error {
358372
return err
359373
}
360374

361-
if _, err := c.sec.Encrypt(c.rw, body); err != nil {
375+
if _, err := c.rw.Write(body); err != nil {
362376
c.checkIO(err)
363377
return err
364378
}
@@ -428,7 +442,12 @@ func (c *Conn) read() Msg {
428442
}
429443

430444
buf := new(bytes.Buffer)
431-
if _, msg.err = c.sec.Decrypt(buf, body); msg.err != nil {
445+
if isCmd {
446+
_, msg.err = buf.Write(body)
447+
if msg.err != nil {
448+
return msg
449+
}
450+
} else if _, msg.err = c.sec.Decrypt(buf, body); msg.err != nil {
432451
return msg
433452
}
434453
msg.Frames = append(msg.Frames, buf.Bytes())

go.mod

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,15 @@
11
module github.com/go-zeromq/zmq4
22

3-
go 1.21
3+
go 1.23.0
4+
5+
toolchain go1.24.2
46

57
require (
68
github.com/go-zeromq/goczmq/v4 v4.2.2
79
go.uber.org/goleak v1.3.0
8-
golang.org/x/sync v0.7.0
9-
golang.org/x/text v0.15.0
10+
golang.org/x/crypto v0.38.0
11+
golang.org/x/sync v0.14.0
12+
golang.org/x/text v0.25.0
1013
)
14+
15+
require golang.org/x/sys v0.33.0 // indirect

go.sum

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,21 @@ github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PK
88
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
99
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
1010
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
11-
golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M=
12-
golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
13-
golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk=
14-
golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
11+
golang.org/x/crypto v0.37.0 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE=
12+
golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc=
13+
golang.org/x/crypto v0.38.0 h1:jt+WWG8IZlBnVbomuhg2Mdq0+BBQaHbtqHEFEigjUV8=
14+
golang.org/x/crypto v0.38.0/go.mod h1:MvrbAqul58NNYPKnOra203SB9vpuZW0e+RRZV+Ggqjw=
15+
golang.org/x/sync v0.13.0 h1:AauUjRAJ9OSnvULf/ARrrVywoJDy0YS2AwQ98I37610=
16+
golang.org/x/sync v0.13.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
17+
golang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ=
18+
golang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
19+
golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20=
20+
golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
21+
golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw=
22+
golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
23+
golang.org/x/text v0.24.0 h1:dd5Bzh4yt5KYA8f9CJHCP4FB4D51c2c6JvN37xJJkJ0=
24+
golang.org/x/text v0.24.0/go.mod h1:L8rBsPeo2pSS+xqN0d5u2ikmjtmoJbDBT1b7nHvFCdU=
25+
golang.org/x/text v0.25.0 h1:qVyWApTSYLk/drJRO5mDlNYskwQznZmkpV2c8q9zls4=
26+
golang.org/x/text v0.25.0/go.mod h1:WEdwpYrmk1qmdHvhkSTNPm3app7v4rsT8F2UD6+VHIA=
1527
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
1628
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

security.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ type Security interface {
2323
Handshake(conn *Conn, server bool) error
2424

2525
// Encrypt writes the encrypted form of data to w.
26-
Encrypt(w io.Writer, data []byte) (int, error)
26+
Encrypt(w io.Writer, data []byte, more bool) (int, error)
2727

2828
// Decrypt writes the decrypted form of data to w.
2929
Decrypt(w io.Writer, data []byte) (int, error)
@@ -91,7 +91,7 @@ func (nullSecurity) Handshake(conn *Conn, server bool) error {
9191
}
9292

9393
// Encrypt writes the encrypted form of data to w.
94-
func (nullSecurity) Encrypt(w io.Writer, data []byte) (int, error) {
94+
func (nullSecurity) Encrypt(w io.Writer, data []byte, more bool) (int, error) {
9595
return w.Write(data)
9696
}
9797

0 commit comments

Comments
 (0)