static void pdcmode_aes_ecb_decrypt(const ccecb_ctx *ctx, unsigned long nblocks, const void *in, void *out) { printf("%s\n", __func__); AES128_ECB_decrypt((struct _pdcmode_aes128_ctx *)ctx, nblocks, in, out); }
static void test_decrypt_ecb(void) { uint8_t key[] = {0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c}; uint8_t in[] = {0x3a, 0xd7, 0x7b, 0xb4, 0x0d, 0x7a, 0x36, 0x60, 0xa8, 0x9e, 0xca, 0xf3, 0x24, 0x66, 0xef, 0x97}; uint8_t expected[] = {0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96, 0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a}; uint8_t buffer[16]; AES128_ECB_decrypt(in, key, buffer); NP_ASSERT_BYTES_EQUAL( expected, buffer, sizeof(buffer) ); }
static void test_decrypt_ecb(void) { uint8_t key[] = {0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c}; uint8_t in[] = {0x3a, 0xd7, 0x7b, 0xb4, 0x0d, 0x7a, 0x36, 0x60, 0xa8, 0x9e, 0xca, 0xf3, 0x24, 0x66, 0xef, 0x97}; uint8_t out[] = {0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96, 0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a}; uint8_t buffer[16]; AES128_ECB_decrypt(in, key, buffer); printf("ECB decrypt: "); if(0 == strncmp((char*) out, (char*) buffer, 16)) { printf("SUCCESS!\n"); } else { printf("FAILURE!\n"); } }
void read_client_msg(Client* client, int read_fd) { rb_red_blk_node* transfer = RBExactQuery(client->transfers, &read_fd); File_msg* file_msg = (File_msg*)(transfer->info); int valread = read(read_fd, file_msg->msg.buffer+file_msg->msg.offset, BUFFER_SIZE-file_msg->msg.offset); if(valread == 0) { logger("<Client><read_client_msg>client disconnected\n"); RBDelete(client->transfers, transfer); close(read_fd); FD_CLR(read_fd, &(client->fd_read_set)); FD_CLR(read_fd, &(client->fd_write_set)); return; } file_msg->msg.offset += valread; if(file_msg->msg.offset == BUFFER_SIZE) { if(file_msg->aes_key[0] == '\0') { if(ENCRYPTION_ENABLED) { logger("<Client><read_client_msg>got a full RSA message from another client\n"); char encrypted[BUFFER_SIZE]; for(int i = 0; i<BUFFER_SIZE; ++i) encrypted[i] = file_msg->msg.buffer[i]; private_decrypt(encrypted,BUFFER_SIZE,client->keypair,file_msg->msg.buffer); } char command = file_msg->msg.buffer[0]; if(command == 'r') { logger("<Client><read_client_msg>got a request message\n"); /*rname token AES => cname ip token*/ sscanf(file_msg->msg.buffer+1, "%s %s %s", file_msg->file_name, file_msg->token, file_msg->aes_key); struct sockaddr address; int add_len = sizeof(address); getpeername(read_fd, (struct sockaddr*)&(address), (socklen_t*)&(add_len)); struct in_addr ip_struct; inet_aton(address.sa_data, & ip_struct); int ip = ip_struct.s_addr; RBTreeInsert(client->waiting_list, file_msg->token, &read_fd); sprintf(client->server_msg.buffer, "c%s %d %s", file_msg->file_name, ip, file_msg->token); FD_SET(client->maintainer_fd, &(client->fd_write_set)); file_msg->msg.offset=0; } else { exit(1); } } else { if(ENCRYPTION_ENABLED) { char partial_msg[128]; for(int i = 0; i < (BUFFER_SIZE/128); ++i) { for(int j=0; j<128; ++j) partial_msg[j] = file_msg->msg.buffer[i*128+j]; AES128_ECB_decrypt(partial_msg,file_msg->aes_key,file_msg->msg.buffer+i*128); } logger("<Client><read_client_msg>AES decrypted the message\n"); } if(file_msg->file_fd == -1) { /*ttoken size => in data mode*/ char token[8]; sscanf(file_msg->msg.buffer, "t%s %d", token, file_msg->msg.total_len); logger("<Client><read_client_msg>got a transfer message with %s for and with size %d\n", token, file_msg->msg.total_len); file_msg->token[0] = '\0'; file_msg->msg.offset=0; } else { /*read data mode (write to file)*/ if(ENCRYPTION_ENABLED) { char file_write_buffer[BUFFER_SIZE]; AES128_ECB_decrypt(file_msg->msg.buffer, file_msg->aes_key, file_write_buffer); file_msg->msg.offset += write(file_msg->file_fd, file_write_buffer, (file_msg->msg.total_len-file_msg->msg.offset) > 0 ? BUFFER_SIZE : (file_msg->msg.total_len-file_msg->msg.offset)); } else file_msg->msg.offset += write(file_msg->file_fd, file_msg->msg.buffer, (file_msg->msg.total_len-file_msg->msg.offset) > 0 ? BUFFER_SIZE : (file_msg->msg.total_len-file_msg->msg.offset)); logger("<Client><read_client_msg>wrote to file\n"); if(file_msg->msg.offset == file_msg->msg.total_len) close(file_msg->file_fd); } } } }