package ownwire_sdk_test import ( "context" "crypto/ecdh" "crypto/rand" "encoding/base64" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" sdk "ownwire.net/ownwire-sdk" ) var _ = Describe("Handshaker", func() { It("sends /create when no resume session_id is provided and derives shared key", func() { ctx := context.Background() conn := sdk_test_new_inmem_conn() client_kp, err := sdk.GenClientKey() Expect(err).To(BeNil()) h := sdk.Handshaker{ GenClientKeyF: func() (sdk.Keypair, error) { return client_kp, nil }, } curve := ecdh.P256() server_priv, err := curve.GenerateKey(rand.Reader) Expect(err).To(BeNil()) server_pub_raw := server_priv.PublicKey().Bytes() server_pub_b64 := base64.StdEncoding.EncodeToString(server_pub_raw) salt_raw := make([]byte, 32) _, err = rand.Read(salt_raw) Expect(err).To(BeNil()) salt_b64 := base64.StdEncoding.EncodeToString(salt_raw) session_id := "cb653f53-6f7d-4aeb-ba0d-d2b17c290d8a" go func() { written := <-conn.write_ch Expect(written).To(HavePrefix("/create:")) conn.read_ch <- "/session:" + session_id + ":" + server_pub_b64 + ":" + salt_b64 + ":12:34" }() state, pending, err := h.Run(ctx, conn, "") Expect(err).To(BeNil()) Expect(pending).To(BeEmpty()) Expect(state.SessionId).To(Equal(session_id)) Expect(state.ClientPubKeyB64).ToNot(BeEmpty()) want_key, err := sdk.DeriveSharedKey(session_id, client_kp.ClientPriv, server_pub_raw, salt_raw) Expect(err).To(BeNil()) Expect(state.SharedKey).To(Equal(want_key)) Expect(state.SeqOut).To(Equal(uint64(34))) Expect(state.SeqInMax).To(Equal(uint64(12))) }) It("sends /open when resume session_id is provided", func() { ctx := context.Background() conn := sdk_test_new_inmem_conn() client_kp, err := sdk.GenClientKey() Expect(err).To(BeNil()) h := sdk.Handshaker{ GenClientKeyF: func() (sdk.Keypair, error) { return client_kp, nil }, } curve := ecdh.P256() server_priv, err := curve.GenerateKey(rand.Reader) Expect(err).To(BeNil()) server_pub_raw := server_priv.PublicKey().Bytes() server_pub_b64 := base64.StdEncoding.EncodeToString(server_pub_raw) salt_raw := make([]byte, 32) _, err = rand.Read(salt_raw) Expect(err).To(BeNil()) salt_b64 := base64.StdEncoding.EncodeToString(salt_raw) session_id := "cb653f53-6f7d-4aeb-ba0d-d2b17c290d8a" go func() { written := <-conn.write_ch Expect(written).To(HavePrefix("/open:" + session_id + ":")) conn.read_ch <- "/session:" + session_id + ":" + server_pub_b64 + ":" + salt_b64 + ":1:2" }() _, pending, err := h.Run(ctx, conn, session_id) Expect(err).To(BeNil()) Expect(pending).To(BeEmpty()) }) })