aboutsummaryrefslogtreecommitdiff
path: root/ostp.d/net/otd_auth.c
diff options
context:
space:
mode:
Diffstat (limited to 'ostp.d/net/otd_auth.c')
-rw-r--r--ostp.d/net/otd_auth.c37
1 files changed, 37 insertions, 0 deletions
diff --git a/ostp.d/net/otd_auth.c b/ostp.d/net/otd_auth.c
index 3511e0c..6e757ae 100644
--- a/ostp.d/net/otd_auth.c
+++ b/ostp.d/net/otd_auth.c
@@ -27,9 +27,12 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
+#include <arpa/inet.h>
#include <net/auth.h>
+#include <net/param.h>
#include <net/stpsession.h>
#include <crypto/ecdh.h>
+#include <otconfig.h>
#include <stdio.h>
#define KEY_BYTE_WIDTH 32
@@ -47,6 +50,17 @@ log_pubkey(uint8_t pubkey[KEY_BYTE_WIDTH])
printf("\n");
}
+static void
+send_motd(int client_fd, const unsigned char *session_key)
+{
+ char motd[] = MOTD;
+
+ printf("Sending MOTD...\n");
+ if (send_frame(client_fd, motd, sizeof(motd), session_key) < 0) {
+ printf("Failed to session MOTD\n");
+ }
+}
+
/*
* Verify the session request packet and handle
* the rest.
@@ -58,6 +72,8 @@ int
handle_srq(int client_fd, struct session_request *srq)
{
struct x25519_keypair keypair;
+ unsigned char *session_key;
+ int error;
printf("Got public key from peer: \n");
log_pubkey(srq->pubkey);
@@ -68,5 +84,26 @@ handle_srq(int client_fd, struct session_request *srq)
return -1;
}
+ /* Send back our our public key */
+ error = send(client_fd, keypair.pubkey, keypair.pubkey_len, 0);
+ if (error < 0) {
+ perror("Failed to send public key");
+ return error;
+ }
+
+ printf("Deriving session key...\n");
+ error = gen_session_key(keypair.privkey, srq->pubkey, &session_key);
+ if (error < 0) {
+ return error;
+ }
+
+ /* Handle any requested session parameters */
+ if ((error = negotiate_spw(client_fd, session_key)) < 0) {
+ free_session_key(session_key);
+ return error;
+ }
+
+ send_motd(client_fd, session_key);
+ free_session_key(session_key);
return 0;
}