Beispiel #1
0
static int
aead_from_name(const EVP_AEAD **aead, const char *name)
{
	*aead = NULL;

	if (strcmp(name, "aes-128-gcm") == 0) {
#ifndef OPENSSL_NO_AES
		*aead = EVP_aead_aes_128_gcm();
#else
		fprintf(stderr, "No AES support.\n");
#endif
	} else if (strcmp(name, "aes-256-gcm") == 0) {
#ifndef OPENSSL_NO_AES
		*aead = EVP_aead_aes_256_gcm();
#else
		fprintf(stderr, "No AES support.\n");
#endif
	} else if (strcmp(name, "chacha20-poly1305") == 0) {
#if !defined(OPENSSL_NO_CHACHA) && !defined(OPENSSL_NO_POLY1305)
		*aead = EVP_aead_chacha20_poly1305();
#else
		fprintf(stderr, "No chacha20-poly1305 support.\n");
#endif
	} else {
		fprintf(stderr, "Unknown AEAD: %s\n", name);
		return -1;
	}

	if (aead == NULL)
		return 0;

	return 1;
}
Beispiel #2
0
int ssl_cipher_get_evp_aead(const EVP_AEAD **out_aead,
                            size_t *out_mac_secret_len,
                            size_t *out_fixed_iv_len,
                            const SSL_CIPHER *cipher, uint16_t version) {
  *out_aead = NULL;
  *out_mac_secret_len = 0;
  *out_fixed_iv_len = 0;

  switch (cipher->algorithm_enc) {
    case SSL_AES128GCM:
      *out_aead = EVP_aead_aes_128_gcm();
      *out_fixed_iv_len = 4;
      return 1;

    case SSL_AES256GCM:
      *out_aead = EVP_aead_aes_256_gcm();
      *out_fixed_iv_len = 4;
      return 1;

    case SSL_CHACHA20POLY1305:
      *out_aead = EVP_aead_chacha20_poly1305();
      *out_fixed_iv_len = 0;
      return 1;

    case SSL_RC4:
      switch (cipher->algorithm_mac) {
        case SSL_MD5:
          if (version == SSL3_VERSION) {
            *out_aead = EVP_aead_rc4_md5_ssl3();
          } else {
            *out_aead = EVP_aead_rc4_md5_tls();
          }
          *out_mac_secret_len = MD5_DIGEST_LENGTH;
          return 1;
        case SSL_SHA1:
          if (version == SSL3_VERSION) {
            *out_aead = EVP_aead_rc4_sha1_ssl3();
          } else {
            *out_aead = EVP_aead_rc4_sha1_tls();
          }
          *out_mac_secret_len = SHA_DIGEST_LENGTH;
          return 1;
        default:
          return 0;
      }

    case SSL_AES128:
      switch (cipher->algorithm_mac) {
        case SSL_SHA1:
          if (version == SSL3_VERSION) {
            *out_aead = EVP_aead_aes_128_cbc_sha1_ssl3();
            *out_fixed_iv_len = 16;
          } else if (version == TLS1_VERSION) {
            *out_aead = EVP_aead_aes_128_cbc_sha1_tls_implicit_iv();
            *out_fixed_iv_len = 16;
          } else {
            *out_aead = EVP_aead_aes_128_cbc_sha1_tls();
          }
          *out_mac_secret_len = SHA_DIGEST_LENGTH;
          return 1;
        case SSL_SHA256:
          *out_aead = EVP_aead_aes_128_cbc_sha256_tls();
          *out_mac_secret_len = SHA256_DIGEST_LENGTH;
          return 1;
        default:
          return 0;
      }

    case SSL_AES256:
      switch (cipher->algorithm_mac) {
        case SSL_SHA1:
          if (version == SSL3_VERSION) {
            *out_aead = EVP_aead_aes_256_cbc_sha1_ssl3();
            *out_fixed_iv_len = 16;
          } else if (version == TLS1_VERSION) {
            *out_aead = EVP_aead_aes_256_cbc_sha1_tls_implicit_iv();
            *out_fixed_iv_len = 16;
          } else {
            *out_aead = EVP_aead_aes_256_cbc_sha1_tls();
          }
          *out_mac_secret_len = SHA_DIGEST_LENGTH;
          return 1;
        case SSL_SHA256:
          *out_aead = EVP_aead_aes_256_cbc_sha256_tls();
          *out_mac_secret_len = SHA256_DIGEST_LENGTH;
          return 1;
        case SSL_SHA384:
          *out_aead = EVP_aead_aes_256_cbc_sha384_tls();
          *out_mac_secret_len = SHA384_DIGEST_LENGTH;
          return 1;
        default:
          return 0;
      }

    case SSL_3DES:
      switch (cipher->algorithm_mac) {
        case SSL_SHA1:
          if (version == SSL3_VERSION) {
            *out_aead = EVP_aead_des_ede3_cbc_sha1_ssl3();
            *out_fixed_iv_len = 8;
          } else if (version == TLS1_VERSION) {
            *out_aead = EVP_aead_des_ede3_cbc_sha1_tls_implicit_iv();
            *out_fixed_iv_len = 8;
          } else {
            *out_aead = EVP_aead_des_ede3_cbc_sha1_tls();
          }
          *out_mac_secret_len = SHA_DIGEST_LENGTH;
          return 1;
        default:
          return 0;
      }

    default:
      return 0;
  }
}
const EVP_AEAD *EVP_aead_chacha20_poly1305_rfc7539(void) {
  return EVP_aead_chacha20_poly1305();
}