18d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce/*
28d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce * Copyright (C) 2014 The Android Open Source Project
38d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce *
48d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce * Licensed under the Apache License, Version 2.0 (the "License");
58d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce * you may not use this file except in compliance with the License.
68d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce * You may obtain a copy of the License at
78d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce *
88d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce *      http://www.apache.org/licenses/LICENSE-2.0
98d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce *
108d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce * Unless required by applicable law or agreed to in writing, software
118d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce * distributed under the License is distributed on an "AS IS" BASIS,
128d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce * See the License for the specific language governing permissions and
148d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce * limitations under the License.
158d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce */
168d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
178d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce#include <gtest/gtest.h>
188d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce#include <string.h>
198d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
208d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce#include <utils/String8.h>
218d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce#include <utils/Vector.h>
228d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
238d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce#include "AesCtrDecryptor.h"
248d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
258d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Brucenamespace clearkeydrm {
268d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
278d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruceusing namespace android;
288d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
298d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruceclass AesCtrDecryptorTest : public ::testing::Test {
308d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce  protected:
318d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    typedef uint8_t Key[kBlockSize];
328d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
338d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    status_t attemptDecrypt(const Key& key, const Iv& iv, const uint8_t* source,
348d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce                            uint8_t* destination, const SubSample* subSamples,
358d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce                            size_t numSubSamples, size_t* bytesDecryptedOut) {
368d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        Vector<uint8_t> keyVector;
378d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        keyVector.appendArray(key, kBlockSize);
388d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
398d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        AesCtrDecryptor decryptor;
408d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        return decryptor.decrypt(keyVector, iv, source, destination, subSamples,
418d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce                                 numSubSamples, bytesDecryptedOut);
428d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    }
438d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
448d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    template <size_t totalSize>
458d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    void attemptDecryptExpectingSuccess(const Key& key, const Iv& iv,
468d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce                                        const uint8_t* encrypted,
478d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce                                        const uint8_t* decrypted,
488d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce                                        const SubSample* subSamples,
498d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce                                        size_t numSubSamples) {
508d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        uint8_t outputBuffer[totalSize] = {};
518d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        size_t bytesDecrypted = 0;
528d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        ASSERT_EQ(android::OK, attemptDecrypt(key, iv, encrypted, outputBuffer,
538d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce                                              subSamples, numSubSamples,
548d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce                                              &bytesDecrypted));
558d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        EXPECT_EQ(totalSize, bytesDecrypted);
568d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        EXPECT_EQ(0, memcmp(outputBuffer, decrypted, totalSize));
578d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    }
588d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce};
598d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
608d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" BruceTEST_F(AesCtrDecryptorTest, DecryptsContiguousEncryptedBlock) {
618d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    const size_t kTotalSize = 64;
628d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    const size_t kNumSubsamples = 1;
638d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
648d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    // Test vectors from NIST-800-38A
658d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    Key key = {
668d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6,
678d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c
688d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    };
698d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
708d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    Iv iv = {
718d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
728d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
738d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    };
748d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
758d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    uint8_t encrypted[kTotalSize] = {
768d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x87, 0x4d, 0x61, 0x91, 0xb6, 0x20, 0xe3, 0x26,
778d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x1b, 0xef, 0x68, 0x64, 0x99, 0x0d, 0xb6, 0xce,
788d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x98, 0x06, 0xf6, 0x6b, 0x79, 0x70, 0xfd, 0xff,
798d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x86, 0x17, 0x18, 0x7b, 0xb9, 0xff, 0xfd, 0xff,
808d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x5a, 0xe4, 0xdf, 0x3e, 0xdb, 0xd5, 0xd3, 0x5e,
818d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x5b, 0x4f, 0x09, 0x02, 0x0d, 0xb0, 0x3e, 0xab,
828d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x1e, 0x03, 0x1d, 0xda, 0x2f, 0xbe, 0x03, 0xd1,
838d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x79, 0x21, 0x70, 0xa0, 0xf3, 0x00, 0x9c, 0xee
848d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    };
858d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
868d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    uint8_t decrypted[kTotalSize] = {
878d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96,
888d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a,
898d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c,
908d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x9e, 0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51,
918d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c, 0xe4, 0x11,
928d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0xe5, 0xfb, 0xc1, 0x19, 0x1a, 0x0a, 0x52, 0xef,
938d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0xf6, 0x9f, 0x24, 0x45, 0xdf, 0x4f, 0x9b, 0x17,
948d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0xad, 0x2b, 0x41, 0x7b, 0xe6, 0x6c, 0x37, 0x10
958d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    };
968d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
978d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    SubSample subSamples[kNumSubsamples] = {
988d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        {0, 64}
998d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    };
1008d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
1018d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    attemptDecryptExpectingSuccess<kTotalSize>(key, iv, encrypted, decrypted,
1028d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce                                               subSamples, kNumSubsamples);
1038d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce}
1048d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
1058d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" BruceTEST_F(AesCtrDecryptorTest, DecryptsAlignedBifurcatedEncryptedBlock) {
1068d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    const size_t kTotalSize = 64;
1078d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    const size_t kNumSubsamples = 2;
1088d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
1098d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    // Test vectors from NIST-800-38A
1108d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    Key key = {
1118d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6,
1128d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c
1138d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    };
1148d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
1158d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    Iv iv = {
1168d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1178d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1188d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    };
1198d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
1208d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    uint8_t encrypted[kTotalSize] = {
1218d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x87, 0x4d, 0x61, 0x91, 0xb6, 0x20, 0xe3, 0x26,
1228d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x1b, 0xef, 0x68, 0x64, 0x99, 0x0d, 0xb6, 0xce,
1238d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x98, 0x06, 0xf6, 0x6b, 0x79, 0x70, 0xfd, 0xff,
1248d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x86, 0x17, 0x18, 0x7b, 0xb9, 0xff, 0xfd, 0xff,
1258d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x5a, 0xe4, 0xdf, 0x3e, 0xdb, 0xd5, 0xd3, 0x5e,
1268d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x5b, 0x4f, 0x09, 0x02, 0x0d, 0xb0, 0x3e, 0xab,
1278d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x1e, 0x03, 0x1d, 0xda, 0x2f, 0xbe, 0x03, 0xd1,
1288d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x79, 0x21, 0x70, 0xa0, 0xf3, 0x00, 0x9c, 0xee
1298d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    };
1308d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
1318d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    uint8_t decrypted[kTotalSize] = {
1328d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96,
1338d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a,
1348d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c,
1358d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x9e, 0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51,
1368d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c, 0xe4, 0x11,
1378d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0xe5, 0xfb, 0xc1, 0x19, 0x1a, 0x0a, 0x52, 0xef,
1388d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0xf6, 0x9f, 0x24, 0x45, 0xdf, 0x4f, 0x9b, 0x17,
1398d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0xad, 0x2b, 0x41, 0x7b, 0xe6, 0x6c, 0x37, 0x10
1408d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    };
1418d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
1428d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    SubSample subSamples[kNumSubsamples] = {
1438d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        {0, 32},
1448d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        {0, 32}
1458d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    };
1468d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
1478d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    attemptDecryptExpectingSuccess<kTotalSize>(key, iv, encrypted, decrypted,
1488d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce                                               subSamples, kNumSubsamples);
1498d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce}
1508d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
1518d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" BruceTEST_F(AesCtrDecryptorTest, DecryptsUnalignedBifurcatedEncryptedBlock) {
1528d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    const size_t kTotalSize = 64;
1538d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    const size_t kNumSubsamples = 2;
1548d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
1558d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    // Test vectors from NIST-800-38A
1568d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    Key key = {
1578d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6,
1588d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c
1598d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    };
1608d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
1618d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    Iv iv = {
1628d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
1638d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
1648d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    };
1658d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
1668d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    uint8_t encrypted[kTotalSize] = {
1678d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x87, 0x4d, 0x61, 0x91, 0xb6, 0x20, 0xe3, 0x26,
1688d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x1b, 0xef, 0x68, 0x64, 0x99, 0x0d, 0xb6, 0xce,
1698d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x98, 0x06, 0xf6, 0x6b, 0x79, 0x70, 0xfd, 0xff,
1708d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x86, 0x17, 0x18, 0x7b, 0xb9, 0xff, 0xfd, 0xff,
1718d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x5a, 0xe4, 0xdf, 0x3e, 0xdb, 0xd5, 0xd3, 0x5e,
1728d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x5b, 0x4f, 0x09, 0x02, 0x0d, 0xb0, 0x3e, 0xab,
1738d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x1e, 0x03, 0x1d, 0xda, 0x2f, 0xbe, 0x03, 0xd1,
1748d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x79, 0x21, 0x70, 0xa0, 0xf3, 0x00, 0x9c, 0xee
1758d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    };
1768d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
1778d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    uint8_t decrypted[kTotalSize] = {
1788d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96,
1798d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a,
1808d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c,
1818d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x9e, 0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51,
1828d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c, 0xe4, 0x11,
1838d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0xe5, 0xfb, 0xc1, 0x19, 0x1a, 0x0a, 0x52, 0xef,
1848d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0xf6, 0x9f, 0x24, 0x45, 0xdf, 0x4f, 0x9b, 0x17,
1858d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0xad, 0x2b, 0x41, 0x7b, 0xe6, 0x6c, 0x37, 0x10
1868d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    };
1878d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
1888d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    SubSample subSamples[kNumSubsamples] = {
1898d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        {0, 29},
1908d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        {0, 35}
1918d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    };
1928d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
1938d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    attemptDecryptExpectingSuccess<kTotalSize>(key, iv, encrypted, decrypted,
1948d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce                                               subSamples, kNumSubsamples);
1958d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce}
1968d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
1978d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" BruceTEST_F(AesCtrDecryptorTest, DecryptsOneMixedSubSample) {
1988d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    const size_t kTotalSize = 72;
1998d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    const size_t kNumSubsamples = 1;
2008d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
2018d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    // Based on test vectors from NIST-800-38A
2028d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    Key key = {
2038d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6,
2048d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c
2058d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    };
2068d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
2078d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    Iv iv = {
2088d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
2098d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
2108d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    };
2118d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
2128d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    uint8_t encrypted[kTotalSize] = {
2138d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        // 8 clear bytes
2148d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0xf0, 0x13, 0xca, 0xc7, 0x00, 0x64, 0x0b, 0xbb,
2158d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        // 64 encrypted bytes
2168d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x87, 0x4d, 0x61, 0x91, 0xb6, 0x20, 0xe3, 0x26,
2178d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x1b, 0xef, 0x68, 0x64, 0x99, 0x0d, 0xb6, 0xce,
2188d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x98, 0x06, 0xf6, 0x6b, 0x79, 0x70, 0xfd, 0xff,
2198d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x86, 0x17, 0x18, 0x7b, 0xb9, 0xff, 0xfd, 0xff,
2208d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x5a, 0xe4, 0xdf, 0x3e, 0xdb, 0xd5, 0xd3, 0x5e,
2218d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x5b, 0x4f, 0x09, 0x02, 0x0d, 0xb0, 0x3e, 0xab,
2228d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x1e, 0x03, 0x1d, 0xda, 0x2f, 0xbe, 0x03, 0xd1,
2238d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x79, 0x21, 0x70, 0xa0, 0xf3, 0x00, 0x9c, 0xee
2248d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    };
2258d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
2268d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    uint8_t decrypted[kTotalSize] = {
2278d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0xf0, 0x13, 0xca, 0xc7, 0x00, 0x64, 0x0b, 0xbb,
2288d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96,
2298d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a,
2308d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c,
2318d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x9e, 0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51,
2328d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c, 0xe4, 0x11,
2338d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0xe5, 0xfb, 0xc1, 0x19, 0x1a, 0x0a, 0x52, 0xef,
2348d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0xf6, 0x9f, 0x24, 0x45, 0xdf, 0x4f, 0x9b, 0x17,
2358d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0xad, 0x2b, 0x41, 0x7b, 0xe6, 0x6c, 0x37, 0x10
2368d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    };
2378d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
2388d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    SubSample subSamples[kNumSubsamples] = {
2398d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        {8, 64}
2408d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    };
2418d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
2428d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    attemptDecryptExpectingSuccess<kTotalSize>(key, iv, encrypted, decrypted,
2438d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce                                               subSamples, kNumSubsamples);
2448d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce}
2458d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
2468d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" BruceTEST_F(AesCtrDecryptorTest, DecryptsAlignedMixedSubSamples) {
2478d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    const size_t kTotalSize = 80;
2488d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    const size_t kNumSubsamples = 2;
2498d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
2508d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    // Based on test vectors from NIST-800-38A
2518d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    Key key = {
2528d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6,
2538d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c
2548d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    };
2558d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
2568d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    Iv iv = {
2578d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
2588d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
2598d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    };
2608d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
2618d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    uint8_t encrypted[kTotalSize] = {
2628d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        // 8 clear bytes
2638d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0xf0, 0x13, 0xca, 0xc7, 0x00, 0x64, 0x0b, 0xbb,
2648d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        // 32 encrypted bytes
2658d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x87, 0x4d, 0x61, 0x91, 0xb6, 0x20, 0xe3, 0x26,
2668d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x1b, 0xef, 0x68, 0x64, 0x99, 0x0d, 0xb6, 0xce,
2678d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x98, 0x06, 0xf6, 0x6b, 0x79, 0x70, 0xfd, 0xff,
2688d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x86, 0x17, 0x18, 0x7b, 0xb9, 0xff, 0xfd, 0xff,
2698d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        // 8 clear bytes
2708d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x94, 0xba, 0x88, 0x2e, 0x0e, 0x12, 0x11, 0x55,
2718d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        // 32 encrypted bytes
2728d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x5a, 0xe4, 0xdf, 0x3e, 0xdb, 0xd5, 0xd3, 0x5e,
2738d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x5b, 0x4f, 0x09, 0x02, 0x0d, 0xb0, 0x3e, 0xab,
2748d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x1e, 0x03, 0x1d, 0xda, 0x2f, 0xbe, 0x03, 0xd1,
2758d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x79, 0x21, 0x70, 0xa0, 0xf3, 0x00, 0x9c, 0xee
2768d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    };
2778d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
2788d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    uint8_t decrypted[kTotalSize] = {
2798d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0xf0, 0x13, 0xca, 0xc7, 0x00, 0x64, 0x0b, 0xbb,
2808d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96,
2818d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a,
2828d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c,
2838d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x9e, 0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51,
2848d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x94, 0xba, 0x88, 0x2e, 0x0e, 0x12, 0x11, 0x55,
2858d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c, 0xe4, 0x11,
2868d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0xe5, 0xfb, 0xc1, 0x19, 0x1a, 0x0a, 0x52, 0xef,
2878d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0xf6, 0x9f, 0x24, 0x45, 0xdf, 0x4f, 0x9b, 0x17,
2888d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0xad, 0x2b, 0x41, 0x7b, 0xe6, 0x6c, 0x37, 0x10
2898d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    };
2908d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
2918d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    SubSample subSamples[kNumSubsamples] = {
2928d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        {8, 32},
2938d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        {8, 32}
2948d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    };
2958d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
2968d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    attemptDecryptExpectingSuccess<kTotalSize>(key, iv, encrypted, decrypted,
2978d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce                                               subSamples, kNumSubsamples);
2988d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce}
2998d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
3008d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" BruceTEST_F(AesCtrDecryptorTest, DecryptsUnalignedMixedSubSamples) {
3018d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    const size_t kTotalSize = 80;
3028d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    const size_t kNumSubsamples = 2;
3038d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
3048d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    // Based on test vectors from NIST-800-38A
3058d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    Key key = {
3068d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6,
3078d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c
3088d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    };
3098d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
3108d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    Iv iv = {
3118d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
3128d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
3138d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    };
3148d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
3158d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    uint8_t encrypted[kTotalSize] = {
3168d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        // 8 clear bytes
3178d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0xf0, 0x13, 0xca, 0xc7, 0x00, 0x64, 0x0b, 0xbb,
3188d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        // 30 encrypted bytes
3198d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x87, 0x4d, 0x61, 0x91, 0xb6, 0x20, 0xe3, 0x26,
3208d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x1b, 0xef, 0x68, 0x64, 0x99, 0x0d, 0xb6, 0xce,
3218d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x98, 0x06, 0xf6, 0x6b, 0x79, 0x70, 0xfd, 0xff,
3228d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x86, 0x17, 0x18, 0x7b, 0xb9, 0xff,
3238d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        // 8 clear bytes
3248d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x94, 0xba, 0x88, 0x2e, 0x0e, 0x12, 0x11, 0x55,
3258d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        // 34 encrypted bytes
3268d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0xfd, 0xff, 0x5a, 0xe4, 0xdf, 0x3e, 0xdb, 0xd5,
3278d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0xd3, 0x5e, 0x5b, 0x4f, 0x09, 0x02, 0x0d, 0xb0,
3288d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x3e, 0xab, 0x1e, 0x03, 0x1d, 0xda, 0x2f, 0xbe,
3298d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x03, 0xd1, 0x79, 0x21, 0x70, 0xa0, 0xf3, 0x00,
3308d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x9c, 0xee
3318d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    };
3328d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
3338d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    uint8_t decrypted[kTotalSize] = {
3348d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0xf0, 0x13, 0xca, 0xc7, 0x00, 0x64, 0x0b, 0xbb,
3358d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96,
3368d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a,
3378d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c,
3388d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x9e, 0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x94, 0xba,
3398d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x88, 0x2e, 0x0e, 0x12, 0x11, 0x55, 0x8e, 0x51,
3408d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c, 0xe4, 0x11,
3418d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0xe5, 0xfb, 0xc1, 0x19, 0x1a, 0x0a, 0x52, 0xef,
3428d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0xf6, 0x9f, 0x24, 0x45, 0xdf, 0x4f, 0x9b, 0x17,
3438d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0xad, 0x2b, 0x41, 0x7b, 0xe6, 0x6c, 0x37, 0x10
3448d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    };
3458d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
3468d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    SubSample subSamples[kNumSubsamples] = {
3478d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        {8, 30},
3488d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        {8, 34}
3498d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    };
3508d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
3518d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    attemptDecryptExpectingSuccess<kTotalSize>(key, iv, encrypted, decrypted,
3528d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce                                               subSamples, kNumSubsamples);
3538d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce}
3548d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
3558d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" BruceTEST_F(AesCtrDecryptorTest, DecryptsComplexMixedSubSamples) {
3568d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    const size_t kTotalSize = 72;
3578d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    const size_t kNumSubsamples = 6;
3588d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
3598d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    // Based on test vectors from NIST-800-38A
3608d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    Key key = {
3618d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6,
3628d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c
3638d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    };
3648d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
3658d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    Iv iv = {
3668d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
3678d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
3688d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    };
3698d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
3708d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    uint8_t encrypted[kTotalSize] = {
3718d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        // 4 clear bytes
3728d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0xf0, 0x13, 0xca, 0xc7,
3738d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        // 1 encrypted bytes
3748d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x87,
3758d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        // 9 encrypted bytes
3768d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x4d, 0x61, 0x91, 0xb6, 0x20, 0xe3, 0x26, 0x1b,
3778d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0xef,
3788d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        // 11 clear bytes
3798d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x81, 0x4f, 0x24, 0x87, 0x0e, 0xde, 0xba, 0xad,
3808d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x11, 0x9b, 0x46,
3818d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        // 20 encrypted bytes
3828d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x68, 0x64, 0x99, 0x0d, 0xb6, 0xce,
3838d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x98, 0x06, 0xf6, 0x6b, 0x79, 0x70, 0xfd, 0xff,
3848d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x86, 0x17, 0x18, 0x7b, 0xb9, 0xff,
3858d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        // 8 clear bytes
3868d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x94, 0xba, 0x88, 0x2e, 0x0e, 0x12, 0x11, 0x55,
3878d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        // 3 clear bytes
3888d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x10, 0xf5, 0x22,
3898d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        // 14 encrypted bytes
3908d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0xfd, 0xff, 0x5a, 0xe4, 0xdf, 0x3e, 0xdb, 0xd5,
3918d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0xd3, 0x5e, 0x5b, 0x4f, 0x09, 0x02,
3928d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        // 2 clear bytes
3938d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x02, 0x01
3948d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    };
3958d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
3968d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    uint8_t decrypted[kTotalSize] = {
3978d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0xf0, 0x13, 0xca, 0xc7, 0x6b, 0xc1, 0xbe, 0xe2,
3988d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x2e, 0x40, 0x9f, 0x96, 0xe9, 0x3d, 0x81, 0x4f,
3998d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x24, 0x87, 0x0e, 0xde, 0xba, 0xad, 0x11, 0x9b,
4008d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x46, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a, 0xae,
4018d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c, 0x9e,
4028d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x94, 0xba, 0x88,
4038d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x2e, 0x0e, 0x12, 0x11, 0x55, 0x10, 0xf5, 0x22,
4048d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0x8e, 0x51, 0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c,
4058d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        0xe4, 0x11, 0xe5, 0xfb, 0xc1, 0x19, 0x02, 0x01
4068d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    };
4078d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
4088d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    SubSample subSamples[kNumSubsamples] = {
4098d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        {4, 1},
4108d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        {0, 9},
4118d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        {11, 20},
4128d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        {8, 0},
4138d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        {3, 14},
4148d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce        {2, 0}
4158d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    };
4168d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
4178d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce    attemptDecryptExpectingSuccess<kTotalSize>(key, iv, encrypted, decrypted,
4188d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce                                               subSamples, kNumSubsamples);
4198d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce}
4208d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce
4218d0bc4a8ea2a5d0d6aba036f15b185d60e18778fJohn "Juce" Bruce}  // namespace clearkeydrm
422