@@ -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 ())
0 commit comments