erickt / rust-zmq

Rust zeromq bindings.
Apache License 2.0
900 stars 194 forks source link

Curve usage fails #164

Closed narkisr closed 7 years ago

narkisr commented 7 years ago

Iv tried to use curve based encryption:

extern crate zmq;
use zmq::*;

fn create_socketpair() -> (Socket, Socket) {
    let ctx = Context::default();
    let sender = ctx.socket(zmq::REQ).unwrap();
    let receiver = ctx.socket(zmq::REP).unwrap();
    let private = "s9N%S3*NKSU$6pUnpBI&K5HBd[]G$Y3yrK?mhdbS";
    let public = "FX5b8g5ZnOk7$Q}^)Y&?.v3&MIe+]OU7DTKynkUL";
    receiver.set_curve_secretkey(private).unwrap();
    receiver.set_curve_serverkey(public).unwrap();
    sender.set_curve_publickey(public).unwrap();
    // Don't block forever
    sender.set_sndtimeo(1000).unwrap();
    sender.set_rcvtimeo(1000).unwrap();
    receiver.set_sndtimeo(1000).unwrap();
    receiver.set_rcvtimeo(1000).unwrap();

    receiver.bind("tcp://127.0.0.1:*").unwrap();
    let ep = receiver.get_last_endpoint().unwrap().unwrap();
    sender.connect(&ep).unwrap();
    (sender, receiver)
}

fn main() {
  let (sender, receiver) = create_socketpair();
  sender.send_msg(Message::from_slice(b"foo").unwrap(), 0).unwrap();
  let msg = receiver.recv_msg(0).unwrap();
  assert_eq!(&msg[..], b"foo");
  assert_eq!(msg.as_str(), Some("foo"));
  println!("this is it {0}", msg.as_str().unwrap());
  assert_eq!(format!("{:?}", msg), "[102, 111, 111]");
  receiver.send(b"bar", 0).unwrap();
  let mut msg = Message::with_capacity(1).unwrap();
  sender.recv(&mut msg, 0).unwrap();
  assert_eq!(&msg[..], b"bar");
}

And I keep getting:

Assertion failed: rc == 0 (src/curve_client.cpp:267)

Iv tried both Zeromq 4.2/4.1 and libsodium 1.0.9 and 1.0.11, I suspect that its related to https://github.com/zeromq/libzmq/issues/1831

Thanks

rotty commented 7 years ago

I think you might be just missing receiver.set_curve_server(true).unwrap(). I played with an adaption of your code, and adding that line fixed the issue. However, I did not encounter the assertion you mention, but a hang.

EDIT: The above fix description is incomplete, but #167 should contain all required adaptions.