Esempio n. 1
0
static int test_md5_basic(void)
{
	const char md5_challenge[] = "thequickbrownfox";
	const uint8_t md5_control[16] = { 0x30, 0x8f, 0xb7, 0x6d, 0xc4, 0xd7, 0x30, 0x36, 0x0e, 0xe3, 0x39, 0x32, 0xd2, 0xfb, 0x10, 0x56 };
	const char md5_control_str[33] = "308fb76dc4d730360ee33932d2fb1056";
	uint8_t md5_result[16] = { 0x00 };
	char md5_result_str[33] = "";

	digest_get((uint8_t *)md5_challenge, (unsigned int)strlen(md5_challenge), md5_result);

	digest_to_str(md5_control, md5_result_str);

	if (strcmp(md5_control_str, md5_result_str) != 0)
	{
		fprintf(stderr, "Error: digest_to_str mismatch. Expected 0x%s Got: 0x%s\n", md5_control_str, md5_result_str);
		return -EINVAL;
	}

	digest_to_str(md5_result, md5_result_str);

	if (strcmp(md5_control_str, md5_result_str) != 0)
	{
		fprintf(stderr, "Error: digest_get mismatch. Expected: 0x%s Got: 0x%s\n", md5_control_str, md5_result_str);
		return -EINVAL;
	}

	return 0;
}
Esempio n. 2
0
static int client(const char *filepath, 
                  struct in_addr *srv_inetaddr, int port)
{
        int sock, ret = EXIT_FAILURE;
        union {
                struct sockaddr_sv serval;
                struct sockaddr_in inet;
                struct sockaddr saddr;
        } cliaddr, srvaddr;
        socklen_t addrlen = 0;
        unsigned char digest[SHA_DIGEST_LENGTH];
        unsigned short srv_inetport = (unsigned short)port;
        int family = AF_SERVAL;

        memset(&cliaddr, 0, sizeof(cliaddr));
        memset(&srvaddr, 0, sizeof(srvaddr));

        if (srv_inetaddr) {
                family = AF_INET;
                cliaddr.inet.sin_family = family;
                cliaddr.inet.sin_port = htons(6767);
                srvaddr.inet.sin_family = family;
                srvaddr.inet.sin_port = htons(srv_inetport);
                memcpy(&srvaddr.inet.sin_addr, srv_inetaddr, 
                       sizeof(*srv_inetaddr));
                addrlen = sizeof(cliaddr.inet);
        } else {
                cliaddr.serval.sv_family = family;
                cliaddr.serval.sv_srvid.s_sid32[0] = htonl(getpid());
                srvaddr.serval.sv_family = AF_SERVAL;
                memcpy(&srvaddr.serval.sv_srvid, 
                       &server_srvid, sizeof(server_srvid));
                addrlen = sizeof(cliaddr.serval);
                /* srvaddr.sv_flags = SV_WANT_FAILOVER; */
        }
        
        sock = socket_sv(family, SOCK_STREAM, 0);
        
        set_reuse_ok(sock);
        
        if (family == AF_SERVAL) {
                ret = bind_sv(sock, &cliaddr.saddr, addrlen);
                
                if (ret < 0) {
                        fprintf(stderr, "error client binding socket: %s\n", 
                                strerror_sv(errno));
                        goto out;
                }
        }
        
        if (family == AF_INET) {
                char buf[18];
                printf("Connecting to service %s:%u\n",
                       inet_ntop(family, srv_inetaddr, buf, 18), 
                       srv_inetport);
        } else {
                printf("Connecting to service id %s\n", 
                       service_id_to_str(&srvaddr.serval.sv_srvid));
        }
        ret = connect_sv(sock, &srvaddr.saddr, addrlen);
    
        if (ret < 0) {
                fprintf(stderr, "ERROR connecting: %s\n",
                        strerror_sv(errno));
                goto out;
        }
#if defined(SERVAL_NATIVE)
        {
                struct {
                        struct sockaddr_sv sv;
                        struct sockaddr_in in;
                } saddr;
                socklen_t addrlen = sizeof(saddr.in);
                char ipaddr[18];

                memset(&saddr, 0, sizeof(saddr));
                
                ret = getsockname(sock, (struct sockaddr *)&saddr, &addrlen);

                if (ret == -1) {
                        fprintf(stderr, "Could not get sock name : %s\n",
                                strerror(errno));
                } else {
                        printf("sock name is %s @ %s\n",
                               service_id_to_str(&saddr.sv.sv_srvid),
                               inet_ntop(AF_INET, &saddr.in.sin_addr, 
                                         ipaddr, 18));
                }

                memset(&saddr, 0, sizeof(saddr));
                
                ret = getpeername(sock, (struct sockaddr *)&saddr, &addrlen);

                if (ret == -1) {
                        fprintf(stderr, "Could not get peer name : %s\n",
                                strerror(errno));
                } else {
                        printf("peer name is %s @ %s\n",
                               service_id_to_str(&saddr.sv.sv_srvid),
                               inet_ntop(AF_INET, &saddr.in.sin_addr, 
                                         ipaddr, 18));
                }
        } 
#endif
        printf("Connected successfully!\n");
        
        ret = recv_file(sock, filepath, digest);
        
        if (ret == EXIT_SUCCESS) {
                printf("SHA1 digest is [%s]\n", digest_to_str(digest));
        } else {
                printf("Receive failed\n");
        }
out:
        fprintf(stderr, "Closing socket...\n");
        close_sv(sock);

        return ret;
}
Esempio n. 3
0
static int server(const char *filepath, 
                  size_t send_memory_buffer_size, 
                  int family)
{
        int sock;
        int backlog = 8;    
        union {
                 struct sockaddr_sv serval;
                struct sockaddr_in inet;
                struct sockaddr saddr;
        } cliaddr, srvaddr;
        socklen_t addrlen = 0;
        unsigned char digest[SHA_DIGEST_LENGTH];
        int ret = EXIT_FAILURE;
        unsigned short srv_inetport = 49254;

        memset(&cliaddr, 0, sizeof(cliaddr));
        memset(&srvaddr, 0, sizeof(srvaddr));

        if (family == AF_INET) {
                cliaddr.inet.sin_family = family;
                srvaddr.inet.sin_family = family;
                srvaddr.inet.sin_addr.s_addr = INADDR_ANY;
                srvaddr.inet.sin_port = htons(srv_inetport);
                addrlen = sizeof(srvaddr.inet);
        } else {
                cliaddr.serval.sv_family = family;
                srvaddr.serval.sv_family = AF_SERVAL;
                memcpy(&srvaddr.serval.sv_srvid,
                       &listen_srvid, sizeof(listen_srvid));
                addrlen = sizeof(cliaddr.serval);
        }
      
        sock = socket_sv(family, SOCK_STREAM, 0);

        if (sock < 0) {
                fprintf(stderr, "error creating AF_SERVAL socket: %s\n", 
                        strerror(errno));
                return EXIT_FAILURE;
        }
  
        set_reuse_ok(sock);
        
        ret = bind_sv(sock, &srvaddr.saddr, addrlen);
  
        if (ret < 0) {
                fprintf(stderr, "error binding socket: %s\n", strerror(errno));
                close_sv(sock);
                return ret;
        }
        
        if (family == AF_INET) {
                printf("server: bound to port %u\n",
                       srv_inetport);
        } else {
                printf("server: bound to service id %s\n", 
                       service_id_to_str(&listen_srvid));
        }
        
        ret = listen_sv(sock, backlog);

        if (ret < 0) {
                fprintf(stderr, "error setting listening socket: %s\n", 
                        strerror(errno));
                close_sv(sock);
                return ret;
        }
    
        while (!should_exit) {
                socklen_t l = addrlen;
                int client_sock;
                long offset = 0;

                printf("Waiting for new connections\n");
                
                client_sock = accept_sv(sock, &cliaddr.saddr, &l);
        
                if (client_sock < 0) {
                        fprintf(stderr, "error accepting new conn: %s\n", 
                                strerror_sv(errno));
                        continue;
                }
                
                if (family == AF_INET) {
                        char buf[18];
                        printf("Connect request from %s:%u\n",
                               inet_ntop(family, 
                                         &cliaddr.inet.sin_addr, buf, 18),
                               ntohs(cliaddr.inet.sin_port));
                } else {
                        printf("Connect req from service id %s (sock = %d)\n",
                               service_id_to_str(&cliaddr.serval.sv_srvid), 
                               client_sock);
                }
                
                if (send_memory_buffer_size > 0)
                        ret = send_memory_buffer(client_sock, 
                                                 send_memory_buffer_size, 
                                                 digest);
                else
                        ret = send_file(client_sock, filepath, offset, 
                                        digest);

                if (ret == EXIT_SUCCESS) {
                        printf("Send successful\n");
                        printf("SHA1 digest is [%s]\n", digest_to_str(digest));
                } else if (ret < 0) {
                        fprintf(stderr, "Failed data transfer to client\n");
                        //should_exit = 1;
                }
                close_sv(client_sock);
        } 

        close_sv(sock);

        return ret;
}