示例#1
0
文件: AES.cpp 项目: Yveaux/MySensors
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 ;
}
示例#2
0
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 ;
}
示例#3
0
文件: AES.cpp 项目: Yveaux/MySensors
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 ;
}
示例#4
0
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 ;
}
示例#5
0
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); 
  }

}
示例#7
0
文件: rng.cpp 项目: theihor/crypto2
void copy_bytes(char* from, char* to) {
    copy_n_bytes(from, to, BLOCK_SIZE);
}