ref: 2736d5031f6de6df31efb3bba148259395a02e47
parent: 4fab5fa56fb55196b8684fcd0fbbcd7a66a74d6f
author: Jacob Moody <moody@posixcafe.org>
date: Mon May 19 23:36:20 EDT 2025
libsec: move tests in port to test/ some quick hacks to quiet output and exit on failure where needed
--- a/sys/src/libsec/port/aesgcmtest.c
+++ /dev/null
@@ -1,314 +1,0 @@
-#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");
- }
-}
--- a/sys/src/libsec/port/bftest.c
+++ /dev/null
@@ -1,279 +1,0 @@
-#include <u.h>
-#include <libc.h>
-#include <libsec.h>
-
-enum{
- Bsz = 8,
-};
-
-typedef struct Testvector Testvector;
-
-struct Testvector{
- uchar key[Bsz];
- uchar plain[Bsz];
- uchar cipher[Bsz];
-};
-
-/*
- * Blowfish test vectors from https://www.schneier.com/code/vectors.txt
- */
-Testvector vector [] = {
- {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x4E, 0xF9, 0x97, 0x45, 0x61, 0x98, 0xDD, 0x78}},
-
- {{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
- {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
- {0x51, 0x86, 0x6F, 0xD5, 0xB8, 0x5E, 0xCB, 0x8A}},
-
- {{0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
- {0x7D, 0x85, 0x6F, 0x9A, 0x61, 0x30, 0x63, 0xF2}},
-
- {{0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11},
- {0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11},
- {0x24, 0x66, 0xDD, 0x87, 0x8B, 0x96, 0x3C, 0x9D}},
-
- {{0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF},
- {0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11},
- {0x61, 0xF9, 0xC3, 0x80, 0x22, 0x81, 0xB0, 0x96}},
-
- {{0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11},
- {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF},
- {0x7D, 0x0C, 0xC6, 0x30, 0xAF, 0xDA, 0x1E, 0xC7}},
-
- {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x4E, 0xF9, 0x97, 0x45, 0x61, 0x98, 0xDD, 0x78}},
-
- {{0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10},
- {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF},
- {0x0A, 0xCE, 0xAB, 0x0F, 0xC6, 0xA0, 0xA2, 0x8D}},
-
- {{0x7C, 0xA1, 0x10, 0x45, 0x4A, 0x1A, 0x6E, 0x57},
- {0x01, 0xA1, 0xD6, 0xD0, 0x39, 0x77, 0x67, 0x42},
- {0x59, 0xC6, 0x82, 0x45, 0xEB, 0x05, 0x28, 0x2B}},
-
- {{0x01, 0x31, 0xD9, 0x61, 0x9D, 0xC1, 0x37, 0x6E},
- {0x5C, 0xD5, 0x4C, 0xA8, 0x3D, 0xEF, 0x57, 0xDA},
- {0xB1, 0xB8, 0xCC, 0x0B, 0x25, 0x0F, 0x09, 0xA0}},
-
- {{0x07, 0xA1, 0x13, 0x3E, 0x4A, 0x0B, 0x26, 0x86},
- {0x02, 0x48, 0xD4, 0x38, 0x06, 0xF6, 0x71, 0x72},
- {0x17, 0x30, 0xE5, 0x77, 0x8B, 0xEA, 0x1D, 0xA4}},
-
- {{0x38, 0x49, 0x67, 0x4C, 0x26, 0x02, 0x31, 0x9E},
- {0x51, 0x45, 0x4B, 0x58, 0x2D, 0xDF, 0x44, 0x0A},
- {0xA2, 0x5E, 0x78, 0x56, 0xCF, 0x26, 0x51, 0xEB}},
-
- {{0x04, 0xB9, 0x15, 0xBA, 0x43, 0xFE, 0xB5, 0xB6},
- {0x42, 0xFD, 0x44, 0x30, 0x59, 0x57, 0x7F, 0xA2},
- {0x35, 0x38, 0x82, 0xB1, 0x09, 0xCE, 0x8F, 0x1A}},
-
- {{0x01, 0x13, 0xB9, 0x70, 0xFD, 0x34, 0xF2, 0xCE},
- {0x05, 0x9B, 0x5E, 0x08, 0x51, 0xCF, 0x14, 0x3A},
- {0x48, 0xF4, 0xD0, 0x88, 0x4C, 0x37, 0x99, 0x18}},
-
- {{0x01, 0x70, 0xF1, 0x75, 0x46, 0x8F, 0xB5, 0xE6},
- {0x07, 0x56, 0xD8, 0xE0, 0x77, 0x47, 0x61, 0xD2},
- {0x43, 0x21, 0x93, 0xB7, 0x89, 0x51, 0xFC, 0x98}},
-
- {{0x43, 0x29, 0x7F, 0xAD, 0x38, 0xE3, 0x73, 0xFE},
- {0x76, 0x25, 0x14, 0xB8, 0x29, 0xBF, 0x48, 0x6A},
- {0x13, 0xF0, 0x41, 0x54, 0xD6, 0x9D, 0x1A, 0xE5}},
-
- {{0x07, 0xA7, 0x13, 0x70, 0x45, 0xDA, 0x2A, 0x16},
- {0x3B, 0xDD, 0x11, 0x90, 0x49, 0x37, 0x28, 0x02},
- {0x2E, 0xED, 0xDA, 0x93, 0xFF, 0xD3, 0x9C, 0x79}},
-
- {{0x04, 0x68, 0x91, 0x04, 0xC2, 0xFD, 0x3B, 0x2F},
- {0x26, 0x95, 0x5F, 0x68, 0x35, 0xAF, 0x60, 0x9A},
- {0xD8, 0x87, 0xE0, 0x39, 0x3C, 0x2D, 0xA6, 0xE3}},
-
- {{0x37, 0xD0, 0x6B, 0xB5, 0x16, 0xCB, 0x75, 0x46},
- {0x16, 0x4D, 0x5E, 0x40, 0x4F, 0x27, 0x52, 0x32},
- {0x5F, 0x99, 0xD0, 0x4F, 0x5B, 0x16, 0x39, 0x69}},
-
- {{0x1F, 0x08, 0x26, 0x0D, 0x1A, 0xC2, 0x46, 0x5E},
- {0x6B, 0x05, 0x6E, 0x18, 0x75, 0x9F, 0x5C, 0xCA},
- {0x4A, 0x05, 0x7A, 0x3B, 0x24, 0xD3, 0x97, 0x7B}},
-
- {{0x58, 0x40, 0x23, 0x64, 0x1A, 0xBA, 0x61, 0x76},
- {0x00, 0x4B, 0xD6, 0xEF, 0x09, 0x17, 0x60, 0x62},
- {0x45, 0x20, 0x31, 0xC1, 0xE4, 0xFA, 0xDA, 0x8E}},
-
- {{0x02, 0x58, 0x16, 0x16, 0x46, 0x29, 0xB0, 0x07},
- {0x48, 0x0D, 0x39, 0x00, 0x6E, 0xE7, 0x62, 0xF2},
- {0x75, 0x55, 0xAE, 0x39, 0xF5, 0x9B, 0x87, 0xBD}},
-
- {{0x49, 0x79, 0x3E, 0xBC, 0x79, 0xB3, 0x25, 0x8F},
- {0x43, 0x75, 0x40, 0xC8, 0x69, 0x8F, 0x3C, 0xFA},
- {0x53, 0xC5, 0x5F, 0x9C, 0xB4, 0x9F, 0xC0, 0x19}},
-
- {{0x4F, 0xB0, 0x5E, 0x15, 0x15, 0xAB, 0x73, 0xA7},
- {0x07, 0x2D, 0x43, 0xA0, 0x77, 0x07, 0x52, 0x92},
- {0x7A, 0x8E, 0x7B, 0xFA, 0x93, 0x7E, 0x89, 0xA3}},
-
- {{0x49, 0xE9, 0x5D, 0x6D, 0x4C, 0xA2, 0x29, 0xBF},
- {0x02, 0xFE, 0x55, 0x77, 0x81, 0x17, 0xF1, 0x2A},
- {0xCF, 0x9C, 0x5D, 0x7A, 0x49, 0x86, 0xAD, 0xB5}},
-
- {{0x01, 0x83, 0x10, 0xDC, 0x40, 0x9B, 0x26, 0xD6},
- {0x1D, 0x9D, 0x5C, 0x50, 0x18, 0xF7, 0x28, 0xC2},
- {0xD1, 0xAB, 0xB2, 0x90, 0x65, 0x8B, 0xC7, 0x78}},
-
- {{0x1C, 0x58, 0x7F, 0x1C, 0x13, 0x92, 0x4F, 0xEF},
- {0x30, 0x55, 0x32, 0x28, 0x6D, 0x6F, 0x29, 0x5A},
- {0x55, 0xCB, 0x37, 0x74, 0xD1, 0x3E, 0xF2, 0x01}},
-
- {{0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01},
- {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF},
- {0xFA, 0x34, 0xEC, 0x48, 0x47, 0xB2, 0x68, 0xB2}},
-
- {{0x1F, 0x1F, 0x1F, 0x1F, 0x0E, 0x0E, 0x0E, 0x0E},
- {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF},
- {0xA7, 0x90, 0x79, 0x51, 0x08, 0xEA, 0x3C, 0xAE}},
-
- {{0xE0, 0xFE, 0xE0, 0xFE, 0xF1, 0xFE, 0xF1, 0xFE},
- {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF},
- {0xC3, 0x9E, 0x07, 0x2D, 0x9F, 0xAC, 0x63, 0x1D}},
-
- {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
- {0x01, 0x49, 0x33, 0xE0, 0xCD, 0xAF, 0xF6, 0xE4}},
-
- {{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0xF2, 0x1E, 0x9A, 0x77, 0xB7, 0x1C, 0x49, 0xBC}},
-
- {{0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF},
- {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
- {0x24, 0x59, 0x46, 0x88, 0x57, 0x54, 0x36, 0x9A}},
-
- {{0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10},
- {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
- {0x6B, 0x5C, 0x5A, 0x9C, 0x5D, 0x9E, 0x0A, 0x5A}}
-};
-
-uchar CBCkey[16] = {
- 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF,
- 0xF0, 0xE1, 0xD2, 0xC3, 0xB4, 0xA5, 0x96, 0x87
-};
-
-uchar CBCiv[8] = {
- 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10
-};
-
-uchar CBCdata[29] = {
- 0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31, 0x20,
- 0x4E, 0x6F, 0x77, 0x20, 0x69, 0x73, 0x20, 0x74,
- 0x68, 0x65, 0x20, 0x74, 0x69, 0x6D, 0x65, 0x20,
- 0x66, 0x6F, 0x72, 0x20, 0x00
-};
-
-uchar CBCcipher[32] = {
- 0x6B, 0x77, 0xB4, 0xD6, 0x30, 0x06, 0xDE, 0xE6,
- 0x05, 0xB1, 0x56, 0xE2, 0x74, 0x03, 0x97, 0x93,
- 0x58, 0xDE, 0xB9, 0xE7, 0x15, 0x46, 0x16, 0xD9,
- 0x59, 0xF1, 0x65, 0x2B, 0xD5, 0xFF, 0x92, 0xCC
-};
-
-int
-testECB(Testvector *t)
-{
- BFstate s;
- int i;
- uchar aux[Bsz];
-
- memcpy(aux, t->plain, Bsz);
-
- memset(&s, 0, sizeof(BFstate));
- setupBFstate(&s, t->key, Bsz, nil);
- bfECBencrypt(aux, Bsz, &s);
-
- if(memcmp(aux, t->cipher, Bsz) != 0){
- fprint(2, "ECB encrypt failed, ciphertext is:\n");
- for(i = 0; i < Bsz; i++)
- fprint(2, "%02X", aux[i]);
- fprint(2, "\nand should be:\n");
- for(i = 0; i < Bsz; i++)
- fprint(2, "%02X", t->cipher[i]);
- fprint(2, "\n");
- return -1;
- }
-
- memset(&s, 0, sizeof(BFstate));
- setupBFstate(&s, t->key, Bsz, nil);
- bfECBdecrypt(aux, Bsz, &s);
-
- if(memcmp(aux, t->plain, Bsz) != 0){
- fprint(2, "ECB decrypt failed, plaintext is:\n");
- for(i = 0; i < Bsz; i++)
- fprint(2, "%02X", aux[i]);
- fprint(2, "\nand should be:\n");
- for(i = 0; i < Bsz; i++)
- fprint(2, "%02X", t->plain[i]);
- fprint(2, "\n");
- return -1;
- }
- return 0;
-}
-
-int
-testCBC(void)
-{
- BFstate s;
- uchar aux[32];
- int i;
-
- memset(aux, 0 , sizeof(aux));
- memcpy(aux, CBCdata, sizeof(CBCdata));
- memset(&s, 0, sizeof(BFstate));
- setupBFstate(&s, CBCkey, sizeof(CBCkey), CBCiv);
- bfCBCencrypt(aux, 32, &s);
-
- if(memcmp(aux, CBCcipher, sizeof(CBCcipher)) != 0){
- fprint(2, "CBC encrypt failed, ciphertext is:\n");
- for(i = 0; i < sizeof(aux); i++)
- fprint(2, "%02X", aux[i]);
- fprint(2, "\nand should be:\n");
- for(i = 0; i < sizeof(CBCcipher); i++)
- fprint(2, "%02X", CBCcipher[i]);
- fprint(2, "\n");
- return -1;
- }
-
- memset(&s, 0, sizeof(BFstate));
- setupBFstate(&s, CBCkey, sizeof(CBCkey), CBCiv);
- bfCBCdecrypt(aux, 32, &s);
-
- if(memcmp(aux, CBCdata, sizeof(CBCdata)) != 0){
- fprint(2, "CBC decrypt failed, plaintext is:\n");
- for(i = 0; i < sizeof(aux); i++)
- fprint(2, "%02X", aux[i]);
- fprint(2, "\nand should be:\n");
- for(i = 0; i < sizeof(CBCdata); i++)
- fprint(2, "%02X", CBCdata[i]);
- fprint(2, "\n");
- return -1;
- }
-
- return 0;
-}
-
-void
-main(int argc, char **argv)
-{
- int i;
-
- if(argc != 1)
- sysfatal("usage: %s", argv[0]);
-
- for(i=0; i < nelem(vector); i++)
- if(testECB(&vector[i]) < 0)
- sysfatal("TestECB %d failed", i);
-
- if(testCBC() < 0)
- sysfatal("TestCBC failed");
- exits(nil);
-}
--- a/sys/src/libsec/port/chachatest.c
+++ /dev/null
@@ -1,217 +1,0 @@
-#include <u.h>
-#include <libc.h>
-#include <libsec.h>
-
-static void
-printblock(uchar *b, usize n)
-{
- int i;
-
- for(i=0; i+8<=n; i+=8){
- print("%#.2ux %#.2ux %#.2ux %#.2ux %#.2ux %#.2ux %#.2ux %#.2ux\n",
- b[0], b[1], b[2], b[3], b[4], b[5], b[6], b[7]);
- b += 8;
- }
- if(i < n){
- print("%#.2ux", *b++);
- while(++i < n)
- print(" %#.2ux", *b++);
- print("\n");
- }
-}
-
-/* test vector from RFC7539 */
-uchar rfckey[] = {
- 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
- 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
- 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
- 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f};
-uchar rfcnonce[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x00, 0x00, 0x00};
-u32int rfccount = 1;
-char rfctext[] = "Ladies and Gentlemen of the class of '99: If I could offer you only one tip for the future, "
- "sunscreen would be it.";
-uchar rfcout[3*ChachaBsize];
-uchar rfcref[] = {
- 0x6e, 0x2e, 0x35, 0x9a, 0x25, 0x68, 0xf9, 0x80, 0x41, 0xba, 0x07, 0x28, 0xdd, 0x0d, 0x69, 0x81,
- 0xe9, 0x7e, 0x7a, 0xec, 0x1d, 0x43, 0x60, 0xc2, 0x0a, 0x27, 0xaf, 0xcc, 0xfd, 0x9f, 0xae, 0x0b,
- 0xf9, 0x1b, 0x65, 0xc5, 0x52, 0x47, 0x33, 0xab, 0x8f, 0x59, 0x3d, 0xab, 0xcd, 0x62, 0xb3, 0x57,
- 0x16, 0x39, 0xd6, 0x24, 0xe6, 0x51, 0x52, 0xab, 0x8f, 0x53, 0x0c, 0x35, 0x9f, 0x08, 0x61, 0xd8,
- 0x07, 0xca, 0x0d, 0xbf, 0x50, 0x0d, 0x6a, 0x61, 0x56, 0xa3, 0x8e, 0x08, 0x8a, 0x22, 0xb6, 0x5e,
- 0x52, 0xbc, 0x51, 0x4d, 0x16, 0xcc, 0xf8, 0x06, 0x81, 0x8c, 0xe9, 0x1a, 0xb7, 0x79, 0x37, 0x36,
- 0x5a, 0xf9, 0x0b, 0xbf, 0x74, 0xa3, 0x5b, 0xe6, 0xb4, 0x0b, 0x8e, 0xed, 0xf2, 0x78, 0x5e, 0x42,
- 0x87, 0x4d
-};
-
-uchar xcckey[] = {
- 0x1b, 0x27, 0x55, 0x64, 0x73, 0xe9, 0x85, 0xd4, 0x62, 0xcd, 0x51, 0x19, 0x7a, 0x9a, 0x46, 0xc7,
- 0x60, 0x09, 0x54, 0x9e, 0xac, 0x64, 0x74, 0xf2, 0x06, 0xc4, 0xee, 0x08, 0x44, 0xf6, 0x83, 0x89,
-};
-uchar xcciv[] = {
- 0x69, 0x69, 0x6e, 0xe9, 0x55, 0xb6, 0x2b, 0x73, 0xcd, 0x62, 0xbd, 0xa8, 0x75, 0xfc, 0x73, 0xd6,
- 0x82, 0x19, 0xe0, 0x03, 0x6b, 0x7a, 0x0b, 0x37,
-};
-uchar xccref[] = {
- 0x4f, 0xeb, 0xf2, 0xfe, 0x4b, 0x35, 0x9c, 0x50, 0x8d, 0xc5, 0xe8, 0xb5, 0x98, 0x0c, 0x88, 0xe3,
- 0x89, 0x46, 0xd8, 0xf1, 0x8f, 0x31, 0x34, 0x65, 0xc8, 0x62, 0xa0, 0x87, 0x82, 0x64, 0x82, 0x48,
- 0x01, 0x8d, 0xac, 0xdc, 0xb9, 0x04, 0x17, 0x88, 0x53, 0xa4, 0x6d, 0xca, 0x3a, 0x0e, 0xaa, 0xee,
- 0x74, 0x7c, 0xba, 0x97, 0x43, 0x4e, 0xaf, 0xfa, 0xd5, 0x8f, 0xea, 0x82, 0x22, 0x04, 0x7e, 0x0d,
- 0xe6, 0xc3, 0xa6, 0x77, 0x51, 0x06, 0xe0, 0x33, 0x1a, 0xd7, 0x14, 0xd2, 0xf2, 0x7a, 0x55, 0x64,
- 0x13, 0x40, 0xa1, 0xf1, 0xdd, 0x9f, 0x94, 0x53, 0x2e, 0x68, 0xcb, 0x24, 0x1c, 0xbd, 0xd1, 0x50,
- 0x97, 0x0d, 0x14, 0xe0, 0x5c, 0x5b, 0x17, 0x31, 0x93, 0xfb, 0x14, 0xf5, 0x1c, 0x41, 0xf3, 0x93,
- 0x83, 0x5b, 0xf7, 0xf4, 0x16, 0xa7, 0xe0, 0xbb, 0xa8, 0x1f, 0xfb, 0x8b, 0x13, 0xaf, 0x0e, 0x21,
- 0x69, 0x1d, 0x7e, 0xce, 0xc9, 0x3b, 0x75, 0xe6, 0xe4, 0x18, 0x3a,
-};
-
-uchar ccpaad[] = {
- 0x50, 0x51, 0x52, 0x53, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
-};
-uchar ccpkey[] = {
- 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
- 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
-};
-uchar ccpiv[] = {
- 0x07, 0x00, 0x00, 0x00,
- 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
-};
-uchar ccptag[] = {
- 0x1a, 0xe1, 0x0b, 0x59, 0x4f, 0x09, 0xe2, 0x6a, 0x7e, 0x90, 0x2e, 0xcb, 0xd0, 0x60, 0x06, 0x91,
-};
-
-uchar ccp64aad[] = {
- 0x87, 0xe2, 0x29, 0xd4, 0x50, 0x08, 0x45, 0xa0, 0x79, 0xc0,
-};
-uchar ccp64key[] = {
- 0x42, 0x90, 0xbc, 0xb1, 0x54, 0x17, 0x35, 0x31, 0xf3, 0x14, 0xaf, 0x57, 0xf3, 0xbe, 0x3b, 0x50,
- 0x06, 0xda, 0x37, 0x1e, 0xce, 0x27, 0x2a, 0xfa, 0x1b, 0x5d, 0xbd, 0xd1, 0x10, 0x0a, 0x10, 0x07,
-};
-uchar ccp64iv[] = {
- 0xcd, 0x7c, 0xf6, 0x7b, 0xe3, 0x9c, 0x79, 0x4a,
-};
-uchar ccp64inp[] = {
- 0x86, 0xd0, 0x99, 0x74, 0x84, 0x0b, 0xde, 0xd2, 0xa5, 0xca,
-};
-uchar ccp64out[] = {
- 0xe3, 0xe4, 0x46, 0xf7, 0xed, 0xe9, 0xa1, 0x9b, 0x62, 0xa4,
-};
-uchar ccp64tag[] = {
- 0x67, 0x7d, 0xab, 0xf4, 0xe3, 0xd2, 0x4b, 0x87, 0x6b, 0xb2, 0x84, 0x75, 0x38, 0x96, 0xe1, 0xd6,
-};
-
-void
-main(int argc, char **argv)
-{
- Chachastate s;
- uchar tag[16];
- int n;
-
- ARGBEGIN{
- }ARGEND
- print("rfc7539:\n");
- print("key:\n");
- printblock(rfckey, sizeof(rfckey));
- n = strlen(rfctext);
- setupChachastate(&s, rfckey, sizeof(rfckey), rfcnonce, sizeof(rfcnonce), 0);
- chacha_setblock(&s, rfccount);
- print("rfc in:\n");
- printblock((uchar*)rfctext, n);
- chacha_encrypt2((uchar*)rfctext, rfcout, n, &s);
- print("rfc out:\n");
- printblock(rfcout, n);
- if(memcmp(rfcout, rfcref, sizeof(rfcref)) != 0){
- print("failure of vision\n");
- exits("wrong");
- }
- print("\n");
-
-
- print("xchacha key:\n");
- printblock(xcckey, sizeof(xcckey));
-
- print("xchacha iv:\n");
- printblock(xcciv, sizeof(xcciv));
-
- setupChachastate(&s, xcckey, sizeof(xcckey), xcciv, sizeof(xcciv), 20);
- memset(rfcout, 0, sizeof(xccref));
- chacha_encrypt(rfcout, sizeof(xccref), &s);
-
- print("xchacha out:\n");
- printblock(rfcout, sizeof(xccref));
- if(memcmp(rfcout, xccref, sizeof(xccref)) != 0){
- print("failure of vision\n");
- exits("wrong");
- }
- print("\n");
-
-
- print("ccpoly key:\n");
- printblock(ccpkey, sizeof(ccpkey));
-
- print("ccpoly iv:\n");
- printblock(ccpiv, sizeof(ccpiv));
-
- setupChachastate(&s, ccpkey, sizeof(ccpkey), ccpiv, sizeof(ccpiv), 20);
-
- memmove(rfcout, rfctext, sizeof(rfctext)-1);
- ccpoly_encrypt(rfcout, sizeof(rfctext)-1, ccpaad, sizeof(ccpaad), tag, &s);
-
- print("ccpoly cipher:\n");
- printblock(rfcout, sizeof(rfctext)-1);
-
- print("ccpoly tag:\n");
- printblock(tag, sizeof(tag));
-
- if(memcmp(tag, ccptag, sizeof(tag)) != 0){
- print("bad ccpoly tag\n");
- exits("wrong");
- }
-
- if(ccpoly_decrypt(rfcout, sizeof(rfctext)-1, ccpaad, sizeof(ccpaad), tag, &s) != 0){
- print("ccpoly decryption failed\n");
- exits("wrong");
- }
-
- if(memcmp(rfcout, rfctext, sizeof(rfctext)-1) != 0){
- print("ccpoly bad decryption\n");
- exits("wrong");
- }
- print("\n");
-
-
- print("ccpoly64 key:\n");
- printblock(ccp64key, sizeof(ccp64key));
-
- print("ccpoly64 iv:\n");
- printblock(ccp64iv, sizeof(ccp64iv));
-
- setupChachastate(&s, ccp64key, sizeof(ccp64key), ccp64iv, sizeof(ccp64iv), 20);
-
- memmove(rfcout, ccp64inp, sizeof(ccp64inp));
- ccpoly_encrypt(rfcout, sizeof(ccp64inp), ccp64aad, sizeof(ccp64aad), tag, &s);
-
- print("ccpoly64 cipher:\n");
- printblock(rfcout, sizeof(ccp64inp));
-
- print("ccpoly64 tag:\n");
- printblock(tag, sizeof(tag));
-
- if(memcmp(rfcout, ccp64out, sizeof(ccp64out)) != 0){
- print("ccpoly64 bad ciphertext\n");
- exits("wrong");
- }
- if(memcmp(tag, ccp64tag, sizeof(ccp64tag)) != 0){
- print("ccpoly64 bad encryption tag\n");
- exits("wrong");
- }
-
- if(ccpoly_decrypt(rfcout, sizeof(ccp64inp), ccp64aad, sizeof(ccp64aad), tag, &s) != 0){
- print("ccpoly64 decryption failed\n");
- exits("wrong");
- }
- if(memcmp(rfcout, ccp64inp, sizeof(ccp64inp)) != 0){
- print("ccpoly64 bad decryption\n");
- exits("wrong");
- }
-
- print("passed\n");
- exits(nil);
-}
--- a/sys/src/libsec/port/egtest.c
+++ /dev/null
@@ -1,34 +1,0 @@
-#include "os.h"
-#include <mp.h>
-#include <libsec.h>
-
-void
-main(void)
-{
- EGpriv *sk;
- mpint *m, *gamma, *delta, *in, *out;
- int plen, shift;
-
- fmtinstall('B', mpfmt);
-
- sk = egprivalloc();
- sk->pub.p = uitomp(2357, nil);
- sk->pub.alpha = uitomp(2, nil);
- sk->pub.key = uitomp(1185, nil);
- sk->secret = uitomp(1751, nil);
-
- m = uitomp(2035, nil);
-
- plen = mpsignif(sk->pub.p)+1;
- shift = ((plen+Dbits-1)/Dbits)*Dbits;
- gamma = uitomp(1430, nil);
- delta = uitomp(697, nil);
- out = mpnew(0);
- in = mpnew(0);
- mpleft(gamma, shift, in);
- mpadd(delta, in, in);
- egdecrypt(sk, in, out);
-
- if(mpcmp(m, out) != 0)
- print("decrypt failed to recover message\n");
-}
--- a/sys/src/libsec/port/hmactest.c
+++ /dev/null
@@ -1,19 +1,0 @@
-#include "os.h"
-#include <mp.h>
-#include <libsec.h>
-
-uchar key[] = "Jefe";
-uchar data[] = "what do ya want for nothing?";
-
-void
-main(void)
-{
- int i;
- uchar hash[MD5dlen];
-
- hmac_md5(data, strlen((char*)data), key, 4, hash, nil);
- for(i=0; i<MD5dlen; i++)
- print("%2.2x", hash[i]);
- print("\n");
- print("750c783e6ab0b503eaa86e310a5db738\n");
-}
--- a/sys/src/libsec/port/md4test.c
+++ /dev/null
@@ -1,31 +1,0 @@
-#include "os.h"
-#include <mp.h>
-#include <libsec.h>
-
-char *tests[] = {
- "",
- "a",
- "abc",
- "message digest",
- "abcdefghijklmnopqrstuvwxyz",
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
- "12345678901234567890123456789012345678901234567890123456789012345678901234567890",
- 0
-};
-
-void
-main(void)
-{
- char **pp;
- uchar *p;
- int i;
- uchar digest[MD5dlen];
-
- for(pp = tests; *pp; pp++){
- p = (uchar*)*pp;
- md4(p, strlen(*pp), digest, 0);
- for(i = 0; i < MD5dlen; i++)
- print("%2.2ux", digest[i]);
- print("\n");
- }
-}
--- a/sys/src/libsec/port/primetest.c
+++ /dev/null
@@ -1,41 +1,0 @@
-#include "os.h"
-#include <mp.h>
-#include <libsec.h>
-
-void
-main(void)
-{
- mpint *z = mpnew(0);
- mpint *p = mpnew(0);
- mpint *q = mpnew(0);
- mpint *nine = mpnew(0);
-
- fmtinstall('B', mpfmt);
- strtomp("2492491", nil, 16, z); // 38347921 = x*y = (2**28-9)/7,
- // an example of 3**(n-1)=1 mod n
- strtomp("15662C00E811", nil, 16, p);// 23528569104401, a prime
- uitomp(9, nine);
-
- if(probably_prime(z, 5) == 1)
- fprint(2, "tricked primality test\n");
- if(probably_prime(nine, 5) == 1)
- fprint(2, "9 passed primality test!\n");
- if(probably_prime(p, 25) == 1)
- fprint(2, "ok\n");
-
- DSAprimes(q, p, nil);
- print("q=%B\np=%B\n", q, p);
-
- exits(0);
-}
-
-// example output, checked with Maple:
-// seed EB7B6E35F7CD37B511D96C67D6688CC4DD440E1E
-// q=E0F0EF284E10796C5A2A511E94748BA03C795C13
-// = 1284186945063585093695748280224501481698995297299
-// p=C41CFBE4D4846F67A3DF7DE9921A49D3B42DC33728427AB159CEC8CBBDB12B5F0C244F1A734AEB9840804EA3C25036AD1B61AFF3ABBC247CD4B384224567A863A6F020E7EE9795554BCD08ABAD7321AF27E1E92E3DB1C6E7E94FAAE590AE9C48F96D93D178E809401ABE8A534A1EC44359733475A36A70C7B425125062B1142D
-// = 137715385439333164327584575331308277462546592976152006175830654712456008630139443747529133857837818585400418619916530061955288983751958831927807888408309879880101870216437711393638413509484569804814373511469405934988856674935304074081350525593807908358867354528898618574659752879015380013845760006721861915693
-// r=DF310F4E54A5FEC5D86D3E14863921E834113E060F90052AD332B3241CEF2497EFA0303D6344F7C819691A0F9C4A773815AF8EAECFB7EC1D98F039F17A32A7E887D97251A927D093F44A55577F4D70444AEBD06B9B45695EC23962B175F266895C67D21C4656848614D888A4
-// = 107239359478548771267308764204625458348785444483302647285245969203446101233421655396874997253111222983406676955642093641709149748793954493558324738441197139556917622937892491175016280660608595599724194374948056515856812347094848443460715881455884639869144172708
-// g=2F1C308DC46B9A44B52DF7DACCE1208CCEF72F69C743ADD4D2327173444ED6E65E074694246E07F9FD4AE26E0FDDD9F54F813C40CB9BCD4338EA6F242AB94CD410E676C290368A16B1A3594877437E516C53A6EEE5493A038A017E955E218E7819734E3E2A6E0BAE08B14258F8C03CC1B30E0DDADFCF7CEDF0727684D3D255F1
-// = 33081848392740465806285326014906437543653045153885419334085917570615301913274531387168723847139029827598735376746057461417880810924280288611116213062512408829164220104555543445909528701551198146080221790002337033997295756585193926863581671466708482411159477816144226847280417522524922667065714073338662508017
--- a/sys/src/libsec/port/rsatest.c
+++ /dev/null
@@ -1,56 +1,0 @@
-#include "os.h"
-#include <mp.h>
-#include <libsec.h>
-#include <bio.h>
-
-void
-main(void)
-{
- int n;
- vlong start;
- char *p;
- uchar buf[4096];
- Biobuf b;
- RSApriv *rsa;
- mpint *clr, *enc, *clr2;
-
- fmtinstall('B', mpfmt);
-
- rsa = rsagen(1024, 16, 0);
- if(rsa == nil)
- sysfatal("rsagen");
- Binit(&b, 0, OREAD);
- clr = mpnew(0);
- clr2 = mpnew(0);
- enc = mpnew(0);
-
- strtomp("123456789abcdef123456789abcdef123456789abcdef123456789abcdef", nil, 16, clr);
- rsaencrypt(&rsa->pub, clr, enc);
-
- start = nsec();
- for(n = 0; n < 10; n++)
- rsadecrypt(rsa, enc, clr);
- print("%lld\n", nsec()-start);
-
- start = nsec();
- for(n = 0; n < 10; n++)
- mpexp(enc, rsa->dk, rsa->pub.n, clr2);
- print("%lld\n", nsec()-start);
-
- if(mpcmp(clr, clr2) != 0)
- print("%B != %B\n", clr, clr2);
-
- print("> ");
- while(p = Brdline(&b, '\n')){
- n = Blinelen(&b);
- letomp((uchar*)p, n, clr);
- print("clr %B\n", clr);
- rsaencrypt(&rsa->pub, clr, enc);
- print("enc %B\n", enc);
- rsadecrypt(rsa, enc, clr);
- print("clr %B\n", clr);
- n = mptole(clr, buf, sizeof(buf), nil);
- write(1, buf, n);
- print("> ");
- }
-}
--- a/sys/src/libsec/port/sha2test.c
+++ /dev/null
@@ -1,63 +1,0 @@
-#include <u.h>
-#include <libc.h>
-#include "libsec.h"
-
-char *tests[] = {
- "",
- "a",
- "abc",
- "message digest",
- "abcdefghijklmnopqrstuvwxyz",
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
- "123456789012345678901234567890123456789012345678901234567890"
- "12345678901234567890",
- "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
- "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhi"
- "jklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu",
- 0
-};
-
-void
-main(void)
-{
- int i;
- char **pp;
- uchar *p;
- uchar digest[SHA2_512dlen];
-
- print("SHA2_224 tests:\n");
- for(pp = tests; *pp; pp++){
- p = (uchar*)*pp;
- sha2_224(p, strlen(*pp), digest, 0);
- for(i = 0; i < SHA2_224dlen; i++)
- print("%2.2ux", digest[i]);
- print("\n");
- }
-
- print("\nSHA256 tests:\n");
- for(pp = tests; *pp; pp++){
- p = (uchar*)*pp;
- sha2_256(p, strlen(*pp), digest, 0);
- for(i = 0; i < SHA2_256dlen; i++)
- print("%2.2ux", digest[i]);
- print("\n");
- }
-
- print("\nSHA384 tests:\n");
- for(pp = tests; *pp; pp++){
- p = (uchar*)*pp;
- sha2_384(p, strlen(*pp), digest, 0);
- for(i = 0; i < SHA2_384dlen; i++)
- print("%2.2ux", digest[i]);
- print("\n");
- }
-
- print("\nSHA512 tests:\n");
- for(pp = tests; *pp; pp++){
- p = (uchar*)*pp;
- sha2_512(p, strlen(*pp), digest, 0);
- for(i = 0; i < SHA2_512dlen; i++)
- print("%2.2ux", digest[i]);
- print("\n");
- }
-}
--- /dev/null
+++ b/sys/src/libsec/test/aesgcm.c
@@ -1,0 +1,324 @@
+#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 chatty;
+
+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 && chatty)
+ print("%s = %.*H\n", l, n, h);
+ return n;
+}
+
+void
+runtest(Test *t, int i)
+{
+ 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);
+ if(chatty){
+ print("C = %.*H\n", nplain, plain);
+ print("T = %.*H\n", 16, tag);
+ }
+
+ parsehex(t->T, tmp, nil);
+ if(memcmp(tmp, tag, 16) != 0){
+ print("Test case %d fail:\n", i);
+ print("\tExp = %.16H\n", tmp);
+ print("\tRes = %.16H\n", tag);
+ exits("fail");
+ }
+}
+
+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);
+ case 'd':
+ chatty++;
+ break;
+ } ARGEND;
+
+ for(i=0; i<nelem(tests); i++)
+ runtest(&tests[i], i);
+ exits(nil);
+}
--- /dev/null
+++ b/sys/src/libsec/test/bf.c
@@ -1,0 +1,279 @@
+#include <u.h>
+#include <libc.h>
+#include <libsec.h>
+
+enum{
+ Bsz = 8,
+};
+
+typedef struct Testvector Testvector;
+
+struct Testvector{
+ uchar key[Bsz];
+ uchar plain[Bsz];
+ uchar cipher[Bsz];
+};
+
+/*
+ * Blowfish test vectors from https://www.schneier.com/code/vectors.txt
+ */
+Testvector vector [] = {
+ {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+ {0x4E, 0xF9, 0x97, 0x45, 0x61, 0x98, 0xDD, 0x78}},
+
+ {{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
+ {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
+ {0x51, 0x86, 0x6F, 0xD5, 0xB8, 0x5E, 0xCB, 0x8A}},
+
+ {{0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+ {0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
+ {0x7D, 0x85, 0x6F, 0x9A, 0x61, 0x30, 0x63, 0xF2}},
+
+ {{0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11},
+ {0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11},
+ {0x24, 0x66, 0xDD, 0x87, 0x8B, 0x96, 0x3C, 0x9D}},
+
+ {{0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF},
+ {0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11},
+ {0x61, 0xF9, 0xC3, 0x80, 0x22, 0x81, 0xB0, 0x96}},
+
+ {{0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11},
+ {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF},
+ {0x7D, 0x0C, 0xC6, 0x30, 0xAF, 0xDA, 0x1E, 0xC7}},
+
+ {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+ {0x4E, 0xF9, 0x97, 0x45, 0x61, 0x98, 0xDD, 0x78}},
+
+ {{0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10},
+ {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF},
+ {0x0A, 0xCE, 0xAB, 0x0F, 0xC6, 0xA0, 0xA2, 0x8D}},
+
+ {{0x7C, 0xA1, 0x10, 0x45, 0x4A, 0x1A, 0x6E, 0x57},
+ {0x01, 0xA1, 0xD6, 0xD0, 0x39, 0x77, 0x67, 0x42},
+ {0x59, 0xC6, 0x82, 0x45, 0xEB, 0x05, 0x28, 0x2B}},
+
+ {{0x01, 0x31, 0xD9, 0x61, 0x9D, 0xC1, 0x37, 0x6E},
+ {0x5C, 0xD5, 0x4C, 0xA8, 0x3D, 0xEF, 0x57, 0xDA},
+ {0xB1, 0xB8, 0xCC, 0x0B, 0x25, 0x0F, 0x09, 0xA0}},
+
+ {{0x07, 0xA1, 0x13, 0x3E, 0x4A, 0x0B, 0x26, 0x86},
+ {0x02, 0x48, 0xD4, 0x38, 0x06, 0xF6, 0x71, 0x72},
+ {0x17, 0x30, 0xE5, 0x77, 0x8B, 0xEA, 0x1D, 0xA4}},
+
+ {{0x38, 0x49, 0x67, 0x4C, 0x26, 0x02, 0x31, 0x9E},
+ {0x51, 0x45, 0x4B, 0x58, 0x2D, 0xDF, 0x44, 0x0A},
+ {0xA2, 0x5E, 0x78, 0x56, 0xCF, 0x26, 0x51, 0xEB}},
+
+ {{0x04, 0xB9, 0x15, 0xBA, 0x43, 0xFE, 0xB5, 0xB6},
+ {0x42, 0xFD, 0x44, 0x30, 0x59, 0x57, 0x7F, 0xA2},
+ {0x35, 0x38, 0x82, 0xB1, 0x09, 0xCE, 0x8F, 0x1A}},
+
+ {{0x01, 0x13, 0xB9, 0x70, 0xFD, 0x34, 0xF2, 0xCE},
+ {0x05, 0x9B, 0x5E, 0x08, 0x51, 0xCF, 0x14, 0x3A},
+ {0x48, 0xF4, 0xD0, 0x88, 0x4C, 0x37, 0x99, 0x18}},
+
+ {{0x01, 0x70, 0xF1, 0x75, 0x46, 0x8F, 0xB5, 0xE6},
+ {0x07, 0x56, 0xD8, 0xE0, 0x77, 0x47, 0x61, 0xD2},
+ {0x43, 0x21, 0x93, 0xB7, 0x89, 0x51, 0xFC, 0x98}},
+
+ {{0x43, 0x29, 0x7F, 0xAD, 0x38, 0xE3, 0x73, 0xFE},
+ {0x76, 0x25, 0x14, 0xB8, 0x29, 0xBF, 0x48, 0x6A},
+ {0x13, 0xF0, 0x41, 0x54, 0xD6, 0x9D, 0x1A, 0xE5}},
+
+ {{0x07, 0xA7, 0x13, 0x70, 0x45, 0xDA, 0x2A, 0x16},
+ {0x3B, 0xDD, 0x11, 0x90, 0x49, 0x37, 0x28, 0x02},
+ {0x2E, 0xED, 0xDA, 0x93, 0xFF, 0xD3, 0x9C, 0x79}},
+
+ {{0x04, 0x68, 0x91, 0x04, 0xC2, 0xFD, 0x3B, 0x2F},
+ {0x26, 0x95, 0x5F, 0x68, 0x35, 0xAF, 0x60, 0x9A},
+ {0xD8, 0x87, 0xE0, 0x39, 0x3C, 0x2D, 0xA6, 0xE3}},
+
+ {{0x37, 0xD0, 0x6B, 0xB5, 0x16, 0xCB, 0x75, 0x46},
+ {0x16, 0x4D, 0x5E, 0x40, 0x4F, 0x27, 0x52, 0x32},
+ {0x5F, 0x99, 0xD0, 0x4F, 0x5B, 0x16, 0x39, 0x69}},
+
+ {{0x1F, 0x08, 0x26, 0x0D, 0x1A, 0xC2, 0x46, 0x5E},
+ {0x6B, 0x05, 0x6E, 0x18, 0x75, 0x9F, 0x5C, 0xCA},
+ {0x4A, 0x05, 0x7A, 0x3B, 0x24, 0xD3, 0x97, 0x7B}},
+
+ {{0x58, 0x40, 0x23, 0x64, 0x1A, 0xBA, 0x61, 0x76},
+ {0x00, 0x4B, 0xD6, 0xEF, 0x09, 0x17, 0x60, 0x62},
+ {0x45, 0x20, 0x31, 0xC1, 0xE4, 0xFA, 0xDA, 0x8E}},
+
+ {{0x02, 0x58, 0x16, 0x16, 0x46, 0x29, 0xB0, 0x07},
+ {0x48, 0x0D, 0x39, 0x00, 0x6E, 0xE7, 0x62, 0xF2},
+ {0x75, 0x55, 0xAE, 0x39, 0xF5, 0x9B, 0x87, 0xBD}},
+
+ {{0x49, 0x79, 0x3E, 0xBC, 0x79, 0xB3, 0x25, 0x8F},
+ {0x43, 0x75, 0x40, 0xC8, 0x69, 0x8F, 0x3C, 0xFA},
+ {0x53, 0xC5, 0x5F, 0x9C, 0xB4, 0x9F, 0xC0, 0x19}},
+
+ {{0x4F, 0xB0, 0x5E, 0x15, 0x15, 0xAB, 0x73, 0xA7},
+ {0x07, 0x2D, 0x43, 0xA0, 0x77, 0x07, 0x52, 0x92},
+ {0x7A, 0x8E, 0x7B, 0xFA, 0x93, 0x7E, 0x89, 0xA3}},
+
+ {{0x49, 0xE9, 0x5D, 0x6D, 0x4C, 0xA2, 0x29, 0xBF},
+ {0x02, 0xFE, 0x55, 0x77, 0x81, 0x17, 0xF1, 0x2A},
+ {0xCF, 0x9C, 0x5D, 0x7A, 0x49, 0x86, 0xAD, 0xB5}},
+
+ {{0x01, 0x83, 0x10, 0xDC, 0x40, 0x9B, 0x26, 0xD6},
+ {0x1D, 0x9D, 0x5C, 0x50, 0x18, 0xF7, 0x28, 0xC2},
+ {0xD1, 0xAB, 0xB2, 0x90, 0x65, 0x8B, 0xC7, 0x78}},
+
+ {{0x1C, 0x58, 0x7F, 0x1C, 0x13, 0x92, 0x4F, 0xEF},
+ {0x30, 0x55, 0x32, 0x28, 0x6D, 0x6F, 0x29, 0x5A},
+ {0x55, 0xCB, 0x37, 0x74, 0xD1, 0x3E, 0xF2, 0x01}},
+
+ {{0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01},
+ {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF},
+ {0xFA, 0x34, 0xEC, 0x48, 0x47, 0xB2, 0x68, 0xB2}},
+
+ {{0x1F, 0x1F, 0x1F, 0x1F, 0x0E, 0x0E, 0x0E, 0x0E},
+ {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF},
+ {0xA7, 0x90, 0x79, 0x51, 0x08, 0xEA, 0x3C, 0xAE}},
+
+ {{0xE0, 0xFE, 0xE0, 0xFE, 0xF1, 0xFE, 0xF1, 0xFE},
+ {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF},
+ {0xC3, 0x9E, 0x07, 0x2D, 0x9F, 0xAC, 0x63, 0x1D}},
+
+ {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+ {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
+ {0x01, 0x49, 0x33, 0xE0, 0xCD, 0xAF, 0xF6, 0xE4}},
+
+ {{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+ {0xF2, 0x1E, 0x9A, 0x77, 0xB7, 0x1C, 0x49, 0xBC}},
+
+ {{0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF},
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+ {0x24, 0x59, 0x46, 0x88, 0x57, 0x54, 0x36, 0x9A}},
+
+ {{0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10},
+ {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
+ {0x6B, 0x5C, 0x5A, 0x9C, 0x5D, 0x9E, 0x0A, 0x5A}}
+};
+
+uchar CBCkey[16] = {
+ 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF,
+ 0xF0, 0xE1, 0xD2, 0xC3, 0xB4, 0xA5, 0x96, 0x87
+};
+
+uchar CBCiv[8] = {
+ 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10
+};
+
+uchar CBCdata[29] = {
+ 0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31, 0x20,
+ 0x4E, 0x6F, 0x77, 0x20, 0x69, 0x73, 0x20, 0x74,
+ 0x68, 0x65, 0x20, 0x74, 0x69, 0x6D, 0x65, 0x20,
+ 0x66, 0x6F, 0x72, 0x20, 0x00
+};
+
+uchar CBCcipher[32] = {
+ 0x6B, 0x77, 0xB4, 0xD6, 0x30, 0x06, 0xDE, 0xE6,
+ 0x05, 0xB1, 0x56, 0xE2, 0x74, 0x03, 0x97, 0x93,
+ 0x58, 0xDE, 0xB9, 0xE7, 0x15, 0x46, 0x16, 0xD9,
+ 0x59, 0xF1, 0x65, 0x2B, 0xD5, 0xFF, 0x92, 0xCC
+};
+
+int
+testECB(Testvector *t)
+{
+ BFstate s;
+ int i;
+ uchar aux[Bsz];
+
+ memcpy(aux, t->plain, Bsz);
+
+ memset(&s, 0, sizeof(BFstate));
+ setupBFstate(&s, t->key, Bsz, nil);
+ bfECBencrypt(aux, Bsz, &s);
+
+ if(memcmp(aux, t->cipher, Bsz) != 0){
+ fprint(2, "ECB encrypt failed, ciphertext is:\n");
+ for(i = 0; i < Bsz; i++)
+ fprint(2, "%02X", aux[i]);
+ fprint(2, "\nand should be:\n");
+ for(i = 0; i < Bsz; i++)
+ fprint(2, "%02X", t->cipher[i]);
+ fprint(2, "\n");
+ return -1;
+ }
+
+ memset(&s, 0, sizeof(BFstate));
+ setupBFstate(&s, t->key, Bsz, nil);
+ bfECBdecrypt(aux, Bsz, &s);
+
+ if(memcmp(aux, t->plain, Bsz) != 0){
+ fprint(2, "ECB decrypt failed, plaintext is:\n");
+ for(i = 0; i < Bsz; i++)
+ fprint(2, "%02X", aux[i]);
+ fprint(2, "\nand should be:\n");
+ for(i = 0; i < Bsz; i++)
+ fprint(2, "%02X", t->plain[i]);
+ fprint(2, "\n");
+ return -1;
+ }
+ return 0;
+}
+
+int
+testCBC(void)
+{
+ BFstate s;
+ uchar aux[32];
+ int i;
+
+ memset(aux, 0 , sizeof(aux));
+ memcpy(aux, CBCdata, sizeof(CBCdata));
+ memset(&s, 0, sizeof(BFstate));
+ setupBFstate(&s, CBCkey, sizeof(CBCkey), CBCiv);
+ bfCBCencrypt(aux, 32, &s);
+
+ if(memcmp(aux, CBCcipher, sizeof(CBCcipher)) != 0){
+ fprint(2, "CBC encrypt failed, ciphertext is:\n");
+ for(i = 0; i < sizeof(aux); i++)
+ fprint(2, "%02X", aux[i]);
+ fprint(2, "\nand should be:\n");
+ for(i = 0; i < sizeof(CBCcipher); i++)
+ fprint(2, "%02X", CBCcipher[i]);
+ fprint(2, "\n");
+ return -1;
+ }
+
+ memset(&s, 0, sizeof(BFstate));
+ setupBFstate(&s, CBCkey, sizeof(CBCkey), CBCiv);
+ bfCBCdecrypt(aux, 32, &s);
+
+ if(memcmp(aux, CBCdata, sizeof(CBCdata)) != 0){
+ fprint(2, "CBC decrypt failed, plaintext is:\n");
+ for(i = 0; i < sizeof(aux); i++)
+ fprint(2, "%02X", aux[i]);
+ fprint(2, "\nand should be:\n");
+ for(i = 0; i < sizeof(CBCdata); i++)
+ fprint(2, "%02X", CBCdata[i]);
+ fprint(2, "\n");
+ return -1;
+ }
+
+ return 0;
+}
+
+void
+main(int argc, char **argv)
+{
+ int i;
+
+ if(argc != 1)
+ sysfatal("usage: %s", argv[0]);
+
+ for(i=0; i < nelem(vector); i++)
+ if(testECB(&vector[i]) < 0)
+ sysfatal("TestECB %d failed", i);
+
+ if(testCBC() < 0)
+ sysfatal("TestCBC failed");
+ exits(nil);
+}
--- /dev/null
+++ b/sys/src/libsec/test/chacha.c
@@ -1,0 +1,213 @@
+#include <u.h>
+#include <libc.h>
+#include <libsec.h>
+
+static void
+printblock(uchar *b, usize n)
+{
+ int i;
+
+ for(i=0; i+8<=n; i+=8){
+ print("%#.2ux %#.2ux %#.2ux %#.2ux %#.2ux %#.2ux %#.2ux %#.2ux\n",
+ b[0], b[1], b[2], b[3], b[4], b[5], b[6], b[7]);
+ b += 8;
+ }
+ if(i < n){
+ print("%#.2ux", *b++);
+ while(++i < n)
+ print(" %#.2ux", *b++);
+ print("\n");
+ }
+}
+
+/* test vector from RFC7539 */
+uchar rfckey[] = {
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+ 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
+ 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
+ 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f};
+uchar rfcnonce[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x00, 0x00, 0x00};
+u32int rfccount = 1;
+char rfctext[] = "Ladies and Gentlemen of the class of '99: If I could offer you only one tip for the future, "
+ "sunscreen would be it.";
+uchar rfcout[3*ChachaBsize];
+uchar rfcref[] = {
+ 0x6e, 0x2e, 0x35, 0x9a, 0x25, 0x68, 0xf9, 0x80, 0x41, 0xba, 0x07, 0x28, 0xdd, 0x0d, 0x69, 0x81,
+ 0xe9, 0x7e, 0x7a, 0xec, 0x1d, 0x43, 0x60, 0xc2, 0x0a, 0x27, 0xaf, 0xcc, 0xfd, 0x9f, 0xae, 0x0b,
+ 0xf9, 0x1b, 0x65, 0xc5, 0x52, 0x47, 0x33, 0xab, 0x8f, 0x59, 0x3d, 0xab, 0xcd, 0x62, 0xb3, 0x57,
+ 0x16, 0x39, 0xd6, 0x24, 0xe6, 0x51, 0x52, 0xab, 0x8f, 0x53, 0x0c, 0x35, 0x9f, 0x08, 0x61, 0xd8,
+ 0x07, 0xca, 0x0d, 0xbf, 0x50, 0x0d, 0x6a, 0x61, 0x56, 0xa3, 0x8e, 0x08, 0x8a, 0x22, 0xb6, 0x5e,
+ 0x52, 0xbc, 0x51, 0x4d, 0x16, 0xcc, 0xf8, 0x06, 0x81, 0x8c, 0xe9, 0x1a, 0xb7, 0x79, 0x37, 0x36,
+ 0x5a, 0xf9, 0x0b, 0xbf, 0x74, 0xa3, 0x5b, 0xe6, 0xb4, 0x0b, 0x8e, 0xed, 0xf2, 0x78, 0x5e, 0x42,
+ 0x87, 0x4d
+};
+
+uchar xcckey[] = {
+ 0x1b, 0x27, 0x55, 0x64, 0x73, 0xe9, 0x85, 0xd4, 0x62, 0xcd, 0x51, 0x19, 0x7a, 0x9a, 0x46, 0xc7,
+ 0x60, 0x09, 0x54, 0x9e, 0xac, 0x64, 0x74, 0xf2, 0x06, 0xc4, 0xee, 0x08, 0x44, 0xf6, 0x83, 0x89,
+};
+uchar xcciv[] = {
+ 0x69, 0x69, 0x6e, 0xe9, 0x55, 0xb6, 0x2b, 0x73, 0xcd, 0x62, 0xbd, 0xa8, 0x75, 0xfc, 0x73, 0xd6,
+ 0x82, 0x19, 0xe0, 0x03, 0x6b, 0x7a, 0x0b, 0x37,
+};
+uchar xccref[] = {
+ 0x4f, 0xeb, 0xf2, 0xfe, 0x4b, 0x35, 0x9c, 0x50, 0x8d, 0xc5, 0xe8, 0xb5, 0x98, 0x0c, 0x88, 0xe3,
+ 0x89, 0x46, 0xd8, 0xf1, 0x8f, 0x31, 0x34, 0x65, 0xc8, 0x62, 0xa0, 0x87, 0x82, 0x64, 0x82, 0x48,
+ 0x01, 0x8d, 0xac, 0xdc, 0xb9, 0x04, 0x17, 0x88, 0x53, 0xa4, 0x6d, 0xca, 0x3a, 0x0e, 0xaa, 0xee,
+ 0x74, 0x7c, 0xba, 0x97, 0x43, 0x4e, 0xaf, 0xfa, 0xd5, 0x8f, 0xea, 0x82, 0x22, 0x04, 0x7e, 0x0d,
+ 0xe6, 0xc3, 0xa6, 0x77, 0x51, 0x06, 0xe0, 0x33, 0x1a, 0xd7, 0x14, 0xd2, 0xf2, 0x7a, 0x55, 0x64,
+ 0x13, 0x40, 0xa1, 0xf1, 0xdd, 0x9f, 0x94, 0x53, 0x2e, 0x68, 0xcb, 0x24, 0x1c, 0xbd, 0xd1, 0x50,
+ 0x97, 0x0d, 0x14, 0xe0, 0x5c, 0x5b, 0x17, 0x31, 0x93, 0xfb, 0x14, 0xf5, 0x1c, 0x41, 0xf3, 0x93,
+ 0x83, 0x5b, 0xf7, 0xf4, 0x16, 0xa7, 0xe0, 0xbb, 0xa8, 0x1f, 0xfb, 0x8b, 0x13, 0xaf, 0x0e, 0x21,
+ 0x69, 0x1d, 0x7e, 0xce, 0xc9, 0x3b, 0x75, 0xe6, 0xe4, 0x18, 0x3a,
+};
+
+uchar ccpaad[] = {
+ 0x50, 0x51, 0x52, 0x53, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
+};
+uchar ccpkey[] = {
+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
+};
+uchar ccpiv[] = {
+ 0x07, 0x00, 0x00, 0x00,
+ 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
+};
+uchar ccptag[] = {
+ 0x1a, 0xe1, 0x0b, 0x59, 0x4f, 0x09, 0xe2, 0x6a, 0x7e, 0x90, 0x2e, 0xcb, 0xd0, 0x60, 0x06, 0x91,
+};
+
+uchar ccp64aad[] = {
+ 0x87, 0xe2, 0x29, 0xd4, 0x50, 0x08, 0x45, 0xa0, 0x79, 0xc0,
+};
+uchar ccp64key[] = {
+ 0x42, 0x90, 0xbc, 0xb1, 0x54, 0x17, 0x35, 0x31, 0xf3, 0x14, 0xaf, 0x57, 0xf3, 0xbe, 0x3b, 0x50,
+ 0x06, 0xda, 0x37, 0x1e, 0xce, 0x27, 0x2a, 0xfa, 0x1b, 0x5d, 0xbd, 0xd1, 0x10, 0x0a, 0x10, 0x07,
+};
+uchar ccp64iv[] = {
+ 0xcd, 0x7c, 0xf6, 0x7b, 0xe3, 0x9c, 0x79, 0x4a,
+};
+uchar ccp64inp[] = {
+ 0x86, 0xd0, 0x99, 0x74, 0x84, 0x0b, 0xde, 0xd2, 0xa5, 0xca,
+};
+uchar ccp64out[] = {
+ 0xe3, 0xe4, 0x46, 0xf7, 0xed, 0xe9, 0xa1, 0x9b, 0x62, 0xa4,
+};
+uchar ccp64tag[] = {
+ 0x67, 0x7d, 0xab, 0xf4, 0xe3, 0xd2, 0x4b, 0x87, 0x6b, 0xb2, 0x84, 0x75, 0x38, 0x96, 0xe1, 0xd6,
+};
+
+void
+main(int argc, char **argv)
+{
+ Chachastate s;
+ uchar tag[16];
+ int n;
+ int chatty;
+
+ ARGBEGIN{
+ }ARGEND
+
+ n = strlen(rfctext);
+ setupChachastate(&s, rfckey, sizeof(rfckey), rfcnonce, sizeof(rfcnonce), 0);
+ chacha_setblock(&s, rfccount);
+ chacha_encrypt2((uchar*)rfctext, rfcout, n, &s);
+ if(memcmp(rfcout, rfcref, sizeof(rfcref)) != 0){
+ print("failure of vision\n");
+ print("rfc7539:\n");
+ print("key:\n");
+ printblock(rfckey, sizeof(rfckey));
+ print("rfc in:\n");
+ printblock((uchar*)rfctext, n);
+ print("rfc out:\n");
+ printblock(rfcout, n);
+ exits("wrong");
+ }
+
+
+ setupChachastate(&s, xcckey, sizeof(xcckey), xcciv, sizeof(xcciv), 20);
+ memset(rfcout, 0, sizeof(xccref));
+ chacha_encrypt(rfcout, sizeof(xccref), &s);
+ if(memcmp(rfcout, xccref, sizeof(xccref)) != 0){
+ print("failure of vision\n");
+ print("xchacha key:\n");
+ printblock(xcckey, sizeof(xcckey));
+ print("xchacha iv:\n");
+ printblock(xcciv, sizeof(xcciv));
+ print("xchacha out:\n");
+ printblock(rfcout, sizeof(xccref));
+ exits("wrong");
+ }
+
+#define DUMP()\
+ print("ccpoly key:\n");\
+ printblock(ccpkey, sizeof(ccpkey));\
+ print("ccpoly iv:\n");\
+ printblock(ccpiv, sizeof(ccpiv));\
+ print("ccpoly cipher:\n");\
+ printblock(rfcout, sizeof(rfctext)-1);\
+ print("ccpoly tag:\n");\
+ printblock(tag, sizeof(tag));
+
+ setupChachastate(&s, ccpkey, sizeof(ccpkey), ccpiv, sizeof(ccpiv), 20);
+ memmove(rfcout, rfctext, sizeof(rfctext)-1);
+ ccpoly_encrypt(rfcout, sizeof(rfctext)-1, ccpaad, sizeof(ccpaad), tag, &s);
+
+ if(memcmp(tag, ccptag, sizeof(tag)) != 0){
+ print("bad ccpoly tag\n");
+ DUMP()
+ exits("wrong");
+ }
+
+ if(ccpoly_decrypt(rfcout, sizeof(rfctext)-1, ccpaad, sizeof(ccpaad), tag, &s) != 0){
+ print("ccpoly decryption failed\n");
+ DUMP()
+ exits("wrong");
+ }
+
+ if(memcmp(rfcout, rfctext, sizeof(rfctext)-1) != 0){
+ print("ccpoly bad decryption\n");
+ DUMP()
+ exits("wrong");
+ }
+#undef DUMP
+
+
+#define DUMP()\
+ print("ccpoly64 key:\n");\
+ printblock(ccp64key, sizeof(ccp64key));\
+ print("ccpoly64 iv:\n");\
+ printblock(ccp64iv, sizeof(ccp64iv));\
+ print("ccpoly64 cipher:\n");\
+ printblock(rfcout, sizeof(ccp64inp));\
+ print("ccpoly64 tag:\n");\
+ printblock(tag, sizeof(tag));
+
+ setupChachastate(&s, ccp64key, sizeof(ccp64key), ccp64iv, sizeof(ccp64iv), 20);
+ memmove(rfcout, ccp64inp, sizeof(ccp64inp));
+ ccpoly_encrypt(rfcout, sizeof(ccp64inp), ccp64aad, sizeof(ccp64aad), tag, &s);
+
+ if(memcmp(rfcout, ccp64out, sizeof(ccp64out)) != 0){
+ print("ccpoly64 bad ciphertext\n");
+ DUMP()
+ exits("wrong");
+ }
+ if(memcmp(tag, ccp64tag, sizeof(ccp64tag)) != 0){
+ print("ccpoly64 bad encryption tag\n");
+ DUMP()
+ exits("wrong");
+ }
+
+ if(ccpoly_decrypt(rfcout, sizeof(ccp64inp), ccp64aad, sizeof(ccp64aad), tag, &s) != 0){
+ print("ccpoly64 decryption failed\n");
+ DUMP()
+ exits("wrong");
+ }
+ if(memcmp(rfcout, ccp64inp, sizeof(ccp64inp)) != 0){
+ print("ccpoly64 bad decryption\n");
+ DUMP()
+ exits("wrong");
+ }
+
+ exits(nil);
+}
--- /dev/null
+++ b/sys/src/libsec/test/eg.c
@@ -1,0 +1,35 @@
+#include "os.h"
+#include <mp.h>
+#include <libsec.h>
+
+void
+main(void)
+{
+ EGpriv *sk;
+ mpint *m, *gamma, *delta, *in, *out;
+ int plen, shift;
+
+ fmtinstall('B', mpfmt);
+
+ sk = egprivalloc();
+ sk->pub.p = uitomp(2357, nil);
+ sk->pub.alpha = uitomp(2, nil);
+ sk->pub.key = uitomp(1185, nil);
+ sk->secret = uitomp(1751, nil);
+
+ m = uitomp(2035, nil);
+
+ plen = mpsignif(sk->pub.p)+1;
+ shift = ((plen+Dbits-1)/Dbits)*Dbits;
+ gamma = uitomp(1430, nil);
+ delta = uitomp(697, nil);
+ out = mpnew(0);
+ in = mpnew(0);
+ mpleft(gamma, shift, in);
+ mpadd(delta, in, in);
+ egdecrypt(sk, in, out);
+
+ if(mpcmp(m, out) != 0)
+ sysfatal("decrypt failed to recover message");
+ exits(nil);
+}
--- /dev/null
+++ b/sys/src/libsec/test/hmac.c
@@ -1,0 +1,24 @@
+#include "os.h"
+#include <mp.h>
+#include <libsec.h>
+
+uchar key[] = "Jefe";
+uchar data[] = "what do ya want for nothing?";
+char out[] = "750c783e6ab0b503eaa86e310a5db738";
+
+void
+main(void)
+{
+ uchar hash[MD5dlen];
+ char buf[256];
+
+ fmtinstall('H', encodefmt);
+ hmac_md5(data, strlen((char*)data), key, 4, hash, nil);
+ snprint(buf, sizeof buf, "%.*lH", MD5dlen, hash);
+ if(strcmp(buf, out) != 0){
+ print("Exp: %s\n", out);
+ print("Got: %s\n", buf);
+ exits("fail");
+ }
+ exits(nil);
+}
--- /dev/null
+++ b/sys/src/libsec/test/md4.c
@@ -1,0 +1,36 @@
+#include "os.h"
+#include <mp.h>
+#include <libsec.h>
+
+struct {
+ char *in, *out;
+} tests[] = {
+ { "", "31d6cfe0d16ae931b73c59d7e0c089c0" },
+ { "a", "bde52cb31de33e46245e05fbdbd6fb24" },
+ { "abc", "a448017aaf21d8525fc10ae87aa6729d" },
+ { "message digest", "d9130a8164549fe818874806e1c7014b" },
+ { "abcdefghijklmnopqrstuvwxyz", "d79e1c308aa5bbcdeea8ed63df412da9" },
+ { "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", "043f8582f241db351ce627e153e7f0e4" },
+ { "12345678901234567890123456789012345678901234567890123456789012345678901234567890" , "e33b4ddc9c38f2199c3e7b164fcc0536" },
+};
+
+void
+main(void)
+{
+ int i;
+ uchar digest[MD5dlen];
+ char buf[256];
+
+ fmtinstall('H', encodefmt);
+ for(i = 0; i < nelem(tests); i++){
+ md4((uchar*)tests[i].in, strlen(tests[i].in), digest, 0);
+ snprint(buf, sizeof buf, "%.*lH", MD5dlen, digest);
+ if(strcmp(tests[i].out, buf) != 0){
+ print("Input: %s\n", tests[i].in);
+ print("Exp: %s\n", tests[i].out);
+ print("Got: %s\n", buf);
+ exits("fail");
+ }
+ }
+ exits(nil);
+}
--- a/sys/src/libsec/test/mkfile
+++ b/sys/src/libsec/test/mkfile
@@ -2,6 +2,15 @@
TEST=\
blake2s\
+ aesgcm\
+ bf\
+ chacha\
+ eg\
+ hmac\
+ md4\
+ prime\
+ rsa\
+ sha2\
CFLAGS=$CFLAGS -I../../libmp/port
--- /dev/null
+++ b/sys/src/libsec/test/prime.c
@@ -1,0 +1,43 @@
+#include "os.h"
+#include <mp.h>
+#include <libsec.h>
+
+void
+main(void)
+{
+ mpint *z = mpnew(0);
+ mpint *p = mpnew(0);
+ mpint *nine = mpnew(0);
+
+ fmtinstall('B', mpfmt);
+ strtomp("2492491", nil, 16, z); // 38347921 = x*y = (2**28-9)/7,
+ // an example of 3**(n-1)=1 mod n
+ strtomp("15662C00E811", nil, 16, p);// 23528569104401, a prime
+ uitomp(9, nine);
+
+ if(probably_prime(z, 5) == 1)
+ sysfatal("0x2492491 passed probably_prime");
+ if(probably_prime(nine, 5) == 1)
+ sysfatal("9 passed probably_prime");
+ if(probably_prime(p, 25) != 1)
+ sysfatal("25 failed probably_prime");
+
+/*
+ mpint *q = mpnew(0);
+ DSAprimes(q, p, nil);
+ print("q=%B\np=%B\n", q, p);
+*/
+
+ exits(0);
+}
+
+// example DSAprimes output, checked with Maple:
+// seed EB7B6E35F7CD37B511D96C67D6688CC4DD440E1E
+// q=E0F0EF284E10796C5A2A511E94748BA03C795C13
+// = 1284186945063585093695748280224501481698995297299
+// p=C41CFBE4D4846F67A3DF7DE9921A49D3B42DC33728427AB159CEC8CBBDB12B5F0C244F1A734AEB9840804EA3C25036AD1B61AFF3ABBC247CD4B384224567A863A6F020E7EE9795554BCD08ABAD7321AF27E1E92E3DB1C6E7E94FAAE590AE9C48F96D93D178E809401ABE8A534A1EC44359733475A36A70C7B425125062B1142D
+// = 137715385439333164327584575331308277462546592976152006175830654712456008630139443747529133857837818585400418619916530061955288983751958831927807888408309879880101870216437711393638413509484569804814373511469405934988856674935304074081350525593807908358867354528898618574659752879015380013845760006721861915693
+// r=DF310F4E54A5FEC5D86D3E14863921E834113E060F90052AD332B3241CEF2497EFA0303D6344F7C819691A0F9C4A773815AF8EAECFB7EC1D98F039F17A32A7E887D97251A927D093F44A55577F4D70444AEBD06B9B45695EC23962B175F266895C67D21C4656848614D888A4
+// = 107239359478548771267308764204625458348785444483302647285245969203446101233421655396874997253111222983406676955642093641709149748793954493558324738441197139556917622937892491175016280660608595599724194374948056515856812347094848443460715881455884639869144172708
+// g=2F1C308DC46B9A44B52DF7DACCE1208CCEF72F69C743ADD4D2327173444ED6E65E074694246E07F9FD4AE26E0FDDD9F54F813C40CB9BCD4338EA6F242AB94CD410E676C290368A16B1A3594877437E516C53A6EEE5493A038A017E955E218E7819734E3E2A6E0BAE08B14258F8C03CC1B30E0DDADFCF7CEDF0727684D3D255F1
+// = 33081848392740465806285326014906437543653045153885419334085917570615301913274531387168723847139029827598735376746057461417880810924280288611116213062512408829164220104555543445909528701551198146080221790002337033997295756585193926863581671466708482411159477816144226847280417522524922667065714073338662508017
--- /dev/null
+++ b/sys/src/libsec/test/rsa.c
@@ -1,0 +1,71 @@
+#include "os.h"
+#include <mp.h>
+#include <libsec.h>
+#include <bio.h>
+
+void
+main(int argc, char **argv)
+{
+ int n;
+ vlong start;
+ char *p;
+ uchar buf[4096];
+ Biobuf b;
+ RSApriv *rsa;
+ mpint *clr, *enc, *clr2;
+ int iflag, pflag;
+
+ iflag = pflag = 0;
+ ARGBEGIN{
+ case 'i':
+ iflag++;
+ break;
+ case 'p':
+ pflag++;
+ break;
+ }ARGEND
+
+ fmtinstall('B', mpfmt);
+
+ rsa = rsagen(1024, 16, 0);
+ if(rsa == nil)
+ sysfatal("rsagen");
+ Binit(&b, 0, OREAD);
+ clr = mpnew(0);
+ clr2 = mpnew(0);
+ enc = mpnew(0);
+
+ strtomp("123456789abcdef123456789abcdef123456789abcdef123456789abcdef", nil, 16, clr);
+ rsaencrypt(&rsa->pub, clr, enc);
+
+ start = nsec();
+ for(n = 0; n < 10; n++)
+ rsadecrypt(rsa, enc, clr);
+ if(pflag)
+ print("%lld\n", nsec()-start);
+
+ start = nsec();
+ for(n = 0; n < 10; n++)
+ mpexp(enc, rsa->dk, rsa->pub.n, clr2);
+ if(pflag)
+ print("%lld\n", nsec()-start);
+
+ if(mpcmp(clr, clr2) != 0)
+ sysfatal("%B != %B", clr, clr2);
+
+ if(!iflag)
+ exits(nil);
+ print("> ");
+ while(p = Brdline(&b, '\n')){
+ n = Blinelen(&b);
+ letomp((uchar*)p, n, clr);
+ print("clr %B\n", clr);
+ rsaencrypt(&rsa->pub, clr, enc);
+ print("enc %B\n", enc);
+ rsadecrypt(rsa, enc, clr);
+ print("clr %B\n", clr);
+ n = mptole(clr, buf, sizeof(buf), nil);
+ write(1, buf, n);
+ print("> ");
+ }
+}
--- /dev/null
+++ b/sys/src/libsec/test/sha2.c
@@ -1,0 +1,102 @@
+#include <u.h>
+#include <libc.h>
+#include "libsec.h"
+
+struct {
+ DigestState*(*x)(uchar*, ulong, uchar*, DigestState*);
+ int len;
+} funcs[] = {
+ { sha2_224, SHA2_224dlen },
+ { sha2_256, SHA2_256dlen },
+ { sha2_384, SHA2_384dlen },
+ { sha2_512, SHA2_512dlen },
+};
+
+struct {
+ char *in;
+ char *out[4];
+} tests[] = {
+ {
+ "",
+ "d14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f",
+ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b",
+ "cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e",
+ },
+ {
+ "a",
+ "abd37534c7d9a2efb9465de931cd7055ffdb8879563ae98078d6d6d5",
+ "ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb",
+ "54a59b9f22b0b80880d8427e548b7c23abd873486e1f035dce9cd697e85175033caa88e6d57bc35efae0b5afd3145f31",
+ "1f40fc92da241694750979ee6cf582f2d5d7d28e18335de05abc54d0560e0f5302860c652bf08d560252aa5e74210546f369fbbbce8c12cfc7957b2652fe9a75",
+ },
+ {
+ "abc",
+ "23097d223405d8228642a477bda255b32aadbce4bda0b3f7e36c9da7",
+ "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad",
+ "cb00753f45a35e8bb5a03d699ac65007272c32ab0eded1631a8b605a43ff5bed8086072ba1e7cc2358baeca134c825a7",
+ "ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f",
+ },
+ {
+ "message digest",
+ "2cb21c83ae2f004de7e81c3c7019cbcb65b71ab656b22d6d0c39b8eb",
+ "f7846f55cf23e14eebeab5b4e1550cad5b509e3348fbc4efa3a1413d393cb650",
+ "473ed35167ec1f5d8e550368a3db39be54639f828868e9454c239fc8b52e3c61dbd0d8b4de1390c256dcbb5d5fd99cd5",
+ "107dbf389d9e9f71a3a95f6c055b9251bc5268c2be16d6c13492ea45b0199f3309e16455ab1e96118e8a905d5597b72038ddb372a89826046de66687bb420e7c",
+ },
+ {
+ "abcdefghijklmnopqrstuvwxyz",
+ "45a5f72c39c5cff2522eb3429799e49e5f44b356ef926bcf390dccc2",
+ "71c480df93d6ae2f1efad1447c66c9525e316218cf51fc8d9ed832f2daf18b73",
+ "feb67349df3db6f5924815d6c3dc133f091809213731fe5c7b5f4999e463479ff2877f5f2936fa63bb43784b12f3ebb4",
+ "4dbff86cc2ca1bae1e16468a05cb9881c97f1753bce3619034898faa1aabe429955a1bf8ec483d7421fe3c1646613a59ed5441fb0f321389f77f48a879c7b1f1",
+ },
+ {
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
+ "bff72b4fcb7d75e5632900ac5f90d219e05e97a7bde72e740db393d9",
+ "db4bfcbd4da0cd85a60c3c37d3fbd8805c77f15fc6b1fdfe614ee0a7c8fdb4c0",
+ "1761336e3f7cbfe51deb137f026f89e01a448e3b1fafa64039c1464ee8732f11a5341a6f41e0c202294736ed64db1a84",
+ "1e07be23c26a86ea37ea810c8ec7809352515a970e9253c26f536cfc7a9996c45c8370583e0a78fa4a90041d71a4ceab7423f19c71b9d5a3e01249f0bebd5894",
+ },
+ {
+ "12345678901234567890123456789012345678901234567890123456789012345678901234567890",
+ "b50aecbe4e9bb0b57bc5f3ae760a8e01db24f203fb3cdcd13148046e",
+ "f371bc4a311f2b009eef952dd83ca80e2b60026c8e935592d0f9c308453c813e",
+ "b12932b0627d1c060942f5447764155655bd4da0c9afa6dd9b9ef53129af1b8fb0195996d2de9ca0df9d821ffee67026",
+ "72ec1ef1124a45b047e8b7c75a932195135bb61de24ec0d1914042246e0aec3a2354e093d76f3048b456764346900cb130d2a4fd5dd16abb5e30bcb850dee843",
+ },
+ {
+ "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
+ "75388b16512776cc5dba5da1fd890150b0c6455cb4f58b1952522525",
+ "248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1",
+ "3391fdddfc8dc7393707a65b1b4709397cf8b1d162af05abfe8f450de5f36bc6b0455a8520bc4e6f5fe95b1fe3c8452b",
+ "204a8fc6dda82f0a0ced7beb8e08a41657c16ef468b228a8279be331a703c33596fd15c13b1b07f9aa1d3bea57789ca031ad85c7a71dd70354ec631238ca3445",
+ },
+ {
+ "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu",
+ "c97ca9a559850ce97a04a96def6d99a9e0e0e2ab14e6b8df265fc0b3",
+ "cf5b16a778af8380036ce59e7b0492370b249b11e8f07a51afac45037afee9d1",
+ "09330c33f71147e83d192fc782cd1b4753111b173b3b05d22fa08086e3b0f712fcc7c71a557e2db966c3e9fa91746039",
+ "8e959b75dae313da8cf4f72814fc143f8f7779c6eb9f7fa17299aeadb6889018501d289e4900f7e4331b99dec4b5433ac7d329eeb6dd26545e96e55b874be909",
+ },
+};
+
+void
+main(void)
+{
+ int i, j;
+ uchar digest[SHA2_512dlen];
+ char buf[1024];
+
+ fmtinstall('H', encodefmt);
+ for(i = 0; i < nelem(tests); i++)
+ for(j = 0; j < nelem(funcs); j++){
+ funcs[j].x((uchar*)tests[i].in, strlen(tests[i].in), digest, 0);
+ snprint(buf, sizeof buf, "%.*lH", funcs[j].len, digest);
+ if(strcmp(buf, tests[i].out[j]) != 0){
+ sysfatal("fail");
+ }
+ }
+
+ exits(nil);
+}
--
⑨