aboutsummaryrefslogtreecommitdiff
path: root/client
diff options
context:
space:
mode:
Diffstat (limited to 'client')
-rw-r--r--client/main.c190
1 files changed, 21 insertions, 169 deletions
diff --git a/client/main.c b/client/main.c
index 6bc5a5e..0f87639 100644
--- a/client/main.c
+++ b/client/main.c
@@ -27,186 +27,38 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
-#include <net/stpsession.h>
-#include <net/param.h>
-#include <crypto/ecdh.h>
-#include <arpa/inet.h>
-#include <defs.h>
+#include <libostp/session.h>
#include <stdio.h>
-#include <stdint.h>
-#include <unistd.h>
-#include <string.h>
#define CENTRAL_SERVER "149.248.6.149"
-#define OSTP_PORT 5352
+// #define CENTRAL_SERVER "127.0.0.1"
-static const char *pap_codestr[] = {
- [PAP_SUCCESS] = "success",
- [PAP_BAD_SPW] = "bad SPW",
- [PAP_BAD_PERMS] = "insufficient permissions",
- [PAP_RESOURCE] = "server out of resources"
-};
-
-static void
-log_pubkey(uint8_t pubkey[])
+int
+main(int argc, char **argv)
{
- for (size_t i = 0; i < 32; ++i) {
- printf("%02X ", pubkey[i] & 0xFF);
- if (i != 0 && i % 4 == 0) {
- printf("\n");
- }
+ char buf[] = "Hello, World!\n";
+ char recv_buf[4096];
+ struct ostp_session s;
+ int err;
+
+ if ((err = session_new(CENTRAL_SERVER, &s)) < 0) {
+ fprintf(stderr, "Failed to create new session!\n");
+ return err;
}
- printf("\n");
-}
-
-static int
-negotiate_spw(int sockfd, const unsigned char *session_key)
-{
- struct aes_message am;
- struct msg_frame msg_frame;
- struct pap pap;
- unsigned char *tmp;
- int error;
-
- /* Create a PAP and encrypt it */
- pap.spw = 0x8000;
- pap.code = 0;
-
- while (1) {
- if ((error = send_frame(sockfd, &pap, sizeof(pap), session_key)) < 0) {
- return error;
- }
-
- /* Receive the PAP the server replies with */
- if ((error = recv_frame(sockfd, sizeof(pap), session_key, &pap)) < 0) {
- return error;
- }
- /*
- * If the server echos our PAP with code 0 then it has
- * applied our session parameters! However, there is
- * a chance arbitration will be needed and we need
- * to look out for that too...
- */
- if (pap.code == 0) {
- printf("** Negotiation success\n");
- break;
+ if (argc >= 2) {
+ if (session_send(buf, sizeof(buf), &s) < 0) {
+ fprintf(stderr, "Failed to send data to server!\n");
+ return -1;
}
-
- printf("** Arbitration needed, server says: %s\n", pap_codestr[pap.code]);
- printf("** Server proposes SPW of 0x%0X, accepting\n", pap.spw);
- pap.spw |= PAP_SPW_QSR;
- pap.code = 0;
- }
-
- return 0;
-}
-
-static void
-recv_motd(int sockfd, const unsigned char *session_key)
-{
- char buf[4096];
- int len;
-
- /* Receive the PAP the server replies with */
- if ((len = recv_frame(sockfd, sizeof(buf), session_key, buf)) < 0) {
- printf("Failed to recv MOTD...\n");
- return;
- }
-
- buf[len] = '\0';
- printf("%s\n", buf);
-}
-
-static int
-request_session(void)
-{
- struct sockaddr_in addr;
- struct session_request stp_sq;
- struct x25519_keypair keypair;
- unsigned char serv_pubkey[32];
- unsigned char *session_key;
- int error, sockfd;
-
- addr.sin_family = AF_INET;
- addr.sin_addr.s_addr = inet_addr(CENTRAL_SERVER);
- addr.sin_port = htons(OSTP_PORT);
-
- sockfd = socket(AF_INET, SOCK_STREAM, 0);
- if (sockfd < 0) {
- return sockfd;
- }
-
- error = connect(sockfd, (struct sockaddr *)&addr, sizeof(addr));
- if (error < 0) {
- printf("Failed to connect!\n");
- close(sockfd);
- return error;
- }
-
- printf("Generating keys...\n");
-
- /* Generate an ephemeral keypair */
- if ((error = gen_x25519_keypair(&keypair)) < 0) {
- printf("Key generation failed!\n");
- close(sockfd);
- return error;
- }
-
- /*
- * Setup the session request and add our public
- * key to it.
- *
- * TODO: Use the 'U' bit in options.
- */
- memset(stp_sq.hash, 0, sizeof(stp_sq.hash));
- stp_sq.options = 0;
- memcpy(stp_sq.pubkey, keypair.pubkey, sizeof(stp_sq.pubkey));
- log_pubkey(keypair.pubkey);
-
- printf("Sending session request...\n");
- error = send(sockfd, &stp_sq, sizeof(stp_sq), 0);
- if (error < 0) {
- perror("Failed to send session request");
- close(sockfd);
- return error;
- }
-
- error = recv(sockfd, serv_pubkey, sizeof(serv_pubkey), 0);
- if (error < 0) {
- perror("Failed to get public key from peer\n");
- close(sockfd);
- return error;
}
- if (error == 0) {
- printf("Connection closed by peer\n");
- close(sockfd);
- return 0;
+ if (session_recv(recv_buf, sizeof(recv_buf), &s) < 0) {
+ fprintf(stderr, "Failed to recv data from server!\n");
+ return -1;
}
- printf("Got public key from server\n");
- log_pubkey(serv_pubkey);
-
- printf("Deriving session key...\n");
- gen_session_key(keypair.privkey, serv_pubkey, &session_key);
-
- /* Send server SPW bits */
- if ((error = negotiate_spw(sockfd, session_key)) < 0) {
- printf("Session Parameter Negotiation failed\n");
- free_session_key(session_key);
- close(sockfd);
- return error;
- }
-
- recv_motd(sockfd, session_key);
- free_session_key(session_key);
- close(sockfd);
+ printf("%s\n", recv_buf);
+ session_close(&s);
return 0;
}
-
-int
-main(void)
-{
- return request_session();
-}