diff options
Diffstat (limited to 'ostp.d/net/otd_auth.c')
-rw-r--r-- | ostp.d/net/otd_auth.c | 37 |
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; } |