byte AES::cbc_decrypt (byte * cipher, byte * plain, int n_block) { while (n_block--) { byte tmp [N_BLOCK] ; copy_n_bytes (tmp, cipher, N_BLOCK) ; if (decrypt (cipher, plain) != AES_SUCCESS) { return AES_FAILURE ; } xor_block (plain, iv) ; copy_n_bytes (iv, tmp, N_BLOCK) ; plain += N_BLOCK ; cipher += N_BLOCK; } return AES_SUCCESS ; }
byte AES::set_key (byte key [], int keylen) { byte hi ; switch (keylen) { case 16: case 128: keylen = 16; // 10 rounds round = 10 ; break; case 24: case 192: keylen = 24; // 12 rounds round = 12 ; break; case 32: case 256: keylen = 32; // 14 rounds round = 14 ; break; default: round = 0; return FAILURE; } hi = (round + 1) << 4 ; copy_n_bytes (key_sched, key, keylen) ; byte t[4] ; byte next = keylen ; for (byte cc = keylen, rc = 1 ; cc < hi ; cc += N_COL) { for (byte i = 0 ; i < N_COL ; i++) t[i] = key_sched [cc-4+i] ; if (cc == next) { next += keylen ; byte ttt = t[0] ; t[0] = s_box (t[1]) ^ rc ; t[1] = s_box (t[2]) ; t[2] = s_box (t[3]) ; t[3] = s_box (ttt) ; rc = f2 (rc) ; } else if (keylen == 32 && (cc & 31) == 16) { for (byte i = 0 ; i < 4 ; i++) t[i] = s_box (t[i]) ; } byte tt = cc - keylen ; for (byte i = 0 ; i < N_COL ; i++) key_sched [cc + i] = key_sched [tt + i] ^ t[i] ; } return SUCCESS ; }
byte AES::cbc_encrypt (byte * plain, byte * cipher, int n_block) { while (n_block--) { xor_block (iv, plain) ; if (encrypt (iv, iv) != AES_SUCCESS) { return AES_FAILURE ; } copy_n_bytes (cipher, iv, N_BLOCK) ; plain += N_BLOCK ; cipher += N_BLOCK ; } return AES_SUCCESS ; }
byte AES::cbc_encrypt (byte * plain, byte * cipher, int n_block, byte iv [N_BLOCK]) { while (n_block--) { xor_block (iv, plain) ; if (encrypt (iv, iv) != SUCCESS) return FAILURE ; copy_n_bytes (cipher, iv, N_BLOCK) ; plain += N_BLOCK ; cipher += N_BLOCK ; } return SUCCESS ; }
void put_file (int socket, char *filename, int length) { struct answer response; response.errnum = 0; response.nbbytes = 0; response.ack = ANSWER_OK; int file = open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0644); if (file == -1) { exit(errno); } copy_n_bytes (socket, file, length); if(write (socket, &response, sizeof(response)) == -1) { exit (errno); } } /* put_file */
/* * Obtention d'un fichier distant. * 'serverfd' est un socket connecte a la machine 'servername'. * 'distname' est le nom du fichier a demander, 'localname' est le nom du * fichier resultat. */ void get_file (int serverfd, char *servername, char *distname, char *localname) { // REQUEST GET struct request request_get; request_get.kind=REQUEST_GET; strcpy(request_get.path,distname); // ANSWER GET struct answer answer_get; // Envoie de la requete au serveur if(write(serverfd,&request_get,sizeof(request_get))==-1) { perror("erreur envoi requette de get\n"); exit(EXIT_FAILURE); } //Lecture de la réponse du serveur a la requete if(read(serverfd,&answer_get,sizeof(answer_get))==-1){ perror("erreur lors de la lecture de la reponse\n"); exit(EXIT_FAILURE); } // CHECK ack GET check_answer(&answer_get); // Création d'n fichier int fd= open(localname, O_WRONLY | O_CREAT| O_EXCL, 0644); if (fd == -1) { perror("Erreur de creation du fichier\n"); exit(EXIT_FAILURE); } else { // Récuperation des données printf("Debut de la recuperation du fichier\n"); int taille=answer_get.nbbytes; copy_n_bytes(serverfd,fd,taille); printf("Recuperation terminee\n"); close(fd); } }
void copy_bytes(char* from, char* to) { copy_n_bytes(from, to, BLOCK_SIZE); }