Add AAD support in AES GCM 19/42819/5
authorKrzysztof Jackiewicz <k.jackiewicz@samsung.com>
Thu, 2 Jul 2015 13:34:47 +0000 (15:34 +0200)
committerKrzysztof Jackiewicz <k.jackiewicz@samsung.com>
Tue, 28 Jul 2015 09:04:51 +0000 (02:04 -0700)
[Feature] Encryption service development.
[Solution] Add AppendAAD method to EvpCipherWrapper. Use it to provide AAD in
AES GCM encryption/decryption.

[Verification] ckm-test --regexp=TED_1250_gcm_aad should pass.

Change-Id: If461a875490b3a6319eb5c78b914bd4df6591746

src/manager/crypto/sw-backend/crypto.h
src/manager/crypto/sw-backend/internals.cpp
src/manager/crypto/sw-backend/internals.h

index d23aac0..d42d930 100644 (file)
@@ -52,6 +52,7 @@ struct Base {
         return EVP_CIPHER_CTX_ctrl(m_ctx, type, arg, ptr);
     }
 
+    virtual void AppendAAD(const T&) = 0;
     virtual T Append(const T&) = 0;
     virtual T Finalize() = 0;
     virtual ~Base(){
@@ -83,12 +84,20 @@ public:
         EVP_CIPHER_CTX_set_padding(m_ctx, 1);
     }
 
+    void AppendAAD(const T& data) {
+        static_assert(sizeof(typename T::value_type) == 1, "Unsupported type inside container.");
+        int bytesLen;
+        if (1 != EVP_CipherUpdate(m_ctx, NULL, &bytesLen, data.data(), data.size())) {
+            ThrowErr(Exc::Crypto::InternalError, "AppendAAD(): Failed in EVP_CipherUpdate");
+        }
+    }
+
     T Append(const T& data) {
         static_assert(sizeof(typename T::value_type) == 1, "Unsupported type inside container.");
         int bytesLen = static_cast<int>(data.size() + EVP_CIPHER_CTX_block_size(m_ctx));
         T output(bytesLen);
         if (1 != EVP_CipherUpdate(m_ctx, output.data(), &bytesLen, data.data(), data.size())) {
-            ThrowErr(Exc::Crypto::InternalError, "Failed in EVP_CipherUpdate");
+            ThrowErr(Exc::Crypto::InternalError, "Append(): Failed in EVP_CipherUpdate");
         }
         output.resize(bytesLen);
         return output;
index 658d6eb..df9fbb7 100644 (file)
@@ -534,11 +534,16 @@ std::pair<RawBuffer, RawBuffer> encryptDataAesGcm(
     const RawBuffer &key,
     const RawBuffer &data,
     const RawBuffer &iv,
-    int tagSize)
+    int tagSize,
+    const RawBuffer &aad)
 {
     RawBuffer tag(tagSize);
     EvpCipherPtr enc;
     selectCipher(AlgoType::AES_GCM, key.size())(enc, key, iv);
+
+    if (!aad.empty())
+        enc->AppendAAD(aad);
+
     RawBuffer result = enc->Append(data);
     RawBuffer tmp = enc->Finalize();
     std::copy(tmp.begin(), tmp.end(), std::back_inserter(result));
@@ -552,9 +557,10 @@ RawBuffer encryptDataAesGcmPacked(
     const RawBuffer &key,
     const RawBuffer &data,
     const RawBuffer &iv,
-    int tagSize)
+    int tagSize,
+    const RawBuffer &aad)
 {
-    auto pair = encryptDataAesGcm(key, data, iv, tagSize);
+    auto pair = encryptDataAesGcm(key, data, iv, tagSize, aad);
     std::copy(pair.second.begin(), pair.second.end(), std::back_inserter(pair.first));
     return pair.first;
 }
@@ -577,7 +583,8 @@ RawBuffer decryptDataAesGcm(
     const RawBuffer &key,
     const RawBuffer &data,
     const RawBuffer &iv,
-    const RawBuffer &tag)
+    const RawBuffer &tag,
+    const RawBuffer &aad)
 {
     EvpCipherPtr dec;
     selectCipher(AlgoType::AES_GCM, key.size(), false)(dec, key, iv);
@@ -586,6 +593,9 @@ RawBuffer decryptDataAesGcm(
         ThrowErr(Exc::Crypto::InternalError,
             "Error in AES control function. Set tag failed.");
     }
+    if (!aad.empty())
+        dec->AppendAAD(aad);
+
     RawBuffer result = dec->Append(data);
     RawBuffer tmp = dec->Finalize();
     std::copy(tmp.begin(), tmp.end(), std::back_inserter(result));
@@ -596,7 +606,8 @@ RawBuffer decryptDataAesGcmPacked(
     const RawBuffer &key,
     const RawBuffer &data,
     const RawBuffer &iv,
-    int tagSize)
+    int tagSize,
+    const RawBuffer &aad)
 {
     if (tagSize > static_cast<int>(data.size()))
         ThrowErr(Exc::Crypto::InputParam, "Wrong size of tag");
@@ -606,7 +617,8 @@ RawBuffer decryptDataAesGcmPacked(
         key,
         RawBuffer(data.data(), tagPos),
         iv,
-        RawBuffer(tagPos, data.data() + data.size()));
+        RawBuffer(tagPos, data.data() + data.size()),
+        aad);
 }
 
 RawBuffer symmetricEncrypt(const RawBuffer &key,
@@ -626,10 +638,13 @@ RawBuffer symmetricEncrypt(const RawBuffer &key,
         {
             int tagLenBits = DEFAULT_AES_GCM_TAG_LEN;
             alg.getParam(ParamName::ED_TAG_LEN, tagLenBits);
+            RawBuffer aad;
+            alg.getParam(ParamName::ED_AAD, aad);
             return encryptDataAesGcmPacked(key,
                                            data,
                                            unpack<RawBuffer>(alg, ParamName::ED_IV),
-                                           tagLenBits/8);
+                                           tagLenBits/8,
+                                           aad);
         }
         default:
             break;
@@ -655,10 +670,13 @@ RawBuffer symmetricDecrypt(const RawBuffer &key,
         {
             int tagLenBits = DEFAULT_AES_GCM_TAG_LEN;
             alg.getParam(ParamName::ED_TAG_LEN, tagLenBits);
+            RawBuffer aad;
+            alg.getParam(ParamName::ED_AAD, aad);
             return decryptDataAesGcmPacked(key,
                                            data,
                                            unpack<RawBuffer>(alg, ParamName::ED_IV),
-                                           tagLenBits/8);
+                                           tagLenBits/8,
+                                           aad);
         }
         default:
             break;
index ebd14de..4d810d5 100644 (file)
@@ -57,12 +57,14 @@ RawBuffer symmetricDecrypt(const RawBuffer &key,
 std::pair<RawBuffer, RawBuffer> encryptDataAesGcm(const RawBuffer &key,
     const RawBuffer &data,
     const RawBuffer &iv,
-    int tagSizeBits);
+    int tagSize,
+    const RawBuffer &aad = RawBuffer());
 
 RawBuffer decryptDataAesGcm(const RawBuffer &key,
     const RawBuffer &data,
     const RawBuffer &iv,
-    const RawBuffer &tag);
+    const RawBuffer &tag,
+    const RawBuffer &aad = RawBuffer());
 
 RawBuffer encryptDataAes(AlgoType type,
     const RawBuffer &key,