Advertisement
Guest User

Untitled

a guest
Apr 25th, 2015
216
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.12 KB | None | 0 0
  1. /*
  2. * secure_comms.c
  3. * Copyright (C) 2015 tibbar <tibbar@ubuntu>
  4. *
  5. * Distributed under terms of the MIT license.
  6. */
  7.  
  8. #include "secure_comms.h"
  9. #include <jnxc_headers/jnxsocket.h>
  10. #include <net/if.h>
  11. #include <sys/types.h>
  12. #include <sys/socket.h>
  13. #include <ifaddrs.h>
  14. #include <netinet/in.h>
  15. #include <arpa/inet.h>
  16. #include <netdb.h>
  17. #include <jnxc_headers/jnxthread.h>
  18.  
  19. static int listen_for_socket_fd(jnx_socket *s, peer *remote_peer,session *ses) {
  20. jnx_int32 optval = 1;
  21. struct addrinfo hints, *res, *p;
  22. struct sockaddr_storage their_addr;
  23. memset(&hints,0,sizeof(hints));
  24. hints.ai_family = s->addrfamily;
  25. hints.ai_socktype = s->stype;
  26. hints.ai_flags = AI_PASSIVE;
  27. JNXCHECK(getaddrinfo(NULL,ses->secure_comms_port,&hints,&res) == 0);
  28. p = res;
  29. while(p != NULL) {
  30. if (setsockopt(s->socket,
  31. SOL_SOCKET,
  32. SO_REUSEADDR,
  33. &optval,sizeof(jnx_int32)) == -1) {
  34. perror("setsockopt");
  35. exit(1);
  36. }
  37. if (bind(s->socket, p->ai_addr, p->ai_addrlen) == -1) {
  38. perror("server: bind");
  39. return -1;
  40. }
  41. break;
  42. p = p->ai_next;
  43. }
  44. freeaddrinfo(res);
  45. listen(s->socket,1);
  46. socklen_t addr_size = sizeof(their_addr);
  47. return accept(s->socket,(struct sockaddr*)&their_addr,&addr_size);
  48. }
  49. static int connect_for_socket_fd(jnx_socket *s, peer *remote_peer,session *ses) {
  50. struct addrinfo hints, *res;
  51. memset(&hints,0,sizeof(hints));
  52. hints.ai_family = s->addrfamily;
  53. hints.ai_socktype = s->stype;
  54.  
  55. jnx_int32 rg = 0;
  56.  
  57. if((rg = getaddrinfo(remote_peer->host_address,ses->secure_comms_port,&hints,&res)) != 0) {
  58. JNX_LOG(DEFAULT_CONTEXT,"%s\n",gai_strerror(rg));
  59. return -1;
  60. }
  61. if(!s->isconnected) {
  62. if(connect(s->socket,res->ai_addr,res->ai_addrlen) != 0) {
  63. perror("connect:");
  64. freeaddrinfo(res);
  65. return 1;
  66. }
  67. s->isconnected = 1;
  68. }
  69. freeaddrinfo(res);
  70. return s->socket;
  71. }
  72. void *secure_comms_bootstrap_listener(void *args) {
  73. session *s = (session *)args;
  74. jnx_char buffer[2048];
  75. while(s->is_connected) {
  76. bzero(buffer,2048);
  77. jnx_size bytes_read = read(s->secure_comms_fd,
  78. buffer,2048);
  79.  
  80. jnx_char *decrypted_message =
  81. symmetrical_decrypt(s->shared_secret,buffer,strlen(buffer));
  82.  
  83. if(strcmp(decrypted_message,":q") == 0) {
  84. close(s->secure_comms_fd);
  85. return 0;
  86. }
  87. s->session_callback(&(*s).session_guid,decrypted_message);
  88. }
  89. }
  90. void secure_comms_start(secure_comms_endpoint e, discovery_service *ds,
  91. session *s,jnx_unsigned_int addr_family) {
  92. JNXCHECK(s->is_connected);
  93. printf("Starting secure comms on %s.\n",s->secure_comms_port);
  94.  
  95. peer *local_peer = peerstore_get_local_peer(ds->peers);
  96. JNXCHECK(local_peer);
  97. peer *remote_peer = peerstore_lookup(ds->peers,&(*s).remote_peer_guid);
  98. JNXCHECK(remote_peer);
  99. printf("Starting a tunnel to %s\n",remote_peer->host_address);
  100.  
  101. jnx_socket *secure_sock = jnx_socket_tcp_create(addr_family);
  102. /* Not using standard jnx_socket networking here due to bespoke nature of
  103. * bi directional socket with non-blocking write properties */
  104. jnx_int sockfd = -1;
  105. switch(e) {
  106.  
  107. case SC_INITIATOR:
  108. printf("About to initiate connection to remote secure_comms_port.\n");
  109. sleep(3);
  110. sockfd = connect_for_socket_fd(secure_sock,remote_peer,s);
  111. s->secure_comms_fd = sockfd;
  112. printf("Secure socket fd: %d\n",s->secure_comms_fd);
  113. break;
  114.  
  115. case SC_RECEIVER:
  116. printf("Setting up recevier.\n");
  117. sockfd = listen_for_socket_fd(secure_sock,remote_peer,s);
  118. JNXCHECK(sockfd != -1);
  119. s->secure_comms_fd = sockfd;
  120. printf("Secure socket fd: %d\n",s->secure_comms_fd);
  121. break;
  122. }
  123. JNXCHECK(sockfd != -1);
  124. // At this point both the initiator and receiver are equal and have fd's relevent to them
  125. // that are connected *
  126.  
  127. jnx_thread_create_disposable(secure_comms_bootstrap_listener,
  128. s);
  129.  
  130. }
  131. void secure_comms_receiver_start(discovery_service *ds,
  132. session *s,jnx_unsigned_int addr_family) {
  133. secure_comms_start(SC_RECEIVER,ds,s,addr_family);
  134. }
  135. void secure_comms_initiator_start(discovery_service *ds,
  136. session *s,jnx_unsigned_int addr_family) {
  137. secure_comms_start(SC_INITIATOR,ds,s,addr_family);
  138. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement