Sleds/libeye/testapi.cpp

5598 lines
238 KiB
C++
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// Copyright (c) 2013-2015 IONU Security, Inc. All rights reserved.
//
// Command line test program for libeye C++ and C interfaces
#include <cstdio>
#include <cstring>
#include <sys/stat.h>
#include <algorithm>
#include <chrono>
#include <map>
#include <string>
#include <openssl/err.h>
#include <openssl/ssl.h>
#include <openssl/rand.h>
#include <openssl/ec.h>
#include <openssl/rsa.h>
//#include "eyeball.h"
//#include "eyecontainer.h"
#include "eyeencrypteddb.h"
//#include "eyedirectory.h"
#include "eyedrbg.h"
#include "eyeinterface.h"
#include "eyejson.h"
#include "eyelock.h"
#include "eyelog.h"
//#include "eyeconnection.h"
#include "eyering.h"
#ifdef ALAN
#include "eyesearch.h"
#include "eyestemmer.h"
#endif
//#include "eyestream.h"
#include "eyetime.h"
#include "eyeutils.h"
long ms; // System time in milliseconds
const char* shortword = "Hi";
const char* password = "u3K2*l$qZ0a<";
static const char* passwordset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890";
unsigned char garbage[SL_AES_KEY_LEN];
static const char* longtest = "test/thisisaverylongtestpathfortarformatcheckingandverificationpurposes_exceedstar1988maxpath/verylongpathtartest.txt";
static const char* testfile = "test/tartest.txt";
static const char* testfile_orig = "test/tartest.orig";
static const char* attachfile = "test/attachment.docx";
static const char* thumbfile = "test/thumb.png";
static const char* xmlfile = "test/test.xsd";
static const char* htmlfile = "test/test.html";
static const char* jsonfile = "test/test.json";
static const char* njsonfile = "test/nothere.json";
static const char* cionu = "test/ctest.ionu";
static const char* oldionu = "test/old.ionu";
static const char* yoionu = "test/yotest.ionu";
// Modified .iks files
static const char* empty_iks = "test/empty.iks";
// Modified .ionu files
static const char* empty_ionu = "test/empty.ionu";
static const char* perm_mods = "test/perm_mods.ionu";
static const char* meta_corrupt = "test/meta_corrupt.ionu";
static const char* fek_corrupt = "test/badfek1.ionu";
static const char* chksum_corrupt = "test/badchksum.ionu";
static const char* keystore = "test/keystore.iks";
static const unsigned char TestKey[SL_AES_KEY_LEN] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31};
//static const unsigned char TGIkey[SL_AES_KEY_LEN] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31};
static const unsigned char badkey[SL_AES_KEY_LEN] = {1,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31};
static const unsigned char utf8[10] = {0x24, 0xc2,0xa2, 0xe2,0x82,0xac, 0xf0,0xa4,0xad,0xa2};
static const char* smiley = "SMILING FACE WITH OPEN MOUTH AND SMILING EYES \\uD83D\\uDE04";
static const char* utfjson = "\\u0123\\u4567\\u89AB\\uCDEF\\uabcd\\uef4A ";
static const char* utfeuro = "euro \\u20ac cent \\u00a2";
static const char* URN = "urn:sl:FFFFFF:FFFFFFFF:FFFF:FFFFFFFFFFFF";
static const char* URN0 = "urn:sl:000000:00000000:FFFF:D2F04FEB8495";
static const char* URN1 = "urn:sl:000000:00000000:FFFF:";
static const char* URN2 = "urn:sl:000100:00000100::000000000ED2";
static const char* URN3 = "urn:sl:000101:00001000::";
static const char* URN4 = "urn:sl:001001:::";
static const char* URN5 = "urn:sl::::";
static const char* officeURN = "urn:sl:000000:12345678:::";
static const char* docURN = "urn:sl:000000:12345678:ABCD:0123456789AB";
static const char* burn0 = "urn:sl:000001:00000010:7fFf:000000000EG2"; // Bad digit
static const char* burn1 = "urn:sl:000001:7fffffff:0A00"; // Missing field
static const char* burn2 = "urn:sl:000001:00000010:0A00:000000000ED2:00"; // extra field
static const char* burn3 = "urn:sl:1ffffff:fFfFfF:FfFf:000000000ED2"; // Too large van
static const char* burn4 = "urn:sl:0:1fffFfFfF:FfFf:000000000ED2"; // Too large pmo
static const char* burn5 = "urn:sl:0:fFfFfF:1FfFf:000000000ED2"; // Too large device
static const char* burn6 = "urn:sl:ffffff:fffFfFfF:FfFf:1ffffffffffff"; // Too large device
static const char* burn7 = "urn:ion:002:1ffffff:0A00:000000000ED2"; // Invalid ionu
static const char* shredurn = "urn:sl:000011:00000010:0ABC:00000000DED2";
//static const char* challenges = "[{\"me\":\"urn:sl:000001:00000010::\"},{\"tim\":\"urn:sl:000011:00000010::\"}]";
#ifndef WIN32
static const std::vector<std::string> challengeQuestions = {"favbook", "flame", "kiss", "kissloc", "concert", "memperson",
"favchar", "favsay", "neverinv", "bestcostume", "growndiff", "wallpic", "childnames", "songdesc", "erasure", "custom"};
static const std::vector<std::string> challengeAnswers = {"HARRYPOTTER", "LUANN", "LAURIE", "TRUCK", "BTO", "EDISON",
"NIKITA", "HAVEYOUFIGUREDITOUT", "OBAMA", "BUNNY", "FLINTSTONE", "RANDOM", "JACK", "HMMMMMM", "ARNOLD", "MYQUESTION"};
#endif
static const char* challenges = "[\"IOnU\",\"favchar::BOULDER\",\"celebrity::UNIT TEST\",\"custom:UNIT:TESTING\"]";
static const char* challenges1 = "[\"IOnU\",\"favchar::LARAMIE\",\"celebrity::UNIT TEST\",\"custom:UNIT:TESTING\"]";
static const char* challenges2 = "[\"IOnU\",\"favchar::DUBLIN\",\"celebrity::BONO\",\"custom:FAVORITE BIKE:BMW\"]";
static const char* challenges3 = "[\"IOnU\",\"favchar::RENO\",\"celebrity::HARAH\",\"custom:FAVORITEBIKE:YAMAHAH\"]";
static const char* challenges4 = "[\"IOnU\",\"favchar::NEWYORK\",\"celebrity::BLOOMBERG\",\"custom:FAVORITEBIKE:TREK\"]";
static const char* challenges5 = "[\"IOnU\",\"favchar::WASHINGTONDC\",\"celebrity::BOND\",\"custom:FAVORITEBIKE:DUCATI\"]";
static const char* challenges6 = "[\"IOnU\",\"favchar::CUPERTINO\",\"celebrity::SHIVA\",\"custom:FAVORITEBIKE:CERVELO\"]";
static const char* challenges7 = "[\"IOnU\",\"favchar::CHEYENNE\",\"celebrity::TOBYKEITH\",\"custom:FAVORITEBIKE:SUZUKI\"]";
static const char* challenges8 = "[\"IOnU\",\"BOB\",\"SMITH\",\"NIKKI\"]";
static const char* challenges9 = "[\"IOnU\",\"one\",\"two\",\"three\"]";
static const char* challenges10 = "[\"IOnU\",\"one\",\"one\",\"one\"]";
static const char* challenges11 = "[\"one\",\"two\",\"three\"]";
static const char* challenges12 = "[\"IOnU\",\"favbook::ONE\",\"flame::TWO\",\"kiss::THREE\"]";
static const char* shortchallenge = "[\"IOnU\"]";
static const char* supershortchallenge = "onetwothree";
static const char* members = "[{\"me\":\"urn:sl:000001:00000010::\"},{\"tim\":\"urn:sl:000011:00000010::\"}]";
static const char* cgurl = "/cgsl/v2/office/discover?email=freddy&password=6EVdXfSkSX%2bI15ZXGCRRH4TnpBnt17ivih5Nd7DxkPQ%3d&\
vanURN=urn%3aionu%3a000000%3a%3a%3a&deviceURN=urn%3aionu%3a000000%3aEB3AFD45%3a4239%3a";
static const char* badMeta = "\
{platform=OSX, utime=2014-04-26T17:23:19.996Z, status=modified, contents=[{\"md5\":\"b2ab1008fefd005d9ade42e3d63205ff\",\
\"metatype\":\"msg\",\"mimetype\":\"text/plain\",\"time\":\"2014-04-26T17:23:17Z\",\"size\":8},\
{\"md5\":\"30ed0df9f4203931f8a539c0fcd6539c\",\"metatype\":\"file\",\"mimetype\":\"image/jpeg\",\
\"time\":\"2014-04-26T17:23:17Z\",\"size\":131118}], modified_date=2014-04-26T17:23:17.221Z, \
mtime=2014-04-26T17:24:12.838Z, file_operations={\"vanished_on\":{\"urn:sl:000000:67D77BB4::\":\"2014-04-26T17:24:05.983Z\"}},\
digest=sha256, ver=0.1, drr=true, tgisig=656930478659, urn=urn:sl:000000:A606592D:0F47:9F496CEBE3AF, \
burn_date=2014-04-26T17:24:05.883Z, magic=IOnU Encrypted Archive, expires=2014-04-26T17:24:05.899Z, sync=false, tctr=18, \
modified_by=urn:sl:000000:A606592D:0F47:, action=VANISH, rr=[\"urn:sl:000000:67D77BB4::\"], seq=3, cipher=aes256cbc, tbr=true, rrr=true}";
static const char* vanishMeta = "\
{\"platform\":\"OSX\",\"utime\":\"2014-04-26T17:23:19.996Z\",\"status\":\"modified\",\"contents\":[{\"md5\":\"b2ab1008fefd005d9ade42e3d63205ff\",\
\"metatype\":\"msg\",\"mimetype\":\"text/plain\",\"time\":\"2014-04-26T17:23:17Z\",\"size\":8},{\"md5\":\"30ed0df9f4203931f8a539c0fcd6539c\",\
\"metatype\":\"file\",\"mimetype\":\"image/jpeg\",\"time\":\"2014-04-26T17:23:17Z\",\"size\":131118}],\"modified_date\":\"2014-04-26T17:23:17.221Z\",\
\"mtime\":\"2014-04-26T17:24:12.838Z\",\"file_operations\":{\"vanished_on\":{\"urn:sl:000000:67D77BB4::\":\"2014-04-26T17:24:05.983Z\"}},\
\"digest\":\"sha256\",\"ver\":\"0.1\",\"drr\":true,\"tgisig\":\"656930478659\",\"urn\":\"urn:sl:000000:A606592D:0F47:9F496CEBE3AF\",\
\"burn_date\":\"2014-04-26T17:24:05.883Z\",\"magic\":\"IOnU Encrypted Archive\",\"expires\":\"2014-04-26T17:24:05.899Z\",\"sync\":false,\
\"tctr\":16,\"modified_by\":\"urn:sl:000000:A606592D:0F47:\",\"action\":\"VANISH\",\"rr\":[\"urn:sl:000000:67D77BB4::\"],\"seq\":3,\
\"cipher\":\"aes256cbc\",\"tbr\":true,\"rrr\":true}";
static const char* uploadedMeta = "\
{\"magic\":\"IOnU Encrypted Archive\",\"tgisig\":\"64f2a81d678c\",\"urn\":\"urn:sl:000000:17C38E5A:C60D:79916D07C42C\",\
\"modified_by\":\"urn:sl:000000:17C38E5A:C60D:\",\"drr\":true,\"contents\":[{\"time\":\"2014-01-02T16:56:29Z\",\
\"mimetype\":\"text/plain\",\"size\":2,\"metatype\":\"msg\",\"md5\":\"23b58def11b45727d3351702515f86af\"},\
{\"time\":\"2014-01-02T16:56:29Z\",\"mimetype\":\"image\\/jpeg\",\"size\":565679,\"metatype\":\"file\",\
\"md5\":\"fa802d84e9618dc23b5dbaaa17e31a8d\"}],\"platform\":\"OSX\",\"seq\":2,\"tctr\":5,\"rr\":[\"\"],\
\"utime\":\"2014-01-02T16:56:31.308Z\",\"ver\":\"0.1\",\"synchronized_date\":\"2014-01-02T16:57:59.333Z\",\
\"modified_date\":\"2014-01-02T16:56:30.274Z\",\"cipher\":\"aes256cbc\",\"digest\":\"sha256\",\
\"status\":\"modified\",\"mtime\":\"2014-01-02T16:57:57.851Z\"}";
static const char* someMeta = "\
{\"utime\":\"2014-04-22T16:01:43.765Z\",\"platform\":\"Windows\",\"status\":\"modified\",\"modified_date\":\"2014-04-22T16:01:41.629Z\",\
\"contents\":[{\"md5\":\"9b5c5c35567fc20ad7f305014cddfcd0\",\"metatype\":\"msg\",\"mimetype\":\"text\\/plain\",\"time\":\"2014-04-22T16:01:41Z\",\
\"size\":3}],\"mtime\":\"2014-04-28T22:05:25.481Z\",\"digest\":\"sha256\",\"ver\":\"0.1\",\"drr\":true,\"tgisig\":\"16dadd9cb2ac\",\
\"urn\":\"urn:sl:000000:6BBC3A33:F9CB:6F3AE7A6CBA3\",\"magic\":\"IOnU Encrypted Archive\",\"sync\":false,\"tctr\":5,\
\"modified_by\":\"urn:sl:000000:6BBC3A33:F9CB:\",\"seq\":2,\"rr\":[\"\"],\"action\":\"DELETE\",\"cipher\":\"aes256cbc\",\"tbr\":false,\"rrr\":true,\"dr\":[\"\"]}";
static const char* updateMeta = "\
{\"modified_by\":\"urn:sl:Alan00:17C38E5A:C60D:\",\"drr\":true}";
static const char* operationsMeta = "\
{\"file_operations\":\
        \"deleted_by\":{\
            \"urn:sl:000000:4616E326::\":\"2014-01-07T20:15:25.543Z\",\
            \"urn:sl:000000:6B424AA9::\":\"2014-01-07T07:33:11.228Z\"\
      },\
        \"vanished_on\":{\
            \"urn:sl:000000:6B424AA9::\":\"2014-01-06T23:12:18.155Z\"\
        }\
    }";
static const char* megaMeta = "\
{\"ver\":\"0.1\",\"magic\":\"IOnU Encrypted Archive\",\"status\":\"modified\",\"tctr\":0,\"urn\":\"urn:ion\
u:000001:00000010:0011:00000000ffff\",\"cipher\":\"aes256cbc\",\"digest\":\"sha256\",\"tgi\
sig\":\"6a0ce1ec504b\",\"contents\":[{\"metatype\":\"msg\",\"mimetype\":\"text/plain\",\"size\"\
:11,\"time\":\"2013-08-08T20:56:57Z\"},{\"metatype\":\"file\",\"mimetype\":\"application/vn\
d.ms-word\",\"size\":20721,\"time\":\"2013-08-01T23:34:29Z\"},{\"metatype\":\"thumb\",\"mime\
type\":\"image/png\",\"size\":45119,\"time\":\"2013-08-01T23:34:29Z\"},{\"metatype\":\"msg\",\
\"mimetype\":\"text/plain\",\"size\":14,\"time\":\"2013-08-08T20:56:57Z\"}]}";
static const char* tgiMeta = "\
{\"ver\":\"0.1\",\"magic\":\"IOnU Encrypted Archive\",\"status\":\"modified\",\"tctr\":0,\"urn\":\"urn:ion\
u:000001:00000010:0011:00000000ffff\",\"cipher\":\"aes256cbc\",\"digest\":\"sha256\",\"tgi\
sig\":\"6b0ce1ec504b\",\"contents\":[{\"metatype\":\"msg\",\"mimetype\":\"text/plain\",\"size\"\
:11,\"time\":\"2013-08-08T20:56:57Z\"},{\"metatype\":\"file\",\"mimetype\":\"application/vn\
d.ms-word\",\"size\":20721,\"time\":\"2013-08-01T23:34:29Z\"},{\"metatype\":\"thumb\",\"mime\
type\":\"image/png\",\"size\":45119,\"time\":\"2013-08-01T23:34:29Z\"},{\"metatype\":\"msg\",\
\"mimetype\":\"text/plain\",\"size\":14,\"time\":\"2013-08-08T20:56:57Z\"}]}";
//static const char* members = "[\"urn:sl:000001:00000010::\",\"urn:sl:000011:00000010::\"]";
static const char* collabs = "{\"collab\":[{\"publicKey\":\"\
-----BEGIN PUBLIC KEY-----\n\
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzBTVhKef/68WvTns382x\n\
Pw9i4RvZX3y8DH70YEvP3WgqC39pD3PLhe7RiRvEGHWm0cdVpvUg1rdUE1pVPNSZ\n\
jan/I8YUuX9eqLDZf6iqCYm5KwLjreaz2T0QBaKCs98I2W5qULbzKhqtw3Yp9gOy\n\
ZTlEbgkg0ZVunzLr42se0LsvmbWlEr3UksyzAJfsE6q0eKjyvpaoAFT1nTEr84Ir\n\
ZqUdn2YKV80WX9zj7maQqWviDKowxK8NKO50oCouTXNDpxwYKqoT9/8rcpOUSXaw\n\
BDbcNZWHKvG8e8icxLQqpDT3Egdnz+VtQXRwk1Yuyt8eE9jgh5dmBoo7PspQt6EV\n\
vwIDAQAB\n\
-----END PUBLIC KEY-----\
\",\"_id\":\"urn:sl:000001:00000010::\"},\
{\"publicKey\":\"\
-----BEGIN PUBLIC KEY-----\n\
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzBTVhKef/68WvTns382x\n\
Pw9i4RvZX3y8DH70YEvP3WgqC39pD3PLhe7RiRvEGHWm0cdVpvUg1rdUE1pVPNSZ\n\
jan/I8YUuX9eqLDZf6iqCYm5KwLjreaz2T0QBaKCs98I2W5qULbzKhqtw3Yp9gOy\n\
ZTlEbgkg0ZVunzLr42se0LsvmbWlEr3UksyzAJfsE6q0eKjyvpaoAFT1nTEr84Ir\n\
ZqUdn2YKV80WX9zj7maQqWviDKowxK8NKO50oCouTXNDpxwYKqoT9/8rcpOUSXaw\n\
BDbcNZWHKvG8e8icxLQqpDT3Egdnz+VtQXRwk1Yuyt8eE9jgh5dmBoo7PspQt6EV\n\
vwIDAQAB\n\
-----END PUBLIC KEY-----\
\",\"_id\":\"urn:sl:000011:00000010::\"}]}";
static const char* PERMS = "{\"read\":[\"00000003\"],\"readAssign\":[\"00000003\"],\"write\":[\"00000003\"],\"writeAssign\":[\"00000003\"],\"admin\":[\"00000003\"],\"adminAssign\":[\"00000003\"],\"stream\":[],\"streamAssign\":[],\"doorway\":[],\"doorwayAssign\":[],\"owner\":\"00000003\"}";
static const char* PERMS2 = "{\"read\":[\"00000003\",\"00000077\"],\"readAssign\":[\"00000003\"],\"write\":[\"00000003\"],\"writeAssign\":[\"00000003\"],\"admin\":[\"00000003\"],\"adminAssign\":[\"00000003\"],\"stream\":[],\"streamAssign\":[],\"doorway\":[],\"doorwayAssign\":[],\"owner\":\"00000003\"}";
static const char* PERMS3 = "{\"read\":[\"00000003\",\"17C38E5A\"],\"adminAssign\":[\"00000003\",\"17C38E5A\"],\"admin\":[\"00000003\",\"17C38E5A\"],\"writeAssign\":[\"00000003\",\"17C38E5A\"],\"hideAssign\":[\"00000003\",\"17C38E5A\"],\"stream\":[],\"readAssign\":[\"00000003\",\"17C38E5A\"],\"owner\":\"00000003\",\"doorwayAssign\":[],\"write\":[\"00000003\",\"17C38E5A\"],\"doorway\":[],\"hide\":[],\"streamAssign\":[]}";
static const char* TopicPerms = "{\"read\":[\"123456AB\",\"123456CD\"],\"write\":[\"123456AB\"],\"admin\":[],\"doorway\":[],\"stream\":[],\"hide\":[],\"readAssign\":[\"123456AB\"],\"writeAssign\":[\"123456AB\"],\"adminAssign\":[],\"doorwayAssign\":[],\"streamAssign\":[],\"hideAssign\":[\"123456AB\"],\"topic\":\"A456BA456BA456B\"}";
static const char* policyTest = "{ \"_id\" : \"urn:sl:000000:::\", \"name\" : \"TEST VAN\", \"statusPassphrase\" : \"madman\", \"tokenPassphrase\" : \"madman\", \"policies\": [\
{\"policyName\": \"allowUserPasswordChange\", \"policyType\": \"BOOLEAN\", \"mayDelegateToAdminUsers\": true, \"mayDelegateToNormalUsers\": false, \"mayAdministerViaRemoteApp\": true, \"policyValue\": true},\
{\"policyName\": \"allowUserPasswordReset\", \"policyType\": \"BOOLEAN\", \"mayDelegateToAdminUsers\": true, \"mayDelegateToNormalUsers\": false, \"mayAdministerViaRemoteApp\": true, \"policyValue\": false},\
{\"policyName\": \"cachedTGIKeysExpire\", \"policyType\": \"duration\", \"mayDelegateToAdminUsers\": true, \"mayDelegateToNormalUsers\": false, \"mayAdministerViaRemoteApp\": true, \"policyValue\": 86400000},\
{\"policyName\": \"duration\", \"policyType\": \"BOOLEAN\", \"mayDelegateToAdminUsers\": true, \"mayDelegateToNormalUsers\": false, \"mayAdministerViaRemoteApp\": true, \"policyValue\": 1.5552E7},\
{\"policyName\": \"percentage\", \"policyType\": \"BOOLEAN\", \"mayDelegateToAdminUsers\": true, \"mayDelegateToNormalUsers\": false, \"mayAdministerViaRemoteApp\": true, \"policyValue\": 99.9}]}";
static const char *JSON = "{\"van\":{\"_id\":\"urn:sl:000000:::\",\"name\":\"TEST VAN\",\"vanPublic\":\"-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDIU1QyiN2QJbW2WUrgsvjr/OG+\ner79aVxCyXaZsdTamiOTCfw/UKm9Eg+I8IGPa9HD81wFPkN2RZYj6P4AiehaUqR4\natc+QoxmcTfv93gIVW2zkgZOn6bWk+XAw7I7qrfFM1UAEGQlDJZX+bQaxCXOBB36\n+Ba/HF3uCWqTS3OwowIDAQAB\n-----END PUBLIC KEY-----\n\",\"policies\":[{\"name\":\"challengeResponseMinLength\",\"value\":3},{\"name\":\"passwordMinLength\",\"value\":6},{\"name\":\"passphraseMinLength\",\"value\":20},{\"name\":\"customChallengeMinLength\",\"value\":6},{\"name\":\"minNumberChallengesIncludingPassword\",\"value\":4},{\"name\":\"customChallengeRequired\",\"value\":true},{\"name\":\"passwordDigitRequired\",\"value\":true},{\"name\":\"passwordAlphaRequired\",\"value\":true}]},\"cg\":\"-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDQ+S2gq98BLf43PvjF6KGnJRJA\nrhGK0YHjvYR5X53WdGG5jnzWo5Lq2JlbKNB4LxQVnPNot7wsPl1+FLAxKtGNY6Ep\nwaVasmK2aS8GX/j0BPHTXbwdVirE4EIiIPFMSv+V73phJdc4rKld66JC7EHpGI/u\ntm3qERRXtu5x6g9Q3wIDAQAB\n-----END PUBLIC KEY-----\n\",\"devices\":[{\"publicKey\":\"-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDXYZysxVvPCOLSMrOKbmefyZ7u\nAhEYCRb/jbBTDS7wsgfmWsBuc2i5oTu19sylqrk5SCFJtSiAQXM3k2N9l7+RJcoE\nsUkCgUK5LVmN+0xgqQAEZfttBIflwhqQEUROMxRBfKso5n2inAriMB/QoRntqAv4\nVe1mkrzlBa4GifU5cwIDAQAB\n-----END PUBLIC KEY-----\n\",\"enabled\":true,\"privateKey\":\"-----BEGIN RSA PRIVATE KEY-----\nMIICXQIBAAKBgQDXYZysxVvPCOLSMrOKbmefyZ7uAhEYCRb/jbBTDS7wsgfmWsBu\nc2i5oTu19sylqrk5SCFJtSiAQXM3k2N9l7+RJcoEsUkCgUK5LVmN+0xgqQAEZftt\nBIflwhqQEUROMxRBfKso5n2inAriMB/QoRntqAv4Ve1mkrzlBa4GifU5cwIDAQAB\nAoGAA4GwVlPEQeOoJbnzmF5hy4Ux1DguZRDI0hJRe5isWfjcDhEOLv4sB1GrsjO5\ncz0LVPZqrFOJvETUhmQc64+L695mhhEjLzx60DWr7Cj/ieerT+POgDXX3oOAgy/t\nNNSvn5dem/9UX7/bLSGTFPsazfiG9amfMRmYnuS3OADTf7ECQQDxQT3a3IhRYLcG\nskKC5su2OoU9klhHOYWD3WZh+O16Zfw5Yt5mP3m7RJz/L4hgOl1FUDQSom+ZiC0G\nay/TjjcpAkEA5IuLLXTI9odkKfsRqtpy1D+5bl/1tOPDe6dIxQh/N7tmX8kK73qa\nEUHVr5Fg68BbCvAGV7itXgqdSOQiwgnLOwJAQwFVxqWdjsyHyOpVormrNo+GVhWB\nQzbsqDUjrG5QtsAAj4ewMUHL84EZAZ8YB3HuWcPu0oYe7MtvherbO6yyEQJBANNB\nVeYvtG+FWQYhKQSYJlqhiONI2lNZ0eGkEPToVMgMdqYFrREOcAmRpFdEd6WTydRD\naGl/sOljwF2XW7Wm3e8CQQDCN21k+m2lwY55NPhxVCBgdl7ZCCK4RauQXyO/7a9X\nreGjb5dFQTb88P8kAwSuycc5DfHNFgU2Uv7nnSRayfLJ\n-----END RSA PRIVATE KEY-----\n\",\"_id\":\"urn:sl:000000:00000004:D1EA:\",\"description\":\"\",\"name\":\"JMeter\",\"type\":\"SNT_PEER\",\"metaType\":\"default\",\"info\":{}}],\"pmo\":{\"publicKey\":\"-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDXYZysxVvPCOLSMrOKbmefyZ7u\nAhEYCRb/jbBTDS7wsgfmWsBuc2i5oTu19sylqrk5SCFJtSiAQXM3k2N9l7+RJcoE\nsUkCgUK5LVmN+0xgqQAEZfttBIflwhqQEUROMxRBfKso5n2inAriMB/QoRntqAv4\nVe1mkrzlBa4GifU5cwIDAQAB\n-----END PUBLIC KEY-----\n\",\"enabled\":true,\"cr\":[\"password::e38ad214943daad1d64c102faec29de4afe9da3d\",\"favchar::boulder\",\"favsay::bob\",\"custom:WHO LET THE DOGS OUT:WHO WHO\"],\"phone\":{\"primary\":\"\"},\"privateKey\":\"-----BEGIN RSA PRIVATE KEY-----\nMIICXQIBAAKBgQDXYZysxVvPCOLSMrOKbmefyZ7uAhEYCRb/jbBTDS7wsgfmWsBu\nc2i5oTu19sylqrk5SCFJtSiAQXM3k2N9l7+RJcoEsUkCgUK5LVmN+0xgqQAEZftt\nBIflwhqQEUROMxRBfKso5n2inAriMB/QoRntqAv4Ve1mkrzlBa4GifU5cwIDAQAB\nAoGAA4GwVlPEQeOoJbnzmF5hy4Ux1DguZRDI0hJRe5isWfjcDhEOLv4sB1GrsjO5\ncz0LVPZqrFOJvETUhmQc64+L695mhhEjLzx60DWr7Cj/ieerT+POgDXX3oOAgy/t\nNNSvn5dem/9UX7/bLSGTFPsazfiG9amfMRmYnuS3OADTf7ECQQDxQT3a3IhRYLcG\nskKC5su2OoU9klhHOYWD3WZh+O16Zfw5Yt5mP3m7RJz/L4hgOl1FUDQSom+ZiC0G\nay/TjjcpAkEA5IuLLXTI9odkKfsRqtpy1D+5bl/1tOPDe6dIxQh/N7tmX8kK73qa\nEUHVr5Fg68BbCvAGV7itXgqdSOQiwgnLOwJAQwFVxqWdjsyHyOpVormrNo+GVhWB\nQzbsqDUjrG5QtsAAj4ewMUHL84EZAZ8YB3HuWcPu0oYe7MtvherbO6yyEQJBANNB\nVeYvtG+FWQYhKQSYJlqhiONI2lNZ0eGkEPToVMgMdqYFrREOcAmRpFdEd6WTydRD\naGl/sOljwF2XW7Wm3e8CQQDCN21k+m2lwY55NPhxVCBgdl7ZCCK4RauQXyO/7a9X\nreGjb5dFQTb88P8kAwSuycc5DfHNFgU2Uv7nnSRayfLJ\n-----END RSA PRIVATE KEY-----\n\",\"_id\":\"urn:sl:000000:00000004::\",\"email\":\"jmeter@sequencelogic.net\",\"user\":\"jmeter\",\"fullname\":\"JMeter User\"}}";
static const char* RSA_private = "-----BEGIN RSA PRIVATE KEY-----\n\
MIIEpAIBAAKCAQEAzBTVhKef/68WvTns382xPw9i4RvZX3y8DH70YEvP3WgqC39p\n\
D3PLhe7RiRvEGHWm0cdVpvUg1rdUE1pVPNSZjan/I8YUuX9eqLDZf6iqCYm5KwLj\n\
reaz2T0QBaKCs98I2W5qULbzKhqtw3Yp9gOyZTlEbgkg0ZVunzLr42se0LsvmbWl\n\
Er3UksyzAJfsE6q0eKjyvpaoAFT1nTEr84IrZqUdn2YKV80WX9zj7maQqWviDKow\n\
xK8NKO50oCouTXNDpxwYKqoT9/8rcpOUSXawBDbcNZWHKvG8e8icxLQqpDT3Egdn\n\
z+VtQXRwk1Yuyt8eE9jgh5dmBoo7PspQt6EVvwIDAQABAoIBAHkr5Zrd7CHj05yG\n\
yB4aAyNt/0epQWdwqDbDKlYCrWjIcC5jd/20wyLCqaa+1a+wK1xi/ngjE1xpfYIA\n\
IJv9ny59wP98nNGGzq1aU8l4W31OSKNBE+4tDJvvpZOy6efihV6UMIu8FKTrMkDb\n\
6A4qI8H2PqsWwGWwU/4yPdzJvYIwkjUDayCfOYjLjYJgiDK4ZrSkH6nwlTQ0ajaP\n\
gyLZrJu8o7KOa6bmyjT4iXUsvXsh5Q37rzLQd7sUOXCRvLp6QdPWvAy9zGDDew3q\n\
3ecA+87h1WDWVhnEUZl+pNKtBHRo9THUTIh3lG0eZNVPj+RLXLN8nARDauZb6cSy\n\
h35jQAECgYEA8exV7ssnhVlN8VZF/NN0FI+RX7fSTXcvVjtzQXsq8dm4vNj6VYde\n\
5gsgYSar3L0hdROFBP6E6OmzrLnXHfuVp0h4Y1CcYjbaj6uqUfm4e3k8xUKqwez/\n\
8cs7D+xhlpncf5z0ZaMJFS8bgRRUOReB2+qAcJowxJ/J+bwxHAC9y2sCgYEA1/TP\n\
gCXVt2Hh+mpwLkg1nYJItDJzGJwH8uN3pD53i03qRsfGdHaf+JHFXQF6XpupyvlZ\n\
0jR7i7/+OY1oqRTfUcApfyUKlOv8bOz6O+DNjh9p2eDx/Oztt4vQgjRqbRVqTFVu\n\
zwni5ApvIhpz0f22GBBWOt51DpmnTsTwSJplZ/0CgYADW/K9hBiiY2EPrtD997mu\n\
52dvWtASv0rq+ZxaFmm8Pfewt5qSQXTx4MmsT6snP4ENbR31ucsCqOwTw+jWw72K\n\
Oxlg16e0PWq/f/S3eq4zGLXdT1Wrp6zOILJLQE8CllRXeUhzeNYRczwAiNW6jTcC\n\
ZLkv1xRCRq25SAGuj9wSzQKBgQCIjWQnw8S/kEUz8tm8aix8zETsrHnatc7Q5sRg\n\
Np+glkPtPaVfPyMoKgSCKs0VxZg3oDQLluQIGf7GpYPoZipPpxKWMvXd9NpIhhA0\n\
jJFtrK9h9bsOE0K9LMtLiZlCIKh2XA8VG0s8ptxe1BsoTSU3Uh00XDXoZYBFboIB\n\
Zp94gQKBgQCR5mcD8JIWOts0ZxrTwho2kg898WRINusaIIhrCFPoWymvLpoeRzkG\n\
KvOt9T3KXVzT6lqmBRfZO50Dd9N7+oxYEA7OJb1JJ4WUmOn5llJOgsVmaT4iVdj6\n\
FqFAwmMOl6/hbaIXBUZ4q/QbzZLxmezOu0XwUzQ4ptvdgaab2qSkmQ==\n\
-----END RSA PRIVATE KEY-----";
static const char* BOT_private = "-----BEGIN RSA PRIVATE KEY-----\n\
MIIEpAIBAAKCAQEAx6wmsx+MqvvLqCpnNFT76ebpP9CHnwiv4uvGXVGEv9LJXPOw\n\
OUV8Iwrvgst8ZQWJGO2lTIwLhTQ6piyq1H0NOWtsFKtQHZm1MrjDs51w8OOwgWUb\n\
TKslQ9cSgHZ+MsNB/Tk8La2C1mDmWt0Ae0CEMY8/q/xdpWsxd+2XodwRVFKfwF3f\n\
VnjzA5gVE18c/81dJ1UF5QuPkgp8o3+sXpRLElajyFjfbTg/74phOOiyPcEptbl8\n\
/Mz6QilVCkHEW2f3CcIx7ttAoQIDMqiOVgECOMdWSW1roKCSNsQHOUYFZ7EkpZiB\n\
Py9qGMI2woXsc8UPgXppl/Buz21zd87TQmlqlQIDAQABAoIBAFKnf6mcgMVyz/4/\n\
91LhbxqHHLzu3IVHuk9sHEQa76HcZsCUm7lJezaiWz1AcLD81qC8FzYVrtsoILMT\n\
QHAPh/7h6e6wb8yhCTIC6/gZT1xYVINr0B4vppBrolwNMPZgf5uMKs4ZylRl7lVk\n\
sMNUlKRTUR8nq7hDJEopzyAQkhfeFGyvid8i9lsHjHZhcU+b0jdDUoEs9/pLQ94+\n\
Nt7Kh/Xn0cyiUmycuVZyhjFqCiK/egohDbiKDIV9rfMupQAQCprJfo5T5Iy/zncW\n\
XS8/Oz/9bE8yRNPOhjj/32KSrTNPgdmDE7aT8Ntloh5FXSISSzYHqpn+DWRVD3iY\n\
+EjIMKECgYEA8aO5PN5/omL3CroKa9LV8Oa0fRbhKKJMaTzgIAIoHLBWgoVkPUER\n\
ALStMvCeYy3By/gSHakrf4vTjDn+cnC1Wfw8riYf0N0oQD6lZHSbBslToAiIsMD7\n\
lfWhSW8MEfnKKjWru0/sGmaBcBuBtIb9WSJ/MTmFr8U3zMFsBsMPyp0CgYEA04nx\n\
+sI2KmaTxxPZ/liUjMnRWd+ZgTlMAdDp/a7CwzDPhp0U27TxITYNf5/sg+rxx570\n\
0XuMhUHNmoeAs7fmtJ37fqvX117guTwUaSe5UdoO3MHwr4fE+Xc70daMuqaPpwAa\n\
srAIbJGITIvdCOPK6whRkRL8Vjd9ljO04LGVwlkCgYEAwYbm7KEmh9/LC4REpGaP\n\
ggjDtQuF+Q1DNWXT+s6/YXq5Tn+W8JgUDgSmUo3zzGrxM3LSz36Vn+lU3JH1/6HV\n\
HOSvlKpkANufSRTjUbkyEBVeLGWpVCa7WDcJnc6aVCtChtvFVpeD+QDv2eGt1+/l\n\
KGZAiCQRtdy1+/9NjXzcQOECgYEAuK8JnVTrt08BG+CABOhPIS+d4CowObrNWhSM\n\
BVgLYCCAPlVr/XlWwBkR5ee4tV9soUxtD2sfPsQ5ff1pZv5apDv9cxUSh0ylQ/Np\n\
Gnl8+TI4oZGM0aLmXKo1hrka+mYqqrGTnYfEgwz4A2RkoLtH0LTdiZwaxCcENRuF\n\
glpollkCgYBuCsAUSV1irzydIktSAT1xEDpgqoeQ1iQR4jD8CR57NI94p1IT7kmZ\n\
bKkNftJL/DdmvPzuYTQgenR/5GKEw1Ca2O9Caa9YU+KDXI4jgHMBfjxcY4Sc8D2W\n\
RdC/OfVdFmIXPnB/Twyo7PR2oX1tA+XtL3WLIkkmK1JdB/s2XieMGA==\n\
-----END RSA PRIVATE KEY-----";
static const char* BOT_public = "-----BEGIN PUBLIC KEY-----\n\
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx6wmsx+MqvvLqCpnNFT7\n\
6ebpP9CHnwiv4uvGXVGEv9LJXPOwOUV8Iwrvgst8ZQWJGO2lTIwLhTQ6piyq1H0N\n\
OWtsFKtQHZm1MrjDs51w8OOwgWUbTKslQ9cSgHZ+MsNB/Tk8La2C1mDmWt0Ae0CE\n\
MY8/q/xdpWsxd+2XodwRVFKfwF3fVnjzA5gVE18c/81dJ1UF5QuPkgp8o3+sXpRL\n\
ElajyFjfbTg/74phOOiyPcEptbl8/Mz6QilVCkHEW2f3CcIx7ttAoQIDMqiOVgEC\n\
OMdWSW1roKCSNsQHOUYFZ7EkpZiBPy9qGMI2woXsc8UPgXppl/Buz21zd87TQmlq\n\
lQIDAQAB\n\
-----END PUBLIC KEY-----";
// JSON encoded version of BOT public key as in Collaborators
static const char* BOT_json = "{\"publicKey\":\"\
-----BEGIN PUBLIC KEY-----\\n\
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx6wmsx+MqvvLqCpnNFT7\\n\
6ebpP9CHnwiv4uvGXVGEv9LJXPOwOUV8Iwrvgst8ZQWJGO2lTIwLhTQ6piyq1H0N\\n\
OWtsFKtQHZm1MrjDs51w8OOwgWUbTKslQ9cSgHZ+MsNB\\/Tk8La2C1mDmWt0Ae0CE\\n\
MY8\\/q\\/xdpWsxd+2XodwRVFKfwF3fVnjzA5gVE18c\\/81dJ1UF5QuPkgp8o3+sXpRL\\n\
ElajyFjfbTg\\/74phOOiyPcEptbl8\\/Mz6QilVCkHEW2f3CcIx7ttAoQIDMqiOVgEC\\n\
OMdWSW1roKCSNsQHOUYFZ7EkpZiBPy9qGMI2woXsc8UPgXppl\\/Buz21zd87TQmlq\\n\
lQIDAQAB\\n\
-----END PUBLIC KEY-----\"}";
// JSON encoded version of BOT public key
static const char* BOT_jsonkey = "\"\
-----BEGIN PUBLIC KEY-----\\n\
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx6wmsx+MqvvLqCpnNFT7\\n\
6ebpP9CHnwiv4uvGXVGEv9LJXPOwOUV8Iwrvgst8ZQWJGO2lTIwLhTQ6piyq1H0N\\n\
OWtsFKtQHZm1MrjDs51w8OOwgWUbTKslQ9cSgHZ+MsNB\\/Tk8La2C1mDmWt0Ae0CE\\n\
MY8\\/q\\/xdpWsxd+2XodwRVFKfwF3fVnjzA5gVE18c\\/81dJ1UF5QuPkgp8o3+sXpRL\\n\
ElajyFjfbTg\\/74phOOiyPcEptbl8\\/Mz6QilVCkHEW2f3CcIx7ttAoQIDMqiOVgEC\\n\
OMdWSW1roKCSNsQHOUYFZ7EkpZiBPy9qGMI2woXsc8UPgXppl\\/Buz21zd87TQmlq\\n\
lQIDAQAB\\n\
-----END PUBLIC KEY-----\"";
static const char* BOT_tgi_encrypted = "ZZKY8mDLpOfL1KEr+I+Jc0327p1AoSbB3189wQpzBvzLWNsdIySaRRKJQnzov\
7iP784VkF8awVcARhZ5Nklwv0m3pps1eUFEG8ivMPVSKyNmTz/CmcAAWZ7TOm/8lApHJsWbHSX76j8zYygpqrL6q4oV+vVxqFTbl9\
gL+YD4cMb6BE3T0jAi19fMyEWVLX62l/VZsdZscGIPonH/hsvz8YkJry3qAOiixmAo6Pe9UsmhJxv6qFy7u+0bB8NF+iCf0iBwDp5\
PO32n1nhq80E80p2f8H5ag8mM1OJ5iDzwUxKpkRr7Gpct2lqmidQ2o1bWu0Esgd1hof/gKXEyPxyntw==";
//static const unsigned char BOTtgi[32] = {0, 0, 0, 0, 0, 0, 0, 112, 0, 0, 0, 0, 0, 0, 0, 112, 30, 0, 0, 0, 0, 0, 0, 0, -64, 76, 100, -61, -46, 127, 0, 0};
static const unsigned char BOTtgi[32] = {0, 0, 0, 0, 0, 0, 0, 112, 0, 0, 0, 0, 0, 0, 0, 112, 30, 0, 0, 0, 0, 0, 0, 0, 192, 76, 100, 195, 210, 127, 0, 0};
using namespace std;
using namespace sequencelogic;
int testfailed (const char* inf, const char* msg)
{
printf ("FAILED: %s: %s\n", inf, msg);
return 1;
}
int testfailed (const std::string& inf, const std::string& msg)
{
cout << "FAILED: " << inf << ": " << msg << endl;
//printf ("FAILED: %s : %s\n", inf.c_str(), msg.c_str());
return 1;
}
char* fileload (const char* filename)
{
ifstream file (filename, ios::in | ios::binary | ios::ate);
char* buff = nullptr;
if (file.is_open()) {
size_t bytes = (size_t)file.tellg();
file.seekg (0, ios::beg);
buff = new char[bytes + 1];
file.read (buff, bytes);
file.close();
buff[bytes] = '\0';
}
return buff;
}
void filewrite (const char* filename, const char* bytes)
{
ofstream file (filename, ios::out | ios::binary | ios::trunc);
if (file.is_open()) {
file.write (bytes, strlen(bytes) + 1);
file.close();
}
}
void filedump (const char* filename)
{
ifstream file (filename, ios::in | ios::binary | ios::ate);
if (file.is_open())
{
size_t bytes = (size_t)file.tellg();
file.seekg (0, ios::beg);
char* big = new char[bytes + 1];
if (big) {
file.read (big, bytes);
file.close();
big[bytes] = '\0';
printf ("%s\n", big);
delete[] big;
}
}
}
bool filecompare (const char* f1, const char* f2)
{
std::string f1md5 = sequencelogic::DigestFile ("md5", f1);
std::string f2md5 = sequencelogic::DigestFile ("md5", f2);
return f1md5 == f2md5;
}
int locktestfailed (const char* inf, const char* msg)
{
printf ("FAILED: %s: %s\n", inf, msg);
filedump ("test/.ctest.ionu.lk");
return 1;
}
// Parse an urn, if valid get the urn back and compare
bool CheckURN (const char* urn)
{
bool rc = false;
EyeURN* u = new EyeURN (urn);
if (u->IsValid()) {
char* n = u->GetURN();
if (n && strcmp (n, urn) == 0)
rc = true;
else {
IONUDEBUG ("%s, %s", urn, n);
}
delete[] n;
}
delete u;
return rc;
}
int TestLogging()
{
printf ("\nLogging tests\n-------------------------------\n");
IONUDEBUG ("%s:%d logging test", __FILE__, __LINE__);
int rc = 0;
Keyring ring ("testring", "Test Key Ring");
ring.GenerateECKey ("MyAudit", "deterministic", challenges);
char* pk = ring.GetPubKey ("MyAudit");
Key* pubkey = new Key ("AuditPublic", "My auditing public key", (int)strlen(pk), (const unsigned char*)pk, Key::EC_PUBLIC);
ring.AddKey (pubkey);
Key RSA ("Auditor", "RSA auditing key", (int)strlen(RSA_private), (const unsigned char*)RSA_private, Key::RSA);
delete[] pk;
remove ("test/mylog.log");
IONUCONFIGFILELOG ("audit", "urn:sl:000000:17C38E5A:C60D:79916D07C42C - Nexus-7", EyeLog::IONU_WARN, "test/mylog.log", EyeLog::IONU_FILE, "%l: %m");
IONUBEGINAUDIT (*(ring.GetKey ("MyAudit")), "test");
IONUAUDIT (EyeLog::ACCOUNT_CREATE, "madman, madman@sequencelogic.net, 303-217-8477");
IONUAUDIT (EyeLog::DEVICE_PROVISION, "Nexus-7 4.4.1");
IONUAUDIT (EyeLog::ACCOUNT_LOGIN, "Failed: invalid password");
IONUAUDIT (EyeLog::ACCOUNT_LOGIN, "Succeeded");
IONUCLOSELOG();
EyeLog::GetInstance()->ReviewAudit (*(ring.GetKey ("MyAudit")), "test/audit.ioa");
// Test the basics
IONUCONFIGLOG ("test", "urn:sl:000000:17C38E5A:C60D:79916D07C42C - Nexus-7", EyeLog::IONU_WARN, EyeLog::IONU_CONSOLE, "%l: %m");
IONULOG (EyeLog::IONU_INFO, "%s", "Simple log message");
IONUFATAL ("Fatal message");
IONUERROR ("Error message");
IONUWARN ("Warning message");
IONUINFO ("not ***Info message");
IONUDEBUG ("not ***Debug message");
IONUTRACE ("not ***Trace message");
EyeLog::GetInstance()->SetLogLevel (EyeLog::IONU_TRACE);
IONUINFO ("Info message");
IONUDEBUG ("Debug message");
IONUTRACE ("Trace message");
IONUCONFIGFILELOG ("ftest", "urn:sl:000000:17C38E5A:C60D:79916D07C42C - Nexus-7", EyeLog::IONU_WARN, "test/mylog.log", EyeLog::IONU_FILE, "%l: %m");
IONUERROR ("Message only in the file");
IONUCONFIGFILELOG ("ftest", "urn:sl:000000:17C38E5A:C60D:79916D07C42C - Nexus-7", EyeLog::IONU_WARN, "test/mylog.log", EyeLog::IONU_CONSOLE, "%l: %m");
IONUERROR ("Message in the file and to the console");
IONUCLOSELOG("test/mylog.log"); // Close the log file, but keep messages to the console
printf ("File contents -------\n");
fstream lfile ("test/mylog.log");
if (lfile.is_open()) {
std::string line;
while (std::getline(lfile, line))
cout << line << endl;
}
printf ("-------\n");
lfile.close();
#ifndef WIN32
// VS 2012 does not support variadic templates so don't crash with these tests
IONUWARN ("Not enough args %s %d %f", "missing two");
IONUWARN ("Too many args %d", "have 3, need one", 7, 33.33);
IONUWARN ("Wrong arg types, but that's ok (%d %f %s)", "int float string", 13, 99.99);
IONUWARN ("%% at the end of just a string %");
IONUWARN ("%% at the end with an argument %", 7);
IONUWARN (cgurl);
IONUWARN ("null pointer %s", NULL);
// Test various custom formats
IONUCONFIGLOG ("IM", "dev", EyeLog::IONU_WARN, EyeLog::IONU_CONSOLE, "[%L]|%c|%t|%m");
IONUWARN ("Format [%%L]|%%c|%%t|%%m");
IONUCONFIGLOG ("IM", "dev", EyeLog::IONU_WARN, EyeLog::IONU_CONSOLE, "%l:%c:%m");
IONUWARN ("Format %%l:%%c:%%m");
IONUCONFIGLOG ("IM", "dev", EyeLog::IONU_WARN, EyeLog::IONU_CONSOLE, "%l - %m");
IONUWARN ("Format %%l - %%m");
IONUCONFIGLOG ("smo", "dev", EyeLog::IONU_WARN, EyeLog::IONU_CONSOLE, "%l - %m <%c>");
IONUWARN ("Format %%l - %%m <%%c>");
IONUCONFIGLOG ("smo", "dev", EyeLog::IONU_INFO, EyeLog::IONU_CONSOLE, "%ems %l - %m");
IONUWARN ("Format %%eMs %%l- %%m");
#endif
// Test file based logging
IONUCONFIGFILELOG ("im", "urn:sl:000000:17C38E5A:C60D:79916D07C42C - TestPad", EyeLog::IONU_WARN, "test/mylog.log", EyeLog::IONU_FILE, "%l: %m");
EyeLog::GetInstance()->SetMaxLogFile (300);
IONUWARN ("This is a custom warning message with %d options", 273);
IONUWARN ("This is a custom warning message with %d options", 274);
IONUWARN ("This is a custom warning message with %d options", 275);
IONUWARN ("This is a custom warning message with %d options", 276);
IONUWARN ("This is a custom warning message with %d options", 277);
IONUWARN ("This is a custom warning message with %d options", 278);
IONUWARN ("This is a custom warning message with %d options", 279);
IONUWARN ("This is a custom warning message with %d options", 280);
IONUWARN ("This is a custom warning message with %d options", 281);
IONUWARN ("This is a custom warning message with %d options", 282);
IONUWARN ("This is a custom warning message with %d options", 283);
IONUWARN ("This is a custom warning message with %d options", 284);
IONUWARN ("This is a custom warning message with %d options", 285);
IONUCLOSELOG ("test/mylog.log");
EyeLog::GetInstance()->SetMaxLogFile (IONU_MAX_LOG_FILE_SIZE);
EyeLog::GetInstance()->ConfigLogger ("IM", "urn:sl:000000:17C38E5A:C60D:79916D07C42C - TestPad", EyeLog::IONU_AUDIT, EyeLog::IONU_CONSOLE);
EyeLog::GetInstance()->BeginAudit (RSA, "test");
IONUAUDIT (EyeLog::ACCOUNT_CREATE, "madman, madman@sequencelogic.net, 303-217-8477");
IONUAUDIT (EyeLog::DEVICE_PROVISION, "Nexus-7 4.3.1");
IONUAUDIT (EyeLog::ACCOUNT_LOGIN, "Failed: invalid password");
IONUAUDIT (EyeLog::ACCOUNT_LOGIN, "ip:192.168.8.101");
IONUAUDIT (EyeLog::ACCOUNT_CHANGE, "Added Avatar");
IONUAUDIT (EyeLog::ACCOUNT_CHANGE, "Added contect: <Nikki>");
IONUAUDIT (EyeLog::DOCUMENT_SEND, "Message To: <Nikki>");
IONUAUDIT (EyeLog::DOCUMENT_RECEIVE, "Message From: <Nikki>");
IONUAUDIT (EyeLog::ACCOUNT_LOGOUT, "time limit expired");
IONUWARN ("This warning should not appear");
IONUCONFIGLOG ("IM1", "dev", EyeLog::IONU_WARN, EyeLog::IONU_CONSOLE);
IONUWARN ("This warning should appear");
IONUCLOSELOG();
printf ("--Reviewing IM.ioa\n");
if (!EyeLog::GetInstance()->ReviewAudit (RSA, "test/IM.ioa"))
rc += testfailed ("EyeLog::ReviewAudit (RSA, test/IM.ioa)", "");
printf ("--Reviewing badaudit.ioa\n");
if (EyeLog::GetInstance()->ReviewAudit (RSA, "test/badaudit.ioa"))
rc += testfailed ("EyeLog::ReviewAudit (RSA, test/badaudit.ioa", "");
printf ("--Reviewing badauditk.ioa\n");
if (EyeLog::GetInstance()->ReviewAudit (RSA, "test/badauditk.ioa"))
rc += testfailed ("EyeLog::ReviewAudit (RSA, test/badauditk.ioa", "");
//printf ("--Audit consolidation tests\n");
//if (!EyeLog::GetInstance()->ReviewAudit (RSA, "test/first.ioa"))
// rc += testfailed ("EyeLog::ReviewAudit (RSA, test/first.ioa", "pre-consolidation");
//EyeLog::GetInstance()->ConsolidateAudit (RSA, "test/first.ioa", "test/second.ioa");
//if (!EyeLog::GetInstance()->ReviewAudit (RSA, "test/first.ioa"))
// rc += testfailed ("EyeLog::ReviewAudit (RSA, test/first.ioa", "consolidated");
if (rc)
printf ("%d log tests failed\n", rc);
else
printf ("logging and audit tests passed\n");
return rc;
}
int TestFileThreadLocking()
{
int rc = 0;
#ifdef LOCK_STRATEGY_MEMORY
printf ("\nMemory file locking tests\n-------------------------------\n");
if (sequencelogic::ThreadLockFile ("lockfile.ionu", "you", IONU_FILE_LOCK_WRITE) != IONU_FILE_LOCK_OK)
rc += testfailed ("failed to get initial write lock", "you");
if (sequencelogic::ThreadLockFile ("lockfile.ionu", "me", IONU_FILE_LOCK_READ) == IONU_FILE_LOCK_OK)
rc += testfailed ("got read lock when should not have", "me");
if (sequencelogic::ThreadLockFile ("lockfile.ionu", "you", IONU_FILE_LOCK_CLEAR) != IONU_FILE_LOCK_OK)
rc += testfailed ("failed to release initial write lock", "you");
if (EyeFileThreadLocker::GetInstance()->GetNumLocks() > 0)
rc += testfailed ("should be 0 locks", "you");
EyeFileThreadLock* locka = new EyeFileThreadLock (IONU_FILE_LOCK_READ, "lockfile.ionu", "me");
EyeFileThreadLock* lockb = new EyeFileThreadLock (IONU_FILE_LOCK_READ, "lockfile.ionu", "you");
if (!locka->acquired() || !lockb->acquired())
rc += testfailed ("2 read locks", "a and b");
else
cout << "2 read locks acquired" << endl;
if (locka->convertToWrite())
rc += testfailed ("convert read lock should have failed", "a");
else
cout << sequencelogic::GetLastEyeLockMessage() << endl;
delete lockb;
if (!locka->convertToWrite())
rc += testfailed ("convert read lock", "a");
lockb = new EyeFileThreadLock (IONU_FILE_LOCK_READ, "lockfile.ionu", "you");
if (lockb->acquired())
rc += testfailed ("read lock should have failed", "b");
else
cout << sequencelogic::GetLastEyeLockMessage() << endl;
delete locka;
delete lockb;
EyeFileThreadWriteLock* wlock = new EyeFileThreadWriteLock ("lockfile.ionu", "wlok");
if (!wlock->acquired())
rc += testfailed ("failed to get write lock", "wlock");
EyeFileThreadReadLock* rlock = new EyeFileThreadReadLock ("lockfile.ionu", "rlok");
if (rlock->acquired())
rc += testfailed ("read lock should have failed", "rlock");
else
cout << sequencelogic::GetLastEyeLockMessage() << endl;
delete rlock;
delete wlock;
EyeFileThreadReadLock readlock ("lockfile.ionu", "me");
if (!readlock.acquired())
rc += testfailed ("read lock", "me");
if (sequencelogic::ThreadLockFile ("lockfile.ionu", "you", IONU_FILE_LOCK_WRITE) == IONU_FILE_LOCK_OK)
rc += testfailed ("thread lock write", "you");
if (!readlock.convertToWrite())
rc += testfailed ("convert write lock", "me");
else
cout << "converted to write" << endl;
if (!readlock.convertToRead())
rc += testfailed ("convert read lock", "me");
else
cout << "converted to read" << endl;
if (!readlock.release())
rc += testfailed ("release read lock", "me");
if (readlock.release())
rc += testfailed ("no lock to release", "me");
if (!readlock.acquire(IONU_FILE_LOCK_READ))
rc += testfailed ("reacquire read lock", "me");
else
cout << "released and re-acquired" << endl;
IONU_FILE_LOCK_STATUS st;
st = sequencelogic::ThreadLockFile ("cantlocklock.lk", "me", IONU_FILE_LOCK_READ); // My read lock
if (st == IONU_FILE_LOCK_OK)
rc += locktestfailed ("ThreadLockFile() read lock on", "cantlocklock.lk");
st = sequencelogic::ThreadLockFile ("thisfiledoesnotexistyet", "me", IONU_FILE_LOCK_READ); // My read lock
if (st != IONU_FILE_LOCK_OK)
rc += locktestfailed ("ThreadLockFile() read lock - me", "thisfiledoesnotexistyet");
st = sequencelogic::ThreadLockFile ("thisfiledoesnotexistyet", "me", IONU_FILE_LOCK_CLEAR); // Clear my lock
if (st != IONU_FILE_LOCK_OK)
rc += locktestfailed ("LockFile() read lock - you", "thisfiledoesnotexistyet");
else
printf ("Lock and clear of non-existant file passed\n");
if (rc)
printf ("%d lock tests failed\n", rc);
else
printf ("lock tests passed\n");
#endif
return rc;
}
int TestProcessLocking()
{
int rc = 0;
#ifdef LOCK_STRATEGY_MASTER
//printf ("\nProcess file locking tests\n-------------------------------\n");
//EyeContainer* IOnU = new EyeContainer("test/lockfile.ionu", TGIkey, URN, TopicPerms);
//IOnU->AddTextMessage (".imchat", "A long and verbose yo there to you from me type chat message to test various stuff with");
//IOnU->Finalize();
//delete IOnU;
EyeFileProcessLock* locka = new EyeFileProcessLock (IONU_FILE_LOCK_READ, "test/lockfile.ionu", "a");
if (!locka->acquired())
rc += testfailed ("read lock", "a");
else
cout << "read lock a acquired" << endl;
EyeFileProcessLock* lockb = new EyeFileProcessLock (IONU_FILE_LOCK_READ, "test/lockfile.ionu", "b");
if (!locka->acquired() || !lockb->acquired())
rc += testfailed ("2 read locks", "a and b");
else
cout << "2 read locks acquired" << endl;
//cout << EyeContainer::GetMetaDataClassic ("test/lockfile.ionu") << endl;
if (locka->convertToWrite())
rc += testfailed ("convert read lock should have failed", "a");
else
cout << sequencelogic::GetLastEyeLockMessage() << endl;
delete lockb;
if (!locka->convertToWrite()) {
rc += testfailed ("convert read lock", "a");
cout << sequencelogic::GetLastEyeLockMessage() << endl;
}
lockb = new EyeFileProcessLock (IONU_FILE_LOCK_READ, "test/lockfile.ionu", "b");
if (lockb->acquired())
rc += testfailed ("read lock should have failed", "b");
else
cout << sequencelogic::GetLastEyeLockMessage() << endl;
delete locka;
delete lockb;
EyeFileProcessWriteLock* wlock = new EyeFileProcessWriteLock ("test/lockfile.ionu", "w");
if (!wlock->acquired())
rc += testfailed ("failed to get write lock", "wlock");
else
cout << "write lock a acquired" << endl;
//IOnU = new EyeContainer("test/lockfile.ionu", TGIkey);
//cout << IOnU->GetTextMessage (".imchat") << endl;
//IOnU->AddTextMessage (".imchat", "Short chat");
//IOnU->Finalize();
//delete IOnU;
//IOnU = new EyeContainer("test/lockfile.ionu", TGIkey);
//cout << IOnU->GetTextMessage (".imchat") << endl;
//delete IOnU;
EyeFileProcessReadLock* rlock = new EyeFileProcessReadLock ("test/lockfile.ionu", "r");
if (rlock->acquired())
rc += testfailed ("read lock should have failed", "rlock");
else
cout << sequencelogic::GetLastEyeLockMessage() << endl;
delete rlock;
delete wlock;
cout << "deleted read and write locks" << endl;
EyeFileProcessReadLock readlock ("test/lockfile.ionu", "r");
if (!readlock.acquired())
rc += testfailed ("read lock", "me");
if (!readlock.convertToWrite())
rc += testfailed ("convert write lock", "me");
else
cout << "converted to write" << endl;
if (!readlock.convertToRead())
rc += testfailed ("convert read lock", "me");
else
cout << "converted to read" << endl;
if (!readlock.release())
rc += testfailed ("release read lock", "me");
if (!readlock.acquire(IONU_FILE_LOCK_READ))
rc += testfailed ("reacquire read lock", "me");
else
cout << "released and re-acquired" << endl;
IONU_FILE_LOCK_STATUS st;
st = sequencelogic::ProcessLockFile ("cantlocklock.lk", "me", IONU_FILE_LOCK_READ); // My read lock
if (st == IONU_FILE_LOCK_OK)
rc += locktestfailed ("ProcessLockFile() read lock on", "cantlocklock.lk");
st = sequencelogic::ProcessLockFile ("thisfiledoesnotexistyet", "me", IONU_FILE_LOCK_READ); // My read lock
if (st != IONU_FILE_LOCK_OK)
rc += locktestfailed ("ProcessLockFile() read lock - me", "thisfiledoesnotexistyet");
st = sequencelogic::ProcessLockFile ("thisfiledoesnotexistyet", "me", IONU_FILE_LOCK_CLEAR); // Clear my lock
if (st != IONU_FILE_LOCK_OK)
rc += locktestfailed ("LockFile() read lock - you", "thisfiledoesnotexistyet");
else
printf ("Lock and clear of non-existant file passed\n");
if (rc)
printf ("%d lock tests failed\n", rc);
else
printf ("lock tests passed\n");
#endif
return rc;
}
int TestRAIIRead()
{
int rc = 0;
EyeFileReadLock readlock (cionu, "raii");
if (sequencelogic::LockFile (cionu, "me", IONU_FILE_LOCK_READ) != IONU_FILE_LOCK_OK)
rc += testfailed ("EyeFileReadLock(RAII) read lock", "me");
if (sequencelogic::LockFile (cionu, "me", IONU_FILE_LOCK_CLEAR) != IONU_FILE_LOCK_OK)
rc += testfailed ("EyeFileReadLock(RAII) clear lock", "me");
if (sequencelogic::LockFile (cionu, "me", IONU_FILE_LOCK_WRITE) == IONU_FILE_LOCK_OK)
rc += testfailed ("EyeFileReadLock(RAII) read lock", "me");
return rc;
}
int TestRAIIWrite()
{
int rc = 0;
EyeFileWriteLock readlock (cionu, "raii");
if (sequencelogic::LockFile (cionu, "me", IONU_FILE_LOCK_READ) == IONU_FILE_LOCK_OK)
rc += testfailed ("EyeFileWriteLock(RAII) read lock", "me");
if (sequencelogic::LockFile (cionu, "me", IONU_FILE_LOCK_WRITE) == IONU_FILE_LOCK_OK)
rc += testfailed ("EyeFileWriteLock(RAII) write lock", "me");
return rc;
}
int TestFileLocking()
{
printf ("\nFile locking tests\n-------------------------------\n");
int rc = 0;
//ionu_eyefile_create_with_message ("test/remove_test.ionu", TGIkey, ".imchatty", "Yo!", 3, URN, PERMS);
sequencelogic::EyeFileLock* ef = new EyeFileLock(IONU_FILE_LOCK_READ, "test/remove_test.ionu", "remove");
sequencelogic::RemoveFile ("test/remove_test.ionu");
delete ef;
if (sequencelogic::CanReadFile ("test/.remove_test.ionu.lk"))
rc += locktestfailed ("RemoveEntry() lock not deleted", "test/.remove_test.ionu.lk");
IONU_FILE_LOCK_STATUS st;
st = sequencelogic::LockFile ("cantlocklock.lk", "me", IONU_FILE_LOCK_READ); // My read lock
if (st == IONU_FILE_LOCK_OK)
rc += locktestfailed ("LockFile() read lock on", "cantlocklock.lk");
st = sequencelogic::LockFile ("thisfiledoesnotexistyet", "me", IONU_FILE_LOCK_READ); // My read lock
if (st != IONU_FILE_LOCK_OK)
rc += locktestfailed ("LockFile() read lock - me", "thisfiledoesnotexistyet");
st = sequencelogic::LockFile ("thisfiledoesnotexistyet", "me", IONU_FILE_LOCK_CLEAR); // Clear my lock
if (st != IONU_FILE_LOCK_OK)
rc += locktestfailed ("LockFile() read lock - you", "thisfiledoesnotexistyet");
else
printf ("Lock and clear of non-existant file passed\n");
if (sequencelogic::CanReadFile ("test/.thisfiledoesnotexistyet.lk"))
rc += locktestfailed ("LockFile() lockfile not deleted after clear", "test/.thisfiledoesnotexistyet.lk");
st = sequencelogic::LockFile (cionu, "me", IONU_FILE_LOCK_READ); // My read lock
if (st != IONU_FILE_LOCK_OK)
rc += locktestfailed ("LockFile() read lock - me", cionu);
st = sequencelogic::LockFile (cionu, "you", IONU_FILE_LOCK_WRITE); // Fails to get your write lock
cout << sequencelogic::GetLastEyeLockMessage() << endl;
if (st == IONU_FILE_LOCK_OK)
rc += locktestfailed ("LockFile() write lock - you", cionu);
else
printf ("Basic write lock test me and you passed\n");
st = sequencelogic::LockFile (cionu, "me", IONU_FILE_LOCK_CLEAR); // Clear my lock
if (st != IONU_FILE_LOCK_OK)
rc += locktestfailed ("LockFile() read lock - you", cionu);
else
printf ("Clear lock passed\n");
if (sequencelogic::CanReadFile ("test/.ctest.ionu.lk"))
rc += locktestfailed ("LockFile() lockfile not deleted after clear", "test/.ctest.ionu.lk");
else
printf ("Lock file deleted\n");
st = sequencelogic::LockFile (cionu, "me", IONU_FILE_LOCK_CLEAR); // Clear lock on non-existant lock file
if (st != IONU_FILE_LOCK_OK)
rc += locktestfailed ("LockFile() cleared read lock", cionu);
else
printf ("Double clear lock passed\n");
if (sequencelogic::CanReadFile ("test/.ctest.ionu.lk"))
rc += locktestfailed ("LockFile() lockfile not deleted after clear", "test/.ctest.ionu.lk");
// Cleared lock, should get it now
st = sequencelogic::LockFile (cionu, "you", IONU_FILE_LOCK_READ); // Your read lock
if (st != IONU_FILE_LOCK_OK)
rc += locktestfailed ("LockFile() read lock - you", cionu);
else
printf ("Basic unlock test passed\n");
// Multiple read locks
st = sequencelogic::LockFile (cionu, "me", IONU_FILE_LOCK_READ); // Now we both have read locks
if (st != IONU_FILE_LOCK_OK)
rc += locktestfailed ("LockFile() 2nd read lock - me", cionu);
else
printf ("Multiple read lock test passed\n");
st = sequencelogic::LockFile (cionu, "them", IONU_FILE_LOCK_WRITE); // Their write lock fails
if (st == IONU_FILE_LOCK_OK)
rc += locktestfailed ("LockFile() 3rd write lock - you", cionu);
else
printf ("Multiple read lock test passed\n");
st = sequencelogic::LockFile (cionu, "me", IONU_FILE_LOCK_CLEAR); // Clear my read
if (st != IONU_FILE_LOCK_OK)
rc += locktestfailed ("LockFile() read lock - you", cionu);
st = sequencelogic::LockFile (cionu, "you", IONU_FILE_LOCK_WRITE); // Add your lock to a write
if (st != IONU_FILE_LOCK_OK)
rc += locktestfailed ("LockFile() changed to write lock - you", cionu);
st = sequencelogic::LockFile (cionu, "me", IONU_FILE_LOCK_READ); // My read lock fails
if (st == IONU_FILE_LOCK_OK)
rc += locktestfailed ("LockFile() read lock after you got write - me", cionu);
else
printf ("LockFile() read lock after you got write test passed\n");
st = sequencelogic::LockFile (cionu, "me", IONU_FILE_LOCK_WRITE); // My write lock fails
cout << sequencelogic::GetLastEyeLockMessage() << endl;
if (st == IONU_FILE_LOCK_OK)
rc += locktestfailed ("LockFile() write lock after you got write - me", cionu);
else
printf ("LockFile() write lock after you got write test passed\n");
st = sequencelogic::LockFile (cionu, "you", IONU_FILE_LOCK_CLEAR); // Clear your write lock
if (st != IONU_FILE_LOCK_OK)
rc += locktestfailed ("LockFile() clear write lock - you", cionu);
st = sequencelogic::LockFile (cionu, "me", IONU_FILE_LOCK_READ); // My read lock succeeds
if (st == IONU_FILE_LOCK_OK)
printf ("Removed your write test passed\n");
else
rc += locktestfailed ("LockFile() read lock after you got write - me", cionu);
st = sequencelogic::LockFile (cionu, "you", IONU_FILE_LOCK_CLEAR); // Clear your read lock
if (st != IONU_FILE_LOCK_OK)
rc += locktestfailed ("LockFile() clear read lock - you", cionu);
st = sequencelogic::LockFile (cionu, "me", IONU_FILE_LOCK_CLEAR); // Clear my read lock
if (st != IONU_FILE_LOCK_OK)
rc += locktestfailed ("LockFile() clear read lock - me", cionu);
// Try to lock a lockfile
st = sequencelogic::LockFile ("test/.ctest.ionu.lk", "pad", IONU_FILE_LOCK_READ);
if (st != IONU_FILE_LOCK_ERROR)
rc += locktestfailed ("LockFile() lock lockfile - pad", "test/.ctest.ionu.lk");
EyeFileReadLock readlock (cionu, "me");
if (!readlock.acquired())
rc += testfailed ("read lock", "me");
if (sequencelogic::LockFile (cionu, "you", IONU_FILE_LOCK_WRITE) == IONU_FILE_LOCK_OK)
rc += testfailed ("thread lock write", "you");
if (!readlock.convertToWrite())
rc += testfailed ("convert write lock", "me");
if (!readlock.convertToRead())
rc += testfailed ("convert read lock", "me");
if (!readlock.release())
rc += testfailed ("release read lock", "me");
if (!readlock.release())
rc += testfailed ("no lock to release", "me");
if (!readlock.acquire(IONU_FILE_LOCK_READ))
rc += testfailed ("reacquire read lock", "me");
if (!readlock.release())
rc += testfailed ("release after reacquire", "me");
if (sequencelogic::CanReadFile ("test/.ctest.ionu.lk"))
rc += locktestfailed ("EyeFileReadLock() lockfile not deleted after clear", "test/.ctest.ionu.lk");
rc += TestRAIIRead();
if (sequencelogic::CanReadFile ("test/.ctest.ionu.lk"))
rc += locktestfailed ("EyeFileReadLock() lockfile not deleted after RAII", "test/.ctest.ionu.lk");
else
printf ("RAII read test passed\n");
rc += TestRAIIWrite();
if (sequencelogic::CanReadFile ("test/.ctest.ionu.lk"))
rc += locktestfailed ("EyeFileWriteLock() lockfile not deleted after RAII", "test/.ctest.ionu.lk");
else
printf ("RAII write test passed\n");
// Test a remote locked file
std::string remote = "[{\"pid\":\"RSUS-8:7963\",\"id\":\"me\",\"type\":\"W\",\"time\":\"";
EyeTime now;
remote += now.GetISO8601Time();
remote += "\"}]";
filewrite ("test/.ctest.ionu.lk", remote.c_str());
filedump ("test/.ctest.ionu.lk");
st = sequencelogic::LockFile (cionu, "me", IONU_FILE_LOCK_WRITE);
if (st == IONU_FILE_LOCK_OK)
rc += locktestfailed ("LockFile() remote lock", cionu);
else
printf ("Lock check for remote system locked file passed\n");
sequencelogic::RemoveFile ("test/.ctest.ionu.lk");
// Add a stale lock for the next run
sequencelogic::LockFile (cionu, "me", IONU_FILE_LOCK_READ);
filedump ("test/.ctest.ionu.lk");
if (rc)
printf ("%d lock tests failed\n", rc);
else
printf ("lock tests passed\n");
return rc;
}
int IONUCompressTests()
{
int rc = 0;
unsigned char compressed[2048];
unsigned char uncompressed[4098];
const char* str = "<!DOCTYPE html><html><head><title>Hello HTML</title></head><body><p>Hello World!</p></body></html>";
size_t len = strlen (str) + 1;
size_t dest_len = 2048;
sequencelogic::Compress (compressed, &dest_len, (unsigned char*)str, len);
printf ("%d bytes in, %d bytes compressed\n", (int)len, (int)dest_len);
sequencelogic::Uncompress (uncompressed, &len, compressed, dest_len);
printf ("%d bytes out\n", (int)len);
if (memcmp (str, uncompressed, len) != 0)
rc += testfailed ("HTML compress", (char*)uncompressed);
len = strlen (vanishMeta) + 1;
dest_len = 2048;
sequencelogic::Compress (compressed, &dest_len, (unsigned char*)vanishMeta, len);
printf ("%d bytes in, %d bytes compressed\n", (int)len, (int)dest_len);
sequencelogic::Uncompress (uncompressed, &len, compressed, dest_len);
printf ("%d bytes out\n", (int)len);
if (memcmp (vanishMeta, uncompressed, len) != 0)
rc += testfailed ("vanishMeta compress", (char*)uncompressed);
len = strlen (uploadedMeta) + 1;
dest_len = 2048;
sequencelogic::Compress (compressed, &dest_len, (unsigned char*)uploadedMeta, len);
printf ("%d bytes in, %d bytes compressed\n", (int)len, (int)dest_len);
sequencelogic::Uncompress (uncompressed, &len, compressed, dest_len);
printf ("%d bytes out\n", (int)len);
if (memcmp (uploadedMeta, uncompressed, len) != 0)
rc += testfailed ("uploadedMeta compress", (char*)uncompressed);
ifstream file ("test/system info dump.xml", ios::in | ios::binary | ios::ate);
if (file.is_open())
{
size_t bytes = (size_t)file.tellg();
file.seekg (0, ios::beg);
char* big = new char[bytes];
char* b64 = new char[bytes];
unsigned char* data = new unsigned char[bytes];
if (big && data) {
size_t rbytes = bytes;
file.read (big, bytes);
file.close();
sequencelogic::Compress (data, &bytes, (unsigned char*)big, bytes);
sequencelogic::Base64Encode (data, bytes, b64);
bytes = sequencelogic::Base64Decode (b64, data);
sequencelogic::Uncompress ((unsigned char*)b64, &rbytes, data, bytes);
if (memcmp (big, b64, rbytes) != 0) {
rc += testfailed ("Big Xml compress", "test/system info dump.xml");
big[80] = '\0';
b64[80] = '\0';
printf ("%s\n%s\n", big, b64);
}
}
delete[] big;
delete[] b64;
delete[] data;
}
return rc;
}
int TestDB()
{
printf ("\nDB tests\n-------------------------------\n");
int rc = 0;
char* val = NULL;
EyeEncryptedDB* test = new EyeEncryptedDB ("test/test.db", TestKey);
std::map<std::string, std::string> entries;
entries["key1"] = "value1";
entries["key2"] = "value2";
entries["key3"] = "value3";
entries["key4"] = "Longervalueforkey4";
test->PutAll ("cache", entries, true);
std::map<std::string, std::string> dbentries = test->GetAll ("cache");
printf ("got all\n");
for (std::map<std::string, std::string>::const_iterator itr = dbentries.begin(); itr != dbentries.end(); ++itr) {
std::cout << itr->first << " " << itr->second << std::endl;
}
test->Put ("backup", "key2", "bvalue2");
// ms = sequencelogic::GetSystemTime();
// for (int i=0; i<10000; ++i) {
// val = test->Get ("cache", "key1");
// delete[] val;
// }
// ms = sequencelogic::GetSystemTime() - ms;
// printf ("Loaded 10,000 values in %ld ms\n", ms);
val = test->Get ("cache", "key1");
if (val) {
printf ("cache.key1.%s\n", val);
delete[] val;
}
else
rc += testfailed ("Get", "cache.key1");
val = test->Get ("cache", "key2");
if (val) {
printf ("cache.key2.%s\n", val);
delete[] val;
}
else
rc += testfailed ("Get", "cache.key2");
val = test->Get ("cache", "key3");
if (val) {
printf ("cache.key3.%s\n", val);
delete[] val;
}
else
rc += testfailed ("Get", "cache.key3");
val = test->Get ("cache", "key4");
if (val) {
printf ("cache.key4.%s\n", val);
delete[] val;
}
else
rc += testfailed ("Get", "cache.key4");
val = test->Get ("backup", "key2");
if (val) {
printf ("backup.key2.%s\n", val);
delete[] val;
}
else
rc += testfailed ("Get", "backup.key2");
val = test->Get ("cache", "keynot");
if (val)
rc += testfailed ("Get", "cache.keynot");
delete test;
test = new EyeEncryptedDB ("test/test.db", badkey);
val = test->Get ("backup", "key2");
if (val)
rc += testfailed ("Get() with bad key", "backup.key2");
else
printf ("Bad DB key test passed\n");
delete test;
test = new EyeEncryptedDB ("test/test.db", TestKey);
//test->Dump("cache");
test->Put ("cache", "key2", "NewValue2");
test->ReKey (badkey);
//test->Dump("cache");
delete test;
test = new EyeEncryptedDB ("test/test.db", badkey);
val = test->Get ("cache", "key2");
if (sequencelogic::StrCmp (val, "NewValue2") == 0)
printf ("cache.key2.%s\n", val);
else
rc += testfailed ("Get() after ReKey", "cache.key2");
if (val) delete[] val;
test->Remove ("cache", "key2");
//test->Dump("cache");
val = test->Get ("cache", "key2");
if (sequencelogic::StrCmp (val, "value2") == 0)
rc += testfailed ("Remove key", "cache.key2");
if (val) delete[] val;
test->Remove ("cache");
//test->Dump("cache");
val = test->Get ("cache", "key1");
if (sequencelogic::StrCmp (val, "value1") == 0)
rc += testfailed ("Remove table", "cache");
if (val) delete[] val;
test->ReKey (TestKey);
delete test;
#ifndef WIN32
test = new EyeEncryptedDB ("/test.db", badkey);
if (test->Put ("cache", "key2", "NewValue2"))
rc += testfailed ("UnCreated", "cache");
delete test;
#endif
if (rc == 0)
printf ("C++ DB tests passed\n");
// Test the C bindings
ionu_eyedb_put ("dbfile.db", TestKey, "collection", "key", "value");
ionu_eyedb_put ("dbfile.db", TestKey, "collection", "key2", "value2");
val = ionu_eyedb_get ("dbfile.db", TestKey, "collection", "key");
if (sequencelogic::StrCmp (val, "value") != 0)
rc += testfailed ("ionu_eyedb_get", "collection:key");
if (val) free (val);
ionu_eyedb_remove ("dbfile.db", TestKey, "collection", "key");
val = ionu_eyedb_get ("dbfile.db", TestKey, "collection", "key");
if (val)
rc += testfailed ("ionu_eyedb_remove", "collection:key");
ionu_eyedb_remove ("dbfile.db", TestKey, "collection", NULL);
val = ionu_eyedb_get ("dbfile.db", TestKey, "collection", "key2");
if (val)
rc += testfailed ("ionu_eyedb_remove", "collection");
if (rc)
printf ("%d db tests failed\n", rc);
else
printf ("DB tests passed\n");
return rc;
}
int TestDirectory()
{
printf ("\nDirectory tests\n-------------------------------\n");
int rc = 0;
/*
EyeDirectory* d = new EyeDirectory ("test", "*.ionu");
d->Dump();
d->Sort (EyeDirectory::ASCENDING_TIME);
d->Dump();
d->Sort (EyeDirectory::DESCENDING_TIME);
d->Dump();
d->Sort (EyeDirectory::ASCENDING_ALPHA);
d->Dump();
d->Sort (EyeDirectory::DESCENDING_ALPHA);
d->Dump();
size_t bytes = EyeDirectory::GetNumBytes ("test");
printf ("%ld bytes\n", (long int)bytes);
std::string f = d->GetFileName(5);
cout << "file 5: " << f << endl;
delete d;
d = new EyeDirectory ("test", "*.jk");
if (d->GetNumFiles() > 0)
rc += testfailed ("EyeDirectory(*.jk)", d->GetFileName(0));
delete d;
d = new EyeDirectory ("tst", "*.ionu");
if (d->GetNumFiles() > 0)
rc += testfailed ("EyeDirectory(tst/*.ionu)", d->GetFileName(0));
delete d;
d = new EyeDirectory ("test", "*.ion?");
delete d;
size_t i = 0;
size_t num = ionu_eyefile_list_directory_length ("garbage", "*.ionu");
char** list = ionu_eyefile_list_directory_sorted ("garbage", 0, num/2, "*.ionu", true);
for (i = 0; i<num/2; ++i) {
printf ("%s\n", list[i]);
free (list[i]);
}
if (list) free (list);
printf ("----------\n");
list = ionu_eyefile_list_directory_sorted ("test", num/2, num, "*.ionu", true);
if (list) {
for (i = 0; i<100; ++i) {
if (list[i]) {
printf ("%s\n", list[i]);
free (list[i]);
}
else
break;
}
free (list);
}
*/
return rc;
}
int TestJSON()
{
printf ("\nJSON tests\n-------------------------------\n");
int rc = 0;
std::string json;
unsigned char buff[2048];
char cbuff[2048];
EyeJSONObject* jtest = NULL;
EyeJSONObject* policies = NULL;
EyeJSONObject* policy = NULL;
jtest = new EyeJSONObject (NULL, JSON_OBJECT, NULL);
jtest->AddMember (new EyeJSONScalar ("id", "identifire", JSON_STRING));
jtest->AddMember (new EyeJSONScalar ("type", "rwlock", JSON_STRING));
jtest->GetJSONString(json);
delete jtest;
cout << json << std::endl;
const char* utfjson = "\\u0123\\u4567\\u89AB\\uCDEF\\uabcd\\uef4A ";
//const char* utfjson = "euro \\u20ac cent \\u00a2";
EyeJSONScalar* unicode = new EyeJSONScalar ("UTF-8", utfjson, JSON_STRING);
printf ("%s\n", utfjson);
sequencelogic::BinaryToHex ((unsigned char*)unicode->GetValue(), 16, cbuff);
printf ("%s\n", cbuff);
unicode->GetJSONString(json);
cout << json << std::endl;
if (sequencelogic::MemCmp (utfjson, json.c_str() + 9, 16) != 0) // Skip "UTF-8":"
rc += testfailed ("JSON", "UTF currency");
delete unicode;
jtest = new EyeJSONObject (NULL);
if (jtest->GetNumMembers() > 0 || jtest->GetMember ("policies"))
rc += testfailed ("JSON", "NULL");
delete jtest;
jtest = new EyeJSONObject ("");
if (jtest->GetNumMembers() > 0)
rc += testfailed ("JSON", "empty");
delete jtest;
jtest = new EyeJSONObject ("{}");
if (jtest->GetNumMembers() > 0)
rc += testfailed ("JSON", "empty{}");
delete jtest;
jtest = new EyeJSONObject ((char*)garbage);
if (jtest->GetNumMembers() > 0)
rc += testfailed ("JSON", "garbage");
delete jtest;
jtest = new EyeJSONObject ("[\"\"]");
if (jtest->GetNumMembers() != 1)
rc += testfailed ("JSON", "[\"\"]");
jtest->GetJSONString(json);
cout << json << std::endl;
delete jtest;
if (rc == 0)
printf ("PASSED: Bad json input data tests\n");
jtest = new EyeJSONObject (uploadedMeta);
jtest->GetJSONString(json);
cout << json << std::endl;
delete jtest;
jtest = new EyeJSONObject (someMeta);
jtest->GetJSONString(json);
cout << json << std::endl;
delete jtest;
jtest = new EyeJSONObject (policyTest);
jtest->GetJSONString(json);
cout << json << std::endl;
delete jtest;
jtest = new EyeJSONObject (vanishMeta);
jtest->GetJSONString(json);
cout << json << std::endl;
delete jtest;
jtest = new EyeJSONObject (badMeta);
jtest->GetJSONString(json);
cout << json << std::endl;
delete jtest;
FILE* fp = fopen ("test/test.json", "r");
char fbuff[104668];
size_t by = fread (fbuff, 1, 2048, fp);
fbuff[by] = '\0';
//printf ("%d\n<%s>\n", int(by), fbuff);
jtest = new EyeJSONObject (fbuff);
jtest->GetJSONString(json);
if (json.length() > 0)
cout << json << std::endl;
else
rc += testfailed ("JSON", "coverage test");
delete jtest;
fclose (fp);
fp = fopen ("test/huge.json", "r");
by = fread (fbuff, 1, 104663, fp);
fbuff[by] = '\0';
//printf ("%d\n<%s>\n", int(by), fbuff);
jtest = new EyeJSONObject (fbuff);
jtest->GetJSONString(json);
if (json.length() < 3)
testfailed ("JSON", "huge test");
else
printf ("test/huge.json = %d bytes\n", (int)(json.length()));
delete jtest;
fclose (fp);
jtest = new EyeJSONObject (JSON);
policies = dynamic_cast<EyeJSONObject*>(jtest->GetMember ("policies"));
if (policies) {
policies->GetJSONString(json);
cout << json << std::endl;
}
delete jtest;
jtest = new EyeJSONObject (policyTest);
policies = dynamic_cast<EyeJSONObject*>(jtest->GetMember ("policies"));
if (policies) {
for (size_t i = 0; i < policies->GetNumMembers(); ++i) {
policy = dynamic_cast<EyeJSONObject*>(policies->GetMember (i));
EyeJSONNode* item = policy->GetMember("policyName");
if (item) {
item->GetJSONString(json);
cout << json << std::endl;
}
item = policy->GetMember("policyValue");
if (item) {
item->GetJSONString(json);
cout << json << std::endl;
}
}
}
else
rc++;
delete jtest;
printf ("\nPolicy tests\n-------------------------------\n");
ionu_policy_install (NULL);
ionu_policy_install ("");
ionu_policy_install ((char*)garbage);
ionu_policy_install (policyTest);
char* policychk = ionu_policy_check ("allowUserPasswordChange");
if (policychk) {
printf ("%s\n", policychk);
free (policychk);
}
else
rc += testfailed ("PolicyCheck", "allowUserPasswordChange");
policychk = ionu_policy_check ("cachedTGIKeysExpire");
if (policychk) {
EyeJSONObject* expire = new EyeJSONObject (policychk);
EyeJSONScalar* pval = dynamic_cast<EyeJSONScalar*>(expire->GetMember("policyValue"));
if (pval)
printf ("Cached keys expire in %sms\n", pval->GetValue());
else
rc += testfailed ("PolicyCheck", "cachedTGIKeysExpire no value found");
delete expire;
free (policychk);
}
else
rc += testfailed ("PolicyCheck", "cachedTGIKeysExpire");
// Check for policy that is not there
policychk = ionu_policy_check ("allowStupidPasswords");
if (policychk) {
rc += testfailed ("PolicyCheck", "allowStupidPasswords");
free (policychk);
}
ionu_policy_check (NULL);
ionu_policy_check ("");
ionu_policy_check ((char*)garbage);
ionu_policy_uninstall ();
// Check with no policies installed
policychk = ionu_policy_check ("allowUserPasswordChange");
if (policychk) {
rc += testfailed ("PolicyCheck", "uninstalled");
free (policychk);
}
/*
printf ("\ncompute_keys tests\n-------------------------------\n");
FILE* jp = fopen ("test/collab100.json", "r");
char* jbuff = new (char[1024*1024]);
by = fread (jbuff, 1, 592693, jp);
fclose (jp);
jbuff[by] = '\0';
//char* j = ionu_compute_keys ("[\"urn:sl:000000:1A537720::\",\"urn:sl:000000:D676E999::\"]", jbuff);
//if (j) free (j);
delete[] jbuff;
//ionu_compute_keys (NULL, collabs);
//ionu_compute_keys ("", collabs);
//ionu_compute_keys ((char*)garbage, collabs);
//ionu_compute_keys (members, NULL);
//ionu_compute_keys (members, "");
//ionu_compute_keys (members, (char*)garbage);
jtest = new EyeJSONObject (members);
delete jtest;
jtest = new EyeJSONObject (collabs);
delete jtest;
j = ionu_compute_keys (members, collabs);
EyeJSONObject* collabtest = new EyeJSONObject(collabs);
EyeJSONObject* membertest = new EyeJSONObject(members);
std::string c2;
collabtest->GetJSONString(c2);
std::string m2;
membertest->GetJSONString(m2);
//char* j2 = ionu_compute_keys (m2.c_str(), c2.c_str());
cout << "Random" << endl;
cout << j2 << endl;
//if (strcmp (c2, collabs) != 0)
// printf ("FAILED:\n%s\n%s\n", collabs, c2);
//if (strcmp (m2, members) != 0)
// printf ("FAILED:\n%s\n%s\n", members, m2);
delete collabtest;
delete membertest;
Key* privateKey = new Key ("Check", "compute_keys", "test/private_key.pem", "");
EyeJSONObject* keys = new EyeJSONObject(j);
keys->GetJSONString(m2);
if (sequencelogic::StrCmp (m2.c_str(), j) != 0)
rc += testfailed ("compute_keysi j != m2", m2.c_str());
for (size_t i = 0; i < keys->GetNumMembers(); ++i) {
EyeJSONObject* userkey = dynamic_cast<EyeJSONObject*>(keys->GetMember(i));
EyeJSONScalar* enkey = dynamic_cast<EyeJSONScalar*>(userkey->GetMember("key"));
Base64Decode (enkey->GetValue(), buff);
size_t bytes = 256;
unsigned char* back = privateKey->PrivateKeyDecrypt (buff, bytes, &bytes);
sequencelogic::Base64Encode (back, SL_AES_KEY_LEN, cbuff);
printf ("decrypt TGI %d: %s\n", (int)bytes, cbuff);
delete[] back;
}
free (j);
free (j2);
delete keys;
sequencelogic::Base64Encode (TGIkey, SL_AES_KEY_LEN, cbuff);
printf ("TGI: %s\n", cbuff);
j2 = ionu_recompute_keys (m2.c_str(), c2.c_str(), TGIkey);
cout << j2 << endl;
keys = new EyeJSONObject(j2);
keys->GetJSONString(m2);
for (size_t i = 0; i < keys->GetNumMembers(); ++i) {
EyeJSONObject* userkey = dynamic_cast<EyeJSONObject*>(keys->GetMember(i));
EyeJSONScalar* enkey = dynamic_cast<EyeJSONScalar*>(userkey->GetMember("key"));
Base64Decode (enkey->GetValue(), buff);
size_t bytes = 256;
unsigned char* back = privateKey->PrivateKeyDecrypt (buff, bytes, &bytes);
sequencelogic::Base64Encode (back, SL_AES_KEY_LEN, cbuff);
printf ("decrypt TGI %d: %s\n", (int)bytes, cbuff);
delete[] back;
}
free (j2);
delete keys;
delete privateKey;
*/
return rc;
}
int TestTime()
{
int rc = 0;
EyeTime t;
const char* tstr = t.GetISO8601Time();
printf ("Current time %s\n", tstr);
EyeTime nt(tstr);
const char* ntstr = nt.GetISO8601Time();
if (strcmp (tstr, ntstr) != 0)
rc += testfailed ("EyeTime", ntstr);
tstr = t.GetISO8601TimeMs();
printf ("Current time %s\n", tstr);
nt.SetTime (tstr);
ntstr = nt.GetISO8601TimeMs();
if (strcmp (tstr, ntstr) != 0)
rc += testfailed ("EyeTime", ntstr);
tstr = t.GetUnixTime();
printf ("Current time %s\n", tstr);
t.SetTime ("2014-01-23T17:44:40Z");
printf ("Seconds from now %0.0f\n", t.SecondsFromNow());
t.SetTime ("2014-01-23T17:45:40Z");
printf ("Seconds from now %0.0f\n", t.SecondsFromNow());
t.SetTime ("2014-03-07T09:31:17U");
printf ("2014-03-07T09:31:17U %s\n", t.GetUnixTime());
t.SetTime ("2014-03-07T10:18:37U");
printf ("2014-03-07T10:18:37U %s\n", t.GetUnixTime());
printf ("%s\n", t.GetISO8601Time ());
printf ("%s\n", t.GetLocalISO8601Time ());
printf ("%s\n", t.GetISO8601Time ());
t.SetTime ("2014-03-06T00:31:17Z");
tstr = t.GetUnixTime();
if (strcmp (tstr, "1394065877") != 0)
rc += testfailed ("EyeTime", tstr);
t.Dump();
// Test various leap years over a range of time
t.SetTime ("2006-01-31T01:31:17Z");
if (strcmp (t.GetISO8601Time(), "2006-01-31T01:31:17Z") != 0)
rc += testfailed ("EyeTime", t.GetISO8601Time());
t.SetTime ("2006-02-29T01:32:17Z");
if (strcmp (t.GetISO8601Time(), "2006-02-29T01:32:17Z") != 0)
rc += testfailed ("EyeTime", t.GetISO8601Time());
t.SetTime ("2006-06-08T01:33:17Z");
if (strcmp (t.GetISO8601Time(), "2006-06-08T01:33:17Z") != 0)
rc += testfailed ("EyeTime", t.GetISO8601Time());
t.SetTime ("2006-12-08T01:34:17Z");
if (strcmp (t.GetISO8601Time(), "2006-12-08T01:34:17Z") != 0)
rc += testfailed ("EyeTime", t.GetISO8601Time());
t.SetTime ("2010-01-31T01:31:17Z");
if (strcmp (t.GetISO8601Time(), "2010-01-31T01:31:17Z") != 0)
rc += testfailed ("EyeTime", t.GetISO8601Time());
t.SetTime ("2010-06-08T01:32:17Z");
if (strcmp (t.GetISO8601Time(), "2010-06-08T01:32:17Z") != 0)
rc += testfailed ("EyeTime", t.GetISO8601Time());
t.SetTime ("2010-12-08T01:33:17Z");
if (strcmp (t.GetISO8601Time(), "2010-12-08T01:33:17Z") != 0)
rc += testfailed ("EyeTime", t.GetISO8601Time());
t.SetTime ("2014-01-31T01:31:17Z");
if (strcmp (t.GetISO8601Time(), "2014-01-31T01:31:17Z") != 0)
rc += testfailed ("EyeTime", t.GetISO8601Time());
t.SetTime ("2014-02-28T01:32:17Z");
if (strcmp (t.GetISO8601Time(), "2014-02-28T01:32:17Z") != 0)
rc += testfailed ("EyeTime", t.GetISO8601Time());
t.SetTime ("2014-02-29T01:33:17Z");
if (strcmp (t.GetISO8601Time(), "2014-02-29T01:33:17Z") != 0)
rc += testfailed ("EyeTime", t.GetISO8601Time());
t.SetTime ("2014-06-08T01:34:17Z");
if (strcmp (t.GetISO8601Time(), "2014-06-08T01:34:17Z") != 0)
rc += testfailed ("EyeTime", t.GetISO8601Time());
t.SetTime ("2014-12-08T01:35:17Z");
if (strcmp (t.GetISO8601Time(), "2014-12-08T01:35:17Z") != 0)
rc += testfailed ("EyeTime", t.GetISO8601Time());
// Most recent leap second, June 30, 2012 at 23:59:60
t.SetTime ("2012-06-30T23:59:60Z");
if (strcmp (t.GetISO8601Time(), "2012-06-30T23:59:60Z") != 0)
rc += testfailed ("EyeTime", t.GetISO8601Time());
// Invalid dates and times
t.SetTime ("2013-02-29T01:31:17Z");
if (strcmp (t.GetISO8601Time(), "2014-02-29T01:31:17Z") == 0)
rc += testfailed ("EyeTime", t.GetISO8601Time());
t.SetTime ("2013-04-31T01:31:17Z");
if (strcmp (t.GetISO8601Time(), "2014-04-31T01:31:17Z") == 0)
rc += testfailed ("EyeTime", t.GetISO8601Time());
t.SetTime ("2013-02-28T24:31:17Z");
if (strcmp (t.GetISO8601Time(), "2014-02-28T24:31:17Z") == 0)
rc += testfailed ("EyeTime", t.GetISO8601Time());
t.SetTime ("2013-02-28T14:71:17Z");
if (strcmp (t.GetISO8601Time(), "2014-02-28T14:71:17Z") == 0)
rc += testfailed ("EyeTime", t.GetISO8601Time());
t.SetTime ("2013-02-28T14:31:77Z");
if (strcmp (t.GetISO8601Time(), "2014-02-28T14:31:77Z") == 0)
rc += testfailed ("EyeTime", t.GetISO8601Time());
t.SetTime ("2014-06-08T01:31:17.777Z");
t.Dump();
t.SetTime ("2014-06-14T01:31:17.777Z");
t.Dump();
t.SetTime ("2013-03-01T01:31:17.777Z");
t.Dump();
t.SetTime ("2012-03-01T01:31:17.555M");
t.Dump();
t.SetTime ("2012-06-11T01:31:17.333Y");
t.Dump();
t.SetTime ("2014-10-28T23:13:06.174Z");
cout << t << endl;
t.SetFileTime ("t");
t.GetFileTime ("t");
cout << t << endl;
t.SetTime ("2014-11-17T15:14:56-07:00");
cout << t << endl;
t.SetTime ("2014-11-17T15:14:56+07:00");
cout << t << endl;
t.SetTime ("2014-11-17T16:14:56-08:00");
cout << t << endl;
//t.SetTime ("2008-04-10 13:30:00Z");
//cout << t << endl;
//t.SetTime ("Thu, 10 Apr 2008 13:30:00 GMT");
//cout << t << endl;
//t.SetTime ("Thursday, April 10, 2008 1:30:00 PM");
//cout << t << endl;
//t.SetTime ("6/15/2009 1:45:30 PM");
//cout << t << endl;
//t.SetTime ("6/15/2009 1:45:30 PM -07:00");
//cout << t << endl;
//t.SetTime ("4/10/2008 6:30:00 AM");
//cout << t << endl;
t.SetTime ("808464430-67--858993460T58:128:00.000C");
printf ("%s\n", t.GetISO8601TimeMs ());
cout << t << endl;
t.Dump();
t.SetTime ("2014-06-08T01:31:17.777Z");
if (rc == 0)
printf ("\nEyeTime tests passed\n-------------------------------\n");
else
printf ("\n%d EyeTime tests failed\n-------------------------------\n", rc);
return rc;
}
int TestUtils()
{
int rc = 0;
printf ("\nUtility tests\n-------------------------------\n");
char* md = NULL;
unsigned char cg_key[SL_AES_KEY_LEN];
unsigned char user_key[SL_AES_KEY_LEN];
ionu_derive_key ("u3K2*l$qZ0a<", cg_key);
ionu_derive_userkey ("u3K2*l$qZ0a<", user_key, cg_key);
unsigned char binary[64] = {211,231,210,248,235};
unsigned char utf8[10] = {0x20, 0xc2,0xa2, 0xe2,0x82,0xac, 0xf0,0xa4,0xad,0xa2};
if (sequencelogic::IsStrUTF8 ((char*)cg_key, SL_AES_KEY_LEN))
rc += testfailed ("sequencelogic::IsStrUTF8", "cg_key");
if (!sequencelogic::IsStrUTF8 ((char*)utf8, 10))
rc += testfailed ("sequencelogic::IsStrUTF8", "valid currency symbols");
char ascii[256];
size_t bytes = 0;
//sequencelogic::DumpAsBinary (binary, 5);
//sequencelogic::Base32Encode (binary, 1, ascii);
//printf ("%s\n", ascii);
//sequencelogic::Base32Encode (binary, 2, ascii);
//printf ("%s\n", ascii);
//sequencelogic::Base32Encode (binary, 3, ascii);
//printf ("%s\n", ascii);
//sequencelogic::Base32Encode (binary, 4, ascii);
//printf ("%s\n", ascii);
//sequencelogic::Base32Encode (binary, 5, ascii);
//printf ("%s\n", ascii);
//bytes = sequencelogic::Base32Decode (ascii, binary);
//sequencelogic::DumpAsBinary (binary, 5);
sequencelogic::Base32Encode (cg_key, 15, ascii);
bytes = sequencelogic::Base32Decode (ascii, binary);
if (bytes != 15 || sequencelogic::MemCmp (binary, cg_key, 15) != 0)
rc += testfailed ("B32 15 bytes cg_key", ascii);
sequencelogic::Base32Encode (cg_key, SL_AES_KEY_LEN, ascii);
bytes = sequencelogic::Base32Decode (ascii, binary);
if (bytes != SL_AES_KEY_LEN || sequencelogic::MemCmp (binary, cg_key, SL_AES_KEY_LEN) != 0)
rc += testfailed ("B32 cg_key", ascii);
sequencelogic::Base32Encode (user_key, 15, ascii);
bytes = sequencelogic::Base32Decode (ascii, binary);
if (bytes != 15 || sequencelogic::MemCmp (binary, user_key, 15) != 0)
rc += testfailed ("B32 15 bytes user_key", ascii);
sequencelogic::Base32Encode (user_key, SL_AES_KEY_LEN, ascii);
bytes = sequencelogic::Base32Decode (ascii, binary);
if (bytes != SL_AES_KEY_LEN || sequencelogic::MemCmp (binary, user_key, SL_AES_KEY_LEN) != 0)
rc += testfailed ("B32 user_key", ascii);
if (rc == 0)
printf ("Base32 tests passed\n");
sequencelogic::Base64Encode (cg_key, 15, ascii);
bytes = sequencelogic::Base64Decode (ascii, binary);
if (bytes != 15 || sequencelogic::MemCmp (binary, cg_key, 15) != 0)
rc += testfailed ("B64 15 bytes cg_key", ascii);
sequencelogic::Base64Encode (cg_key, SL_AES_KEY_LEN, ascii);
bytes = sequencelogic::Base64Decode (ascii, binary);
if (bytes != SL_AES_KEY_LEN || sequencelogic::MemCmp (binary, cg_key, SL_AES_KEY_LEN) != 0)
rc += testfailed ("B64 cg_key", ascii);
sequencelogic::Base64Encode (user_key, 15, ascii);
bytes = sequencelogic::Base64Decode (ascii, binary);
if (bytes != 15 || sequencelogic::MemCmp (binary, user_key, 15) != 0)
rc += testfailed ("B64 15 bytes user_key", ascii);
sequencelogic::Base64Encode (user_key, SL_AES_KEY_LEN, ascii);
bytes = sequencelogic::Base64Decode (ascii, binary);
if (bytes != SL_AES_KEY_LEN || sequencelogic::MemCmp (binary, user_key, SL_AES_KEY_LEN) != 0)
rc += testfailed ("B64 user_key", ascii);
if (rc == 0)
printf ("Base64 tests passed\n");
ionu_base64_encode (cg_key, 15, ascii);
bytes = ionu_base64_decode (ascii, binary);
if (bytes != 15 || sequencelogic::MemCmp (binary, cg_key, 15) != 0)
rc += testfailed ("ionu_B64 15 bytes cg_key", ascii);
// Test TGI signature generation
/*
if (ionu_gen_tgisig (NULL))
rc += testfailed ("GenerateTGISig", "NULLempty");
if (ionu_gen_tgisig (""))
rc += testfailed ("GenerateTGISig", "empty");
if (ionu_gen_tgisig ((char*)garbage))
rc += testfailed ("GenerateTGISig", "garbage");
md = ionu_gen_tgisig (PERMS);
if (rc == 0 && sequencelogic::StrCmp (md, "6a0ce1ec504b") == 0)
printf ("TGI signature tests passed: %s\n", md);
else
rc += testfailed ("TGI signature\n", md);
free (md);
*/
md = ionu_digest_msg ("sha1", (const unsigned char*)PERMS, strlen(PERMS));
if (sequencelogic::StrCmp (md, "03b00bb4cc0edc80b9063653c8340a908775a367") != 0)
rc += testfailed ("sha1", md);
free (md);
md = ionu_digest_msg ("sha256", (const unsigned char*)PERMS, strlen(PERMS));
if (sequencelogic::StrCmp (md, "27d80a5effacb099f49ba81a245ad4a4ea0c3e1768b3b2a7d6833365c66be8fa") != 0)
rc += testfailed ("sha256", md);
free (md);
std::string hmd;
hmd = sequencelogic::HMACMessage (NULL, SL_AES_KEY_LEN, (const unsigned char*)PERMS, strlen(PERMS));
if (hmd.size() > 0)
rc += testfailed ("hmac", "NULL key");
hmd = sequencelogic::HMACMessage (TestKey, SL_AES_KEY_LEN, NULL, strlen(PERMS));
if (hmd.size() > 0)
rc += testfailed ("hmac", "NULL msg");
hmd = sequencelogic::HMACMessage (TestKey, SL_AES_KEY_LEN/2, (const unsigned char*)PERMS, strlen(PERMS));
if (hmd.compare ("42963870f70684f00ebe8d083f61f20a87265ff4") != 0)
rc += testfailed ("hmac cg_key/2", hmd.c_str());
hmd = sequencelogic::HMACMessage (TestKey, SL_AES_KEY_LEN, (const unsigned char*)shortword, strlen(shortword));
if (hmd.compare ("f160e4c65719db3bbcfe9bf00cd3cedda078a3dd") != 0)
rc += testfailed ("hmac cg_key Hi", hmd.c_str());
hmd = sequencelogic::HMACMessage (TestKey, SL_AES_KEY_LEN, (const unsigned char*)PERMS, strlen(PERMS));
if (hmd.compare ("a06df1aacfbf923b8053773dec8b7529467faaab") != 0)
rc += testfailed ("hmac cg_key", hmd.c_str());
hmd = sequencelogic::HMACMessage (badkey, SL_AES_KEY_LEN, (const unsigned char*)PERMS, strlen(PERMS));
if (hmd.compare ("c59d3a08989ffd2d30b05815d68a240d526fa49f") != 0)
rc += testfailed ("hmac user_key", hmd.c_str());
if (rc == 0)
printf ("Hash and HMAC tests passed\n");
//size_t len = 0;
//unsigned char* enc = ionu_symmetric_encrypt_buffer (TGIkey, (const unsigned char*) "Howdy", 6, &len, badkey);
//unsigned char* dec = ionu_symmetric_decrypt_buffer (TGIkey, enc, len, &len, badkey);
//if (sequencelogic::StrCmp ((char*)dec, "Howdy") != 0)
// rc += testfailed ("ionu_symmetric_decrypt_buffer", "Howdy");
//free (enc);
//free (dec);
// Test URN validation
if (! CheckURN (URN))
rc += testfailed ("IsValidURN", URN);
if (! CheckURN (URN0))
rc += testfailed ("IsValidURN", URN0);
if (! CheckURN (URN1))
rc += testfailed ("IsValidURN", URN1);
if (! CheckURN (URN2))
rc += testfailed ("IsValidURN", URN2);
if (! CheckURN (URN3))
rc += testfailed ("IsValidURN", URN3);
if (! CheckURN (URN4))
rc += testfailed ("IsValidURN", URN4);
if (! CheckURN (URN5))
rc += testfailed ("IsValidURN", URN5);
if (rc == 0)
printf ("Valid URN tests passed\n");
if (sequencelogic::IsValidURN (NULL))
rc += testfailed ("IsValidURN", "NULL");
if (sequencelogic::IsValidURN (""))
rc += testfailed ("IsValidURN", "empty");
if (sequencelogic::IsValidURN ((char*)garbage))
rc += testfailed ("IsValidURN", "garbage");
if (sequencelogic::IsValidURN (burn0))
rc += testfailed ("IsValidURN", burn0);
if (sequencelogic::IsValidURN (burn1))
rc += testfailed ("IsValidURN", burn1);
if (sequencelogic::IsValidURN (burn2))
rc += testfailed ("IsValidURN", burn2);
if (sequencelogic::IsValidURN (burn3))
rc += testfailed ("IsValidURN", burn3);
if (sequencelogic::IsValidURN (burn4))
rc += testfailed ("IsValidURN", burn4);
if (sequencelogic::IsValidURN (burn5))
rc += testfailed ("IsValidURN", burn5);
if (sequencelogic::IsValidURN (burn6))
rc += testfailed ("IsValidURN", burn6);
if (sequencelogic::IsValidURN (burn7))
rc += testfailed ("IsValidURN", burn7);
if (rc == 0)
printf ("Invalid URN tests passed\n");
// Test URI encode and decode
//EyeBytes url;
//url.AssignURIEncodedString(cgurl);
//char* uri = url.GetURIEncodedString();
//if (sequencelogic::StrCmp (cgurl, uri) != 0)
// rc += testfailed ("URI encoding", uri);
//delete[] uri;
Key bkey ("Meta", "key", SL_AES_KEY_LEN, badkey, Key::AES);
std::string encfstr = sequencelogic::EncryptFilename (".imchat", bkey);
encfstr = sequencelogic::DecryptFilename (encfstr, bkey);
if (encfstr.compare (".imchat") != 0)
rc += testfailed ("sequencelogic::DecryptFilename(.imchat)", "");
#ifdef WIN32
std::string f1 ("C:\\Users\\philip\\Dropbox\\New Text Document.txt.ionu");
std::string f2 ("C:\\Users\\philip\\Dropbox\\NEW TEXT DOCUMENT.txt.ionu");
if (sequencelogic::CompareFilenames (f1, f2) != 0)
rc += testfailed ("sequencelogic::sequencelogic::CompareFilenames", "New Text Document");
#endif
cout << "test.ai " << sequencelogic::GuessMimeType ("test.ai") << endl;
cout << "test.doc " << sequencelogic::GuessMimeType ("test.doc") << endl;
cout << "test.gzip " << sequencelogic::GuessMimeType ("test.gzip") << endl;
cout << "test.docx " << sequencelogic::GuessMimeType ("test.docx") << endl;
cout << "test.ionu " << sequencelogic::GuessMimeType ("test.ionu") << endl;
cout << "test.jpeg " << sequencelogic::GuessMimeType ("test.jpeg") << endl;
cout << "test.json " << sequencelogic::GuessMimeType ("test.json") << endl;
cout << "test.m4a " << sequencelogic::GuessMimeType ("test.m4a") << endl;
cout << "test.pdf " << sequencelogic::GuessMimeType ("test.pdf") << endl;
cout << "test.qt " << sequencelogic::GuessMimeType ("test.qt") << endl;
cout << "test.cer " << sequencelogic::GuessMimeType ("test.cer") << endl;
cout << "test.crt " << sequencelogic::GuessMimeType ("test.crt") << endl;
cout << "test.ionu " << sequencelogic::GuessMimeType ("test.ionu") << endl;
cout << "test.wav " << sequencelogic::GuessMimeType ("test.wav") << endl;
cout << "test.g " << sequencelogic::GuessMimeType ("test.g") << endl;
cout << "test. " << sequencelogic::GuessMimeType ("test.") << endl;
cout << "test " << sequencelogic::GuessMimeType ("test") << endl;
return rc;
}
int TestRandom()
{
std::string pw ("");
unsigned char buff[32768];
EyeDRBG* drbg = new EyeDRBG ((unsigned char*)"000000:tim,favbook::BOB,flame::BOB,kiss::BOB]", strlen ("000000:tim,favbook::BOB,flame::BOB,kiss::BOB]"));
drbg->RandBytes (buff, 4096);
ofstream file ("drbg", ios::out | ios::binary | ios::trunc);
if (file.is_open()) {
file.write ((char*)buff, 4096);
file.close();
}
delete drbg;
#ifdef ENTROPY_VALIDATION
// Create 3 different files with 4096 bytes of "random" data. The program "ent" can be used to
// analyze these using statistical techniques for randomness.
drbg = new EyeDRBG ((unsigned char*)"ALANRENOTOBYKEITH", strlen ("ALANRENOTOBYKEITH"));
drbg->RandBytes (buff, 4096);
ofstream nfile ("drbg1", ios::out | ios::binary | ios::trunc);
if (nfile.is_open()) {
nfile.write ((char*)buff, 4096);
nfile.close();
}
delete drbg;
sequencelogic::RandomBytes (buff, 4096);
ofstream rfile ("rand", ios::out | ios::binary | ios::trunc);
if (rfile.is_open()) {
rfile.write ((char*)buff, 4096);
rfile.close();
}
#endif
// Generate 8 base32 and base64 passwords
size_t i = 0;
printf ("Base32: ");
for (i = 0; i < 8; ++i) {
pw = RandomBase32 (8);
printf ("%s ", pw.c_str());
}
printf ("\nBase64: ");
for (i = 0; i < 8; ++i) {
pw = RandomBase64 (8);
printf ("%s ", pw.c_str());
}
printf ("\nSimple: ");
for (i = 0; i < 8; ++i) {
pw = RandomPassWord (8, passwordset);
printf ("%s ", pw.c_str());
}
printf ("\nBest: ");
for (i = 0; i < 6; ++i) {
pw = RandomPassWord (10, NULL);
printf ("%s ", pw.c_str());
}
printf ("\n");
return 0;
}
int TestRSAKeyGeneration()
{
Key rkey;
Keyring ring ("RSA", "tests");
ring.GenerateRSAKey ("challenges", "test to match JS implementation", challenges);
ring.GetKey ("challenges", rkey);
cout << rkey.GetPubKey() << endl;
ring.GenerateRSAKey ("challenges1", "test to match JS implementation", challenges1);
ring.GetKey ("challenges1", rkey);
cout << rkey.GetPubKey() << endl;
ring.GenerateRSAKey ("challenges2", "test to match JS implementation", challenges2);
ring.GetKey ("challenges2", rkey);
cout << rkey.GetPubKey() << endl;
ring.GenerateRSAKey ("IOnUBob", "test to match JS implementation", "IOnU,Bob,Bob,Bob");
ring.GetKey ("IOnUBob", rkey);
cout << rkey.PublicKeyFingerPrint() << endl;
ring.GenerateRSAKey ("IONUBob", "test to match JS implementation", "IONU,Bob,Bob,Bob");
ring.GetKey ("IONUBob", rkey);
cout << rkey.PublicKeyFingerPrint() << endl;
#ifndef WIN32
std::vector<std::string> answers;
for (size_t i = 0; i < 10; ++i) {
size_t pos = rand() &0x000F;
std::string challengeResponse = challengeQuestions[pos];
challengeResponse += ":";
challengeResponse += challengeAnswers[pos];
answers.push_back (challengeResponse);
pos = rand() &0x000F;
challengeResponse = challengeQuestions[pos];
challengeResponse += ":";
challengeResponse += challengeAnswers[pos];
answers.push_back (challengeResponse);
pos = rand() &0x000F;
challengeResponse = challengeQuestions[pos];
challengeResponse += ":";
challengeResponse += challengeAnswers[pos];
answers.push_back (challengeResponse);
std::sort (answers.begin(), answers.end());
challengeResponse = "[\"IOnU\",";
for (string &answer : answers) {
challengeResponse += "\"";
challengeResponse += answer;
}
challengeResponse += "\"]";
cout << challengeResponse << endl;
answers.clear();
//ring.GenerateRSAKey ("RSA", "", challengeResponse);
}
#endif
return 0;
}
int TestKeys()
{
int rc = 0;
unsigned char* pbuff = NULL;
Key* k = NULL;
size_t bytes = 0;
unsigned char* back = NULL;
printf ("\nKeyring tests\n-------------------------------\n");
const char* goodword = "password";
const char* badword = "wrong";
unsigned char hi[SL_AES_KEY_LEN];
unsigned char good[SL_AES_KEY_LEN];
unsigned char bad[SL_AES_KEY_LEN];
unsigned char aes[SL_AES_KEY_LEN];
ionu_derive_key (shortword, hi);
ionu_derive_key (goodword, good);
ionu_derive_key (badword, bad);
Key qKey ("Good", "", SL_AES_KEY_LEN, good, Key::AES);
// Test JSON and SQLite based keyrings for interop
Keyring qtest ("SQLite", "test/qtest.iks", qKey);
qtest.AddKey ("CloudGuard", "CG half key", SL_AES_KEY_LEN, good, Key::AES);
qtest.AddKey ("String", "", 6, (unsigned char*)"string", Key::STRING);
Keyring utest ("JSON", "");
cout << qtest.Stringify (qKey) << endl;
utest.LoadFromJSON (qtest.Stringify (qKey));
cout << utest.Stringify (qKey) << endl;
utest.Unlock (good);
const Key* uk = utest.GetKey ("CloudGuard");
const Key* qk = qtest.GetKey ("CloudGuard");
if (!uk->Equals (*qk))
rc += testfailed ("SQLite and JSON key mismatch", "CloudGuard");
else
printf ("JSON and SQLite based keyrings interop passed\n");
uk->Dump();
qk->Dump();
// Test public key encrypt/decrypt
k = new Key ("test", "Import/Export", "test/private_key.pem", "");
pbuff = k->PublicKeyEncrypt ((unsigned char*)"Howdy", 6, &bytes);
printf ("PK howdy %d bytes\n", (int)bytes);
if (pbuff) {
printf ("Howdy 6 bytes in, %d bytes out\n", (int)bytes);
back = k->PrivateKeyDecrypt (pbuff, bytes, &bytes);
if (strcmp ((char*)back, "Howdy") != 0)
rc += testfailed ("pkey decrypt", (char*)back);
else
printf ("Howdy, decrypted %d bytes\n", (int)bytes);
delete[] back;
delete[] pbuff;
}
else
rc += testfailed ("pkey encrypt", "Howdy");
delete k;
k = new Key ("test", "Import/Export", "test/private_key.der", "");
k->Export ("t.pem", "");
if (! filecompare ("t.pem", "test/private_key.pem"))
rc += testfailed ("Export (from der)", "t.pem");
delete k;
// TODO, get import of encrypted keys working
//k = new Key ("test", "Import/Export", "test/pk8_des.pem", "pk8_des");
//delete k;
//k = new Key ("test", "Import/Export", "test/pk8_3des.pem", "pk8_3des");
//delete k;
// Create a keyring, add 3 keys and lock with short password
Keyring* ring = new Keyring ("testring", "Test Key Ring");
Key* key1 = new Key ("Sample", "do not duplicate", 16, (const unsigned char*) "0123456789abcdef", Key::GENERIC);
key1->Dump();
Key* key2 = new Key ("Example", "do duplicate", 16, (const unsigned char*) "fedcba9876543210", Key::STRING);
//key2->Dump();
//Key* key3 = new Key ("6a0ce1ec504b", "TGI good", SL_AES_KEY_LEN, good, Key::TGI);
//Key* key4 = new Key ("ea7cb39afc1a", "TGI bad", SL_AES_KEY_LEN, bad, Key::TGI);
//key3->Dump();
if (! ring->AddKey (key1))
rc += testfailed ("Keyring::AddKey", key1->GetName());
if (! ring->AddKey (key2))
rc += testfailed ("Keyring::AddKey", key2->GetName());
//if (! ring->AddKey (key3))
// rc += testfailed ("Keyring::AddKey", key3->GetName());
ring->Dump();
//ring->AddKey (key4);
//ring->Dump();
//key3 = new Key ("6a0ce1ec504b", "SL good", SL_AES_KEY_LEN, good, Key::TGI);
//ring->AddKey (key3);
//key3 = new Key ("6a0ce1ec504b", "SL good", SL_AES_KEY_LEN, good, Key::TGI);
if (ring->Lock (shortword))
printf ("Lock succeeded\n");
else
rc += testfailed ("Keyring::Lock", shortword);
// Unlock with short password and verify keys
if (ring->Unlock (shortword))
printf ("Unlock succeeded\n");
else
rc += testfailed ("Keyring::Unlock", shortword);
if (! ring->GetKey (key1->GetName()))
rc += testfailed ("Keyring::GetKey", key1->GetName());
if (! ring->GetKey (key2->GetName()))
rc += testfailed ("Keyring::GetKey", key2->GetName());
//if (! ring->GetKey (key3->GetName()))
// rc += testfailed ("Keyring::GetKey", key3->GetName());
k = new Key ("Example", "updated", 16, (const unsigned char*) "0123fedcba987654", Key::STRING);
if (! ring->UpdateKey (k))
rc += testfailed ("Keyring::UpdateKey", key2->GetName());
delete k;
const Key* ck = ring->GetKey (key2->GetName());
ck->Dump();
// Lock with new password
ring->Lock (goodword);
//ck = ring->GetKey (key3->GetName());
//ck->Dump();
ring->Unlock (goodword);
ck = ring->GetKey (key2->GetName());
if (strncmp ((char*)ck->GetKey(), "0123fedcba987654", 16) != 0)
rc += testfailed ("Keyring::GetKey decrypted", k->GetName());
else
printf ("Key decrypt succeeded\n");
ring->Dump();
/*
if (!ring->RenewTGICache(43200)) // Set expiration to 1/2 day
rc += testfailed ("Keyring::RenewTGICache", ring->GetName());
ring->Dump();
if (!ring->ClearTGICache())
rc += testfailed ("Keyring::ClearTGICache", ring->GetName());
if (ring->GetNumKeys() != 2)
rc += testfailed ("Keyring::ClearTGICache", ring->GetName());
if (!ring->RenewTGICache(-2*86400)) // Subtract 2 days from the expiration
rc += testfailed ("Keyring::RenewTGICache", ring->GetName());
if (!ring->ClearTGICache())
rc += testfailed ("Keyring::ClearTGICache", ring->GetName());
delete key3;
key3 = new Key ("6a0ce1ec504b", "TGI sig/key pair", SL_AES_KEY_LEN, good, Key::TGI);
ring->AddKey (key3); // Add the TGI key back
if (!ring->RenewTGICache(-2*86400)) // Set expiration to 2 days ago
rc += testfailed ("Keyring::RenewTGICache", ring->GetName());
ring->Lock (goodword);
ring->SaveAs (keystore);
delete ring;
ring = new Keyring (keystore);
if (!ring->Unlock (goodword))
rc += testfailed ("Keyring::Unlock after TGI", ring->GetName());
//ring->Dump();
if (ring->GetKey("TGIsignature"))
rc += testfailed ("Keyring::ClearTGICache (not expired)", ring->GetName());
else
printf ("TGI key expiration test succeeded\n");
*/
// Import from X.509, generate pin hash
if (!ring->ImportPubKeyFromCert ("test/ionu.pem"))
rc += testfailed ("Keyring::ImportPubKeyFromCert", "test_cert.pem");
else {
const Key* pub = ring->GetKey ("cert");
if (pub) {
pub->Export ("cert_pk.der", "");
std::string pin = sequencelogic::DigestFile ("sha1", "cert_pk.der");
cout << "X.509 pin hash: " << pin << endl;
}
else {
rc += testfailed ("Keyring::ImportPubKeyFromCert get pubkey", "cert");
Key junk;
cout << ring->Stringify (junk);
}
}
// Generate RSA key pair
if (ring->GenerateRSAKey("CloudGuard", "RSA keypair"))
printf ("Generated RSA keypair\n");
else
rc += testfailed ("GeneratedRSAKey", "CloudGuard");
const Key* privateK = ring->GetKey("CloudGuard");
// Test RSA IES hybrid encryption
pbuff = privateK->RSAIESEncrypt ((unsigned char*)megaMeta, strlen(megaMeta)+1, &bytes);
back = privateK->RSAIESDecrypt (pbuff, bytes, &bytes);
if (sequencelogic::StrCmp ((char*)back, megaMeta) != 0)
rc += testfailed ("RSAIESEncrypt()", "CloudGuard");
if (pbuff) delete[] pbuff;
if (back) delete[] back;
char* pk = ring->GetPubKey("CloudGuard");
if (!pk)
rc += testfailed ("Keyring::GetPubKey", "CloudGuard not found");
else if (strncmp (pk, "-----BEGIN PUBLIC KEY", 21) != 0)
rc += testfailed ("Keyring::GetPubKey", "CloudGuard");
Key* publicK = NULL;
if (pk) {
publicK = new Key ("CgPublic", "CloudGuard public key", (int)strlen(pk), (const unsigned char*) pk, Key::RSA_PUBLIC);
delete[] pk;
// Test public key encrypt/decrypt
pbuff = publicK->PublicKeyEncrypt ((unsigned char*)"Howdy", 6, &bytes);
if (pbuff) {
back = privateK->PrivateKeyDecrypt (pbuff, bytes, &bytes);
if (back == nullptr || strcmp ((char*)back, "Howdy") != 0)
rc += testfailed ("pkey decrypt", (char*)back);
if (back) delete[] back;
// Try decrypt with wrong private key
Key* badBOT = new Key ("BadBot", "RSA key", (int)strlen(BOT_private), (const unsigned char*)BOT_private, Key::RSA);
back = badBOT->PrivateKeyDecrypt (pbuff, 256, &bytes);
if (back || bytes > 0)
rc += testfailed ("badBOT decrypt", (char*)back);
else
printf ("RSA decrypt test with wrong key succeeded\n");
delete[] pbuff;
}
else
rc += testfailed ("pkey encrypt", "Howdy");
pbuff = privateK->PrivateKeySign ((unsigned char*)"ydwoH", 6, &bytes);
if (pbuff) {
// Verify match and not matched
if (publicK->PublicKeyVerify (pbuff, bytes, (unsigned char*)"ydwoH", 6) != 1)
rc += testfailed ("pkey verify", "ydwoH");
else
printf ("Sign and very tests passed\n");
if (publicK->PublicKeyVerify (pbuff, bytes, (unsigned char*)"Howdy", 6) == 1)
rc += testfailed ("pkey verify bad", "Howdy");
delete[] pbuff;
}
else
rc += testfailed ("pkey sign:", "ydwoH");
}
// Test secret + challenge key generation
Keyring sss ("Secret", "test");
Key k1, k2, k3, k4;
std::string sname = "RSA - secret";
std::string sdesc = "test";
std::string schal = "";
std::string ssalt = "";
std::string sempty = "";
std::string ssret ("secret78$joe@gmail.com$urn:sl:001001:::");
std::string van ("urn:sl:001001:::");
#ifdef LIN64
std::vector<std::string> elist ({ "joe@sequencelogic.net", "jenny@sequencelogic.net", "jones@sequencelogic.net" });
if (!sss.GenerateRSAKeys (van, elist))
rc += testfailed ("Corporate email based pre-provisioning", "bulk");
#endif
// Verify old style unsalted challenges
sss.GenerateRSAKey ("RSA-old", "", "[sequencelogic::challenges]");
sss.GenerateRSAKey ("RSA-new", sempty, "[sequencelogic::challenges]", sempty, sempty);
sss.GetKey ("RSA-old", k1);
sss.GetKey ("RSA-new", k2);
if (k1.Equals (k2))
printf ("Unsalted key generation tests passed\n");
else
rc += testfailed ("Unsalted challenge key generation tests", "RSA - old != new");
// Verify random salted challenges
unsigned char rsalt[SL_SHA256_LEN];
char b64[SL_SHA256_LEN * 4];
sequencelogic::RandomBytes (SL_SHA256_LEN, rsalt);
sequencelogic::Base64Encode (rsalt, SL_SHA256_LEN, b64);
std::string bsalt = b64;
sss.GenerateRSAKey ("RSA-salted1", sempty, "[sequencelogic::challenges]", sempty, bsalt);
sequencelogic::BinaryToHex (rsalt, SL_SHA256_LEN, b64);
std::string hsalt = b64;
sss.GenerateRSAKey ("RSA-salted1h", sempty, "[sequencelogic::challenges]", sempty, hsalt);
sequencelogic::RandomBytes (SL_SHA256_LEN, rsalt);
sequencelogic::Base64Encode (rsalt, SL_SHA256_LEN, b64);
bsalt = b64;
sss.GenerateRSAKey ("RSA-salted2", sempty, "[sequencelogic::challenges]", sempty, bsalt);
bsalt = "random";
sss.GenerateRSAKey ("RSA-salter", sempty, "[sequencelogic::challenges]", sempty, bsalt);
sss.GetKey ("RSA-salted1", k1);
sss.GetKey ("RSA-salted1h", k2);
sss.GetKey ("RSA-salted2", k3);
sss.GetKey ("RSA-salter", k4);
if (k1.Equals (k3) && !(k1.Equals (k2)) && !(k1.Equals (k4)))
rc += testfailed ("Salted challenge key generation tests", "RSA - salted 1 = 2");
else
printf ("Random salted key generation tests passed\n");
// Verify secret based keys
sss.GenerateRSAKey (sname, sdesc, schal, ssret, ssalt);
sss.GetKey (sname, k1);
schal = "[sequencelogic::challenges]";
sname = "RSA - secret + challenge";
// Create key with secret, and return "salt"
sss.GenerateRSAKey (sname, sdesc, schal, ssret, ssalt);
sss.GetKey (sname, k2);
ssret = "";
// Create key with challenges and "salt"
sname = "RSA - secret + salt";
sss.GenerateRSAKey (sname, sdesc, schal, ssret, ssalt);
sss.GetKey (sname, k3);
if (k1.Equals (k2) && k1.Equals (k3))
printf ("Secret challenge key generation tests passed\n");
else {
k1.Dump();
k2.Dump();
k3.Dump();
rc += testfailed ("Secret challenge key generation tests", "RSA - secret");
}
// Test EC key generation and ECDH generation of shared secret between peers
ring->GenerateECKey("me", "mine");
ring->GenerateECKey("peer", "theirs");
ring->GenerateECKey("third", "theirs");
pk = ring->GetPubKey ("me");
Key* mypubkey = new Key ("EcPublic", "Electric CloudGuard public key", (int)strlen(pk), (const unsigned char*) pk, Key::EC_PUBLIC);
delete[] pk;
pk = ring->GetPubKey ("peer");
Key* peerpubkey = new Key ("EcPublic", "Electric CloudGuard public key", (int)strlen(pk), (const unsigned char*) pk, Key::EC_PUBLIC);
peerpubkey->Export ("test/ec_pub.pem", "");
delete[] pk;
ring->GenerateECKey ("MyChallenge", "deterministic", challenges);
ring->GenerateECKey ("PeerChallenge", "deterministic", challenges1);
const Key* me = ring->GetKey ("me");
me->Export ("test/ec_priv.pem", "");
const Key* peer = ring->GetKey ("peer");
const Key* third = ring->GetKey ("third");
const Key* mychallenge = ring->GetKey ("MyChallenge");
mychallenge->Export ("test/ec_challenge.pem", "");
const Key* peerchallenge = ring->GetKey ("PeerChallenge");
unsigned char* secret = NULL;
size_t secret_len;
char ascii[256];
secret = me->GenerateECDHSecret (peer, &secret_len);
sequencelogic::Base64Encode (secret, secret_len, ascii);
printf ("ECDH m+p: %s\n", ascii);
delete[] secret;
secret = me->GenerateECDHSecret (peerpubkey, &secret_len);
sequencelogic::Base64Encode (secret, secret_len, ascii);
printf ("ECDH m+p: %s\n", ascii);
delete[] secret;
secret = peer->GenerateECDHSecret (me, &secret_len);
sequencelogic::Base64Encode (secret, secret_len, ascii);
printf ("ECDH p+m: %s\n", ascii);
delete[] secret;
secret = me->GenerateECDHSecret (third, &secret_len);
sequencelogic::Base64Encode (secret, secret_len, ascii);
printf ("ECDH m+t: %s\n", ascii);
delete[] secret;
secret = third->GenerateECDHSecret (me, &secret_len);
sequencelogic::Base64Encode (secret, secret_len, ascii);
printf ("ECDH t+m: %s\n", ascii);
delete[] secret;
secret = peer->GenerateECDHSecret (third, &secret_len);
sequencelogic::Base64Encode (secret, secret_len, ascii);
printf ("ECDH p+t: %s\n", ascii);
delete[] secret;
secret = third->GenerateECDHSecret (peer, &secret_len);
sequencelogic::Base64Encode (secret, secret_len, ascii);
printf ("ECDH t+p: %s\n", ascii);
delete[] secret;
secret = mychallenge->GenerateECDHSecret (peerchallenge, &secret_len);
sequencelogic::Base64Encode (secret, secret_len, ascii);
printf ("ECDH challenge m+p: %s\n", ascii);
delete[] secret;
secret = peerchallenge->GenerateECDHSecret (mychallenge, &secret_len);
sequencelogic::Base64Encode (secret, secret_len, ascii);
printf ("ECDH challenge p+m: %s\n", ascii);
delete[] secret;
// Test EC public key encrypt/decrypt
pbuff = me->ECDHEncrypt (peerpubkey, (unsigned char*)"Howdy we are having some funny now", 35, &bytes);
//printf ("EC: PK howdy %d bytes\n", (int)bytes);
if (pbuff) {
printf ("EC: Howdy 35 bytes in, %d bytes out\n", (int)bytes);
back = peer->ECDHDecrypt (mypubkey, pbuff, bytes, &bytes);
if (strcmp ((char*)back, "Howdy we are having some funny now") != 0)
rc += testfailed ("pkey decrypt", (char*)back);
else
printf ("EC: %s, decrypted %d bytes\n", (char*)back, (int)bytes);
delete[] back;
delete[] pbuff;
}
else
rc += testfailed ("EC: pkey encrypt", "Howdy");
pbuff = me->ECDHEncrypt (peerpubkey, (unsigned char*)"Howdy we are having some funny now", 35, &bytes);
if (pbuff) {
pbuff[bytes - 2] = 85;
back = peer->ECDHDecrypt (mypubkey, pbuff, bytes, &bytes);
if (back)
rc += testfailed ("EC: authentication", "HMAC");
else
printf ("EC: Authentication fail test passed\n");
delete[] pbuff;
}
pbuff = me->ECDHEncrypt (peerpubkey, hi, SL_AES_KEY_LEN, &bytes);
if (pbuff) {
printf ("EC: AES 32 bytes in, %d bytes out\n", (int)bytes);
back = peer->ECDHDecrypt (mypubkey, pbuff, bytes, &bytes);
if (sequencelogic::MemCmp (back, hi, SL_AES_KEY_LEN) != 0)
rc += testfailed ("pkey aes decrypt", (char*)back);
else
printf ("ECDH encrypt/decrypt of AES key passed\n");
delete[] pbuff;
delete[] back;
}
else
rc += testfailed ("pkey encrypt", "Howdy");
pbuff = mypubkey->ECIESEncrypt ((unsigned char*)"Howdy we are having some ecies now", 35, &bytes);
back = me->ECIESDecrypt (pbuff, bytes, &bytes);
if (!back || strcmp ((char*)back, "Howdy we are having some ecies now") != 0)
rc += testfailed ("ECIES encryption failed", (char*)back);
else
printf ("ECIES me encrypt/decrypt passed - %s\n", (char*)back);
delete[] pbuff;
delete[] back;
pbuff = peerpubkey->ECIESEncrypt ((unsigned char*)"Howdy we are having some ecies fun", 35, &bytes);
back = peer->ECIESDecrypt (pbuff, bytes, &bytes);
if (!back || strcmp ((char*)back, "Howdy we are having some ecies fun") != 0)
rc += testfailed ("ECIES encryption failed", (char*)back);
else
printf ("ECIES peer encrypt/decrypt passed - %s\n", (char*)back);
delete[] pbuff;
delete[] back;
delete peerpubkey;
delete mypubkey;
// Test AES key generation, symmetric en/decrypt and public key encrypt/decrypt of that key
ring->GenerateAESKey("CloudGuardTGI", "TGI half key");
const Key* aesKey = ring->GetKey ("CloudGuardTGI");
unsigned char iv[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'a', 'b', 'c', 'd', 'e', 'f'};
size_t ebytes = 0;
unsigned char* ct = aesKey->SymmetricEncryptBuffer ((unsigned char*)PERMS, strlen (PERMS), &ebytes, iv);
unsigned char* pt = aesKey->SymmetricDecryptBuffer (ct, ebytes, &ebytes, iv);
if (sequencelogic::MemCmp (pt, PERMS, strlen (PERMS)) != 0)
rc += testfailed ("Key::SymmetricEncryptBuffer", "perms");
delete[] ct;
delete[] pt;
aesKey->SymmetricEncryptFile (testfile, "test/tartest.enc", iv);
aesKey->SymmetricDecryptFile ("test/tartest.enc", "test/tartest.dec", iv);
if (filecompare (testfile, "test/tartest.dec"))
printf ("SymmetricEncryptFile tartest.txt\n");
else
rc += testfailed ("Key::SymmetricEncryptFile", testfile);
// Test 128 bit key
unsigned char b128[16];
sequencelogic::RandomBytes (16, b128);
Key aes128 ("AES 128", "CBC", 16, b128, Key::AES);
ct = aes128.SymmetricEncryptBuffer ((unsigned char*)PERMS, strlen (PERMS), &ebytes, iv);
pt = aes128.SymmetricDecryptBuffer (ct, ebytes, &ebytes, iv);
if (sequencelogic::MemCmp (pt, PERMS, ebytes) != 0)
rc += testfailed ("Key::SymmetricEncryptBuffer aes128cbc", "perms");
delete[] ct;
delete[] pt;
// Test Authenticated GCM with and without additional authenticated data
unsigned char aad[] = {'a', 'a', 'd', 'd'};
unsigned char abd[] = {'a', 'b', 'd', 'd'};
// No aad
ct = aesKey->SymmetricEncryptAuthenticated ((unsigned char*)PERMS, strlen (PERMS), &ebytes, iv);
pt = aesKey->SymmetricDecryptAuthenticated (ct, ebytes, &ebytes, iv);
if (sequencelogic::MemCmp (pt, PERMS, ebytes) != 0)
rc += testfailed ("Key::SymmetricEncryptAuthenticated", "");
delete[] ct;
delete[] pt;
// With aad
ct = aesKey->SymmetricEncryptAuthenticated ((unsigned char*)PERMS, strlen (PERMS), &ebytes, iv, aad, 4);
pt = aesKey->SymmetricDecryptAuthenticated (ct, ebytes, &ebytes, iv, aad, 4);
if (sequencelogic::MemCmp (pt, PERMS, ebytes) != 0)
rc += testfailed ("Key::SymmetricEncryptAuthenticated", "+ aad");
delete[] pt;
// With invalid aad
pt = aesKey->SymmetricDecryptAuthenticated (ct, ebytes, &ebytes, iv, abd, 4);
if (pt)
rc += testfailed ("Key::SymmetricEncryptAuthenticated", "bad aad");
delete[] ct;
memcpy (aes, ring->GetKey ("CloudGuardTGI")->GetKey(), SL_AES_KEY_LEN);
pbuff = publicK->PublicKeyEncrypt (aes, SL_AES_KEY_LEN, &bytes);
if (pbuff) {
back = privateK->PrivateKeyDecrypt (pbuff, bytes, &bytes);
if (sequencelogic::MemCmp (back, aes, SL_AES_KEY_LEN) != 0)
rc += testfailed ("pkey aes decrypt", (char*)back);
else
printf ("TGI half key tests passed\n");
delete[] pbuff;
delete[] back;
}
else
rc += testfailed ("pkey encrypt", "Howdy");
delete publicK;
//ring->GenerateRSAKey ("Holy", "moly", challenges);
ring->Dump();
ring->Lock (goodword);
ring->Unlock (goodword);
ring->Lock (goodword);
unsigned char salt[SL_AES_KEY_LEN];
sequencelogic::GenerateCGKey ("u3K2*l$qZ0a<", aes, salt);
if (sequencelogic::ValidateCGKey ("u3K2*l$qZ0a<", aes, salt))
printf ("CG key generate/validate passed\n");
if (sequencelogic::ValidateCGKey ("not good", aes, salt))
rc += testfailed ("CG validate", "not good");
memset (salt, 85, SL_AES_KEY_LEN);
if (sequencelogic::ValidateCGKey ("u3K2*l$qZ0a<", aes, salt))
rc += testfailed ("CG validate", "who passed the pepper?");
// Failure tests, bad password
if (ring->Unlock (badword))
rc += testfailed ("Keyring::Unlock", badword);
if (!ring->Unlock (goodword))
rc += testfailed ("Keyring::Unlock", "after bad");
delete ring;
// Create a keyring, add 10000 keys, lock, save, delete, load and find the 4777th key
ring = new Keyring ("testring", "Test Key Ring");
char keyname[32];
for (int i = 0; i < 10000; ++i) {
sprintf (keyname, "key%d", i);
Key* key = new Key (keyname, "one of many", 16, (const unsigned char*) "0123456789abcdef", Key::GENERIC);
if (! ring->AddKey (key))
rc += testfailed ("Keyring::AddKey", keyname);
}
ring->Lock (goodword);
ring->SaveAs ("test/thousand.iks");
delete ring;
ms = sequencelogic::GetSystemTime();
ring = new Keyring ("test/thousand.iks");
ring->Unlock (goodword);
if (! ring->GetKey ("key4777"))
rc += testfailed ("Keyring::GetKey", "key4777");
else {
ms = sequencelogic::GetSystemTime() - ms;
printf ("Loaded 10,000 keys, unlocked and found key4777 in %ld ms\n", ms);
}
if (! ring->RemoveKey ("key4777"))
rc += testfailed ("Keyring::RemoveKey", "key4777");
if (ring->GetNumKeys() != 9999)
rc += testfailed ("Keyring::RemoveKey", "9999");
delete ring;
// Test linked key rings
ring = new Keyring ("testring", "Test Linked Key Rings");
key1 = new Key ("Test", "key", 16, (const unsigned char*) "fedcba9876543210", Key::STRING);
key2 = new Key ("Example", "do duplicate", 16, (const unsigned char*) "fedcba9876543210", Key::STRING);
ring->AddKey (key1);
ring->Lock (goodword);
ring->SaveAs ("test/linked.iks");
delete ring;
ring = new Keyring ("test/linked.iks");
ring->Unlock (good);
Keyring* link1 = new Keyring ("private ring", "Private Key Ring");
Keyring* link2 = new Keyring ("public ring", "Public Key Ring");
link2->AddKey (key2);
ring->AddKeyring (link1);
ring->AddKeyring (link2);
ring->Lock (goodword);
ring->SaveAs ("test/linked.iks");
delete ring;
ring = new Keyring ("test/linked.iks");
ring->Unlock (goodword);
const Keyring* t = ring->GetKeyring ("public ring");
if (!t)
rc += testfailed ("GetKeyring", "public ring");
if (t && !t->GetKey ("Example"))
rc += testfailed ("GetKeyring()->GetKey()", "Example");
if (!ring->RemoveKeyring ("public ring"))
rc += testfailed ("RemoveKeyring", "public ring");
delete ring;
int rrc = rc;
k = new Key ("test", "Import/Export", "test/private_key.pem", "");
k->Export ("t.pem", "");
if (! filecompare ("t.pem", "test/private_key.pem"))
rc += testfailed ("Export", "t.pem");
k->Export ("t.der", "");
if (! filecompare ("t.der", "test/private_key.der"))
rc += testfailed ("Export", "t.der");
if (!k->Import ("test/ec_challenge.pem" , "") || k->GetType() != Key::EC)
rc += testfailed ("Import", "test/ec_challenge.pem");
if (!k->Import ("test/ec_pub.pem" , "") || k->GetType() != Key::EC_PUBLIC)
rc += testfailed ("Import", "test/ec_pub.pem");
if (!k->Import ("test/private_key.pem" , "") || k->GetType() != Key::RSA)
rc += testfailed ("Import", "test/private_key.pem");
if (!k->Import ("test/public_key.pem" , "") || k->GetType() != Key::RSA_PUBLIC)
rc += testfailed ("Import", "test/public_key.pem");
if (k->Import ("test/test_cert.pem" , "") || k->GetType() != Key::GENERIC)
rc += testfailed ("Import", "test/test_cert.pem");
// Verify PEM and JSON loaded keys match
Key BOT ("Bot", "RSA key", BOT_public, Key::RSA_PUBLIC);
Key JBOT ("jsonBot", "RSA key", BOT_jsonkey, Key::RSA_PUBLIC);
EyeJSONObject botJSON (BOT_json);
EyeJSONScalar* botpk = (EyeJSONScalar*)botJSON.GetMember ("publicKey");
if (sequencelogic::StrCmp ((char*)BOT.GetKey(), botpk->GetValue()) != 0)
rc += testfailed ("{publicKey:", "BOT_json}");
if (!BOT.Equals (JBOT))
rc += testfailed ("JSON String", "BOT_jsonkey");
if (rc == rrc)
printf ("Import/Export tests passed\n");
delete k;
printf ("Bad keyring tests\n");
ring = new Keyring ((char*)good);
delete ring;
ring = new Keyring ("test/test.ionu");
delete ring;
ring = new Keyring ("test/badmagic.iks");
ring->Unlock (good);
if (ring->GetKey ("Test"))
rc += testfailed ("GetKey", "bad magic");
delete ring;
ring = new Keyring ("test/badiv.iks");
if (ring->Unlock (good))
rc += testfailed ("GetKey", "bad iv");
delete ring;
ring = new Keyring ("test/badigest.iks");
if (ring->Unlock (good))
rc += testfailed ("GetKey", "bad digest");
delete ring;
ring = new Keyring ("test/munged.iks");
ring->Unlock (good);
if (ring->GetKey ("Test"))
rc += testfailed ("GetKey", "munged");
delete ring;
// Test SQLite based keyring
std::string sqlkeyname = "SQLtest";
Key mkey ("Meta", "ring key", SL_AES_KEY_LEN, good, Key::AES);
Keyring sqlring ("SQLite", "keys.db", mkey);
sqlring.AddKey ("SQLtest", "AES key", SL_AES_KEY_LEN, bad, Key::AES);
sqlring.AddKey ("test", "AES key", SL_AES_KEY_LEN, good, Key::AES);
cout << sqlring.GetKeyNames() << endl;;
cout << sqlring.Stringify (mkey) << endl;;
Key tkey;
sqlring.GetKey (sqlkeyname, tkey);
if (memcmp (tkey.GetKey(), bad, SL_AES_KEY_LEN) != 0)
rc += testfailed ("GetKey", "SQLite");
else
printf ("SQLite keyring test passed\n");
if (!sqlring.RemoveKey (sqlkeyname))
rc += testfailed ("RemoveKey", "test");
printf ("remove\n");
if (sqlring.GetKey (sqlkeyname, tkey))
rc += testfailed ("GetKey after RemoveKey", "test");
printf ("get\n");
sqlring.Dump();
printf ("dump\n");
if (rc == 0)
printf ("C++ Keyring tests passed\n-------------------------------\n");
unsigned char kk[4096];
const char* PEM = "-----BEGIN RSA PRIVATE KEY-----";
char prv[2048];
char pub[2048];
ionu_eyering_gen_rsa_pair (prv, pub);
//ionu_eyering_shred ("test/test.iks");
if (!ionu_eyering_create ("test/test.iks", "KeyRIng", "Local key ring", hi))
rc += testfailed ("ionu_eyering_create", "KeyRIng");
else
printf ("ionu_eyering_create() KeyRIng passed\n");
if (ionu_eyering_get_key ("test/test.iks", "CloudGuard", kk, hi))
rc += testfailed ("ionu_eyering_get_key", "no keys");
sequencelogic::RandomBytes (32, kk);
ionu_eyering_add_binkey ("test/test.iks", "AES", "Random AES key", SL_AES_KEY_LEN, kk, hi);
ionu_eyering_add_strkey ("test/test.iks", "Sample", "do not duplicate", "0123456789abcdef", hi);
//ionu_eyering_add_tgikey ("test/test.iks", "6a0ce1ec504b", "Cached TGI key", TGIkey, hi);
ionu_eyering_add_rsakey ("test/test.iks", "private", "Alan's private key", RSA_private, hi);
ionu_eyering_add_strkey ("test/test.iks", "perms", "Just JSON", PERMS, hi);
ionu_eyering_gen_rsa ("test/test.iks", "StorageGuard", "RSA keypair", hi);
ionu_eyering_gen_rsa ("test/test.iks", "Nikki", "RSA keypair", hi);
// Invite ch1, account ch2, provision ch3
ionu_eyering_gen_rsa_secret_challenge ("test/test.iks", "RSA-ch1", "pair", NULL, "secret78", NULL, hi);
char* sssalt = ionu_eyering_gen_rsa_secret_salt ("test/test.iks", "RSA-ch2", "pair", "[sequencelogic::json]", "secret78", hi);
ionu_eyering_gen_rsa_secret_challenge ("test/test.iks", "RSA-ch3", "pair", "[sequencelogic::json]", NULL, sssalt, hi);
char* ch1k = ionu_eyering_get_pubkey ("test/test.iks", "RSA-ch1", hi);
char* ch2k = ionu_eyering_get_pubkey ("test/test.iks", "RSA-ch2", hi);
char* ch3k = ionu_eyering_get_pubkey ("test/test.iks", "RSA-ch3", hi);
if (strcmp (ch1k, ch2k) == 0 && strcmp (ch1k, ch3k) == 0)
printf ("C secretly salted challenge key passed\n");
else
rc += testfailed ("ionu_eyering_gen_rsa_secret_challenge", "mismatched keys");
if (sssalt) free (sssalt);
if (ch1k) free (ch1k);
if (ch2k) free (ch2k);
if (ch3k) free (ch3k);
ionu_eyering_gen_rsa ("test/test.iks", "CloudGuard", "RSA keypair", hi);
ionu_eyering_gen_rsa ("test/test.iks", "CloudGuard", "RSA keypair", hi);
char* keynames = ionu_eyering_get_keynames ("test/test.iks");
printf ("Added: %s\n", keynames);
free (keynames);
char* strkey = ionu_eyering_get_strkey ("test/test.iks", "Sample", hi);
if (sequencelogic::StrCmp (strkey, "0123456789abcdef") != 0)
rc += testfailed ("ionu_eyering_get_strkey", "Sample");
if (strkey) free (strkey);
pk = ionu_eyering_get_pubkey ("test/test.iks", "CloudGuard", hi);
if (!pk || strncmp (pk, "-----BEGIN PUBLIC KEY", 21) != 0)
rc += testfailed ("ionu_eyering_get_pubkey", "CloudGuard");
free (pk);
ionu_eyering_get_key ("test/test.iks", "CloudGuard", kk, hi);
if (memcmp (kk, "-----BEGIN RSA PRIVATE KEY", 21) != 0)
rc += testfailed ("ionu_eyering_get_key", "CloudGuard");
strkey = ionu_eyering_get_strkey ("test/test.iks", "CloudGuard", hi);
if (memcmp (strkey, "-----BEGIN RSA PRIVATE KEY", 21) != 0)
rc += testfailed ("ionu_eyering_get_strkey", "CloudGuard");
if (strkey) free (strkey);
unsigned char rsabuff[256];
size_t rbytes = ionu_eyering_pubkey_encrypt ("test/test.iks", "CloudGuard", hi, bad, SL_AES_KEY_LEN, rsabuff);
rbytes = ionu_eyering_privatekey_decrypt ("test/test.iks", "CloudGuard", hi, rsabuff, rbytes, rsabuff);
if (rbytes != SL_AES_KEY_LEN || memcmp (bad, rsabuff, SL_AES_KEY_LEN) != 0)
rc += testfailed ("ionu_eyering_privatekey_decrypt", "Cloudgaurd");
else
printf ("ionu_eyering_pubkey_encrypt/privatekey_decrypt() passed\n");
size_t sbytes = ionu_eyering_privatekey_sign ("test/test.iks", "CloudGuard", hi, bad, SL_AES_KEY_LEN, rsabuff);
if (ionu_eyering_publickey_verify ("test/test.iks", "CloudGuard", hi, bad, SL_AES_KEY_LEN, rsabuff, sbytes))
printf ("ionu_eyering sign/verify() passed\n");
else
rc += testfailed ("ionu_eyering sign/verify() passed\n", "CloudGuard");
// Old libionu replacements (not secure and misnamed)
rbytes = ionu_eyering_rsaprivatekey_encrypt ("test/test.iks", "CloudGuard", hi, bad, SL_AES_KEY_LEN, rsabuff);
rbytes = ionu_eyering_rsapublickey_decrypt ("test/test.iks", "CloudGuard", hi, rsabuff, rbytes, rsabuff);
if (rbytes != SL_AES_KEY_LEN || memcmp (bad, rsabuff, SL_AES_KEY_LEN) != 0)
rc += testfailed ("ionu_eyering_rsapublickey_decrypt", "Cloudgaurd");
else
printf ("ionu_eyering_rsaprivatekey_encrypt/ionu_eyering_rsapublickey_decrypt() passed\n");
char public_pem[4096];
char private_pem[8192];
ionu_eyering_create ("test/rsa.iks", "KeyRIng", "RSA key ring", hi);
const char* ch = "-----BEGIN PUBLIC KEY-----\n\
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApmPB9KDsrOI1J6jntYbN\n\
Oj9uWUewW+cluNQ0fVCGqoDZ5WLLrz3kpKPlGkI93TraNh2KyyTGDNN0QnCMaOM4\n\
biPfl+z/7xaRTxcYPuoJnBy+a5pCpdLFFUa4qaWPEvF5d5WJesOtvNospEtvlDJJ\n\
EmftOHCCC4NcFxGizcIk4wS/YKlDmjQ0NuJ8bfYP83CqkP8+Pv+QRcdZb5hU1+ov\n\
pOIGfFRjczxkxCTPOqPj6JIhCmxIo93WP7fdKUBFYAnJG2dVCEPmApejJlNzFM7A\n\
otqlseFQ+W1mmpkzcV7sGDb4ej7xhC2YN+u9qMbSxrm1nh4RerXNU7HWD785ScSG\n\
lwIDAQAB\n\
-----END PUBLIC KEY-----";
const char* ch1 = "-----BEGIN PUBLIC KEY-----\n\
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAssBFYAQxvl3UxukRUKSQ\n\
+K/o925SAFeq4EkuGHbDYW3JtGznDBAbTigPgBRkYm5mTZoWFKBjyYRvtPNJCFHe\n\
gAxCmJnqgLELAdsMepBpRqsQQRhlIvCx2G8ppX4BrN+PMZvPMiAyjqL9Pt2ozvob\n\
Hguanc5T++8nx+sJ9S/s7jRZIaR8V3yHmSI0twAaaUKYWRejIXts3i827ObwOGaB\n\
qJSq+bEtMan3QeUUqsnnCZkSfQBHIaRPGFedgxQTGwP2//6efmKI4yY9ODNHd2na\n\
iLMZCLBNQaJZRK4/P7/RZriPzEAjXuQ6mEcIghJtNw7rpVI9GBZB48t8cUK0O8G8\n\
ewIDAQAB\n\
-----END PUBLIC KEY-----";
const char* ch2 = "-----BEGIN PUBLIC KEY-----\n\
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx8yaQrjmL0uUWX+SQxXY\n\
obZXnJlxR6T3tpYyyHCVg11KhzUHY19Rw8NT8bSWR4JDsR/LdML2BR80d4RLxTsy\n\
qi0/LU03y1vKM6y86/4SFoPOyb1VWekq2MWoNmXzUr69I/7vYUIMIKvbZWoUyzYr\n\
ulpsb3J2DzrSvi2nvJ8TTTGe7VSpUC8d+v7hcL1jagRosiHI5fS3ni2V1xg+FBlO\n\
o/BK/IE6Zw8V7o/AjKRE06F5Ve/ou1UNyb9pqLMd1FcMywUPqSSSQkoiQGTknH5O\n\
BEn52fOPy6p1Vf3CIcaSVQeazg6cvACW0+mGkNWtFwHDr6z42sOGHMYxmZA2TAU3\n\
vQIDAQAB\n\
-----END PUBLIC KEY-----";
ionu_eyering_gen_rsa_challenge_pair (challenges, private_pem, public_pem);
printf ("%s\n", public_pem);
if (memcmp (ch, public_pem, strlen(ch)) != 0)
rc += testfailed ("Challenge keygen", challenges);
ionu_eyering_gen_rsa_challenge_pair (challenges1, private_pem, public_pem);
printf ("%s\n", public_pem);
if (memcmp (ch1, public_pem, strlen(ch1)) != 0)
rc += testfailed ("Challenge keygen", challenges1);
ionu_eyering_gen_rsa_challenge_pair (challenges2, private_pem, public_pem);
printf ("%s\n", public_pem);
if (memcmp (ch2, public_pem, strlen(ch2)) != 0)
rc += testfailed ("Challenge keygen", challenges2);
ionu_eyering_add_rsakey ("test/rsa.iks", "public", "key", public_pem, hi);
ionu_eyering_add_rsakey ("test/rsa.iks", "private", "key", private_pem, hi);
rbytes = ionu_eyering_pubkey_encrypt ("test/rsa.iks", "public", hi, bad, SL_AES_KEY_LEN, rsabuff);
rbytes = ionu_eyering_privatekey_decrypt ("test/rsa.iks", "private", hi, rsabuff, rbytes, rsabuff);
if (rbytes != SL_AES_KEY_LEN || memcmp (bad, rsabuff, SL_AES_KEY_LEN) != 0)
rc += testfailed ("ionu_eyering_privatekey_decrypt", "public+private");
else
printf ("ionu_eyering_pubkey_encrypt/privatekey_decrypt() pub+priv passed\n");
/*
ionu_eyering_get_key ("test/test.iks", "6a0ce1ec504b", kk, hi);
if (memcmp (kk, TGIkey, SL_AES_KEY_LEN) != 0)
rc += testfailed ("ionu_eyering_get_key", "TGI key");
else
printf ("ionu_eyering_get_key() TGI passed\n");
*/
ionu_eyering_get_key ("test/test.iks", "private", kk, hi);
if (memcmp (kk, PEM, 6) != 0)
rc += testfailed ("ionu_eyering_get_key", PEM);
else
printf ("ionu_eyering_get_key() RSA passed\n");
ionu_eyering_get_key ("test/test.iks", "perms", kk, bad);
if (memcmp (kk, PERMS, strlen(PERMS)) == 0)
rc += testfailed ("ionu_eyering_get_key()", "wrong password");
else
printf ("ionu_eyering_get_key() wrong password check passed\n");
// change the key
ionu_eyering_change_key ("test/test.iks", hi, bad);
ionu_eyering_get_key ("test/test.iks", "perms", kk, bad);
if (memcmp (kk, PERMS, strlen(PERMS)) != 0)
rc += testfailed ("ionu_eyering_get_key()", "after rekey");
else
printf ("ionu_eyering_get_key() after rekey check passed\n");
ionu_eyering_change_key ("test/test.iks", bad, hi);
/*
ionu_eyering_clear_tgi_cache ("test/test.iks", hi);
if (ionu_eyering_get_key ("test/test.iks", "TGI", kk, hi))
rc += testfailed ("ionu_eyering_get_key", "should not be any TGI keys left");
else
printf ("ionu_eyering_clear_tgi_cache() passed\n");
ionu_eyering_get_key ("test/test.iks", "perms", kk, hi);
if (memcmp (kk, PERMS, strlen(PERMS)) != 0)
rc += testfailed ("ionu_eyering_get_key", "perms JSON data");
else
printf ("ionu_eyering_get_key() JSON data passed\n");
*/
ionu_eyering_create ("test/tim.iks", "KeyRIng", "Local key ring", good);
ionu_eyering_add_strkey ("test/tim.iks", "keyringConfig", "EyeGlass", JSON, good);
ionu_eyering_get_key ("test/tim.iks", "keyringConfig", kk, good);
if (memcmp (kk, "{\"van\":{\"_id\":\"urn:sl:000000:::\",\"name\":\"TEST VAN\",\"vanPublic\"", 64) != 0)
rc += testfailed ("Huge JSON", (char*)kk);
else
printf ("Huge JSON test passed\n");
ionu_eyering_add_strkey ("test/tim.iks", "Sample", "do not duplicate", "0123456789abcdef", good);
ionu_eyering_add_strkey("test/tim.iks", "foo", "Replace Test", "bar", good);
ionu_eyering_get_key ("test/tim.iks", "foo", kk, good);
if (memcmp(kk, "bar", 4) != 0){
rc += testfailed ("foobar", (char*)kk);
}
ionu_eyering_add_strkey("test/tim.iks", "foo", "Replaced bar with newbar", "newbar", good);
int len = ionu_eyering_get_key_len ("test/tim.iks", "foo", good);
if (len != 7){
rc += testfailed ("eyering_get_key_len", "7");
}
ionu_eyering_get_key ("test/tim.iks", "foo", kk, good);
if (memcmp(kk, "newbar", 7) != 0){
rc += testfailed ("newbar", (char*)kk);
}
else {
printf ("update key passed\n");
}
ionu_eyering_remove_key("test/tim.iks", "foo", good);
if (ionu_eyering_get_key ("test/tim.iks", "foo", kk, good))
rc += testfailed ("ionu_eyering_remove_key", "foo");
ionu_eyering_get_key ("test/tim.iks", "Sample", kk, good);
if (memcmp(kk, "0123", 4) != 0){
rc += testfailed ("sample", (char*)kk);
}
ionu_derive_cgkey ("u3K2*l$qZ0a<", kk);
sequencelogic::GenerateCGKey ("u3K2*l$qZ0a<", aes, salt);
if (ionu_validate_cgkey ("u3K2*l$qZ0a<", (unsigned char*)kk))
printf ("CG key generate/validate passed\n");
else
rc += testfailed ("CG validate", "u3K2*l$qZ0a<");
if (ionu_validate_cgkey ("not good", (unsigned char*)kk))
rc += testfailed ("CG validate", "not good");
memset (kk + SL_AES_KEY_LEN, 85, SL_AES_KEY_LEN);
if (ionu_validate_cgkey ("u3K2*l$qZ0a<", (unsigned char*)kk))
rc += testfailed ("CG validate", "who passed the pepper?");
// Test the challenge response RSA key generation
ionu_eyering_create ("test/challenge.iks", "KeyRing", "Private key ring", good);
ionu_eyering_gen_rsa_challenge ("test/challenge.iks", "Unit", "test", challenges, good);
char* upk = ionu_eyering_get_pubkey ("test/challenge.iks", "Unit", good);
ionu_eyering_gen_rsa_challenge ("test/challenge.iks", "Laramie", "test", challenges1, good);
pk = ionu_eyering_get_pubkey ("test/challenge.iks", "Laramie", good);
if (sequencelogic::StrCmp (upk, pk) == 0)
rc += testfailed ("Laramie", "is not Boulder");
free (pk);
ionu_eyering_gen_rsa_challenge ("test/challenge.iks", "Cervelo", "test", challenges2, good);
pk = ionu_eyering_get_pubkey ("test/challenge.iks", "Cervelo", good);
if (sequencelogic::StrCmp (upk, pk) == 0)
rc += testfailed ("Nikki", "is not Cervelo");
free (pk);
ionu_eyering_gen_rsa_challenge ("test/challenge.iks", "Unit2", "test", challenges, good);
pk = ionu_eyering_get_pubkey ("test/challenge.iks", "Unit2", good);
if (sequencelogic::StrCmp (upk, pk) != 0)
rc += testfailed ("Challenge", "is not repeated");
free (pk);
free (upk);
ionu_eyering_gen_rsa_challenge ("test/challenge.iks", "JavaScript", "test to match JS implementation", "IOnU,Bob,Bob,Bob", good);
#ifdef JS
char hex[512];
rbytes = ionu_eyering_pubkey_encrypt ("test/challenge.iks", "JavaScript", good, (unsigned char*)"TGIkey 32 bytes", 16, rsabuff);
sequencelogic::BinaryToHex (rsabuff, rbytes, hex);
printf ("%s\n", hex);
rbytes = ionu_eyering_pubkey_encrypt ("test/challenge.iks", "JavaScript", good, (unsigned char*)"TGIkey 32 bytes", 16, rsabuff);
sequencelogic::BinaryToHex (rsabuff, rbytes, hex);
printf ("%s\n", hex);
rbytes = ionu_eyering_privatekey_decrypt ("test/challenge.iks", "JavaScript", good, rsabuff, rbytes, rsabuff);
printf ("%s\n", (char*)rsabuff);
char* mdhex = sequencelogic::DigestMessage ("sha256", (unsigned char*)"IOnU,Bob,Bob,Bob", 16);
printf ("%s\n", mdhex);
unsigned char hash[32];
sequencelogic::HexToBinary (mdhex, hash);
mdhex = sequencelogic::DigestMessage ("sha256", hash, 32);
printf ("%s\n", mdhex);
#endif
// Test EC public key encrypt/decrypt
unsigned char ecbuf[2048];
char plain[2048];
ionu_eyering_gen_ec_challenge_pair (challenges, private_pem, public_pem);
//printf ("%s\n", private_pem);
//printf ("%s\n", public_pem);
ionu_eyering_create ("test/ecdh.iks", "KeyRing", "Private key ring", good);
if (ionu_eyering_gen_ec_challenge ("test/ecdh.iks", "mine", "Mine", challenges, good))
printf ("Generated EC challenge pair\n");
if (ionu_eyering_gen_ec ("test/ecdh.iks", "peer", "Theirs", good))
printf ("Generated EC random pair\n");
bytes = ionu_eyering_ec_encrypt ("test/ecdh.iks", "mine", "peer", good, (unsigned char*)"Howdy we are having some fune now", 35, ecbuf);
//printf ("EC: PK encrypted %d bytes\n", (int)bytes);
bytes = ionu_eyering_ec_decrypt ("test/ecdh.iks", "peer", "mine", good, ecbuf, bytes, (unsigned char*)plain);
//printf ("EC: PK howdy %d bytes\n", (int)bytes);
if (bytes >= 35) {
if (strcmp (plain, "Howdy we are having some fune now") != 0)
rc += testfailed ("ionu_eyering_ec_decrypt", plain);
else
printf ("EC: %s, decrypted %d bytes\n", plain, (int)bytes);
}
else
rc += testfailed ("ionu_eyering_ec_encrypt", "Howdy");
if (!ionu_eyering_gen_rsa_challenge ("test/challenge.iks", "Unit3", "test", challenges3, good))
rc += testfailed ("ionu_eyering_gen_rsa_challenge", "Unit3");
if (!ionu_eyering_gen_rsa_challenge ("test/challenge.iks", "Unit4", "test", challenges4, good))
rc += testfailed ("ionu_eyering_gen_rsa_challenge", "Unit4");
if (!ionu_eyering_gen_rsa_challenge ("test/challenge.iks", "Unit5", "test", challenges5, good))
rc += testfailed ("ionu_eyering_gen_rsa_challenge", "Unit5");
if (!ionu_eyering_gen_rsa_challenge ("test/challenge.iks", "Unit6", "test", challenges6, good))
rc += testfailed ("ionu_eyering_gen_rsa_challenge", "Unit6");
if (!ionu_eyering_gen_rsa_challenge ("test/challenge.iks", "Unit7", "test", challenges7, good))
rc += testfailed ("ionu_eyering_gen_rsa_challenge", "Unit7");
if (!ionu_eyering_gen_rsa_challenge ("test/challenge.iks", "Unit8", "test", challenges8, good))
rc += testfailed ("ionu_eyering_gen_rsa_challenge", "Unit8");
if (!ionu_eyering_gen_rsa_challenge ("test/challenge.iks", "Unit9", "test", challenges9, good))
rc += testfailed ("ionu_eyering_gen_rsa_challenge", "Unit9");
if (!ionu_eyering_gen_rsa_challenge ("test/challenge.iks", "Unit10", "test", challenges10, good))
rc += testfailed ("ionu_eyering_gen_rsa_challenge", "Unit10");
if (!ionu_eyering_gen_rsa_challenge ("test/challenge.iks", "Unit11", "test", challenges11, good))
rc += testfailed ("ionu_eyering_gen_rsa_challenge", "Unit11");
if (!ionu_eyering_gen_rsa_challenge ("test/challenge.iks", "Unit12", "test", challenges12, good))
rc += testfailed ("ionu_eyering_gen_rsa_challenge", "Unit12");
if (!ionu_eyering_gen_rsa_challenge ("test/challenge.iks", "too short", "test", shortchallenge, good))
rc += testfailed ("ionu_eyering_gen_rsa_challenge", "too short");
if (!ionu_eyering_gen_rsa_challenge ("test/challenge.iks", "super short", "test", supershortchallenge, good))
rc += testfailed ("ionu_eyering_gen_rsa_challenge", "super short");
rbytes = ionu_eyering_pubkey_encrypt ("test/challenge.iks", "Unit", good, bad, SL_AES_KEY_LEN, rsabuff);
rbytes = ionu_eyering_privatekey_decrypt ("test/challenge.iks", "Unit", good, rsabuff, rbytes, rsabuff);
if (rbytes != SL_AES_KEY_LEN || memcmp (bad, rsabuff, SL_AES_KEY_LEN) != 0)
rc += testfailed ("ionu_eyering_privatekey_decrypt", "Cloudgaurd");
else
printf ("challenge pubkey_encrypt/privatekey_decrypt() passed\n");
if (ionu_eyering_get_key ("test/ionu-keyring.iks", "devicePrivate", kk, good))
rc += testfailed ("devicePrivate", (char*)kk);
ionu_eyering_create (NULL, "bad", "Bad key tests", NULL);
ionu_eyering_create ("/garbonzo-beans/what.iks", "bad", "Bad key tests", hi);
ionu_eyering_create ("test/bad.iks", NULL, NULL, hi);
ionu_eyering_create ("test/bad.iks", (char*)bad, "Bad key tests", hi);
ionu_eyering_create ("test/bad.iks", "bad", (char*)bad, hi);
ionu_eyering_create ("test/bad.iks", "bad", "Bad key tests", hi);
ionu_eyering_add_binkey ("junkpathtest/test.iks", "AES", "Random AES key", SL_AES_KEY_LEN, kk, hi);
ionu_eyering_gen_rsa (empty_iks, "CloudGuard", "RSA keypair", hi);
ionu_eyering_add_strkey(empty_iks, "foo", "Replaced bar with newbar", "newbar", hi);
ionu_eyering_add_rsakey ("test/bad.iks", "public", "key", NULL, hi);
ionu_eyering_add_rsakey ("test/rsa.iks", "private", "key", "---RSA PRIVATE", hi);
rbytes = ionu_eyering_pubkey_encrypt ("test/rsa.iks", "public", hi, bad, SL_AES_KEY_LEN, rsabuff);
rbytes = ionu_eyering_privatekey_decrypt ("test/rsa.iks", "private", hi, rsabuff, rbytes, rsabuff);
if (rbytes == SL_AES_KEY_LEN || memcmp (bad, rsabuff, SL_AES_KEY_LEN) == 0)
rc += testfailed ("ionu_eyering_privatekey_decrypt", "bad");
if (rc == 0)
printf ("\nKeyring tests passed\n-------------------------------\n");
else
printf ("\n%d Keyring tests failed\n-------------------------------\n", rc);
return rc;
}
void IOnUKeyDerive (const char* password)
{
unsigned char key[SL_AES_KEY_LEN];
char hex[SL_AES_KEY_LEN * 2 + 1];
ionu_derive_key (password, key);
sequencelogic::Base64Encode (key, SL_AES_KEY_LEN, hex);
printf ("%0.2f <%s> %s\n", ionu_password_strength (password), password, hex);
if (strcmp (password, "Hi") == 0 && strcmp (hex, "9Hyf4kupGoPEv3qf6APiiOs29gJEKIbc4DVzylmxmT0=") != 0)
printf ("***************** DATA WIPE REQUIRED, PASSWORD KEY DERIVATION CHANGES VALUES *****************\n");
}
int IOnUPasswordTests()
{
int rc = 0;
unsigned char userkey[SL_AES_KEY_LEN];
unsigned char cghkey[SL_AES_KEY_LEN*2];
unsigned char tgikey[SL_AES_KEY_LEN];
unsigned char testkey[SL_AES_KEY_LEN];
char hex[SL_AES_KEY_LEN * 2 + 1];
sequencelogic::DeriveKey ("madman12", userkey);
const char* cghk = "fwHi1hYx6wMXSQKxRexqu23ngeBM7ccmKwie0ddkAakNLKV/J9NLjYUzZqOFqllm5pFp8GIdsS5/67ewZyUiYw==";
size_t cghkLength = sequencelogic::Base64Decode (cghk, cghkey);
if (cghkLength != 2 * SL_AES_KEY_LEN)
rc += testfailed ("CGHK: expected 64 bytes\n", "oops");
sequencelogic::XorKeys (userkey, cghkey, tgikey, SL_AES_KEY_LEN);
sequencelogic::Base64Encode (tgikey, SL_AES_KEY_LEN, hex);
printf ("TGI key: %s\n", hex);
sequencelogic::XorKeys (tgikey, cghkey, testkey, SL_AES_KEY_LEN);
if (sequencelogic::MemCmp (testkey, userkey, SL_AES_KEY_LEN) != 0)
rc += testfailed ("XOR key test", "user");
IOnUKeyDerive ("password");
IOnUKeyDerive ("admin");
IOnUKeyDerive ("qwerty");
IOnUKeyDerive ("H");
IOnUKeyDerive ("Hi");
IOnUKeyDerive ("Hello");
IOnUKeyDerive ("He11o");
IOnUKeyDerive ("H3ll0");
IOnUKeyDerive ("12345678");
IOnUKeyDerive ("123456789");
IOnUKeyDerive ("madman12");
IOnUKeyDerive ("ijfijfijf");
IOnUKeyDerive ("ijfIjfijf*");
IOnUKeyDerive ("@bCd1960");
IOnUKeyDerive ("Abcd1960");
IOnUKeyDerive ("gonefishing1125");
IOnUKeyDerive ("LeeAnn82994");
IOnUKeyDerive ("Lee@nn82994");
IOnUKeyDerive ("GeekBand2013");
IOnUKeyDerive ("u3K2*l");
IOnUKeyDerive ("u3K2*l$");
IOnUKeyDerive ("u3K2*l$q");
IOnUKeyDerive ("u3K2*l$qZ");
IOnUKeyDerive ("u3K2*l$qZ0");
IOnUKeyDerive ("u3K2*l$qZ0a");
IOnUKeyDerive ("u3K2*l$qZ0a<");
IOnUKeyDerive ("areallyveryextrasuperduperhugelylongAndSTOOPIDpassword*l$qZ0a<so long\nand full of Gar@#$e");
std::string madman12 ("6EVdXfSkSX+I15ZXGCRRH4TnpBnt17ivih5Nd7DxkPQ=");
std::string ijfijfijf ("V4DnZwzZO+0GLuH0GMj8QZC3dhn4/HIJZvKAtdg2RQk=");
std::string slow = sequencelogic::SlowHash ("madman12", "");
cout << slow << endl;
std::string validate = sequencelogic::SlowHash ("madman12", slow);
if (slow != validate)
rc += testfailed ("sequencelogic::SlowHash", "Validation failed");
validate = sequencelogic::SlowHash ("madman12", madman12);
if (validate.size() == 0)
rc += testfailed ("sequencelogic::SlowHash", "Validation of madman12 failed");
validate = sequencelogic::SlowHash ("ijfijfijf", ijfijfijf);
if (validate.size() == 0)
rc += testfailed ("sequencelogic::SlowHash", "Validation of ijfijfijf failed");
validate = sequencelogic::SlowHash ("madman12", ijfijfijf);
if (validate.size() != 0)
rc += testfailed ("sequencelogic::SlowHash", "inValidation of ijfijfijf failed");
if (rc == 0)
printf ("Password tests passed\n");
return rc;
}
int TestSetSize()
{
int rc = 0;
/*
Key tgi ("tgi", "stream", SL_AES_KEY_LEN, TGIkey, Key::AES);
EyeContainer* IOnU = NULL;
std::string sentry = "stream";
std::streamoff ssize = 0;
size_t nread = 0;
char pbuff[4096]; // Pattern buffer
char vbuff[4096]; // Verify buffer
char zbuff[4096]; // Zeros buffer
memset (zbuff, 0, 4096);
memset (pbuff, '1', 4096);
// Create stream via SetStreamSize, set a size, check that expansion padding is ok
IOnU = new EyeContainer("test/setsize.ionu", tgi, URN, PERMS);
IOnU->SetStreamSize (sentry, 0);
if (IOnU->GetStreamSize (sentry) != 0)
rc += testfailed ("SetStreamSize", "expected 0 size");
IOnU->SetStreamSize (sentry, 4096);
if (IOnU->GetStreamSize (sentry) != 4096)
rc += testfailed ("SetStreamSize", "expected 4096 size");
IOnU->Finalize();
delete IOnU;
IOnU = new EyeContainer("test/setsize.ionu", tgi, ios::in);
ssize = IOnU->GetStreamSize (sentry);
IOnU->ReadStream (sentry, 0, vbuff, 4096, &nread);
if (ssize != 4096 || nread != 4096)
rc += testfailed ("SetStreamSize", "expected 4096 bytes");
else if (memcmp (zbuff, vbuff, 4096) != 0)
rc += testfailed ("SetStreamSize", "expected 4096 0's");
delete IOnU;
// Create an alternating pattern of real writes and expansion padding
IOnU = new EyeContainer("test/setsize.ionu", tgi, ios::out);
for (ssize = 0; ssize < 5*IONU_MEGA_BYTES; ssize += 8192) {
IOnU->WriteStream (sentry, ssize, pbuff, 4096, &nread);
IOnU->SetStreamSize (sentry, ssize + 8192);
}
IOnU->Finalize();
delete IOnU;
IOnU = new EyeContainer("test/setsize.ionu", tgi, ios::in);
ssize = IOnU->GetStreamSize (sentry);
if (ssize != IONU_MEGA_BYTES)
rc += testfailed ("SetStreamSize", "expected 1MB size");
for (ssize = 0; ssize < IONU_MEGA_BYTES; ssize += 8192) {
IOnU->ReadStream (sentry, ssize, vbuff, 4096, &nread);
if (nread != 4096 || memcmp (pbuff, vbuff, 4096) != 0)
rc += testfailed ("Alternating", "expected 4096 1's");
IOnU->ReadStream (sentry, ssize + 4096, vbuff, 4096, &nread);
if (nread != 4096 || memcmp (zbuff, vbuff, 4096) != 0)
rc += testfailed ("Alternating", "expected 4096 0's");
}
delete IOnU;
if (rc == 0)
printf ("SetSize tests passed\n");
*/
return rc;
}
int TestStreams()
{
printf ("\nEyeStream tests\n-------------------------------\n");
int rc = 0;
/*
#ifdef OBSOLETE
size_t n = 0;
EyeContainer* IOnU = NULL;
char ebuff[4096];
char sbuff[4096];
std::string txtmsg;
Key tgi ("tgi", "stream", SL_AES_KEY_LEN, TGIkey, Key::AES);
std::streamoff eyebigsize (8*1024*1024);
#ifdef LIN64
EyeHeader eyehead;
eyehead.SetFileSize (eyebigsize);
if (eyehead.GetFileSize() != eyebigsize) {
std::stringstream ss;
ss << eyebigsize << " != " << eyehead.GetFileSize();
rc += testfailed ("EyeHeader.SetStreamSize ", ss.str());
}
#endif
IOnU = new EyeContainer("test/stream.ionu", tgi, URN, PERMS);
printf ("Created\n");
memset (sbuff, '1', 4096);
memset (sbuff, 'a', 64);
memset (sbuff+64, 'b', 64);
memset (sbuff+128, 'c', 64);
memset (sbuff+192, 'd', 64);
memset (sbuff+256, 'e', 64);
memset (sbuff+320, 'f', 64);
memset (sbuff+384, 'g', 64);
memset (sbuff+448, 'h', 64);
IOnU->AddMemoryFile ("stream", (unsigned char*)sbuff, 512, "test/stream");
IOnU->Finalize();
delete IOnU;
printf ("Closed\n");
IOnU = new EyeContainer("test/stream.ionu", tgi, ios::in);
printf ("Opened\n");
cout << IOnU->GetMetaData() << endl;
delete IOnU;
printf ("Closed\n");
EyeStream wty ("test/stream.ionu", tgi, "stream");
printf ("opened as stream\n");
wty.read (ebuff, 512);
if (memcmp (sbuff, ebuff, 512) != 0)
cout << "Error" << endl;
else
cout << "Stream read passed" << endl;
printf ("read 512\n");
memset (sbuff, 'o', 512);
wty.write (16, sbuff, 64, &n);
printf ("wrote 64\n");
//wty.write (512, sbuff, 64, &n);
wty.close();
printf ("close stream\n");
wty.open ("test/stream.ionu", tgi, "stream");
eyebigsize = 5;
wty.read (ebuff, 512);
txtmsg.assign ((char*)ebuff, 81);
cout << txtmsg << endl;
wty.read (eyebigsize, ebuff, 51, &n);
txtmsg.assign ((char*)ebuff, 51);
cout << txtmsg << endl;
wty.read (ebuff, 512);
txtmsg.assign ((char*)ebuff, 81);
cout << txtmsg << endl;
wty.close();
IOnU = new EyeContainer("test/stream.ionu", tgi);
txtmsg = IOnU->GetTextMessage ("stream");
if (txtmsg.size() != 512)
cout << "Expected 512 got " << txtmsg.size() << endl;
else
cout << txtmsg << endl;
delete IOnU;
cout << "TestStreams() - wrote " << n << endl;
wty.read (0, ebuff, 81, &n);
txtmsg.assign (ebuff, 81);
cout << txtmsg << endl;
wty.close();
cout << "big stream test" << endl;
#define SMALL
#ifdef SMALL
wty.open ("test/stream.ionu", tgi, "stream");
wty.write (sbuff, 2048);
wty.write (sbuff+2048, 2048);
wty.close();
#else
wty.open ("test/stream.ionu", tgi, "stream");
for (int i = 0; i < 2048*1024; ++i)
wty.write (sbuff, 4096);
wty.close();
#endif
IOnU = new EyeContainer("test/stream.ionu", tgi);
txtmsg = IOnU->GetTextMessage ("stream");
if (txtmsg.size() != 4096)
cout << "Expected 4096 got " << txtmsg.size() << endl;
else
cout << "read 4096" << endl;
delete IOnU;
wty.open ("test/stream.ionu", tgi, "stream");
wty.read (sbuff, 2048);
txtmsg.assign (sbuff, 64);
cout << txtmsg << endl;
wty.read (sbuff, 2048);
txtmsg.assign (sbuff, 64);
cout << txtmsg << endl;
wty.close();
ionu_eyefile_create_with_message ("test/stream.ionu", TGIkey, "stream", "Yo there Alan Frost, what are you up to!", 40, URN, PERMS);
EyeStream tty ("test/stream.ionu", tgi, "stream");
tty.read (ebuff, 37);
std::string tee (ebuff, 37);
std::cout << tee << std::endl;
tty.read (4, ebuff, 33, &n);
tee.assign (ebuff, n);
std::cout << tee << std::endl;
tty.read (24, ebuff, 33, &n);
tee.assign (ebuff, n);
std::cout << tee << std::endl;
tty.read (44, ebuff, 33, &n);
tee.assign (ebuff, n);
std::cout << tee << std::endl;
tty.seekg (0);
tty.read (ebuff, 13);
tee.assign (ebuff, 13);
tty.read (ebuff, 13);
tee.append (ebuff, 13);
tty.read (ebuff, 13);
tee.append (ebuff, 13);
tty.read (ebuff, 13);
//tee.append (ebuff, 13);
std::cout << tee << std::endl;
printf ("----------------------------------------------\n");
IOnU = new EyeContainer("test/stream.ionu", tgi, URN, PERMS);
IOnU->AddMemoryFile ("stream", (unsigned char*)"This stream is 28 bytes long", 28, "test/streaming");
IOnU->Finalize();
delete IOnU;
cout << EyeContainer::GetMetaData ("test/stream.ionu", ".ionumeta", tgi) << endl;
EyeStream efile ("test/stream.ionu", tgi, URN, PERMS, "stream");
efile.write ("This stream is 28 bytes long", 28);
efile.close();
IOnU = new EyeContainer("test/stream.ionu", tgi);
cout << IOnU->GetMetaData() << endl;
cout << IOnU->GetTextMessage ("stream") << endl;
delete IOnU;
efile.open ("test/stream.ionu", tgi, URN, PERMS, "stream");
efile.write ("This stream is", 14);
efile.write (" 28 bytes long", 14);
efile.close();
IOnU = new EyeContainer("test/stream.ionu", tgi);
cout << IOnU->GetMetaData() << endl;
cout << IOnU->GetTextMessage ("stream") << endl;
delete IOnU;
//efile.open ("test/stream.ionu", tgi, URN, PERMS, "stream");
efile.open ("test/stream.ionu", tgi, "stream");
efile.write ("This is my stream", 17);
efile.write (", this is your stream", 22);
efile.close();
IOnU = new EyeContainer("test/stream.ionu", tgi);
cout << IOnU->GetMetaData() << endl;
cout << IOnU->GetPermissions() << endl;
txtmsg = IOnU->GetTextMessage ("stream");
if (txtmsg.size() > 0)
cout << "<" << txtmsg << ">" << endl;
else
printf ("Failed to find stream\n");
delete IOnU;
IOnU = new EyeContainer("test/stream.ionu", tgi);
cout << IOnU->GetMetaData() << endl;
delete IOnU;
efile.open ("test/stream.ionu", tgi, "stream");
efile.seekg (19);
efile.read (ebuff, 19);
std::string ee (ebuff, 19);
std::cout << ee << std::endl;
efile.read (0, ebuff, 40, &n);
cout << "read " << n << " of requested 40 bytes" << endl;
strcpy (ebuff, "a garbage stream");
efile.write (8, ebuff, 16, &n);
efile.read (10, ebuff, 14, &n);
efile.dump();
ee.assign (ebuff, 14);
std::cout << ee << std::endl;
efile.open ("test/badstream.ionu", tgi, "stream");
if (efile.is_open())
rc += testfailed ("efile.is_open", "test/badstream.ionu");
efile.flush();
efile.close();
efile.open ("test/stream.ionu", tgi, "stream");
efile.setsize (100);
cout << efile.getsize() << endl;
efile.write ("The stream is larger than this", 30);
efile.close();
IOnU = new EyeContainer("test/stream.ionu", tgi);
txtmsg = IOnU->GetTextMessage ("stream");
if (txtmsg.size() != 130)
cout << "Expected 130 got " << txtmsg.size() << endl;
else
cout << txtmsg << endl;
delete IOnU;
efile.open ("test/stream.ionu", tgi, "stream");
efile.write ("The stream is larger than this", 30);
efile.setsize (20);
cout << efile.getsize() << endl;
efile.close();
IOnU = new EyeContainer("test/stream.ionu", tgi);
txtmsg = IOnU->GetTextMessage ("stream");
if (txtmsg.size() != 20)
cout << "Expected 20 got " << txtmsg.size() << endl;
else
cout << txtmsg << endl;
delete IOnU;
efile.open ("test/stream.ionu", tgi, "stream");
efile.setsize (1*1024*1024);
efile.write ("This a 2MB stream padded out t", 30);
cout << efile.getsize() << endl;
efile.close();
efile.open ("test/stream.ionu", tgi, "stream");
cout << efile.getsize() << endl;
efile.read (10, ebuff, 14, &n);
ee.assign (ebuff, 14);
std::cout << ee << std::endl;
efile.close();
efile.open ("test/stream.ionu", tgi, "stream");
efile.setsize (65536*2);
cout << efile.getsize() << endl;
efile.setsize (20);
efile.write ("The stream is larger than this", 30);
cout << efile.getsize() << endl;
efile.rename ("tstream");
efile.close();
IOnU = new EyeContainer("test/stream.ionu", tgi);
txtmsg = IOnU->GetTextMessage ("tstream");
if (txtmsg.size() != 30)
cout << "Expected 30 got " << txtmsg.size() << endl;
else
cout << txtmsg << endl;
delete IOnU;
if (rc == 0)
printf ("\nStream tests passed\n-------------------------------\n");
else
printf ("\n%d Stream tests failed\n-------------------------------\n", rc);
#endif
*/
return rc;
}
int TestP2P()
{
printf ("\nP2P tests\n-------------------------------\n");
int rc = 0;
/*
size_t bytes = 0;
EyeBytes msg;
unsigned char* cmd;
std::string arg;
std::string meta;
std::vector<std::string> args;
Keyring ring ("testring", "Test Key Ring");
ring.GenerateRSAKey("Client", "RSA keypair");
ring.GenerateRSAKey("Peer", "RSA keypair");
ring.GenerateRSAKey("CG", "RSA keypair");
char* pk = ring.GetPubKey ("Client");
Key clientpubkey ("client", "public key", (int)strlen(pk), (const unsigned char*) pk, Key::RSA_PUBLIC);
delete[] pk;
pk = ring.GetPubKey ("Peer");
Key peerpubkey ("peer", "public key", (int)strlen(pk), (const unsigned char*) pk, Key::RSA_PUBLIC);
delete[] pk;
pk = ring.GetPubKey ("CG");
Key cgpubkey ("CG", "public key", (int)strlen(pk), (const unsigned char*) pk, Key::RSA_PUBLIC);
delete[] pk;
EyeConnection::MESSAGE_CODE mc;
EyeConnection client (URN2, ring.GetKey ("Client"), &peerpubkey);
EyeConnection peer (URN1, ring.GetKey ("Peer"), &clientpubkey);
EyeConnection cg (URN1, ring.GetKey ("CG"), &clientpubkey);
if (! client.ClientHello (msg))
rc += testfailed ("EyeConnection::ClientHello", "uh oh");
cout << "client state " << client.GetState() << endl;
//while (client.GetState() != EyePeer::FINISHED && peer.GetState() != EyePeer::FINISHED) {
mc = peer.Receive (msg.GetBytes(), msg.GetSize(), msg);
cout << mc << " peer state " << peer.GetState() << endl;
mc = client.Receive (msg.GetBytes(), msg.GetSize(), msg);
cout << mc << " client state " << client.GetState() << endl;
//}
mc = peer.Receive (msg.GetBytes(), msg.GetSize(), msg);
cout << mc << " peer state " << peer.GetState() << endl;
// mc = client.Receive (msg.GetBytes(), msg.GetSize(), msg);
//cout << "client state " << client.GetState() << endl;
cmd = client.Send (EyeConnection::DATA, (const unsigned char*)"P2P test message", 17, &bytes);
mc = peer.Receive (cmd, bytes, msg);
cout << mc << endl;
delete[] cmd;
cout << msg.GetString() << endl;
client.Dump();
peer.Dump();
cmd = peer.Send (EyeConnection::DATA, (const unsigned char*)"F2F test message", 17, &bytes);
mc = client.Receive (cmd, bytes, msg);
cout << mc << endl;
delete[] cmd;
cout << msg.GetString() << endl;
arg = "test/*.ionu";
cmd = peer.Command (EyeConnection::LIST, arg, &bytes);
mc = client.Receive (cmd, bytes, msg);
cout << mc << endl;
delete[] cmd;
mc = peer.Receive (msg.GetBytes(), msg.GetSize(), msg);
cout << mc << endl;
meta.assign ((char*)msg.GetBytes(), msg.GetSize());
cout << meta << endl;
arg = "test.ionu";
cmd = peer.Command (EyeConnection::GET, arg, &bytes);
mc = client.Receive (cmd, bytes, msg);
cout << mc << endl;
delete[] cmd;
mc = peer.Receive (msg.GetBytes(), msg.GetSize(), msg);
if (mc != EyeConnection::RETCODE || msg.GetByte(0) == 0) {
rc += testfailed ("EyeConnection::GET", arg);
cout << mc << endl;
}
arg = cionu;
cmd = peer.Command (EyeConnection::HEAD, arg, &bytes);
mc = client.Receive (cmd, bytes, msg);
cout << mc << endl;
delete[] cmd;
mc = peer.Receive (msg.GetBytes(), msg.GetSize(), msg);
cout << mc << endl;
meta.assign ((char*)msg.GetBytes(), msg.GetSize());
cout << meta << endl;
cmd = peer.Command (EyeConnection::GET, arg, &bytes);
mc = client.Receive (cmd, bytes, msg);
cout << mc << endl;
delete[] cmd;
mc = peer.Receive (msg.GetBytes(), msg.GetSize(), msg);
if (mc != EyeConnection::DATA) {
rc += testfailed ("EyeConnection::GET", arg);
cout << mc << endl;
}
args.push_back (cionu);
args.push_back ("alan");
args.push_back ("W");
cmd = peer.Command (EyeConnection::LOCK, args, &bytes);
mc = client.Receive (cmd, bytes, msg);
cout << mc << endl;
delete[] cmd;
mc = peer.Receive (msg.GetBytes(), msg.GetSize(), msg);
if (mc == EyeConnection::RETCODE && msg.GetByte(0) == 0)
cout << "Lock succeeded" << endl;
args.pop_back ();
cmd = peer.Command (EyeConnection::UNLOCK, args, &bytes);
mc = client.Receive (cmd, bytes, msg);
cout << mc << endl;
delete[] cmd;
mc = peer.Receive (msg.GetBytes(), msg.GetSize(), msg);
if (mc == EyeConnection::RETCODE && msg.GetByte(0) == 0)
cout << "Unlock succeeded" << endl;
cmd = peer.Send (EyeConnection::SUSPEND, (const unsigned char*)"suspend", 7, &bytes);
mc = client.Receive (cmd, bytes, msg);
if (mc == EyeConnection::SUSPEND)
cout << "Client suspended" << endl;
delete[] cmd;
mc = peer.Receive (msg.GetBytes(), msg.GetSize(), msg);
if (mc == EyeConnection::RETCODE && msg.GetByte(0) == 0)
cout << "Suspend succeeded" << endl;
cmd = peer.Send (EyeConnection::RESUME, (const unsigned char*)"suspend", 7, &bytes);
mc = client.Receive (cmd, bytes, msg);
cout << mc << endl;
delete[] cmd;
mc = peer.Receive (msg.GetBytes(), msg.GetSize(), msg);
if (mc == EyeConnection::RETCODE && msg.GetByte(0) == 0)
cout << "Resume succeeded" << endl;
client.Dump();
peer.Dump();
if (rc == 0)
printf ("\nP2P tests passed\n-------------------------------\n");
else
printf ("\n%d P2P tests failed\n-------------------------------\n", rc);
*/
return rc;
}
int TestMixedUpKeys()
{
printf ("\nMixed up key tests\n-------------------------------\n");
int rc = 0;
/*
std::string sentry ("stream");
size_t written = 0;
std::string sb;
char sbuffer[1024];
Key junk;
EyeContainer* mixup = new EyeContainer("test/mixup.ionu", TGIkey, URN, PERMS);
std::streamoff spos = 0;
mixup->WriteStream (sentry, spos, "This is a streaming video test s", 32, &written);
spos = 32;
mixup->WriteStream (sentry, spos, "tream not really", 16, &written);
mixup->Finalize();
delete mixup;
cout << EyeContainer::GetContentMetaData ("test/mixup.ionu", "stream", junk) << endl;
mixup = new EyeContainer("test/mixup.ionu", TGIkey);
spos = 0;
mixup->ReadStream (sentry, spos, sbuffer, 48, &written);
sb.assign (sbuffer, written);
delete mixup;
if (written != 48 && sb.compare ("This is a streaming video test stream not really") != 0)
rc += testfailed ("Mixup readstream ios::in", sb);
mixup = new EyeContainer("test/mixup.ionu", TGIkey, ios::in);
spos = 0;
mixup->ReadStream (sentry, spos, sbuffer, 48, &written);
sb.assign (sbuffer, written);
delete mixup;
if (written != 48 && sb.compare ("This is a streaming video test stream not really") != 0)
rc += testfailed ("Mixup readstream ios::in", sb);
mixup = new EyeContainer("test/mixup.ionu", badkey);
spos = 0;
mixup->WriteStream (sentry, spos, "trash", 5, &written);
mixup->Finalize();
delete mixup;
if (written != 0)
rc += testfailed ("Mixup writestream", "trash");
mixup = new EyeContainer("test/mixup.ionu", badkey);
spos = 32;
mixup->WriteStream (sentry, spos, "tream yes it is!", 16, &written);
mixup->Finalize();
delete mixup;
if (written != 0)
rc += testfailed ("Mixup writestream", "tream yes it is!");
mixup = new EyeContainer("test/mixup.ionu", TGIkey);
spos = 0;
mixup->ReadStream (sentry, spos, sbuffer, 48, &written);
sb.assign (sbuffer, written);
delete mixup;
if (written != 48 && sb.compare ("This is a streaming video test stream not really") != 0)
rc += testfailed ("Mixup readstream after bad writes", sb);
spos = 0;
mixup = new EyeContainer("test/mixup.ionu", badkey);
mixup->ReadStream (sentry, spos, sbuffer, 48, &written);
sb.assign (sbuffer, written);
delete mixup;
if (written != 0)
rc += testfailed ("Mixup readstream with bad key", sb);
mixup = new EyeContainer("test/mixup.ionu", badkey);
unsigned char* ex = mixup->ExtractMemoryFile (sentry, &written);
delete mixup;
if (ex || written > 0)
rc += testfailed ("ExtractMemoryFile()", sentry);
mixup = new EyeContainer("test/mixup.ionu", badkey, ios::in);
ex = mixup->ExtractMemoryFile (sentry, &written);
delete mixup;
if (ex || written > 0)
rc += testfailed ("ExtractMemoryFile() ios::in", sentry);
if (rc == 0)
printf ("\nMixed up key tests passed\n-------------------------------\n");
else
printf ("\n%d Mixed up key tests failed\n-------------------------------\n", rc);
*/
return rc;
}
int TestEyeContainer()
{
int rc = 0;
/*
struct stat stat_buf;
char* coldmeta = NULL;
char* cmeta = NULL;
char* cmsg = NULL;
std::string txtmsg;
std::string msg;
EyeBytes currency (utf8, 6);
EyeBytes utfmsg;
EyeContainer* IOnU = NULL;
const std::string tags = "{\"title\":\"Encrypted World\",\"description\":\"The world is now encrypted\"}";
const std::string tags1 = "{\"title\":\"Parade of Fans\",\"description\":\"NEWARK - The guest list and the parade of limousines...\"}";
const std::string tags2 = "{\"title\":\"D-Link Patches Router\",\"description\":\"D-Link has taken action over three serious...\"}";
std::string realsig = sequencelogic::GenerateTGISig (TopicPerms);
unsigned char tgi64[64];
memcpy (tgi64, TGIkey, 32);
memset (tgi64+32, 85, 32);
Key tkey (realsig.c_str(), "key", 64, tgi64, Key::TGI);
Key mkey (realsig.c_str(), "key", 32, tgi64+32, Key::AES);
//SSL_load_error_strings(); /* readable error messages * /
//SSL_library_init(); /* initialize library * /
// Test the C++ interfaces
printf ("\nTestin C++ interfaces\n-------------------------------\n");
IOnU = new EyeContainer("test/nocontent.ionu", TGIkey, URN, TopicPerms);
IOnU->Finalize();
delete IOnU;
cout << EyeContainer::GetMetaData ("test/nocontent.ionu", IONU_EYE_META_FILE, mkey) << endl;
cout << EyeContainer::GetMetaData ("test/nocontent.ionu", IONU_EYE_PERM_FILE, mkey) << endl;
cout << EyeContainer::GetContentMetaData ("test/nocontent.ionu", ".imchat", mkey) << endl;
cout << EyeContainer::GetContentMetaData ("test/nocontent.ionu", "", mkey) << endl;
IOnU = new EyeContainer("test/test.ionu", TGIkey, URN, TopicPerms);
IOnU->AddContent ("test/Screen Shot 2013-04-18 at 1.14.42 PM.png", "image/png");
IOnU->Finalize();
delete IOnU;
IOnU = new EyeContainer("test/test.ionu", TGIkey);
if (!IOnU->ExtractFile ("Screen Shot 2013-04-18 at 1.14.42 PM.png"))
rc += testfailed ("ExtractFile", "Screen Shot 2013-04-18 at 1.14.42 PM.png");
if (!filecompare ("test/Screen Shot 2013-04-18 at 1.14.42 PM.png", "Screen Shot 2013-04-18 at 1.14.42 PM.png"))
rc += testfailed ("File compare", "Screen Shot 2013-04-18 at 1.14.42 PM.png");
delete IOnU;
sequencelogic::RemoveFile ("Screen Shot 2013-04-18 at 1.14.42 PM.png");
IOnU = new EyeContainer("test/test.ionu", TGIkey, URN, TopicPerms);
IOnU->AddContent ("test/Disruptor-1.0.pdf", "application/pdf");
IOnU->Finalize();
delete IOnU;
IOnU = new EyeContainer("test/test.ionu", TGIkey);
if (!IOnU->ExtractFile ("Disruptor-1.0.pdf"))
rc += testfailed ("ExtractFile", "Disruptor-1.0.pdf");
if (!filecompare ("test/Disruptor-1.0.pdf", "Disruptor-1.0.pdf"))
rc += testfailed ("File compare", "Disruptor-1.0.pdf");
delete IOnU;
sequencelogic::RemoveFile ("Disruptor-1.0.pdf");
IOnU = new EyeContainer("test/test.ionu", TGIkey, URN, TopicPerms);
IOnU->AddContent ("test/photo.jpg", "image/jpeg");
IOnU->Finalize();
delete IOnU;
IOnU = new EyeContainer("test/test.ionu", TGIkey);
if (!IOnU->ExtractFile ("photo.jpg"))
rc += testfailed ("ExtractFile", "photo.jpg");
if (!filecompare ("test/photo.jpg", "photo.jpg"))
rc += testfailed ("File compare", "photo.jpg");
delete IOnU;
sequencelogic::RemoveFile ("photo.jpg");
IOnU = new EyeContainer("test/test.ionu", TGIkey, URN, TopicPerms);
IOnU->AddContent ("test/Nikki-Temp.jpg", "image/jpeg");
IOnU->Finalize();
delete IOnU;
IOnU = new EyeContainer("test/test.ionu", TGIkey);
if (!IOnU->ExtractFile ("Nikki-Temp.jpg"))
rc += testfailed ("ExtractFile", "Nikki-Temp.jpg");
if (!filecompare ("test/Nikki-Temp.jpg", "Nikki-Temp.jpg"))
rc += testfailed ("File compare", "Nikki-Temp.jpg");
delete IOnU;
sequencelogic::RemoveFile ("Nikki-Temp.jpg");
IOnU = new EyeContainer("test/test.ionu", TGIkey, URN, TopicPerms);
IOnU->AddContent ("test/End User License Agreement.rtf", "text/rtf");
IOnU->Finalize();
delete IOnU;
IOnU = new EyeContainer("test/test.ionu", TGIkey);
if (!IOnU->ExtractFile ("End User License Agreement.rtf"))
rc += testfailed ("ExtractFile", "End User License Agreement.rtf");
if (!filecompare ("test/End User License Agreement.rtf", "End User License Agreement.rtf"))
rc += testfailed ("File compare", "End User License Agreement.rtf");
delete IOnU;
sequencelogic::RemoveFile ("End User License Agreement.rtf");
IOnU = new EyeContainer("test/test.ionu", TGIkey, URN, TopicPerms);
IOnU->AddContent ("test/TestWordDoc2.docx", "application/vnd.ms-word");
IOnU->Finalize();
delete IOnU;
IOnU = new EyeContainer("test/test.ionu", TGIkey);
if (!IOnU->ExtractFile ("TestWordDoc2.docx"))
rc += testfailed ("ExtractFile", "TestWordDoc2.docx");
if (!filecompare ("test/TestWordDoc2.docx", "TestWordDoc2.docx"))
rc += testfailed ("File compare", "TestWordDoc2.docx");
delete IOnU;
sequencelogic::RemoveFile ("TestWordDoc2.docx");
IOnU = new EyeContainer("test/test.ionu", tkey, URN, TopicPerms);
IOnU->AddTextMessage (".imchat", "A long and verbose yo there to you from me type chat message to test various stuff with");
IOnU->AddTags (tags);
IOnU->AddContent(testfile, "test/plaintext");
cout << "LastModifiedTimeOfEntry() " << IOnU->LastModifiedTimeOfEntry (".imchat") << endl;
cout << "MIMETypeOfEntry() " << IOnU->MIMETypeOfEntry (".imchat") << endl;
cout << "SizeOfEntry(.imchat) " << IOnU->SizeOfEntry (".imchat") << endl;
cout << "SizeOfEntry(tartest.txt) " << IOnU->SizeOfEntry ("tartest.txt") << endl;
cout << "SizeOfEntry(bad) " << IOnU->SizeOfEntry ("bad") << endl;
IOnU->Finalize();
delete IOnU;
// Corrupt .ionu files
ifstream ifile ("test/test.ionu", ios::in | ios::binary | ios::ate);
if (ifile.is_open())
{
size_t bytes = (size_t)ifile.tellg();
ifile.seekg (0, ios::beg);
char* big = new char[bytes];
ifile.read (big, bytes);
ifile.close();
for (size_t i = 0; i < bytes; i += 179) {
char pb = big[i];
ofstream rfile ("rand.ionu", ios::out | ios::binary | ios::trunc);
big[i] = 85;
rfile.write (big, bytes);
rfile.close();
//EyeContainer::GetStatus ("rand.ionu");
big[i] = pb;
IOnU = new EyeContainer("rand.ionu", TGIkey);
//txtmsg = IOnU->GetMetaData ();
txtmsg = IOnU->GetTextMessage (".imchat");
if (txtmsg.size() > 0)
rc += testfailed ("Corruption", txtmsg);
delete IOnU;
}
delete[] big;
}
if (rc == 0) printf ("Corruption tests passed\n");
cout << EyeContainer::GetMetaData ("test/test.ionu", IONU_EYE_META_FILE, mkey) << endl;
cout << EyeContainer::GetContentMetaData ("test/test.ionu", ".imchat", mkey) << endl;
cout << EyeContainer::GetContentMetaData ("test/test.ionu", "", mkey) << endl;
IOnU = new EyeContainer("test/test.ionu", tkey);
cout << IOnU->GetMetaData() << endl;
cout << IOnU->GetPermissions() << endl;
txtmsg = IOnU->GetTextMessage (".imchat");
if (txtmsg.size() > 0)
cout << "<" << txtmsg << ">" << endl;
else
rc += testfailed ("Can't find", ".imchat");
cout << IOnU->GetContentFileObjects() << endl;
cout << IOnU->GetContentFilenames() << endl;
IOnU->ListFiles();
std::string gtags = IOnU->GetTags();
if (gtags == tags)
cout << "Tags: " << gtags << endl;
else
rc += testfailed ("Can't find tags", gtags);
IOnU->ShredContents (shredurn);
delete IOnU;
std::string shredded = EyeContainer::GetMetaData ("test/test.ionu", IONU_EYE_META_FILE, mkey);
if (shredded.find ("deleted") == string::npos)
rc += testfailed ("ShredContents status not set to deleted - static", "test/test.ionu");
cout << shredded << endl;
IOnU = new EyeContainer("test/test.ionu", tkey);
shredded = IOnU->GetContentFilenames();
if (shredded.compare ("[]") != 0)
rc += testfailed ("ShredContents content array not empty", "test/test.ionu");
shredded = IOnU->GetMetaData();
if (shredded.find ("deleted") == string::npos)
rc += testfailed ("ShredContents status not set to deleted", "test/test.ionu");
shredded = IOnU->GetPermissions();
if (shredded.compare (TopicPerms) != 0)
rc += testfailed ("ShredContents perms messed up", "test/test.ionu");
IOnU->ShredContents (shredurn);
delete IOnU;
IOnU = new EyeContainer("test/test.ionu", TGIkey, URN, PERMS);
IOnU->AddTextMessage (".imchat", "Hi");
Key bkey ("Meta", "key", SL_AES_KEY_LEN, badkey, Key::AES);
Key gkey;
Key rkey ("Meta", "RSA", (int)strlen(RSA_private), (const unsigned char*)RSA_private, Key::RSA);
IOnU->AddMetaData (".ionuhistory", "This is the history", mkey);
IOnU->AddMetaData (".ionutags", "history,middle,kingdom", gkey);
IOnU->AddMetaData (".private", "RSA encrypted private data", rkey);
IOnU->AddTextMessage (".imchat", "Hi");
size_t siglen = 0;
unsigned char* sig = rkey.PrivateKeySign ((unsigned char*)"Hi", 2, &siglen);
std::string signature ((char*)sig, siglen);
IOnU->AddMetaData (".signature", signature, gkey);
delete[] sig;
std::cout << IOnU->GetMetaData (".ionuhistory", mkey) << std::endl;
std::cout << IOnU->GetMetaData (".ionuhistory", bkey) << std::endl;
std::cout << IOnU->GetMetaData (".ionutags", gkey) << std::endl;
std::cout << IOnU->GetMetaData (".private", rkey) << std::endl;
signature = IOnU->GetMetaData (".signature", gkey);
std::cout << rkey.PublicKeyVerify ((unsigned char*)signature.data(), signature.size(), (unsigned char*)"Hi", 2) << std::endl;
delete IOnU;
//exit (1);
IOnU = new EyeContainer("test/test.ionu", TGIkey, URN, PERMS);
IOnU->AddTextMessage (".imchat", "Hi there from someone who is not who you think");
//IOnU->AddContent ("test/test.jpeg", NULL);
IOnU->Finalize();
std::string metadata = IOnU->GetMetaData();
std::string spoof = metadata;
size_t pos = spoof.find ("FFFFFFFFFFFF");
spoof.replace (pos, 12, "FFFFFFFFFFF7");
cout << spoof << endl;
IOnU->ReplaceMetaData (spoof.c_str());
IOnU->Finalize();
delete IOnU;
IOnU = new EyeContainer("test/test.ionu", TGIkey);
txtmsg = IOnU->GetTextMessage (".imchat");
if (txtmsg.size() > 0)
rc += testfailed ("Spoof", txtmsg);
if (IOnU->ReplaceMetaData (tgiMeta))
rc += testfailed ("ReplaceMetaData()", "mismatching tgi keys");
delete IOnU;
IOnU = new EyeContainer("test/test.ionu", TGIkey, URN, PERMS);
IOnU->AddContent(testfile, "test/plain");
IOnU->Finalize();
metadata = IOnU->GetMetaData();
if (metadata.size() > 0)
cout << metadata << endl;
else
rc += testfailed ("GetMetaData", testfile);
delete IOnU;
IOnU = new EyeContainer ("test/test.ionu", TGIkey);
if (IOnU->ExtractFile (testfile) && filecompare (testfile, testfile_orig))
printf ("Extracted tartest.txt\n");
else
rc += testfailed ("Extract", testfile);
delete IOnU;
//IOnU = new EyeContainer("test/7E303527-9996-462C-BAAC-D39BADCA377E.ionu", TGIkey);
IOnU = new EyeContainer("test/test.ionu", TGIkey);
IOnU->ListFiles();
metadata = IOnU->GetMetaData();
if (metadata.size() > 0)
cout << metadata << endl;
else
rc += testfailed ("GetMetaData", testfile);
EyeContainer* merge = new EyeContainer ("test/test.ionu", TGIkey, URN, PERMS);
merge->AddContent (testfile, "test/plain");
merge->AddTextMessage ("Merger", "mergers and acquisitions are my specialty");
IOnU->MergeContent (merge);
delete merge;
IOnU->AddTextMessage ("Thread", "Hello, is anyone out there?");
IOnU->AddTextMessage ("Currency Symbols", currency, "text/plain;charset=utf-8");
IOnU->AddTextMessage ("Last", "The last word");
bool found = IOnU->GetTextMessage ("Thread", utfmsg);
if (found)
printf ("%s\n", utfmsg.GetString());
else
rc += testfailed ("GetTextMessage", "Thread");
found = IOnU->GetTextMessage ("Merger", utfmsg);
if (found)
printf ("%s\n", utfmsg.GetString());
else
rc += testfailed ("GetTextMessage", "Merger");
utfmsg.Assign ("UTF-8 encoded string");
IOnU->AddTextMessage ("Thread", "Nobody here but us chickens");
IOnU->AddTextMessage ("UTFThread", utfmsg, "text/plain;charset=utf-8");
found = IOnU->GetTextMessage ("Thread", utfmsg);
if (found)
printf ("%s\n", utfmsg.GetString());
else
rc += testfailed ("GetTextMessage", "Chicken Thread");
IOnU->Finalize();
delete IOnU;
if (rc == 0) printf ("so far passed\n");
IOnU = new EyeContainer("test/test.ionu", TGIkey);
IOnU->ListFiles();
metadata = IOnU->GetMetaData();
if (metadata.size() > 0)
cout << metadata << endl;
else
rc += testfailed ("GetMetaData", testfile);
IOnU->UpdateMetaData (updateMeta);
metadata = IOnU->GetMetaData();
if (metadata.size() > 0)
cout << metadata << endl;
else
rc += testfailed ("UpdateMetaData", testfile);
found = IOnU->GetTextMessage ("Thread", utfmsg);
if (found)
printf ("%s\n", utfmsg.GetString());
else
rc += testfailed ("GetTextMessage", "Thread");
found = IOnU->GetTextMessage ("UTFThread", utfmsg);
if (found)
printf ("%s\n", utfmsg.GetString());
else
rc += testfailed ("GetTextMessage", "UTFThread");
found = IOnU->GetTextMessage ("Currency Symbols", utfmsg);
if (!found || !currency.Equals (utfmsg))
rc += testfailed ("GetTextMessage", "Currency");
// Change the TGI key and try both old and new TGI keys
Key bbkey ("Bad", "key", SL_AES_KEY_LEN, badkey, Key::TGI);
Key ggkey ("Good", "key", SL_AES_KEY_LEN, TGIkey, Key::TGI);
IOnU->ReKey (bbkey);
msg = IOnU->GetTextMessage ("Thread");
if (msg.compare ("Nobody here but us chickens") != 0)
rc += testfailed ("ReKey - memory", testfile);
IOnU->Finalize();
delete IOnU;
IOnU = new EyeContainer("test/test.ionu", TGIkey);
txtmsg = IOnU->GetTextMessage ("Thread");
if (txtmsg.size() > 1 && txtmsg[0] == 'N' && txtmsg[1] == 'o')
rc += testfailed ("ReKey - old key", txtmsg);
delete IOnU;
IOnU = new EyeContainer("test/test.ionu", badkey);
msg = IOnU->GetTextMessage ("Thread");
if (msg.compare ("Nobody here but us chickens") != 0)
rc += testfailed ("ReKey - new key", testfile);
std::string oldmeta = IOnU->GetMetaData();
// Rekey and update permissions, which should change TGIsig in meta
IOnU->ReKey (ggkey, PERMS2);
metadata = IOnU->GetMetaData();
if (metadata.compare (oldmeta) == 0)
rc += testfailed ("ReKey - new perms, TGIsig", testfile);
msg = IOnU->GetTextMessage ("Thread");
if (msg.compare ("Nobody here but us chickens") != 0)
rc += testfailed ("ReKey - new key and perms", testfile);
IOnU->Finalize();
delete IOnU;
metadata = EyeContainer::GetPermissionsClassic ("test/test.ionu");
if (metadata.compare (PERMS2) != 0 )
rc += testfailed ("ReKey", PERMS2);
if (rc == 0)
printf ("Rekey tests passed\n");
if (!IOnU->Shred ("test/test.ionu"))
rc += testfailed ("Shred", testfile);
if (rc == 0) printf ("so far passed\n");
if (stat("test/test.ionu", &stat_buf) != 0)
printf ("Shred passed\n");
else
rc += testfailed ("Shred", testfile);
// Message with attachments and thumbnail
IOnU = new EyeContainer("test/test.ionu", TGIkey, URN, PERMS);
IOnU->AddTextMessage ("Message", "See attached coding guidlines, html, and xml");
if (!IOnU->AddContent (attachfile, ""))
rc += testfailed ("AddContent", attachfile);
if (!IOnU->AddContent (htmlfile, "text/html;charset=utf-8"))
rc += testfailed ("AddContent", htmlfile);
if (!IOnU->AddMetaData (".ionuhistory", operationsMeta))
rc += testfailed ("AddContent", ".ionuhistory");
if (!IOnU->AddContent ("style.xsd", xmlfile, ""))
rc += testfailed ("AddContent", "style.xsd");
if (!IOnU->AddContent (xmlfile, ""))
rc += testfailed ("AddContent", xmlfile);
if (!IOnU->AddContent (jsonfile, "application/json"))
rc += testfailed ("AddContent", jsonfile);
if (IOnU->AddContent (njsonfile, "")) // This file does not exist
rc += testfailed ("AddContent", njsonfile);
if (!IOnU->AddThumbnail (thumbfile, ""))
rc += testfailed ("AddThumbnail", thumbfile);
IOnU->Finalize();
delete IOnU;
IOnU = new EyeContainer("test/test.ionu", TGIkey);
if (!IOnU->HasContent (xmlfile))
rc += testfailed ("HasContent", xmlfile);
IOnU->ListFiles();
std::string cf = IOnU->GetContentFilenames();
if (cf.size() > 4)
cout << cf << endl;
else
rc += testfailed ("GetContentFilenames", testfile);
cf = IOnU->GetContentFileObjects();
if (cf.size() > 4)
cout << cf << endl;
else
rc += testfailed ("GetContentFileObjects", testfile);
metadata = IOnU->GetMetaData();
if (metadata.size() > 0)
cout << metadata << endl;
else
rc += testfailed ("GetMetaData", testfile);
txtmsg = IOnU->GetTextMessage ("Message");
if (txtmsg.size() > 0)
cout << txtmsg << endl;
else
rc += testfailed ("GetTextMessage", "Message");
metadata = IOnU->GetPermissions();
if (metadata.size() > 0)
cout << metadata << endl;
else
rc += testfailed ("GetPermissions", testfile);
IOnU->UpdatePermissions ("{\"read\":[\"me\",\"you\"],\"write\":[\"me\",\"you\"]}");
metadata = IOnU->GetPermissions();
if (metadata.size() > 0)
cout << metadata << endl;
else
rc += testfailed ("GetPermissions", testfile);
IOnU->UpdatePermissions ("{\"read\":[\"me\"]}");
metadata = IOnU->GetPermissions();
if (metadata.size() > 0)
cout << metadata << endl;
else
rc += testfailed ("GetPermissions", testfile);
IOnU->UpdatePermissions ("{\"read\":[\"+george\"], \"write\":[\"+george\"]}");
metadata = IOnU->GetPermissions();
if (metadata.size() > 0)
cout << metadata << endl;
else
rc += testfailed ("GetPermissions", testfile);
IOnU->UpdatePermissions ("{\"read\":[\"-george\"]}");
metadata = IOnU->GetPermissions();
if (metadata.size() > 0)
cout << metadata << endl;
else
rc += testfailed ("GetPermissions", testfile);
IOnU->UpdateMetaData ("{\"msg\":{\"drr\":true}}");
metadata = IOnU->GetMetaData();
if (metadata.size() > 0)
cout << metadata << endl;
else
rc += testfailed ("UpdateMetaData", testfile);
// Get HTML file contents as a message
txtmsg = IOnU->GetTextMessage ("test.html");
if (txtmsg.size() > 1 && txtmsg.compare (0, 14, "<!DOCTYPE html>", 14) == 0)
printf ("HTML message passed\n");
else
rc += testfailed ("GetTextMessage", "<!DOCTYPE html>");
if (!IOnU->RemoveEntry (xmlfile))
rc += testfailed ("RemoveEntry", xmlfile);
IOnU->Finalize();
delete IOnU;
IOnU = new EyeContainer("test/test.ionu", TGIkey);
IOnU->ListFiles();
metadata = IOnU->GetMetaData();
if (metadata.size() > 0)
cout << metadata << endl;
if (!IOnU->ExtractFile ("style.xsd", "test/extracted.xsd"))
rc += testfailed ("ExtractFile", "style.xsd");
delete IOnU;
// Create a large archive
IOnU = new EyeContainer("test/bigtest.ionu", TGIkey, URN, PERMS);
IOnU->AddTextMessage ("test/Message", "Holy crap Batman there are a lot of files in here, and there are no problems with that");
char message[64];
//for (int i = 0; i < 1000; ++i) { // Verified with 1,000, but just use 10 for regular test runs
for (int i = 0; i < 10; ++i) {
sprintf (message, "test/Message%d", i);
IOnU->AddTextMessage (message, "I'm a robot and I love to chat with other bots");
}
if (!IOnU->RenameFile ("test/Message4", "test/renamed"))
rc += testfailed ("RenameFile()", "r/o");
IOnU->Finalize();
delete IOnU;
IOnU = new EyeContainer("test/tags1.ionu", TGIkey, URN, TopicPerms);
IOnU->AddTextMessage (".imchat", "A long and verbose yo there to you from me type chat message to test various stuff with");
IOnU->AddTags (tags1);
IOnU->Finalize();
delete IOnU;
IOnU = new EyeContainer("test/tags2.ionu", TGIkey, URN, TopicPerms);
IOnU->AddTextMessage (".imchat", "A long and verbose yo there to you from me type chat message to test various stuff with");
IOnU->AddTags (tags2);
IOnU->Finalize();
delete IOnU;
IOnU = new EyeContainer("test/tags1.ionu", TGIkey, ios::in);
gtags = IOnU->GetTags();
cout << gtags << endl;
delete IOnU;
IOnU = new EyeContainer("test/tags2.ionu", TGIkey, ios::in);
gtags = IOnU->GetTags();
cout << gtags << endl;
delete IOnU;
if (rc == 0) printf ("so far passed\n");
// Test readonly EyeContainer
printf ("Readonly tests ----------------\n");
size_t nwritten = 0;
std::string sb;
std::string sentry ("test/Message");
std::streamoff spos = 0;
std::streamoff ssize = 0;
char sbuffer[1024];
IOnU = new EyeContainer("test/bigtest.ionu", ggkey, ios::in);
IOnU->ListFiles();
IOnU->ExtractFiles();
metadata = IOnU->GetMetaData();
if (metadata.size() < 50)
rc += testfailed ("GetMetaData", "r/o");
cout << metadata << endl;
metadata = IOnU->GetPermissions();
if (metadata.size() < 50)
rc += testfailed ("GetPermissions", "r/o");
metadata = IOnU->GetMetaData(".ionumeta");
if (metadata.size() < 50)
rc += testfailed ("GetMetaData(.ionumeta)", "r/o");
metadata = IOnU->GetMetaData(".ionuperm");
if (metadata.size() < 50)
rc += testfailed ("GetMetaData(.ionuperm)", "r/o");
metadata = IOnU->GetContentFilenames();
if (metadata.size() < 50)
rc += testfailed ("GetContentFilenames()", "r/o");
metadata = IOnU->GetContentFileObjects();
if (metadata.size() < 50)
rc += testfailed ("GetContentFileObjects()", "r/o");
if (!IOnU->HasEntry (sentry, &ssize))
rc += testfailed ("GetContentMetaData()", "r/o");
else
cout << "found " << sentry << " " << ssize << endl;
if (IOnU->GetFileSize ("test/Message3") != 46)
rc += testfailed ("GetFileSize()", "r/o");
metadata = IOnU->GetTextMessage (sentry);
if (metadata.compare (0, 9, "Holy crap", 9) != 0)
rc += testfailed ("GetTextMessage()", "r/o");
if (!IOnU->ExtractFile (sentry, sentry))
rc += testfailed ("ExtractFile()", "r/o");
spos = 0;
IOnU->ReadStream (sentry, spos, sbuffer, 35, &nwritten);
sb.assign (sbuffer, nwritten);
cout << sb << endl;
spos += nwritten;
IOnU->ReadStream (sentry, spos, sbuffer, 32, &nwritten);
sb.assign (sbuffer, nwritten);
cout << sb << endl;
spos += nwritten;
IOnU->ReadStream (sentry, spos, sbuffer, 32, &nwritten);
sb.assign (sbuffer, nwritten);
cout << sb << endl;
spos = 7;
IOnU->ReadStream (sentry, spos, sbuffer, 32, &nwritten);
sb.assign (sbuffer, nwritten);
cout << sb << endl;
if (metadata.compare (0, 9, "Holy crap", 9) != 0)
rc += testfailed ("GetTextMessage()", "r/o");
delete IOnU;
//exit(1);
// Test EyeContainer stream interfaces
if (rc == 0) printf ("so far passed\n");
printf ("Stream interface tests ----------------\n");
sentry = "stream";
IOnU = new EyeContainer("test/streamtest.ionu", TGIkey, URN, PERMS);
spos = 0;
IOnU->WriteStream (sentry, spos, "This is a streaming video test s", 32, &nwritten);
spos = 32;
IOnU->WriteStream (sentry, spos, "tream not really", 16, &nwritten);
IOnU->Finalize();
delete IOnU;
IOnU = new EyeContainer("test/streamtest.ionu", TGIkey);
unsigned char* ex = IOnU->ExtractMemoryFile (sentry, &nwritten);
if (ex) {
sb.assign ((char*)ex, nwritten);
cout << sb << endl;
delete[] ex;
}
else
rc += testfailed ("ExtractMemoryFile()", sentry);
spos = 0;
IOnU->ReadStream (sentry, spos, sbuffer, 48, &nwritten);
sb.assign (sbuffer, 48);
cout << sb << endl;
spos = 32;
IOnU->WriteStream (sentry, spos, "tream yes it is!", 16, &nwritten);
IOnU->Finalize();
delete IOnU;
IOnU = new EyeContainer("test/streamtest.ionu", TGIkey);
IOnU->ListFiles();
metadata = IOnU->GetMetaData();
cout << metadata << endl;
spos = 0;
IOnU->ReadStream (sentry, spos, sbuffer, 48, &nwritten);
sb.assign (sbuffer, 48);
cout << sb << endl;
spos = 30;
IOnU->SetStreamSize (sentry, spos);
cout << "streamsize " << IOnU->GetStreamSize(sentry) << endl;
IOnU->Finalize();
delete IOnU;
IOnU = new EyeContainer("test/streamtest.ionu", ggkey, ios::in);
IOnU->ListFiles();
IOnU->ExtractFiles();
metadata = IOnU->GetMetaData();
cout << metadata << endl;
delete IOnU;
IOnU = new EyeContainer("test/streamtest.ionu", TGIkey);
cout << "streamsize " << IOnU->GetStreamSize(sentry) << endl;
spos = 0;
IOnU->SetStreamSize (sentry, spos);
cout << "streamsize " << IOnU->GetStreamSize(sentry) << endl;
IOnU->WriteStream (sentry, spos, (void*)"First chunk of data for stream", 30, &nwritten);
spos = 30;
IOnU->WriteStream (sentry, spos, (void*)", second chunk of data for stream", 33, &nwritten);
spos = 63;
IOnU->WriteStream (sentry, spos, (void*)", last chunk of data for stream", 31, &nwritten);
IOnU->Finalize();
delete IOnU;
IOnU = new EyeContainer("test/streamtest.ionu", TGIkey);
cout << "streamsize " << IOnU->GetStreamSize(sentry) << endl;
spos = 0;
IOnU->ReadStream (sentry, spos, sbuffer, 94, &nwritten);
sb.assign (sbuffer, 94);
cout << sb << endl;
cout << IOnU->GetMetaData() << endl;
ex = IOnU->ExtractMemoryFile (sentry, &nwritten);
if (nwritten != 94 || sequencelogic::MemCmp (sb.data(), ex, nwritten) != 0)
rc += testfailed ("ExtractMemoryFile", "stream 94");
if (ex) delete[] ex;
delete IOnU;
IOnU = new EyeContainer("test/streamtest.ionu", TGIkey);
cout << "streamsize " << IOnU->GetStreamSize(sentry) << endl;
spos = 40;
IOnU->SetStreamSize (sentry, spos);
IOnU->Finalize();
delete IOnU;
IOnU = new EyeContainer("test/streamtest.ionu", TGIkey);
ex = IOnU->ExtractMemoryFile (sentry, &nwritten);
if (nwritten != 40)
rc += testfailed ("ExtractMemoryFile", "stream 40");
if (ex) delete[] ex;
delete IOnU;
if (rc == 0)
printf ("\nC++ interface tests passed\n-------------------------------\n");
else
printf ("\n%d C++ interface tests failed\n-------------------------------\n", rc);
// Test the extern "C" interfaces
printf ("\nTestin C interfaces\n-------------------------------\n");
if (ionu_eyefile_is_valid (NULL))
rc += testfailed ("ionu_eye_is_valid", "NULL");
if (ionu_eyefile_is_valid ("bogus"))
rc += testfailed ("ionu_eye_is_valid", "bogus");
if (ionu_eyefile_is_valid (testfile))
rc += testfailed ("ionu_eye_is_valid", testfile);
if (! ionu_eyefile_create_with_content (cionu, TGIkey, "TGI", TGIkey, SL_AES_KEY_LEN, "application/tgi", URN, PERMS))
rc += testfailed ("ionu_eye_create_with_content", "TGI");
if (! ionu_eyefile_create_with_message (cionu, TGIkey, "Thread", "Hello there", 11, URN, PERMS))
rc += testfailed ("ionu_eye_create_with_message", "Thread");
if (! ionu_eyefile_is_valid (cionu))
rc += testfailed ("ionu_eye_is_valid", cionu);
// Simple message test
cmsg = ionu_eyefile_get_message (cionu, TGIkey, "Thread");
if (cmsg) {
printf ("%s\n", cmsg);
free (cmsg);
}
else
rc += testfailed ("ionu_eye_get_message", "Thread");
// File test with bad key, then good key
if (! ionu_eyefile_create_with_file (cionu, TGIkey, testfile, "test/plain", URN, PERMS))
rc += testfailed ("ionu_eye_create_with_file", cionu);
if (ionu_eyefile_extract_file (cionu, badkey, testfile)) {
if (filecompare (testfile, testfile_orig))
rc += testfailed ("Extract Bad TGI key", testfile);
else
printf ("PASSED: Bad TGI key test check\n");
}
else {
printf ("PASSED: Bad TGI key test\n");
}
if (ionu_eyefile_extract_file (cionu, TGIkey, testfile)) {
if (filecompare (testfile, testfile_orig))
printf ("PASSED: ionu_eyefile_extract_file: Good TGI key test\n");
else
rc += testfailed ("ionu_eyefile_extract_file: file differences", testfile);
}
else
rc += testfailed ("ionu_eyefile_extract_file: extract", testfile);
// Long path test
if (! ionu_eyefile_create_with_file (cionu, TGIkey, longtest, "test/plain", URN, PERMS))
rc += testfailed ("ionu_eye_create_with_file - longpath test", cionu);
if (ionu_eyefile_extract_file (cionu, TGIkey, longtest)) {
if (filecompare (longtest, testfile_orig))
printf ("PASSED: ionu_eyefile_extract_file: Long path test\n");
else
rc += testfailed ("ionu_eyefile_extract_file long path: file differences in long", testfile);
}
else
rc += testfailed ("ionu_eyefile_extract_file: extract long", testfile);
// Verify meta data
cmeta = ionu_eyefile_get_meta_data (cionu);
if (cmeta) {
printf ("%s\n", cmeta);
free (cmeta);
}
else
rc += testfailed ("ionu_eye_get_meta_data", cionu);
// Verify permissions data
cmeta = ionu_eyefile_get_perms (cionu);
if (cmeta) {
printf ("%s\n", cmeta);
free (cmeta);
}
else
rc += testfailed ("ionu_eye_get_permissions", cionu);
EyeLog::GetInstance()->SetLogLevel (EyeLog::IONU_DEBUG);
// Replace meta data, works first time, second fails because transaction count is too low
cmeta = ionu_eyefile_get_meta_data (cionu);
if (!ionu_eyefile_replace_meta_data (cionu, cmeta))
rc += testfailed ("ionu_eyefile_replace_meta_data - same meta", cionu);
if (ionu_eyefile_replace_meta_data (cionu, cmeta))
rc += testfailed ("ionu_eyefile_replace_meta_data - old meta", cionu);
free (cmeta);
// SHredd
if (ionu_eyefile_shred (cionu))
printf ("Shred passed\n");
else
rc += testfailed ("Shred failed", cionu);
// Message with multiple associated files and attachments
if (! ionu_eyefile_create_with_message (cionu, TGIkey, "Thread", "Hello there", 11, URN2, PERMS))
rc += testfailed ("ionu_eye_create_with_message", "Thread");
cmeta = ionu_eyefile_get_meta_data (cionu);
if (cmeta) {
printf ("%s\n", cmeta);
free (cmeta);
}
ionu_eyefile_add_file (cionu, TGIkey, attachfile, NULL);
ionu_eyefile_add_thumbnail (cionu, TGIkey, thumbfile, NULL);
ionu_eyefile_add_message (cionu, TGIkey, "Word", "see attachment", 14);
ionu_eyefile_add_content (cionu, TGIkey, "TGI", TGIkey, SL_AES_KEY_LEN, "application/tgi");
ionu_eyefile_add_message (cionu, TGIkey, "UTF", smiley, strlen(smiley)+1);
// Verify meta data
cmeta = ionu_eyefile_get_meta_data (cionu);
if (cmeta) {
printf ("%s\n", cmeta);
free (cmeta);
}
else
rc += testfailed ("ionu_eye_get_meta_data multiple files", cionu);
// Verify meta data
cmeta = ionu_eyefile_get_file_objects (cionu);
if (cmeta) {
printf ("%s\n", cmeta);
free (cmeta);
}
else
rc += testfailed ("ionu_eyefile_get_file_objects multiple files", cionu);
cmsg = ionu_eyefile_get_message (cionu, TGIkey, "Thread");
if (cmsg) {
printf ("%s\n", cmsg);
free (cmsg);
}
else
rc += testfailed ("ionu_eye_get_message", "Thread");
ionu_eyefile_add_message (cionu, TGIkey, "Word", "see attachment - replaced", 25);
cmsg = ionu_eyefile_get_message (cionu, TGIkey, "Word");
if (cmsg) {
printf ("%s\n", cmsg);
free (cmsg);
}
else
rc += testfailed ("ionu_eye_get_message", "Word");
cmsg = ionu_eyefile_get_message (cionu, TGIkey, "UTF");
if (cmsg) {
if (sequencelogic::StrCmp (cmsg, smiley) != 0)
rc += testfailed ("ionu_eye_get_message", smiley);
free (cmsg);
}
size_t thumbsize = ionu_eyefile_get_file_size (cionu, TGIkey, "thumb.png");
if (thumbsize != 45119) {
rc += testfailed ("ionu_eyefile_get_file_size", thumbfile);
}
if (ionu_eyefile_get_file_size (cionu, TGIkey, "TGI") != SL_AES_KEY_LEN)
rc += testfailed ("ionu_eyefile_get_file_size", "TGI");
unsigned char tbuff[SL_AES_KEY_LEN];
if (!ionu_eyefile_get_content (cionu, TGIkey, "TGI", tbuff))
rc += testfailed ("ionu_eyefile_get_content", "TGI");
if (memcmp (TGIkey, tbuff, SL_AES_KEY_LEN) != 0)
rc += testfailed ("ionu_eyefile_get_content", "TGI does not match");
if (ionu_eyefile_get_content_and_write_to_file (cionu, badkey, "Word", "test/word"))
rc += testfailed ("ionu_eyefile_get_content_and_write_to_file", "bad should fail");
if (!ionu_eyefile_get_content_and_write_to_file (cionu, TGIkey, "Word", "test/word"))
rc += testfailed ("ionu_eyefile_get_content_and_write_to_file", "didn't get the word");
if (!ionu_eyefile_get_content_and_write_to_file (cionu, TGIkey, "Word", "test/word"))
rc += testfailed ("ionu_eyefile_get_content_and_write_to_file", "didn't get the word twice");
if (ionu_eyefile_get_content_and_write_to_file (cionu, TGIkey, "Word", "test/readonly"))
rc += testfailed ("ionu_eyefile_get_content_and_write_to_file", "got the readonly word");
// Try to get a text message with badkey, should return NULL
cmsg = ionu_eyefile_get_message (cionu, badkey, "Word");
if (cmsg) {
rc += testfailed ("ionu_eye_get_message", "badkey Word");
free (cmsg);
}
// Change the key and try again
ionu_eyefile_change_key (cionu, TGIkey, badkey);
cmsg = ionu_eyefile_get_message (cionu, badkey, "Word");
if (cmsg) {
printf ("Rekeyed: %s\n", cmsg);
free (cmsg);
}
else
rc += testfailed ("ionu_eye_get_message", "rekeyed Word");
// Verify meta data
cmeta = ionu_eyefile_get_meta_data (cionu);
if (cmeta) {
printf ("%s\n", cmeta);
free (cmeta);
}
else
rc += testfailed ("ionu_eye_get_meta_data", cionu);
// Verify list of file names
cmeta = ionu_eyefile_get_filenames (cionu);
if (cmeta) {
printf ("%s\n", cmeta);
free (cmeta);
}
else
rc += testfailed ("ionu_eyefile_get_filenames", cionu);
cmeta = ionu_eyefile_get_file_objects (cionu);
if (cmeta) {
printf ("%s\n", cmeta);
free (cmeta);
}
else
rc += testfailed ("ionu_eyefile_get_file_objects", cionu);
const char* chatbot = "I'm a robot and I love to chat with other bots";
size_t chatsize = strlen (chatbot);
// Replace the permissions, which should change the tgisig
cmeta = ionu_eyefile_get_meta_data (cionu);
ionu_eyefile_replace_perms (cionu, PERMS3);
coldmeta = ionu_eyefile_get_meta_data (cionu);
if (sequencelogic::StrCmp (coldmeta, cmeta) == 0)
rc += testfailed ("ionu_eyefile_replace_perms TGI sig unchanged", cionu);
free (cmeta);
free (coldmeta);
coldmeta = ionu_eyefile_get_perms (cionu);
if (ionu_eyefile_shred_contents (cionu, TGIkey, shredurn)) {
if (ionu_eyefile_get_status (cionu) != SHREDDED)
rc += testfailed ("ionu_eyefile_get_status", "shredded");
cmeta = ionu_eyefile_get_filenames (cionu);
if (cmeta && strcmp (cmeta, "[]") != 0)
rc += testfailed ("ionu_eyefile_shred_contents []", cmeta);
// Verify meta data
cmeta = ionu_eyefile_get_meta_data (cionu);
if (cmeta) {
if (! strstr (cmeta, "status\":\"deleted"))
rc += testfailed ("ionu_eyefile_shred_contents deleted", cmeta);
free (cmeta);
}
else
rc += testfailed ("ionu_eyefile_get_meta_data after shred", cionu);
// Verify perms
cmeta = ionu_eyefile_get_perms (cionu);
if (cmeta) {
if (sequencelogic::StrCmp (coldmeta, cmeta) != 0)
rc += testfailed ("ionu_eyefile_shred_contents perms", cmeta);
free (cmeta);
}
else
rc += testfailed ("ionu_eyefile_get_perms after shred", cionu);
}
else
rc += testfailed ("ionu_eyefile_shred_contents failed", cionu);
free (coldmeta);
// Try adding a message to shredded container
if (ionu_eyefile_add_message (cionu, TGIkey, "1000's", chatbot, chatsize))
rc += testfailed ("ionu_eyefile_add_message to shredded container", cionu);
coldmeta = ionu_eyefile_get_meta_data (cionu);
ionu_eyefile_replace_meta_data (cionu, megaMeta);
cmeta = ionu_eyefile_get_meta_data (cionu);
// Shredded container, so it should fail to update
if (sequencelogic::StrCmp (coldmeta, cmeta) != 0)
rc += testfailed ("ionu_eyefile_shred_contents replace meta data", cionu);
free (coldmeta);
free (cmeta);
ionu_eyefile_create_with_message (cionu, TGIkey, "1000's", chatbot, chatsize, URN1, PERMS);
//for (int i = 0; i < 1000; ++i) { // Verified with 1,000, but just use 10 for regular test runs
for (int i = 0; i < 10; ++i) {
ionu_eyefile_add_message (cionu, TGIkey, "1000's", chatbot, chatsize);
char* msg = ionu_eyefile_get_message (cionu, TGIkey, "1000's");
if (sequencelogic::MemCmp (msg, chatbot, chatsize) != 0) {
rc += testfailed ("Get1000Messages", chatbot);
}
if (msg) free (msg);
}
ionu_eyefile_add_message (cionu, TGIkey, "1000's", "Short chat", 10);
cmeta = ionu_eyefile_get_message (cionu, TGIkey, "1000's");
if (sequencelogic::MemCmp (cmeta, "Short chat", 10) != 0) {
rc += testfailed ("Get1000Messages", "Short chat");
}
if (cmeta) free (cmeta);
cmeta = ionu_eyefile_get_meta_data (cionu);
if (cmeta) {
printf ("%s\n", cmeta);
free (cmeta);
}
//long ms = sequencelogic::GetSystemTime();
//for (int i=0; i<10000; ++i) {
// meta = ionu_eyefile_get_meta_data (cionu);
// free (meta);
//}
//ms = sequencelogic::GetSystemTime() - ms;
//printf ("get_meta_data() 10,000 values in %ld ms\n", ms);
if (! ionu_eyefile_create_with_message (cionu, TGIkey, "Empty", "", 0, URN1, PERMS))
rc += testfailed ("ionu_eye_create_with_message", "Empty");
cmsg = ionu_eyefile_get_message (cionu, TGIkey, "Empty");
if (cmsg && *cmsg == '\0') {
printf ("Empty message passed <>\n");
free (cmsg);
}
else
rc += testfailed ("ionu_eye_get_message", "Empty");
ionu_eyefile_replace_meta_data (cionu, megaMeta);
cmeta = ionu_eyefile_get_meta_data (cionu);
if (cmeta) {
printf ("%s\n", cmeta);
free (cmeta);
}
else
rc += testfailed ("ionu_eyefile_replace_meta_data", cionu);
ionu_eyefile_create_with_message (yoionu, TGIkey, ".imchat", "Yo!", 3, URN, PERMS);
cmsg = ionu_eyefile_get_message (yoionu, TGIkey, ".imchat");
if (!cmsg || strcmp (cmsg, "Yo!") != 0)
rc += testfailed ("ionu_eye_get_message", "Yo!");
if (cmsg) free (cmsg);
cmsg = ionu_eyefile_get_message ("test/yo_eyecontainer.ionu", TGIkey, ".imchat");
if (!cmsg || strcmp (cmsg, "Yo!") != 0)
rc += testfailed ("ionu_eye_get_message - EyeContainer", "Yo!");
if (cmsg) free (cmsg);
if (ionu_eyefile_get_content_and_write_to_file ("test/yo_eyecontainer.ionu", badkey, ".imchat", "test/chat"))
rc += testfailed ("ionu_eyefile_get_content_and_write_to_file - EyeContainer", "Yo!");
// Invalid argument and modified file tests
printf ("Invalid argument tests\n-------------------------------\n");
if (ionu_eyefile_get_message (cionu, TGIkey, NULL))
rc += testfailed ("ionu_eye_get_message", "extracted NULL");
if (ionu_eyefile_get_message (cionu, NULL, "Empty"))
rc += testfailed ("ionu_eye_get_message", "NULL key");
if (ionu_eyefile_get_message (NULL, TGIkey, "Empty"))
rc += testfailed ("ionu_eye_get_message", "NULL .ionu");
if (ionu_eyefile_get_message (empty_ionu, TGIkey, "Empty"))
rc += testfailed ("ionu_eye_get_message", "empty .ionu");
if (ionu_eyefile_get_meta_data (empty_ionu))
rc += testfailed ("ionu_eyefile_get_meta_data", "empty .ionu");
if (ionu_eyefile_get_filenames (empty_ionu))
rc += testfailed ("ionu_eyefile_get_filenames", "empty .ionu");
if (ionu_eyefile_get_message ("", TGIkey, "Empty"))
rc += testfailed ("ionu_eye_get_message", "empty .ionu");
if (ionu_eyefile_get_message ("this path does not exist/test.ionu", TGIkey, "Empty"))
rc += testfailed ("ionu_eye_get_message", "this path does not exist .ionu");
if (ionu_eyefile_get_message ((char*)TGIkey, TGIkey, "Empty"))
rc += testfailed ("ionu_eye_get_message", "bad .ionu");
if (ionu_eyefile_get_message ("test\ncionu", TGIkey, "Empty"))
rc += testfailed ("ionu_eye_get_message", "bad file path");
if (ionu_eyefile_get_message (cionu, TGIkey, "bogus"))
rc += testfailed ("ionu_eye_get_message", "extracted bogus");
if (ionu_eyefile_extract_file (cionu, TGIkey, (char*)TGIkey))
rc += testfailed ("ionu_eye_extract_file", "extracted TGIkey");
if (ionu_eyefile_extract_file (cionu, TGIkey, "bogus"))
rc += testfailed ("ionu_eye_extract_file", "extracted bogus");
if (ionu_eyefile_create_with_file (cionu, TGIkey, NULL, "test/plain", URN, PERMS))
rc += testfailed ("ionu_eye_create_with_file", "added NULL");
if (ionu_eyefile_create_with_file (cionu, TGIkey, "bogus", "test/plain", URN, PERMS))
rc += testfailed ("ionu_eye_create_with_file", "added bogus");
if (ionu_eyefile_get_message (perm_mods, TGIkey, "Empty"))
rc += testfailed ("ionu_eyefile_get_message", perm_mods);
if (ionu_eyefile_get_message (meta_corrupt, TGIkey, "Empty"))
rc += testfailed ("ionu_eyefile_get_message", meta_corrupt);
if (ionu_eyefile_get_message (fek_corrupt, TGIkey, "Empty"))
rc += testfailed ("ionu_eye_get_message", "fek_corrupt");
if (ionu_eyefile_get_meta_data (chksum_corrupt))
rc += testfailed ("ionu_eye_get_meta_data", "chksum_corrupt");
if (ionu_eyefile_get_message (chksum_corrupt, TGIkey, "Empty"))
rc += testfailed ("ionu_eye_get_message", "chksum_corrupt");
if (rc == 0)
printf ("\nEyeContainer interface tests passed\n-------------------------------\n");
else
printf ("\n%d EyeContainer interface tests failed\n-------------------------------\n", rc);
*/
return rc;
}
void GeneratePattern (unsigned char* buffer, std::streamoff spos)
{
char posbuf[16];
sprintf (posbuf, "%08lx", spos);
memcpy (buffer, posbuf, 8);
}
int RandomStreamTest (const std::string& sentry, size_t chunk, size_t chunks, unsigned char* rbuffer, unsigned char* wbuffer)
{
int rc = 0;
/*
std::vector<std::streamoff> positions;
std::streamoff spos = 0;
size_t i = 0;
for (i = 0; i < chunks; ++i) {
positions.push_back (spos);
spos += chunk;
}
for (i = 0; i < chunks * 100; ++i) {
size_t a = rand() % positions.size();
size_t b = rand() % positions.size();
if (a != b) {
std::streamoff save = positions[a];
positions[a] = positions[b];
positions[b] = save;
}
}
memset (rbuffer, '1', chunk);
memset (wbuffer, '1', chunk);
Key tgi ("tgi", "stream", SL_AES_KEY_LEN, TGIkey, Key::AES);
EyeContainer* eye = new EyeContainer("test/performance.ionu", tgi, URN, PERMS);
eye->SetStreamSize (sentry, chunk * chunks);
cout << "RandomStreamTest - streamsize " << eye->GetStreamSize(sentry) << endl;
// Write the random blocks
size_t nwritten = 0;
for (i = 0; i < chunks; ++i) {
spos = positions[i];
GeneratePattern (wbuffer, spos);
eye->WriteStream (sentry, spos, wbuffer, chunk, &nwritten);
if (nwritten != chunk) {
IONUDEBUG ("FAILED: RandomStreamTest() - wrote %d of %d at %d", nwritten, chunk, spos);
rc++;
break;
}
}
// Read them and verify content match
for (i = 0; i < chunks; ++i) {
spos = positions[i];
eye->ReadStream (sentry, spos, rbuffer, chunk, &nwritten);
if (nwritten != chunk) {
IONUDEBUG ("FAILED: RandomStreamTest() - read %d of %d at %d", nwritten, chunk, spos);
rc++;
break;
}
GeneratePattern (wbuffer, spos);
if (memcmp (wbuffer, rbuffer, nwritten) != 0) {
IONUDEBUG ("FAILED: RandomStreamTest() - read/write mismatch, before flush in block starting at %d of size %d", spos, nwritten);
rc++;
size_t badbytes = 0;
std::streamoff badpos = spos;
for (size_t j = 0; j < chunk; ++j) {
if (rbuffer[j] != '1') {
if (badbytes == 0)
badpos += j;
badbytes++;
}
}
if (badbytes > 0) {
IONUDEBUG ("RandomStreamTest() - %d bytes starting at %d", badbytes, badpos);
}
}
}
// Flush to disk and verify read again
eye->Flush();
delete eye;
eye = new EyeContainer("test/performance.ionu", tgi);
for (i = 0; i < chunks; ++i) {
spos = positions[i];
eye->ReadStream (sentry, spos, rbuffer, chunk, &nwritten);
if (nwritten != chunk) {
IONUDEBUG ("FAILED: RandomStreamTest() - read after flush %d of %d at %d on block %d", nwritten, chunk, spos, i);
rc++;
break;
}
GeneratePattern (wbuffer, spos);
if (memcmp (wbuffer, rbuffer, nwritten) != 0) {
IONUDEBUG ("FAILED: RandomStreamTest() - read/write mismatch, after flush in block %d starting at %d of size %d", i, spos, nwritten);
rc++;
size_t badbytes = 0;
std::streamoff badpos = spos;
for (size_t j = 0; j < chunk; ++j) {
if (rbuffer[j] != '1') {
if (badbytes == 0)
badpos += j;
badbytes++;
}
}
if (badbytes > 0) {
IONUDEBUG ("RandomStreamTest() - %d bytes starting at %d", badbytes, badpos);
break;
}
}
}
delete eye;
// Verify readonly
eye = new EyeContainer("test/performance.ionu", tgi, ios::in);
for (i = 0; i < chunks; ++i) {
spos = positions[i];
eye->ReadStream (sentry, spos, rbuffer, chunk, &nwritten);
if (nwritten != chunk) {
IONUDEBUG ("FAILED: RandomStreamTest() - readonly read %d of %d at %d", nwritten, chunk, spos);
rc++;
break;
}
GeneratePattern (wbuffer, spos);
if (memcmp (wbuffer, rbuffer, nwritten) != 0) {
IONUDEBUG ("FAILED: RandomStreamTest() - read/write mismatch, readonly in block starting at %d of size %d", spos, nwritten);
rc++;
size_t badbytes = 0;
std::streamoff badpos = spos;
for (size_t j = 0; j < chunk; ++j) {
if (rbuffer[j] != '1') {
if (badbytes == 0)
badpos += j;
badbytes++;
}
}
if (badbytes > 0) {
IONUDEBUG ("RandomStreamTest() - %d bytes starting at %d", badbytes, badpos);
}
}
}
delete eye;
*/
return rc;
}
// Sequential read, with readonly file, verify data with expected value
bool StreamVerify (const std::string& sentry, size_t chunk, size_t chunks, unsigned char* rbuffer, unsigned char* wbuffer)
{
bool rc = true;
/*
size_t nwritten = 0;
std::streamoff spos = 0;
Key tgi ("tgi", "stream", SL_AES_KEY_LEN, TGIkey, Key::AES);
EyeContainer* eye = new EyeContainer("test/performance.ionu", tgi, ios::in);
for (size_t i = 0; i < chunks; ++i) {
spos = i * chunk;
GeneratePattern (wbuffer, spos);
eye->ReadStream (sentry, spos, rbuffer, chunk, &nwritten);
if (nwritten != chunk) {
IONUDEBUG ("FAILED: StreamVerify() - read %d of %d at %d", nwritten, chunk, spos);
break;
}
if (memcmp (wbuffer, rbuffer, nwritten) != 0) {
rc = false;
IONUDEBUG ("FAILED: StreamVerify() - read/write mismatch in block starting at %d of size %d", spos, nwritten);
size_t badbytes = 0;
std::streamoff badpos = spos;
for (size_t j = 0; j < chunk; ++j) {
if (rbuffer[j] != wbuffer[j]) {
if (badbytes == 0)
badpos += j;
badbytes++;
}
}
if (badbytes > 0) {
IONUDEBUG ("FAILED: StreamVerify() - %d bytes starting at %d", badbytes, badpos);
}
}
}
delete eye;
*/
return rc;
}
int PerformanceTest()
{
printf ("\nSpeed Testin stream interfaces\n-------------------------------\n");
int rc = 0;
/*
size_t chunk = IONU_EYE_STREAM_CHUNK/4;
size_t chunks = 98;
EyeContainer* IOnU = NULL;
std::string sentry ("stream");
std::streamoff spos = 0;
std::string baseline = "";
std::string digest = "";
size_t nwritten = 0;
Key junk;
Key tgi ("tgi", "stream", SL_AES_KEY_LEN, TGIkey, Key::AES);
unsigned char iv[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'a', 'b', 'c', 'd', 'e', 'f'};
unsigned char* rbuffer = sequencelogic::New (chunk);
unsigned char* wbuffer = sequencelogic::New (chunk);
memset (wbuffer, '1', chunk);
std::chrono::high_resolution_clock::time_point begin;
std::chrono::high_resolution_clock::time_point end;
std::chrono::duration<double> time_span;
// Sequential write
begin = std::chrono::high_resolution_clock::now();
IOnU = new EyeContainer("test/performance.ionu", tgi, URN, PERMS);
for (size_t i = 0; i < chunks; ++i) {
spos = i * chunk;
GeneratePattern (wbuffer, spos);
IOnU->WriteStream (sentry, spos, wbuffer, chunk, &nwritten);
if (nwritten != chunk) {
IONUDEBUG ("PerformanceTest() - wrote %d of %d", nwritten, chunk);
break;
}
}
//IOnU->WriteStream (sentry, chunk * chunks, wbuffer, 3, &nwritten);
IOnU->Finalize();
delete IOnU;
end = std::chrono::high_resolution_clock::now();
time_span = std::chrono::duration_cast<std::chrono::duration<double>>(end - begin);
cout << "Sequential write in " << time_span.count() << " seconds" << endl;
// Get baseline hash
IOnU = new EyeContainer("test/performance.ionu", tgi, ios::in);
IOnU->ExtractFile (sentry);
//unsigned char* membuf = IOnU->ExtractMemoryFile (sentry, &nwritten);
delete IOnU;
//if (membuf) delete[] membuf;
begin = std::chrono::high_resolution_clock::now();
baseline = sequencelogic::DigestFile ("sha1", "stream");
cout << baseline << endl;
end = std::chrono::high_resolution_clock::now();
time_span = std::chrono::duration_cast<std::chrono::duration<double>>(end - begin);
cout << "Digested in " << time_span.count() << " seconds" << endl;
begin = std::chrono::high_resolution_clock::now();
if (!StreamVerify (sentry, chunk, chunks, rbuffer, wbuffer))
rc++;
end = std::chrono::high_resolution_clock::now();
time_span = std::chrono::duration_cast<std::chrono::duration<double>>(end - begin);
cout << "Sequential readonly in " << time_span.count() << " seconds" << endl;
// Raw file encryption time
begin = std::chrono::high_resolution_clock::now();
tgi.SymmetricEncryptFile ("stream", "estream", iv);
end = std::chrono::high_resolution_clock::now();
time_span = std::chrono::duration_cast<std::chrono::duration<double>>(end - begin);
cout << "Encrypted in " << time_span.count() << " seconds" << endl;
begin = std::chrono::high_resolution_clock::now();
tgi.SymmetricDecryptFile ("estream", "stream", iv);
end = std::chrono::high_resolution_clock::now();
time_span = std::chrono::duration_cast<std::chrono::duration<double>>(end - begin);
cout << "Decrypted in " << time_span.count() << " seconds" << endl;
digest = sequencelogic::DigestFile ("sha1", "stream");
if (digest != baseline)
cout << "FAIL: digest mismatch " << digest << " expected " << baseline << endl;
// Random write/read tests
begin = std::chrono::high_resolution_clock::now();
rc += RandomStreamTest (sentry, chunk, chunks, rbuffer, wbuffer);
IOnU = new EyeContainer("test/performance.ionu", tgi, ios::in);
IOnU->ExtractFile (sentry);
delete IOnU;
digest = sequencelogic::DigestFile ("sha1", "stream");
if (digest != baseline)
cout << "FAIL: digest mismatch " << digest << " expected " << baseline << endl;
end = std::chrono::high_resolution_clock::now();
time_span = std::chrono::duration_cast<std::chrono::duration<double>>(end - begin);
cout << "Random stream test in " << time_span.count() << " seconds" << endl;
// Reverse write new stream
begin = std::chrono::high_resolution_clock::now();
IOnU = new EyeContainer("test/performance.ionu", tgi, URN, PERMS);
IOnU->SetStreamSize (sentry, chunk * chunks);
for (int i = chunks - 1; i >= 0; --i) {
spos = i * chunk;
GeneratePattern (wbuffer, spos);
IOnU->WriteStream (sentry, spos, wbuffer, chunk, &nwritten);
if (nwritten != chunk) {
IONUDEBUG ("PerformanceTest() - wrote %d of %d at %d", nwritten, chunk, spos);
break;
}
}
IOnU->Finalize();
delete IOnU;
end = std::chrono::high_resolution_clock::now();
time_span = std::chrono::duration_cast<std::chrono::duration<double>>(end - begin);
cout << "Reverse write in " << time_span.count() << " seconds" << endl;
IOnU = new EyeContainer("test/performance.ionu", tgi, ios::in);
IOnU->ExtractFile (sentry);
delete IOnU;
digest = sequencelogic::DigestFile ("sha1", "stream");
if (digest != baseline)
cout << "FAIL: digest mismatch " << digest << " expected " << baseline << endl;
if (!StreamVerify (sentry, chunk, chunks, rbuffer, wbuffer))
rc++;
// Skip write in existing stream
begin = std::chrono::high_resolution_clock::now();
IOnU = new EyeContainer("test/performance.ionu", tgi);
for (size_t i = 0; i < chunks; i += 4) {
spos = i * chunk;
GeneratePattern (wbuffer, spos);
IOnU->WriteStream (sentry, spos, wbuffer, chunk, &nwritten);
if (nwritten != chunk) {
IONUDEBUG ("PerformanceTest() - wrote %d of %d", nwritten, chunk);
break;
}
}
IOnU->Finalize();
delete IOnU;
end = std::chrono::high_resolution_clock::now();
time_span = std::chrono::duration_cast<std::chrono::duration<double>>(end - begin);
cout << "Skip 4 write in " << time_span.count() << " seconds" << endl;
if (!StreamVerify (sentry, chunk, chunks, rbuffer, wbuffer))
rc++;
IOnU = new EyeContainer("test/performance.ionu", tgi, ios::in);
IOnU->ExtractFile (sentry);
delete IOnU;
digest = sequencelogic::DigestFile ("sha1", "stream");
if (digest != baseline)
cout << "FAIL: digest mismatch " << digest << " expected " << baseline << endl;
begin = std::chrono::high_resolution_clock::now();
cout << EyeContainer::GetMetaData ("test/performance.ionu", ".ionumeta", tgi) << endl;
end = std::chrono::high_resolution_clock::now();
time_span = std::chrono::duration_cast<std::chrono::duration<double>>(end - begin);
cout << "GetMetaData in " << time_span.count() << " seconds" << endl;
// Verify baseline hash
IOnU = new EyeContainer("test/performance.ionu", tgi, ios::in);
IOnU->ExtractFile (sentry);
delete IOnU;
digest = sequencelogic::DigestFile ("sha1", "stream");
if (digest != baseline)
cout << "FAIL: digest mismatch " << digest << " expected " << baseline << endl;
// Skip read
begin = std::chrono::high_resolution_clock::now();
IOnU = new EyeContainer("test/performance.ionu", tgi);
for (size_t i = 0; i < chunks; i += 4) {
spos = i * chunk;
GeneratePattern (wbuffer, spos);
IOnU->ReadStream (sentry, spos, rbuffer, chunk, &nwritten);
if (nwritten != chunk) {
IONUDEBUG ("PerformanceTest() - read %d of %d", nwritten, chunk);
break;
}
if (memcmp (wbuffer, rbuffer, nwritten) != 0) {
IONUDEBUG ("PerformanceTest() - read/write mismatch in block starting at %d of size %d", spos, nwritten);
size_t badbytes = 0;
std::streamoff badpos = spos;
for (size_t j = 0; j < chunk; ++j) {
if (rbuffer[j] != wbuffer[j]) {
if (badbytes == 0)
badpos += j;
badbytes++;
}
}
if (badbytes > 0) {
IONUDEBUG ("PerformanceTest() - %d bytes starting at %d", badbytes, badpos);
}
}
}
delete IOnU;
end = std::chrono::high_resolution_clock::now();
time_span = std::chrono::duration_cast<std::chrono::duration<double>>(end - begin);
cout << "Skip 4 read in " << time_span.count() << " seconds" << endl;
// Reverse read
begin = std::chrono::high_resolution_clock::now();
IOnU = new EyeContainer("test/performance.ionu", tgi, ios::in | ios::out);
for (int i = chunks - 1; i >= 0; --i) {
spos = i * chunk;
GeneratePattern (wbuffer, spos);
IOnU->ReadStream (sentry, spos, rbuffer, chunk, &nwritten);
if (nwritten != chunk) {
IONUDEBUG ("PerformanceTest() - read %d of %d at %d", nwritten, chunk, spos);
break;
}
if (memcmp (wbuffer, rbuffer, nwritten) != 0) {
IONUDEBUG ("PerformanceTest() - read/write mismatch in block starting at %d of size %d", spos, nwritten);
size_t badbytes = 0;
std::streamoff badpos = spos;
for (size_t j = 0; j < chunk; ++j) {
if (rbuffer[j] != wbuffer[j]) {
if (badbytes == 0)
badpos += j;
badbytes++;
}
}
if (badbytes > 0) {
IONUDEBUG ("PerformanceTest() - %d bytes starting at %d", badbytes, badpos);
}
}
}
delete IOnU;
end = std::chrono::high_resolution_clock::now();
time_span = std::chrono::duration_cast<std::chrono::duration<double>>(end - begin);
cout << "Reverse read in " << time_span.count() << " seconds" << endl;
// Extract plaintext file
begin = std::chrono::high_resolution_clock::now();
IOnU = new EyeContainer("test/performance.ionu", tgi, ios::in);
IOnU->ExtractFile (sentry);
delete IOnU;
end = std::chrono::high_resolution_clock::now();
time_span = std::chrono::duration_cast<std::chrono::duration<double>>(end - begin);
cout << "Extracted in " << time_span.count() << " seconds" << endl;
begin = std::chrono::high_resolution_clock::now();
digest = sequencelogic::DigestFile ("sha1", "stream");
if (digest != baseline)
cout << "FAIL: digest mismatch " << digest << " expected " << baseline << endl;
end = std::chrono::high_resolution_clock::now();
time_span = std::chrono::duration_cast<std::chrono::duration<double>>(end - begin);
cout << "Digested in " << time_span.count() << " seconds" << endl;
// Add plaintext file
begin = std::chrono::high_resolution_clock::now();
IOnU = new EyeContainer("test/performance.ionu", tgi, URN, PERMS);
IOnU->AddContent (sentry, "text/stream");
IOnU->Finalize();
delete IOnU;
end = std::chrono::high_resolution_clock::now();
time_span = std::chrono::duration_cast<std::chrono::duration<double>>(end - begin);
cout << "Added in " << time_span.count() << " seconds" << endl;
begin = std::chrono::high_resolution_clock::now();
IOnU = new EyeContainer("test/performance.ionu", tgi);
IOnU->AddContent (sentry, "text/stream");
IOnU->Finalize();
delete IOnU;
end = std::chrono::high_resolution_clock::now();
time_span = std::chrono::duration_cast<std::chrono::duration<double>>(end - begin);
cout << "Replaced in " << time_span.count() << " seconds" << endl;
cout << EyeContainer::GetMetaData ("test/performance.ionu", ".ionumeta", tgi) << endl;
// Sequential read, with read/write file
begin = std::chrono::high_resolution_clock::now();
IOnU = new EyeContainer("test/performance.ionu", tgi, ios::in | ios::out);
for (int i = 0; i < chunks; ++i) {
spos = i * chunk;
GeneratePattern (wbuffer, spos);
IOnU->ReadStream (sentry, spos, rbuffer, chunk, &nwritten);
if (nwritten != chunk) {
IONUDEBUG ("PerformanceTest() - read %d of %d at %d", nwritten, chunk, spos);
break;
}
if (memcmp (wbuffer, rbuffer, nwritten) != 0) {
IONUDEBUG ("PerformanceTest() - read/write mismatch in block starting at %d of size %d", spos, nwritten);
size_t badbytes = 0;
std::streamoff badpos = spos;
for (size_t j = 0; j < chunk; ++j) {
if (rbuffer[j] != '1') {
if (badbytes == 0)
badpos += j;
badbytes++;
}
}
if (badbytes > 0) {
IONUDEBUG ("PerformanceTest() - %d bytes starting at %d", badbytes, badpos);
}
}
}
delete IOnU;
end = std::chrono::high_resolution_clock::now();
time_span = std::chrono::duration_cast<std::chrono::duration<double>>(end - begin);
cout << "Sequential read in " << time_span.count() << " seconds" << endl;
// Reverse write with SetStreamSize()
begin = std::chrono::high_resolution_clock::now();
IOnU = new EyeContainer("test/performance.ionu", tgi, URN, PERMS);
IOnU->SetStreamSize (sentry, chunk * chunks);
for (int i = chunks - 1; i >= 0; --i) {
spos = i * chunk;
GeneratePattern (wbuffer, spos);
IOnU->WriteStream (sentry, spos, wbuffer, chunk, &nwritten);
if (nwritten != chunk) {
IONUDEBUG ("PerformanceTest() - wrote %d of %d at %d", nwritten, chunk, spos);
break;
}
}
IOnU->Finalize();
delete IOnU;
end = std::chrono::high_resolution_clock::now();
time_span = std::chrono::duration_cast<std::chrono::duration<double>>(end - begin);
cout << "Reverse write, SetStreamSize in " << time_span.count() << " seconds" << endl;
if (!StreamVerify (sentry, chunk, chunks, rbuffer, wbuffer))
rc++;
#ifdef SLOW
// Reverse write
begin = std::chrono::high_resolution_clock::now();
IOnU = new EyeContainer("test/performance.ionu", tgi, ios::in | ios::out);
for (int i = chunks - 1; i >= 0; --i) {
spos = i * chunk;
GeneratePattern (wbuffer, spos);
IOnU->WriteStream (sentry, spos, rbuffer, chunk, &nwritten);
if (nwritten != chunk) {
IONUDEBUG ("PerformanceTest() - wrote %d of %d at %d", nwritten, chunk, spos);
break;
}
}
IOnU->Finalize();
delete IOnU;
end = std::chrono::high_resolution_clock::now();
time_span = std::chrono::duration_cast<std::chrono::duration<double>>(end - begin);
cout << "Reverse write in " << time_span.count() << " seconds" << endl;
EyeContainer::UpdateMetaData ("test/performance.ionu", ".ionumeta", "{\"urn\":\"urn:sl:FFFFFF:FFFFFFFF:ALAN:FROSTFFFFFFF\"}", junk);
// Verify that reverse write worked
IOnU = new EyeContainer("test/performance.ionu", tgi, ios::in);
IOnU->ExtractFile (sentry);
membuf = IOnU->ExtractMemoryFile (sentry, &nwritten);
delete IOnU;
if (membuf) delete[] membuf;
cout << "Extracted " << nwritten << " bytes - " << sequencelogic::DigestFile ("sha1", "stream") << endl;
// Reverse write with sequential read
begin = std::chrono::high_resolution_clock::now();
std::streamoff rpos = 0;
IOnU = new EyeContainer("test/performance.ionu", tgi, ios::in | ios::out);
for (int i = chunks - 1; i >= 0; --i) {
spos = i * chunk;
GeneratePattern (wbuffer, spos);
IOnU->WriteStream (sentry, spos, rbuffer, chunk, &nwritten);
if (nwritten != chunk) {
IONUDEBUG ("PerformanceTest() - wrote %d of %d at %d", nwritten, chunk, spos);
break;
}
IOnU->ReadStream (sentry, rpos, rbuffer, chunk, &nwritten);
rpos += chunk;
}
IOnU->Finalize();
delete IOnU;
end = std::chrono::high_resolution_clock::now();
time_span = std::chrono::duration_cast<std::chrono::duration<double>>(end - begin);
cout << "Reverse write, sequential read in " << time_span.count() << " seconds" << endl;
// Verify that reverse write with sequential read worked
IOnU = new EyeContainer("test/performance.ionu", tgi, ios::in);
IOnU->ExtractFile (sentry);
delete IOnU;
digest = sequencelogic::DigestFile ("sha1", "stream");
if (digest != baseline)
cout << "FAIL: digest mismatch " << digest << " expected " << baseline << endl;
#endif
// Test static methods for metadata, rename and permissions
cout << EyeContainer::GetMetaData ("test/performance.ionu", ".ionumeta", junk) << endl;
EyeContainer::UpdateMetaData ("test/performance.ionu", ".ionumeta", "{\"msg\":{\"drr\":true}}", junk);
cout << EyeContainer::GetMetaData ("test/performance.ionu", ".ionumeta", junk) << endl;
EyeContainer::RenameFile ("test/performance.ionu", "stream", "renamed", junk);
cout << EyeContainer::GetContentMetaData ("test/performance.ionu", "stream", junk) << endl;
EyeContainer::UpdateMetaData ("test/performance.ionu", ".ionuperm", "{\"read\":[\"00000003\",\"17C38E5A\"]}", junk);
cout << EyeContainer::GetMetaData ("test/performance.ionu", ".ionuperm", junk) << endl;
if (EyeContainer::GetStatus ("test/performance.ionu") != EyeContainer::EYE_VALID)
cout << "FAIL: invalid EyeContainer after static metadata tests" << endl;
delete[] wbuffer;
delete[] rbuffer;
if (rc == 0)
printf ("\nIVFS interface tests passed\n-------------------------------\n");
else
printf ("\n%d IVFS interface tests failed\n-------------------------------\n", rc);
*/
return rc;
}
#ifdef ALAN
void SearchQuery (EyeSearch& bing, const std::string query)
{
cout << query << " - " << bing.Search (query, 7) << endl;
}
int TestSearch()
{
int rc = 0;
#ifndef WIN32
Key tgi ("tgi", "stream", SL_AES_KEY_LEN, TGIkey, Key::AES);
EyeSearch bing ("index", tgi);
bing.IndexDocument ("test/applications.txt", "text/plain", "{\"title\":\"Applications and Tools\"}");
bing.IndexDocument ("test/authentication.txt", "text/plain", "{\"title\":\"Advanced Authentication\"}");
bing.IndexDocument ("test/cloud.txt", "text/plain", "{\"title\":\"Cloud Services\"}");
bing.IndexDocument ("test/management.txt", "text/plain", "{\"title\":\"Key Management\"}");
bing.IndexDocument ("test/mobility.txt", "text/plain", "{\"title\":\"Mobility and BYOD\"}");
bing.IndexDocument ("test/transparent.txt", "text/plain", "{\"title\":\"Transparent Encryption\"}");
bing.IndexMessage ("Message", "Secure your mobile device with IONU", "{\"title\":\"Mobile Security\"}");
bing.IndexMessage ("unCompound", "Secure your cell or mobile phone and bike for mountain with IONU", "{\"title\":\"Compound Security\"}");
bing.IndexMessage ("Compound", "Secure your cell phone and mountain bike with IONU", "{\"title\":\"Compound Security\"}");
bing.SortByRank();
bing.Dump();
SearchQuery (bing, "security");
SearchQuery (bing, "encryption");
SearchQuery (bing, "mobile security");
SearchQuery (bing, "mobile security storage");
SearchQuery (bing, "attack key encryption");
SearchQuery (bing, "cell phone");
SearchQuery (bing, "cellphone");
SearchQuery (bing, "phone");
SearchQuery (bing, "mountain bike");
EyeStemmer stem;
char* stems = fileload ("test/voc.txt");
std::string stemstr (stems, strlen (stems));
std::vector<std::string> words = SplitString (stemstr, '\n');
for (auto& word: words) {
if (word.size() > 2)
cout << stem.Stem (word) << endl;
else
cout << word << endl;
}
cout << stem.Stem ("feed") << endl;
cout << stem.Stem ("like") << endl;
cout << stem.Stem ("liked") << endl;
cout << stem.Stem ("pencils") << endl;
cout << stem.Stem ("agreed") << endl;
cout << stem.Stem ("agreeable") << endl;
cout << stem.Stem ("rationalize") << endl;
cout << stem.Stem ("rationalization") << endl;
cout << stem.Stem ("rationals") << endl;
cout << stem.Stem ("abate") << endl;
cout << stem.Stem ("windpipe") << endl;
#endif
return rc;
}
#endif
int main ()
{
int rc = 0;
Key junk;
//Key tgi ("tgi", "stream", SL_AES_KEY_LEN, TGIkey, Key::AES);
EyeLog::GetInstance()->ConfigLogger ("libeye", "test", EyeLog::IONU_DEBUG, EyeLog::IONU_CONSOLE, "%l:%c %m");
//cout << sequencelogic::GetVersionInfo() << endl;
//TestSearch();
//TestProcessLocking();
//TestFileThreadLocking();
TestFileLocking();
//TestRandom();
// TestEyeContainer();
exit (0);
/*
TestKeys();
TestMixedUpKeys();
TestEyeContainer();
PerformanceTest();
//TestSearch();
//TestRSAKeyGeneration();
ionu_eyefile_create_with_message (yoionu, TGIkey, ".imchatty", "Yo!", 3, URN, PERMS);
std::string tarjson = EyeContainer::Stringify (yoionu);
cout << tarjson << endl;
EyeContainer::Tarify ("tarjson.ionu", tarjson);
size_t rbytes;
unsigned char* rbuffer = sequencelogic::New (70000);
memset (rbuffer, '7', 70000);
EyeContainer* reye = new EyeContainer("test/rename.ionu", tgi, URN, PERMS);
reye->WriteStream ("stream", 0, rbuffer, 70000, &rbytes);
reye->Finalize();
delete reye;
std::string smallermeta = EyeContainer::GetMetaData ("test/rename.ionu", IONU_EYE_META_FILE, junk);
tarjson = EyeContainer::Stringify ("test/rename.ionu");
cout << "tarjson " << tarjson.size() << endl;
cout << tarjson.substr (0, 1024) << endl;
EyeContainer::Tarify ("tarjson.ionu", tarjson);
EyeContainer::RenameFile ("test/rename.ionu", "stream", "stream12345", junk);
EyeContainer::RenameFile ("test/rename.ionu", "stream12345", "stream123456", junk);
std::string largermeta = EyeContainer::GetMetaData ("test/rename.ionu", IONU_EYE_META_FILE, junk);
EyeContainer::RenameFile ("test/rename.ionu", "stream123456", "stream12345", junk);
EyeContainer::RenameFile ("test/rename.ionu", "stream12345", "stream", junk);
ionu_eyefile_replace_meta_data ("test/rename.ionu", largermeta.c_str());
ionu_eyefile_replace_meta_data ("test/rename.ionu", smallermeta.c_str());
ionu_eyefile_replace_meta_data ("test/empty.ionu", smallermeta.c_str());
sequencelogic::CopyFiles ("test/old.ionu", "test/oldrename.ionu");
EyeContainer* oldren = new EyeContainer ("test/oldrename.ionu", TGIkey);
oldren->RenameFile (".imchat", "renamed");
oldren->Finalize();
delete oldren;
cout << EyeContainer::GetMetaData ("test/oldrename.ionu", IONU_EYE_META_FILE, junk) << endl;
sequencelogic::RemoveFile ("test/oldrename.ionu");
sequencelogic::RemoveFile ("test/oldrename.ionu");
cout << "done" << endl;
exit (0);
exit (0);
TestFileThreadLocking();
TestFileLocking();
ionu_eyefile_create_with_message (yoionu, TGIkey, ".imchatty", "Yo!", 3, URN, PERMS);
cout << ionu_eyefile_get_message (yoionu, TGIkey, ".imchatty") << endl;
ionu_eyefile_rename_file (yoionu, ".imchatty", ".imchat");
cout << ionu_eyefile_get_message (yoionu, TGIkey, ".imchat") << endl;
Keyring rring ("js", "test");
rring.GenerateRSAKey ("bob", "bob", "IOnU,Bob,Bob,Bob");
Key rrkey;
rring.GetKey ("bob", rrkey);
rrkey.PublicKeyFingerPrint();
rring.ImportPubKeyFromCert ("test/isis.pem");
rring.GetKey ("cert", rrkey);
if (rrkey.PublicKeyFingerPrint() != "fc:34:2b:b3:a2:f6:91:c9:fb:79:16:ca:2e:d2:47:3d:b3:38:8a:b2")
rc += testfailed ("isis.nu - fc:34:2b:b3:a2:f6:91:c9:fb:79:16:ca:2e:d2:47:3d:b3:38:8a:b2", rrkey.PublicKeyFingerPrint());
exit (0);
// Test capture and replace of FEK in compressed EyeContainer
EyeContainer* rionu = new EyeContainer("test/test.ionu", TGIkey, URN, PERMS);
rionu->AddTextMessage ("Message", "Updated FEK from captured FEK after container ReKey and restore FEK");
rionu->Finalize();
delete rionu;
std::string oldfek = EyeContainer::GetMetaData ("test/test.ionu", IONU_EYE_FEK_FILE, junk);
Key bbkey ("Bad", "key", SL_AES_KEY_LEN, badkey, Key::TGI);
rionu = new EyeContainer("test/test.ionu", TGIkey);
rionu->ReKey (bbkey);
rionu->Finalize();
delete rionu;
rionu = new EyeContainer("test/test.ionu", TGIkey);
std::string rmsg = rionu->GetTextMessage ("Message");
if (rmsg.size() > 1 && rmsg[0] == 'U' && rmsg[1] == 'p')
rc += testfailed ("ReKey - old key", rmsg);
delete rionu;
EyeContainer::ReplaceMetaData ("test/test.ionu", IONU_EYE_FEK_FILE, oldfek, junk);
rionu = new EyeContainer("test/test.ionu", TGIkey);
rmsg = rionu->GetTextMessage ("Message");
if (rmsg.size() > 1 && rmsg[0] == 'U' && rmsg[1] == 'p')
cout << rmsg << endl;
delete rionu;
// Test capture and replace of FEK in uncompressed EyeContainer
rionu = new EyeContainer("test/test.ionu", TGIkey, URN, PERMS);
size_t nwritten = 0;
rionu->WriteStream ("Message", 0, "Updated FEK from captured FEK... uncompressed EyeContainer", 58, &nwritten);
rionu->Finalize();
delete rionu;
oldfek = EyeContainer::GetMetaData ("test/test.ionu", IONU_EYE_FEK_FILE, junk);
rionu = new EyeContainer("test/test.ionu", TGIkey);
rionu->ReKey (bbkey);
rionu->Finalize();
delete rionu;
rionu = new EyeContainer("test/test.ionu", TGIkey);
rmsg = rionu->GetTextMessage ("Message");
if (rmsg.size() > 1 && rmsg[0] == 'U' && rmsg[1] == 'p')
rc += testfailed ("ReKey - old key", rmsg);
delete rionu;
EyeContainer::ReplaceMetaData ("test/test.ionu", IONU_EYE_FEK_FILE, oldfek, junk);
rionu = new EyeContainer("test/test.ionu", TGIkey);
rmsg = rionu->GetTextMessage ("Message");
if (rmsg.size() > 1 && rmsg[0] == 'U' && rmsg[1] == 'p')
cout << rmsg << endl;
delete rionu;
exit (0);
//if (!ionu_eyefile_replace_fek ("test/performance.ionu", fek64))
// rc += testfailed ("ionu_eyefile_replace_fek", "test/performance.ionu");
//rc = EyeContainer::ReplaceMetaData (eyefile, IONU_EYE_FEK_FILE, fek64, junk);
TestEyeContainer();
exit (0);
cout << ionu_eyefile_get_status ("test/oldtest.ionu") << endl;
cout << ionu_eyefile_get_filenames ("test/oldtest.ionu");
//exit (0);
Keyring* b = new Keyring ("test/testbot-keyring.iks.device.iks");
b->Dump();
b = new Keyring ("test/testbot-keyring.iks");
b->Dump();
static const char* pkcs1_5 = "R6wk+Bv95uTd0ipk4azmDnOIrUNFuV4eB1USG4uRIcsGcZS7Zh86nBXP8XxvYjjYglYf8234IrFMccmQ5Dk8a5F2fgdLZhwW976h8zhMOgpMHsyaWKELeTdncfd1kR3yTXxRHPCGrS5uglC4WACRmtkjlpWQNs5SHTzFgKcNphtVw7n8bUj5A4h0gTURWPw+uQ7/F6+/el1K6W+4gIBxhJ+Phqws5rJZtp4RHnBFWBTAtNkRx/4XvTk472CCCnG4D5C7mzqbgBpDOKYfq0JVptw8YV9dbkjrxUg4ioNQGAq1YN3xqSqiAy2tHsImTaPtTZMH+CRA/BwCMCpiRUtU9Q==";
static const char* pkcs2_0 = "qiU6RjO7JsiuW8o9J6gerBClAGUY5fXu09JCKXbVE+3RHaG741yzvTuXOi+6ZZrL4ldBzSXvtXwBngGuKZZhQU++eUmiuZyMJeifKuqCpTrwQ3rmBpCxrTCvlXO+br64+w81apgaDySh3EyU7y1q7DyiqAgOjrhpN9zcLxX2hRjrdTtZD8LPsQ2k1eSNjx9/tDIE3BXcRIi5kngL2lT/spjiF1OULVH+AWj0hizzR+iDHOpPxbOAJDD2ckNRYb4UoLnF3ELA3jBvG82CS0oXvWc8rHroDEJX6ja7f0GCPwwiSJA1wm94M31cu1L/YZ10LJXEt+imcLYx9Ixoes3Org==";
unsigned char* pbuff;
unsigned char* back;
Key* RSA = new Key ("Auditor", "RSA auditing key", (int)strlen(BOT_private), (const unsigned char*)BOT_private, Key::RSA);
Keyring* botk = new Keyring("j", "k");
botk->AddKey (RSA);
botk->Lock (TGIkey);
botk->SaveAs ("test/bot.iks");
delete botk;
botk = new Keyring ("test/bot.iks");
botk->Unlock (TGIkey);
std::string pem;
pem.assign ((char*)botk->GetKey ("Auditor")->GetKey(), botk->GetKey ("Auditor")->GetLength());
cout << pem << endl;
char* pkk = botk->GetPubKey ("Auditor");
cout << pkk << endl;
const Key* A = botk->GetKey ("Auditor");
Key kpubkey ("CG", "public key", (int)strlen(pkk), (const unsigned char*) pkk, Key::RSA_PUBLIC);
unsigned char b64bot[1024];
size_t botbytes = sequencelogic::Base64Decode (pkcs1_5, b64bot);
cout << "decoded " << botbytes << endl;
unsigned char* bot = A->PrivateKeyDecrypt (b64bot, 256, &botbytes);
cout << "decrypted " << botbytes << endl;
botbytes = sequencelogic::Base64Decode (pkcs2_0, b64bot);
bot = A->PrivateKeyDecrypt (b64bot, 256, &botbytes);
cout << "decrypted " << botbytes << endl;
pbuff = kpubkey.PublicKeyEncrypt (BOTtgi, 32, &botbytes);
sequencelogic::Base64Encode (pbuff, 256, (char*)b64bot);
cout << (char*)b64bot << endl;
back = A->PrivateKeyDecrypt (pbuff, botbytes, &botbytes);
cout << "decrypted " << botbytes << endl;
if (memcmp (back, BOTtgi, 32) != 0)
cout << "fail " << endl;
Keyring ring ("tim", "test");
ring.GenerateRSAKey("random", "RSA keypair");
ring.GenerateRSAKey("office", "RSA keypair");
char* pk = ring.GetPubKey ("random");
Key publicK ("CG", "public key", (int)strlen(pk), (const unsigned char*) pk, Key::RSA_PUBLIC);
const Key* privateK = ring.GetKey("office");
size_t bytes = 0;
pbuff = publicK.PublicKeyEncrypt ((unsigned char*)"Howdy", 6, &bytes);
back = privateK->PrivateKeyDecrypt (pbuff, bytes, &bytes);
char b64[1024];
sequencelogic::Base64Encode (back, bytes, b64);
cout << "decrypted " << bytes << " " << b64 << endl;
//unsigned char bk[32] = {-8, -19, 27, -82, 116, 77, -97, 125, -76, 21, 15, 89, -81, 121, -11, 103, -86, -55, -55, -63, -37, 26, -112, -115, 29, -71, -98, 96, 108, 44, -12, 27};
//EyeContainer* bc = new EyeContainer("test/BCollaborators.json.ionu", bk);
//cout << bc->GetTextMessage("Collaborators");
#ifdef ddbbggrr
unsigned char buff[32];
EyeDRBG drbg ((unsigned char*)"IOnU,Bob,Bob,Bob", strlen ("IOnU,Bob,Bob,Bob"));
drbg.RandBytes (buff, 32);
char bhex[128];
sequencelogic::BinaryToHex (buff, 32, bhex);
cout << bhex << endl;
exit (0);
#endif
EyeTime now ("2014-10-28T23:13:06.174Z");
cout << now << endl;
now.SetFileTime ("t");
now.GetFileTime ("t");
cout << now << endl;
EyeContainer jj ("jjj.ionu", tgi);
cout << jj.GetLastErrorMessage() << endl;
fstream tf ("jjj");
cout << sequencelogic::GetLastErrorMessage();
EyeLog::GetInstance()->SetLogLevel (EyeLog::IONU_DEBUG);
EyeContainer::UpdateMetaData ("test/performance.ionu", ".ionumeta", "{\"modified_date\":\"2014-10-28T23:13:06.174Z\"}", junk);
EyeContainer::SynchronizeFileTime ("test/performance.ionu", junk);
//exit (0);
std::string alan ("Yo there Alan Frost, what are you up to!");
std::string frost ("Working my ass off you fool");
std::streamoff entrysize;
EyeContainer* zero = new EyeContainer("test/zero.ionu", tgi, URN, PERMS);
zero->AddMemoryFile ("stream", (unsigned char*)alan.data(), 0, "zero/stream");
zero->UpdateMetaData ("{\"entry\":\"bstream\"}");
if (zero->RenameFile ("stream", "bstream"))
cout << "success" << endl;
cout << zero->GetContentFilenames() << endl;
zero->SetStreamSize ("stream", 100);
zero->Finalize();
delete zero;
cout << EyeContainer::GetMetaData ("test/zero.ionu", ".ionumeta", junk) << endl;
//exit (1);
EyeContainer* greg = new EyeContainer("test/greg.ionu", tgi, URN, PERMS);
greg->AddMemoryFile ("stream", (unsigned char*)alan.data(), alan.size(), "test/stream");
if (greg->ExtractFile ("stream", "test"))
rc += testfailed ("greg->ExtractFile(stream)", "test");
EyeContainer* frank = new EyeContainer("test/frank.ionu", tgi, URN, PERMS);
frank->AddMemoryFile ("frank", (unsigned char*)frost.data(), frost.size(), "test/frankly");
greg->CopyEntry (frank, "frank");
greg->CopyEntry (frank, "frank");
greg->CopyEntry (frank, "fred");
if (greg->HasEntry ("stream", &entrysize))
cout << "stream " << entrysize << endl;
frank->Finalize();
delete frank;
greg->Finalize();
delete greg;
greg = new EyeContainer("test/greg.ionu", tgi);
cout << greg->GetTextMessage ("stream") << endl;
cout << greg->GetTextMessage ("frank") << endl;
cout << greg->GetMetaData() << endl;
delete greg;
greg = new EyeContainer("test/greg.ionu", tgi, URN, PERMS);
greg->AddMemoryFile (".imchat", (unsigned char*)alan.data(), alan.size(), "test/stream");
greg->Finalize();
delete greg;
greg = new EyeContainer("test/greg.ionu", tgi);
frost = greg->GetTextMessage (".imchat");
cout << frost << endl;
cout << greg->GetMetaData() << endl;
delete greg;
//rc += TestStreams();
//rc += TestEyeContainer();
const char* tk = "a0W4wBu0ZTANeEEokBlVChhHY818ztsqadHDqNrbeuo=";
unsigned char gtk[SL_AES_KEY_LEN];
sequencelogic::Base64Decode (tk, gtk);
char buffy[65536];
ionu_eyefile_get_content ("test/HTML.html.ionu", gtk, "HTML.html", (unsigned char*)buffy);
std::string kool (buffy, 100);
cout << kool << endl;
const char* ttk = "veR+rSvtWMOZlqwlL9tlZ2/n1YtGtEO8aaNjDy8paRU=";
sequencelogic::Base64Decode (ttk, gtk);
//ionu_eyefile_get_content ("test/Test.txt.ionu", gtk, "Test.txt", (unsigned char*)buffy);
//kool.assign (buffy, 100);
//cout << kool << endl;
//EyeContainer* geye = new EyeContainer ("test/PDF.pdf.ionu", gtk);
//geye->ExtractFile ("PDF.pdf");
EyeContainer* nU = new EyeContainer("test/stream.ionu", tgi, URN, PERMS);
nU->AddMemoryFile ("stream", (unsigned char*)alan.data(), alan.size(), "test/stream");
nU->Finalize();
delete nU;
nU = new EyeContainer("test/stream.ionu", tgi);
frost = nU->GetTextMessage ("stream");
cout << frost << endl;
EyeLog::GetInstance()->SetLogLevel (EyeLog::IONU_WARN);
EyeLog::GetInstance()->SetLogLevel (EyeLog::IONU_DEBUG);
#define WOW
#ifdef WOW
std::string m = ionu_eyefile_get_message (oldionu, TGIkey, ".imchat");
if (m.compare ("Yo!") == 0)
cout << m << " - old .ionu quick check passed" << endl;
else
rc += testfailed ("ionu_eyefile_get_message", oldionu);
cout << "---" << endl;
ionu_eyefile_create_with_message (yoionu, TGIkey, ".imchatty", "Yo!", 3, URN, PERMS);
cout << ionu_eyefile_get_message (yoionu, TGIkey, ".imchatty") << endl;
ionu_eyefile_rename_file (yoionu, ".imchatty", ".imchat");
cout << ionu_eyefile_get_message (yoionu, TGIkey, ".imchat") << endl;
char* modmeta = ionu_eyefile_get_meta_data (yoionu);
cout << modmeta << endl << "------" << endl;
EyeJSONObject modtest (modmeta);
if (modmeta) free (modmeta);
EyeJSONScalar* murn = (EyeJSONScalar*)modtest.GetMember ("urn");
std::string murnjson;
murn->ReplaceValue (officeURN);
murn->GetJSONString (murnjson);
murnjson = "{" + murnjson + "}";
cout << murnjson << endl << "------" << endl;
EyeContainer* eye = new EyeContainer (yoionu, TGIkey);
eye->UpdateMetaData (murnjson);
eye->Finalize();
delete eye;
m = EyeContainer::GetMetaDataClassic (yoionu);
cout << "meta = " << m << endl;
m = EyeContainer::GetPermissionsClassic (yoionu);
cout << "perm = " << m << endl;
EyeContainer::UpdateMetaData (yoionu, ".ionumeta", "{\"msg\":{\"drr\":true}}", junk);
m = EyeContainer::GetMetaDataClassic (yoionu);
cout << "meta = " << m << endl;
cout << ionu_eyefile_get_message (yoionu, TGIkey, ".imchat") << endl;
//exit (0);
murn->ReplaceValue (docURN);
modtest.GetJSONString (murnjson);
cout << murnjson << endl << "------" << endl;
ionu_eyefile_replace_meta_data (yoionu, murnjson.c_str());
m = EyeContainer::GetMetaDataClassic (yoionu);
cout << "--\nmeta = " << m << endl;
m = EyeContainer::GetPermissionsClassic (yoionu);
cout << "--\nperm = " << m << endl;
cout << "--\nmsg = " << ionu_eyefile_get_message (yoionu, TGIkey, ".imchat") << endl;
#endif
//TestP2P();
//exit (1);
// casting output of GetNumBytes to match format string
printf ("%ld test\n", long(EyeDirectory::GetNumBytes ("test")));
std::string meta;
std::string msg;
char* cmsg = NULL;
EyeBytes currency (utf8, 6);
EyeBytes utfmsg;
utfmsg.Assign (utf8, 6);
cmsg = utfmsg.GetUTF8EncodedString();
if (cmsg) {
printf ("%d bytes <%s>\n", (int)(utfmsg.GetSize()), cmsg);
delete[] cmsg;
}
utfmsg.AssignUTF8EncodedString (smiley);
cmsg = utfmsg.GetUTF8EncodedString();
if (cmsg) {
printf ("%d bytes <%s>\n", (int)(utfmsg.GetSize()), cmsg);
delete[] cmsg;
}
utfmsg.AssignUTF8EncodedString (utfeuro);
cmsg = utfmsg.GetUTF8EncodedString();
if (cmsg) {
printf ("%d bytes <%s>\n", (int)(utfmsg.GetSize()), cmsg);
delete[] cmsg;
}
utfmsg.AssignUTF8EncodedString (utfjson);
cmsg = utfmsg.GetUTF8EncodedString();
if (cmsg) {
printf ("%d bytes <%s>\n", (int)(utfmsg.GetSize()), cmsg);
delete[] cmsg;
}
ionu_derive_key (password, garbage); // Create a key (32 bytes of random binary data) for testing
// Test logging, json and other utilities
rc += TestLogging();
rc += TestRandom();
rc += TestJSON();
rc += TestUtils();
rc += TestTime();
rc += IONUCompressTests();
rc += IOnUPasswordTests();
rc += TestDB();
rc += TestDirectory();
rc += TestFileLocking();
rc += TestFileThreadLocking();
// Test the Keyring
rc += TestKeys();
rc += TestRSAKeyGeneration();
// Test the EyeContainer
EyeLog::GetInstance()->SetLogLevel (EyeLog::IONU_DEBUG);
rc += TestEyeContainer();
rc += TestMixedUpKeys();
rc += PerformanceTest();
if (rc == 0) {
printf ("All tests passed\n-------------------------------\n");
return 0;
}
else {
printf ("%d tests failed\n-------------------------------\n", rc);
return 1;
}
*/
}