aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xsrc/libstrongswan/asn1/pem.c15
1 files changed, 10 insertions, 5 deletions
diff --git a/src/libstrongswan/asn1/pem.c b/src/libstrongswan/asn1/pem.c
index 60e555e93..1cba08fbf 100755
--- a/src/libstrongswan/asn1/pem.c
+++ b/src/libstrongswan/asn1/pem.c
@@ -29,6 +29,8 @@
#include <crypto/hashers/hasher.h>
#include <crypto/crypters/crypter.h>
+#define PKCS5_SALT_LEN 8 /* bytes */
+
static logger_t *logger = NULL;
/**
@@ -94,6 +96,7 @@ static err_t pem_decrypt(chunk_t *blob, encryption_algorithm_t alg, size_t key_s
{
hasher_t *hasher;
crypter_t *crypter;
+ chunk_t salt = { iv->ptr, PKCS5_SALT_LEN };
chunk_t hash;
chunk_t decrypted;
chunk_t key = {alloca(key_size), key_size};
@@ -107,15 +110,14 @@ static err_t pem_decrypt(chunk_t *blob, encryption_algorithm_t alg, size_t key_s
hash.len = hasher->get_hash_size(hasher);
hash.ptr = alloca(hash.len);
hasher->get_hash(hasher, *passphrase, NULL);
- hasher->get_hash(hasher, *iv, hash.ptr);
+ hasher->get_hash(hasher, salt, hash.ptr);
memcpy(key.ptr, hash.ptr, hash.len);
- printf("hash.len: %d, key.len: %d, iv.len: %d\n", hash.len, key.len, iv->len);
if (key.len > hash.len)
{
hasher->get_hash(hasher, hash, NULL);
hasher->get_hash(hasher, *passphrase, NULL);
- hasher->get_hash(hasher, *iv, hash.ptr);
+ hasher->get_hash(hasher, salt, hash.ptr);
memcpy(key.ptr + hash.len, hash.ptr, key.len - hash.len);
}
hasher->destroy(hasher);
@@ -123,13 +125,11 @@ static err_t pem_decrypt(chunk_t *blob, encryption_algorithm_t alg, size_t key_s
/* decrypt blob */
crypter = crypter_create(alg, key_size);
crypter->set_key(crypter, key);
- logger->log_chunk(logger, CONTROL, " cipher text:", *blob);
if (crypter->decrypt(crypter, *blob, *iv, &decrypted) != SUCCESS)
{
return "data size is not multiple of block size";
}
memcpy(blob->ptr, decrypted.ptr, blob->len);
- logger->log_chunk(logger, CONTROL, " plain text:", *blob);
chunk_free(&decrypted);
/* determine amount of padding */
@@ -248,6 +248,11 @@ err_t pem_to_bin(chunk_t *blob, chunk_t *passphrase, bool *pgp)
alg = ENCR_AES_CBC;
key_size = 16;
}
+ else if (match("AES-192-CBC", &dek))
+ {
+ alg = ENCR_AES_CBC;
+ key_size = 24;
+ }
else if (match("AES-256-CBC", &dek))
{
alg = ENCR_AES_CBC;