in crypto/apr_crypto_commoncrypto.c [337:433]
static apr_status_t crypto_cipher_mechanism(apr_crypto_key_t *key,
const apr_crypto_block_key_type_e type,
const apr_crypto_block_key_mode_e mode, const int doPad, apr_pool_t *p)
{
/* handle padding */
key->options = doPad ? kCCOptionPKCS7Padding : 0;
/* determine the algorithm to be used */
switch (type) {
case (APR_KEY_3DES_192):
/* A 3DES key */
if (mode == APR_MODE_CBC) {
key->algorithm = kCCAlgorithm3DES;
key->keyLen = kCCKeySize3DES;
key->ivSize = kCCBlockSize3DES;
key->blockSize = kCCBlockSize3DES;
}
else {
key->algorithm = kCCAlgorithm3DES;
key->options += kCCOptionECBMode;
key->keyLen = kCCKeySize3DES;
key->ivSize = 0;
key->blockSize = kCCBlockSize3DES;
}
break;
case (APR_KEY_AES_128):
if (mode == APR_MODE_CBC) {
key->algorithm = kCCAlgorithmAES128;
key->keyLen = kCCKeySizeAES128;
key->ivSize = kCCBlockSizeAES128;
key->blockSize = kCCBlockSizeAES128;
}
else {
key->algorithm = kCCAlgorithmAES128;
key->options += kCCOptionECBMode;
key->keyLen = kCCKeySizeAES128;
key->ivSize = 0;
key->blockSize = kCCBlockSizeAES128;
}
break;
case (APR_KEY_AES_192):
if (mode == APR_MODE_CBC) {
key->algorithm = kCCAlgorithmAES128;
key->keyLen = kCCKeySizeAES192;
key->ivSize = kCCBlockSizeAES128;
key->blockSize = kCCBlockSizeAES128;
}
else {
key->algorithm = kCCAlgorithmAES128;
key->options += kCCOptionECBMode;
key->keyLen = kCCKeySizeAES192;
key->ivSize = 0;
key->blockSize = kCCBlockSizeAES128;
}
break;
case (APR_KEY_AES_256):
if (mode == APR_MODE_CBC) {
key->algorithm = kCCAlgorithmAES128;
key->keyLen = kCCKeySizeAES256;
key->ivSize = kCCBlockSizeAES128;
key->blockSize = kCCBlockSizeAES128;
}
else {
key->algorithm = kCCAlgorithmAES128;
key->options += kCCOptionECBMode;
key->keyLen = kCCKeySizeAES256;
key->ivSize = 0;
key->blockSize = kCCBlockSizeAES128;
}
break;
default:
/* TODO: Support CAST, Blowfish */
/* unknown key type, give up */
return APR_EKEYTYPE;
}
/* make space for the key */
key->key = apr_palloc(p, key->keyLen);
if (!key->key) {
return APR_ENOMEM;
}
apr_crypto_clear(p, key->key, key->keyLen);
return APR_SUCCESS;
}