+ /* Generate the server DH block based on the client DH block */
+ printf("Generating the server DH block.\n");
+ printf("...from client DH block, dh_g = %s, dh_p = %s.\n", BN_bn2hex(req->tidc_dh->g), BN_bn2hex(req->tidc_dh->p));
+
+ if (NULL == ((*resp)->servers->aaa_server_dh = tr_create_matching_dh(NULL, 0, req->tidc_dh))) {
+ printf("tids_req_handler(): Can't create server DH params.\n");
+ return -1;
+ }
+
+ /* Generate the server key */
+ printf("Generating the server key.\n");
+ if (NULL == (s_keybuf = malloc(DH_size((*resp)->servers->aaa_server_dh)))) {
+ printf ("tids_req_handler(): Can't allocate server keybuf.\n");
+ return -1;
+ }
+
+ if (0 > (s_keylen = tr_compute_dh_key(s_keybuf,
+ DH_size((*resp)->servers->aaa_server_dh),
+ req->tidc_dh->pub_key,
+ (*resp)->servers->aaa_server_dh))) {
+ printf("tids_req_handler(): Key computation failed.");
+ return -1;
+ }
+
+ /* Print out the key. If this were a AAA server, we'd store the key. */
+ printf("tids_req_handler(): Server Key Generated (len = %d):\n", s_keylen);
+ for (i = 0; i < s_keylen; i++) {
+ printf("%x", s_keybuf[i]);
+ }
+ printf("\n");
+ return s_keylen;
+}