Updated DH code, added code to tpqc to send DH info, removed extra gsscon messages.
[trust_router.git] / tpq / tpqc.c
index a9be6bb..e7ab977 100644 (file)
  *
  */
 
+#include <stdio.h>
 #include <stdlib.h>
+#include <jansson.h>
 
 #include <gsscon.h>
+#include <tr_dh.h>
 #include <tpq.h>
+#include <tr_msg.h>
+
+/* char tmp_key[32] = 
+  {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 
+   0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
+   0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
+   0x19, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F};
+*/
+
+int tmp_len = 32;
 
 TPQC_INSTANCE *tpqc_create ()
 {
   TPQC_INSTANCE *tpqc = NULL;
 
-  if (tpqc = malloc(sizeof(TPQC_INSTANCE)))
+  if (tpqc = malloc(sizeof(TPQC_INSTANCE))) 
     memset(tpqc, 0, sizeof(TPQC_INSTANCE));
+  else
+    return NULL;
+
+  if (NULL == (tpqc->priv_dh = tr_create_dh_params(NULL, 0))) {
+    free (tpqc);
+    return NULL;
+  }
+
+  fprintf(stderr, "TPQC DH Parameters:\n");
+  DHparams_print_fp(stdout, tpqc->priv_dh);
+  fprintf(stderr, "\n");
 
   return tpqc;
 }
 
+void tpqc_destroy (TPQC_INSTANCE *tpqc)
+{
+  if (tpqc)
+    free(tpqc);
+}
+
 int tpqc_open_connection (TPQC_INSTANCE *tpqc, 
-                         char *server)
+                         char *server,
+                         gss_ctx_id_t *gssctx)
 {
   int err = 0;
   int conn = -1;
-  gss_ctx_id_t gssContext = GSS_C_NO_CONTEXT;
-
 
   err = gsscon_connect(server, TPQ_PORT, &conn);
+
   if (!err)
-    err = fsscon_active_authenticate(conn, NULL, "trustquery", &gssContext);
+    err = gsscon_active_authenticate(conn, NULL, "trustquery", gssctx);
 
   if (!err)
     return conn;
@@ -67,21 +97,90 @@ int tpqc_open_connection (TPQC_INSTANCE *tpqc,
 
 int tpqc_send_request (TPQC_INSTANCE *tpqc, 
                       int conn, 
+                      gss_ctx_id_t gssctx,
+                      char *rp_realm,
                       char *realm, 
                       char *coi,
                       TPQC_RESP_FUNC *resp_handler,
                       void *cookie)
 
 {
+  json_t *jreq;
+  int err;
+  char *req_buf;
+  char *resp_buf;
+  size_t resp_buflen = 0;
+  TR_MSG *msg;
+  TPQ_REQ *tpq_req;
+
+  /* Create and populate a TPQ msg structure */
+  if ((!(msg = malloc(sizeof(TR_MSG)))) ||
+      (!(tpq_req = malloc(sizeof(TPQ_REQ)))))
+    return -1;
 
-}
+  memset(tpq_req, 0, sizeof(tpq_req));
 
-void tpqc_destroy (TPQC_INSTANCE *tpqc)
-{
-  if (tpqc)
-    free(tpqc);
+  msg->msg_type = TPQ_REQUEST;
+
+  msg->tpq_req = tpq_req;
+
+  tpq_req->conn = conn;
+
+  /* TBD -- error handling */
+  tpq_req->rp_realm = tr_new_name(rp_realm);
+  tpq_req->realm = tr_new_name(realm);
+  tpq_req->coi = tr_new_name(coi);
+
+  tpq_req->tpqc_dh = tpqc->priv_dh;
+  
+  tpq_req->resp_func = resp_handler;
+  tpq_req->cookie = cookie;
+
+  /* Encode the request into a json string */
+  if (!(req_buf = tr_msg_encode(msg))) {
+    printf("Error encoding TPQ request.\n");
+    return -1;
+  }
+
+  printf ("Sending TPQ request:\n");
+  printf ("%s\n", req_buf);
+
+  /* Send the request over the connection */
+  if (err = gsscon_write_encrypted_token (conn, gssctx, req_buf, 
+                                         strlen(req_buf))) {
+    fprintf(stderr, "Error sending request over connection.\n");
+    return -1;
+  }
+
+  /* TBD -- should queue request on instance, resps read in separate thread */
+  /* Read the response from the connection */
+
+  if (err = gsscon_read_encrypted_token(conn, gssctx, &resp_buf, &resp_buflen)) {
+    if (resp_buf)
+      free(resp_buf);
+    return -1;
+  }
+
+  fprintf(stdout, "Response Received, %d bytes.\n", resp_buflen);
+
+  /* Parse response -- TBD */
+
+  /* Call the caller's response function */
+  (*resp_handler)(tpqc, NULL, cookie);
+
+  if (msg)
+    free(msg);
+  if (tpq_req)
+    free(tpq_req);
+  if (req_buf)
+    free(req_buf);
+  if (resp_buf)
+    free(resp_buf);
+
+  return 0;
 }
 
 
 
 
+