Subversion Repositories planix.SVN

Rev

Rev 33 | Blame | Compare with Previous | Last modification | View Log | RSS feed

#include <u.h>
#include <libc.h>
#include <mp.h>
#include <libsec.h>

typedef struct Test Test;
struct Test
{
        char *K;
        char *P;
        char *A;
        char *IV;
        char *T;
};

Test tests[] = {
        {       /* Test Case 1 */
                "00000000000000000000000000000000",
                "",
                "",
                "000000000000000000000000",

                "58E2FCCEFA7E3061367F1D57A4E7455A"
        },
        {       /* Test Case 2 */
                "00000000000000000000000000000000",
                "00000000000000000000000000000000",
                "",
                "000000000000000000000000",

                "AB6E47D42CEC13BDF53A67B21257BDDF",
        },
        {       /* Test Case 3 */
                "feffe9928665731c6d6a8f9467308308",
                "d9313225f88406e5a55909c5aff5269a"
                "86a7a9531534f7da2e4c303d8a318a72"
                "1c3c0c95956809532fcf0e2449a6b525"
                "b16aedf5aa0de657ba637b391aafd255",
                "",
                "cafebabefacedbaddecaf888",

                "4D5C2AF327CD64A62CF35ABD2BA6FAB4"
        },
        {       /* Test Case 4 */
                "feffe9928665731c6d6a8f9467308308",
                "d9313225f88406e5a55909c5aff5269a"
                "86a7a9531534f7da2e4c303d8a318a72"
                "1c3c0c95956809532fcf0e2449a6b525"
                "b16aedf5aa0de657ba637b39",
                "feedfacedeadbeeffeedfacedeadbeef"
                "abaddad2",
                "cafebabefacedbaddecaf888",

                "5BC94FBC3221A5DB94FAE95AE7121A47"
        },
        {       /* Test Case 5 */
                "feffe9928665731c6d6a8f9467308308",
                "d9313225f88406e5a55909c5aff5269a"
                "86a7a9531534f7da2e4c303d8a318a72"
                "1c3c0c95956809532fcf0e2449a6b525"
                "b16aedf5aa0de657ba637b39",
                "feedfacedeadbeeffeedfacedeadbeef"
                "abaddad2",
                "cafebabefacedbad",

                "3612D2E79E3B0785561BE14AACA2FCCB"
        },
        {       /* Test Case 6 */
                "feffe9928665731c6d6a8f9467308308",
                "d9313225f88406e5a55909c5aff5269a"
                "86a7a9531534f7da2e4c303d8a318a72"
                "1c3c0c95956809532fcf0e2449a6b525"
                "b16aedf5aa0de657ba637b39",
                "feedfacedeadbeeffeedfacedeadbeef"
                "abaddad2",
                "9313225df88406e555909c5aff5269aa"
                "6a7a9538534f7da1e4c303d2a318a728"
                "c3c0c95156809539fcf0e2429a6b5254"
                "16aedbf5a0de6a57a637b39b",

                "619CC5AEFFFE0BFA462AF43C1699D050"
        },
        {       /* Test Case 7 */
                "00000000000000000000000000000000"
                "0000000000000000",
                "",
                "",
                "000000000000000000000000",

                "CD33B28AC773F74BA00ED1F312572435"
        },
        {       /* Test Case 8 */
                "00000000000000000000000000000000"
                "0000000000000000",
                "00000000000000000000000000000000",
                "",
                "000000000000000000000000",

                "2FF58D80033927AB8EF4D4587514F0FB"
        },
        {       /* Test Case 9 */
                "feffe9928665731c6d6a8f9467308308"
                "feffe9928665731c",
                "d9313225f88406e5a55909c5aff5269a"
                "86a7a9531534f7da2e4c303d8a318a72"
                "1c3c0c95956809532fcf0e2449a6b525"
                "b16aedf5aa0de657ba637b391aafd255",
                "",
                "cafebabefacedbaddecaf888",

                "9924A7C8587336BFB118024DB8674A14"
        },
        {       /* Test Case 10 */
                "feffe9928665731c6d6a8f9467308308"
                "feffe9928665731c",
                "d9313225f88406e5a55909c5aff5269a"
                "86a7a9531534f7da2e4c303d8a318a72"
                "1c3c0c95956809532fcf0e2449a6b525"
                "b16aedf5aa0de657ba637b39",
                "feedfacedeadbeeffeedfacedeadbeef"
                "abaddad2",
                "cafebabefacedbaddecaf888",

                "2519498E80F1478F37BA55BD6D27618C"
        },
        {       /* Test Case 11 */
                "feffe9928665731c6d6a8f9467308308"
                "feffe9928665731c",
                "d9313225f88406e5a55909c5aff5269a"
                "86a7a9531534f7da2e4c303d8a318a72"
                "1c3c0c95956809532fcf0e2449a6b525"
                "b16aedf5aa0de657ba637b39",
                "feedfacedeadbeeffeedfacedeadbeef"
                "abaddad2",
                "cafebabefacedbad",

                "65DCC57FCF623A24094FCCA40D3533F8"
        },
        {       /* Test Case 12 */
                "feffe9928665731c6d6a8f9467308308"
                "feffe9928665731c",
                "d9313225f88406e5a55909c5aff5269a"
                "86a7a9531534f7da2e4c303d8a318a72"
                "1c3c0c95956809532fcf0e2449a6b525"
                "b16aedf5aa0de657ba637b39",
                "feedfacedeadbeeffeedfacedeadbeef"
                "abaddad2",
                "9313225df88406e555909c5aff5269aa"
                "6a7a9538534f7da1e4c303d2a318a728"
                "c3c0c95156809539fcf0e2429a6b5254"
                "16aedbf5a0de6a57a637b39b",

                "DCF566FF291C25BBB8568FC3D376A6D9"
        },
        {       /* Test Case 13 */
                "00000000000000000000000000000000"
                "00000000000000000000000000000000",
                "",
                "",
                "000000000000000000000000",

                "530F8AFBC74536B9A963B4F1C4CB738B"
        },
        {       /* Test Case 14 */
                "00000000000000000000000000000000"
                "00000000000000000000000000000000",
                "00000000000000000000000000000000",
                "",
                "000000000000000000000000",

                "D0D1C8A799996BF0265B98B5D48AB919"
        },
        {       /* Test Case 15 */
                "feffe9928665731c6d6a8f9467308308"
                "feffe9928665731c6d6a8f9467308308",
                "d9313225f88406e5a55909c5aff5269a"
                "86a7a9531534f7da2e4c303d8a318a72"
                "1c3c0c95956809532fcf0e2449a6b525"
                "b16aedf5aa0de657ba637b391aafd255",
                "",
                "cafebabefacedbaddecaf888",

                "B094DAC5D93471BDEC1A502270E3CC6C"
        },
        {       /* Test Case 16 */
                "feffe9928665731c6d6a8f9467308308"
                "feffe9928665731c6d6a8f9467308308",
                "d9313225f88406e5a55909c5aff5269a"
                "86a7a9531534f7da2e4c303d8a318a72"
                "1c3c0c95956809532fcf0e2449a6b525"
                "b16aedf5aa0de657ba637b39",
                "feedfacedeadbeeffeedfacedeadbeef"
                "abaddad2",
                "cafebabefacedbaddecaf888",

                "76FC6ECE0F4E1768CDDF8853BB2D551B"
        },
        {       /* Test Case 17 */
                "feffe9928665731c6d6a8f9467308308"
                "feffe9928665731c6d6a8f9467308308",
                "d9313225f88406e5a55909c5aff5269a"
                "86a7a9531534f7da2e4c303d8a318a72"
                "1c3c0c95956809532fcf0e2449a6b525"
                "b16aedf5aa0de657ba637b39",
                "feedfacedeadbeeffeedfacedeadbeef"
                "abaddad2",
                "cafebabefacedbad",

                "3A337DBF46A792C45E454913FE2EA8F2"
        },
        {       /* Test Case 18 */
                "feffe9928665731c6d6a8f9467308308"
                "feffe9928665731c6d6a8f9467308308",
                "d9313225f88406e5a55909c5aff5269a"
                "86a7a9531534f7da2e4c303d8a318a72"
                "1c3c0c95956809532fcf0e2449a6b525"
                "b16aedf5aa0de657ba637b39",
                "feedfacedeadbeeffeedfacedeadbeef"
                "abaddad2",
                "9313225df88406e555909c5aff5269aa"
                "6a7a9538534f7da1e4c303d2a318a728"
                "c3c0c95156809539fcf0e2429a6b5254"
                "16aedbf5a0de6a57a637b39b",

                "A44A8266EE1C8EB0C8B5D4CF5AE9F19A"
        },
};

int
parsehex(char *s, uchar *h, char *l)
{
        char *e;
        mpint *m;
        int n;

        n = strlen(s);
        if(n == 0)
                return 0;
        assert((n & 1) == 0);
        n >>= 1;
        e = nil;
        m = strtomp(s, &e, 16, nil);
        if(m == nil || *e != '\0')
                abort();
        mptober(m, h, n);
        if(l != nil)
                print("%s = %.*H\n", l, n, h);
        return n;
}

void
runtest(Test *t)
{
        AESGCMstate s;
        uchar key[1024], plain[1024], aad[1024], iv[1024], tag[16], tmp[16];
        int nkey, nplain, naad, niv;

        nkey = parsehex(t->K, key, "K");
        nplain = parsehex(t->P, plain, "P");
        naad = parsehex(t->A, aad, "A");
        niv = parsehex(t->IV, iv, "IV");

        setupAESGCMstate(&s, key, nkey, iv, niv);
        aesgcm_encrypt(plain, nplain, aad, naad, tag, &s);
        print("C = %.*H\n", nplain, plain);
        print("T = %.*H\n", 16, tag);

        parsehex(t->T, tmp, nil);
        assert(memcmp(tmp, tag, 16) == 0);
}

void
perftest(void)
{
        AESGCMstate s;
        static uchar zeros[16];
        uchar buf[1024*1024], tag[16];
        vlong now;
        int i, delta;

        now = nsec();
        for(i=0; i<100; i++){
                memset(buf, 0, sizeof(buf));
                if(1){
                        setupAESGCMstate(&s, zeros, 16, zeros, 12);
                        aesgcm_encrypt(buf, sizeof(buf), nil, 0, tag, &s);
                } else {
                        setupAESstate(&s, zeros, 16, zeros);
                        aesCBCencrypt(buf, sizeof(buf), &s);
                }
        }
        delta = (nsec() - now) / 1000000000LL;
        fprint(2, "%ds = %d/s\n", delta, i*sizeof(buf) / delta);
}

void
main(int argc, char **argv)
{
        int i;

        fmtinstall('H', encodefmt);

        ARGBEGIN {
        case 'p':
                perftest();
                exits(nil);
        } ARGEND;

        for(i=0; i<nelem(tests); i++){
                print("Test Case %d\n", i+1);
                runtest(&tests[i]);
                print("\n");
        }
}