// // SignusMediumCases.m // libindy-demo // // Created by Anastasia Tarasova on 14.06.17. // Copyright © 2017 Kirill Neznamov. All rights reserved. // #import #import "PoolUtils.h" #import "TestUtils.h" #import #import "WalletUtils.h" #import "SignusUtils.h" #import "LedgerUtils.h" #import "NSDictionary+JSON.h" #import "NSString+Validation.h" @interface SignusMediumCases : XCTestCase @end @implementation SignusMediumCases - (void)setUp { [super setUp]; // Put setup code here. This method is called before the invocation of each test method in the class. } - (void)tearDown { // Put teardown code here. This method is called after the invocation of each test method in the class. [super tearDown]; } // MARK: - Create my did - (void)testCreateMyDidWorksForInvalidCryptoType { [TestUtils cleanupStorage]; NSError *ret = nil; NSString *poolName = @"pool1"; // 1. Create and open wallet, get wallet handle IndyHandle walletHandle = 0; ret = [[WalletUtils sharedInstance] createAndOpenWalletWithPoolName:poolName xtype:nil handle:&walletHandle]; XCTAssertEqual(ret.code, Success, @"WalletUtils:createAndOpenWalletWithPoolName failed"); // 2. create my did NSString *didJson = @"{\"crypto_type\":\"type\"}"; ret = [[SignusUtils sharedInstance] createMyDidWithWalletHandle:walletHandle myDidJson:didJson outMyDid:nil outMyVerkey:nil outMyPk:nil]; XCTAssertEqual(ret.code, SignusUnknownCryptoError, @"SignusUtils::createMyDidWithWalletHandle() returned wrong error"); [TestUtils cleanupStorage]; } - (void)testCreateMyDidWorksForInvalidSeed { [TestUtils cleanupStorage]; NSError *ret = nil; NSString *poolName = @"pool1"; // 1. Create and open wallet, get wallet handle IndyHandle walletHandle = 0; ret = [[WalletUtils sharedInstance] createAndOpenWalletWithPoolName:poolName xtype:nil handle:&walletHandle]; XCTAssertEqual(ret.code, Success, @"WalletUtils:createAndOpenWalletWithPoolName failed"); // 2. create my did NSString *didJson = @"{\"seed\":\"seed\"}"; ret = [[SignusUtils sharedInstance] createMyDidWithWalletHandle:walletHandle myDidJson:didJson outMyDid:nil outMyVerkey:nil outMyPk:nil]; XCTAssertEqual(ret.code, CommonInvalidStructure, @"SignusUtils::createMyDidWithWalletHandle() returned wrong error"); [TestUtils cleanupStorage]; } - (void)testCreateMyDidWorksForInvalidDid { [TestUtils cleanupStorage]; NSError *ret = nil; NSString *poolName = @"pool1"; // 1. Create and open wallet, get wallet handle IndyHandle walletHandle = 0; ret = [[WalletUtils sharedInstance] createAndOpenWalletWithPoolName:poolName xtype:nil handle:&walletHandle]; XCTAssertEqual(ret.code, Success, @"WalletUtils:createAndOpenWalletWithPoolName failed"); // 2. create my did NSString *didJson = @"{\"did\":\"invalid_base_58_did\"}"; ret = [[SignusUtils sharedInstance] createMyDidWithWalletHandle:walletHandle myDidJson:didJson outMyDid:nil outMyVerkey:nil outMyPk:nil]; XCTAssertEqual(ret.code, CommonInvalidStructure, @"SignusUtils::createMyDidWithWalletHandle() returned wrong error"); [TestUtils cleanupStorage]; } - (void)testCreateMyDidWorksForInvalidJson { [TestUtils cleanupStorage]; NSError *ret = nil; NSString *poolName = @"pool1"; // 1. Create and open wallet, get wallet handle IndyHandle walletHandle = 0; ret = [[WalletUtils sharedInstance] createAndOpenWalletWithPoolName:poolName xtype:nil handle:&walletHandle]; XCTAssertEqual(ret.code, Success, @"WalletUtils:createAndOpenWalletWithPoolName failed"); // 2. create my did NSString *didJson = @"{\"seed\":\"123\"}"; ret = [[SignusUtils sharedInstance] createMyDidWithWalletHandle:walletHandle myDidJson:didJson outMyDid:nil outMyVerkey:nil outMyPk:nil]; XCTAssertEqual(ret.code, CommonInvalidStructure, @"SignusUtils::createMyDidWithWalletHandle() returned wrong error"); [TestUtils cleanupStorage]; } // MARK: - Replace keys -(void)testReplaceKeysWorksForNotExistingDid { [TestUtils cleanupStorage]; NSError *ret = nil; NSString *poolName = @"pool1"; // 1. Create and open wallet, get wallet handle IndyHandle walletHandle = 0; ret = [[WalletUtils sharedInstance] createAndOpenWalletWithPoolName:poolName xtype:nil handle:&walletHandle]; XCTAssertEqual(ret.code, Success, @"WalletUtils:createAndOpenWalletWithPoolName failed"); //TODO: may be we must return WalletNotFound in case if key not exists in wallet // 2. replace keys ret = [[SignusUtils sharedInstance] replaceKeysWithWalletHandle:walletHandle did:@"8wZcEriaNLNKtteJvx7f8i" identityJson:@"{}" outMyVerKey:nil outMyPk:nil]; XCTAssertEqual(ret.code, Success, @"SignusUtils:replaceKeysWithWalletHandle failed"); [TestUtils cleanupStorage]; } // MARK: - Store their did - (void)testStoreTheirDidWorksForInvalidCryptoType { [TestUtils cleanupStorage]; NSError *ret = nil; NSString *poolName = @"pool1"; // 1. Create and open wallet, get wallet handle IndyHandle walletHandle = 0; ret = [[WalletUtils sharedInstance] createAndOpenWalletWithPoolName:poolName xtype:nil handle:&walletHandle]; XCTAssertEqual(ret.code, Success, @"WalletUtils:createAndOpenWalletWithPoolName failed"); // 2. Store their did NSString *identityJson = @"{\"did\":\"8wZcEriaNLNKtteJvx7f8i\", \"crypto_type\":\"type\"}"; ret = [[SignusUtils sharedInstance] storeTheirDidWithWalletHandle:walletHandle identityJson:identityJson]; XCTAssertEqual(ret.code, SignusUnknownCryptoError, @"SignusUtils:storeTheirDidWithWalletHandle failed"); [TestUtils cleanupStorage]; } - (void)testStoreTheirDidWorksForInvalidDid { [TestUtils cleanupStorage]; NSError *ret = nil; NSString *poolName = @"pool1"; // 1. Create and open wallet, get wallet handle IndyHandle walletHandle = 0; ret = [[WalletUtils sharedInstance] createAndOpenWalletWithPoolName:poolName xtype:nil handle:&walletHandle]; XCTAssertEqual(ret.code, Success, @"WalletUtils:createAndOpenWalletWithPoolName failed"); // 2. Store their did NSString *identityJson = @"{\"did\":\"invalid_base58_string\"}"; ret = [[SignusUtils sharedInstance] storeTheirDidWithWalletHandle:walletHandle identityJson:identityJson]; XCTAssertEqual(ret.code, CommonInvalidStructure, @"SignusUtils:storeTheirDidWithWalletHandle returned wrong code"); [TestUtils cleanupStorage]; } - (void)testStoreTheirDidWorksForInvalidVerkey { [TestUtils cleanupStorage]; NSError *ret = nil; NSString *poolName = @"pool1"; // 1. Create and open wallet, get wallet handle IndyHandle walletHandle = 0; ret = [[WalletUtils sharedInstance] createAndOpenWalletWithPoolName:poolName xtype:nil handle:&walletHandle]; XCTAssertEqual(ret.code, Success, @"WalletUtils:createAndOpenWalletWithPoolName failed"); // 2. Store their did NSString *identityJson = @"{\"did\":\"did\", \"verkey\":\"verkey\"}"; ret = [[SignusUtils sharedInstance] storeTheirDidWithWalletHandle:walletHandle identityJson:identityJson]; XCTAssertEqual(ret.code, CommonInvalidStructure, @"SignusUtils:storeTheirDidWithWalletHandle returned wrong code"); [TestUtils cleanupStorage]; } // MARK: - Sign - (void)testSignWorksForInvalidMessage { [TestUtils cleanupStorage]; NSError *ret = nil; // 1. Create and open wallet, get wallet handle IndyHandle walletHandle = 0; ret = [[WalletUtils sharedInstance] createAndOpenWalletWithPoolName:@"pool1" xtype:nil handle:&walletHandle]; XCTAssertEqual(ret.code, Success, @"WalletUtils:createAndOpenWalletWithPoolName failed"); // 2. create my did NSString *myDid; NSString *myDidJson = @"{}"; ret = [[SignusUtils sharedInstance] createMyDidWithWalletHandle:walletHandle myDidJson:myDidJson outMyDid:&myDid outMyVerkey:nil outMyPk:nil]; XCTAssertEqual(ret.code, Success, @"SignusUtils::createMyDidWithWalletHandle() failed"); // 3. Sign NSString *message = @"1495034346617224651"; ret = [[SignusUtils sharedInstance] signWithWalletHandle:walletHandle theirDid:myDid message:message outSignature:nil]; XCTAssertEqual(ret.code, CommonInvalidStructure, @"SignusUtils::signWithWalletHandle() returned wrong code"); [TestUtils cleanupStorage]; } // MARK: - Verify - (void)testVerifyWorksForInvalidMessage { [TestUtils cleanupStorage]; NSError *ret = nil; NSString *poolName = @"indy_verify_works_for_invalid_message"; // 1. Create and open pool ledger config, get pool handle IndyHandle poolHandle = 0; ret = [[PoolUtils sharedInstance] createAndOpenPoolLedgerConfigWithName:poolName poolHandle:&poolHandle]; XCTAssertEqual(ret.code, Success, @"PoolUtils:createAndOpenPoolLedgerConfig:poolName failed"); // 2. Create and open wallet, get wallet handle IndyHandle walletHandle = 0; ret = [[WalletUtils sharedInstance] createAndOpenWalletWithPoolName:poolName xtype:nil handle:&walletHandle]; XCTAssertEqual(ret.code, Success, @"WalletUtils:createAndOpenWalletWithPoolName failed"); // 3. create did NSString *did; NSString *verKey; NSString *didJson = @"{\"seed\":\"000000000000000000000000Trustee1\"}"; ret = [[SignusUtils sharedInstance] createMyDidWithWalletHandle:walletHandle myDidJson:didJson outMyDid:&did outMyVerkey:&verKey outMyPk:nil]; XCTAssertEqual(ret.code, Success, @"SignusUtils::createMyDidWithWalletHandle() failed"); XCTAssertTrue(did, @"invalid did"); XCTAssertTrue(verKey, @"invalid verKey"); // 4. Store their did NSString *identityJson = [NSString stringWithFormat:@"{\"did\":\"%@\", \"verkey\":\"%@\"}", did, verKey]; ret = [[SignusUtils sharedInstance] storeTheirDidWithWalletHandle:walletHandle identityJson:identityJson]; XCTAssertEqual(ret.code, Success, @"SignusUtils::storeTheirDidWithWalletHandle() failed"); // 5. Verify NSString *message = @"1496822211362017764"; BOOL verified = NO; ret = [[SignusUtils sharedInstance] verifyWithWalletHandle:walletHandle poolHandle:poolHandle did:did signature:message outVerified:&verified]; XCTAssertEqual(ret.code, CommonInvalidStructure, @"SignusUtils::verifyWithWalletHandle() returned wrong code"); [TestUtils cleanupStorage]; } - (void)testVerifyWorksForMessageWithoutSignature { [TestUtils cleanupStorage]; NSError *ret = nil; NSString *poolName = @"indy_verify_works_for_message_without_signature"; // 1. Create and open pool ledger config, get pool handle IndyHandle poolHandle = 0; ret = [[PoolUtils sharedInstance] createAndOpenPoolLedgerConfigWithName:poolName poolHandle:&poolHandle]; XCTAssertEqual(ret.code, Success, @"PoolUtils:createAndOpenPoolLedgerConfig:poolName failed"); // 2. Create and open wallet, get wallet handle IndyHandle walletHandle = 0; ret = [[WalletUtils sharedInstance] createAndOpenWalletWithPoolName:poolName xtype:nil handle:&walletHandle]; XCTAssertEqual(ret.code, Success, @"WalletUtils:createAndOpenWalletWithPoolName failed"); // 3. create did NSString *did; NSString *verKey; NSString *didJson = @"{\"seed\":\"000000000000000000000000Trustee1\"}"; ret = [[SignusUtils sharedInstance] createMyDidWithWalletHandle:walletHandle myDidJson:didJson outMyDid:&did outMyVerkey:&verKey outMyPk:nil]; XCTAssertEqual(ret.code, Success, @"SignusUtils::createMyDidWithWalletHandle() failed"); XCTAssertTrue(did, @"invalid did"); XCTAssertTrue(verKey, @"invalid verKey"); // 4. Store their did NSString *identityJson = [NSString stringWithFormat:@"{\"did\":\"%@\", \"verkey\":\"%@\"}", did, verKey]; ret = [[SignusUtils sharedInstance] storeTheirDidWithWalletHandle:walletHandle identityJson:identityJson]; XCTAssertEqual(ret.code, Success, @"SignusUtils::storeTheirDidWithWalletHandle() failed"); // 5. Verify NSString *message = @"{"\ "\"reqId\":1496822211362017764,"\ "\"identifier\":\"GJ1SzoWzavQYfNL9XkaJdrQejfztN4XqdsiV4ct3LXKL\"}"; BOOL verified = NO; ret = [[SignusUtils sharedInstance] verifyWithWalletHandle:walletHandle poolHandle:poolHandle did:did signature:message outVerified:&verified]; XCTAssertEqual(ret.code, CommonInvalidStructure, @"SignusUtils::verifyWithWalletHandle() returned wrong code"); [TestUtils cleanupStorage]; } - (void)testVerifyWorksForGetNymFromLedgerWithIncompatibleWallet { [TestUtils cleanupStorage]; NSError *ret = nil; NSString *poolName = @"indy_verify_works_for_get_nym_from_ledger_with_incompatible_wallet"; // 1. Create and open pool ledger config, get pool handle IndyHandle poolHandle = 0; ret = [[PoolUtils sharedInstance] createAndOpenPoolLedgerConfigWithName:poolName poolHandle:&poolHandle]; XCTAssertEqual(ret.code, Success, @"PoolUtils:createAndOpenPoolLedgerConfig:poolName failed"); // 2. Create and open wallet, get wallet handle IndyHandle walletHandle = 0; ret = [[WalletUtils sharedInstance] createAndOpenWalletWithPoolName:@"other_pool_name" xtype:nil handle:&walletHandle]; XCTAssertEqual(ret.code, Success, @"WalletUtils:createAndOpenWalletWithPoolName failed"); // 3. create did NSString *myDid; NSString *myDidJson = @"{\"seed\":\"00000000000000000000000000000My1\"}"; ret = [[SignusUtils sharedInstance] createMyDidWithWalletHandle:walletHandle myDidJson:myDidJson outMyDid:&myDid outMyVerkey:nil outMyPk:nil]; XCTAssertEqual(ret.code, Success, @"SignusUtils::createMyDidWithWalletHandle() failed"); XCTAssertTrue(myDid, @"invalid did"); // 4. Store their did NSString *identityJson = [NSString stringWithFormat:@"{\"did\":\"%@\"}", myDid]; ret = [[SignusUtils sharedInstance] storeTheirDidWithWalletHandle:walletHandle identityJson:identityJson]; XCTAssertEqual(ret.code, Success, @"SignusUtils::storeTheirDidWithWalletHandle() failed"); // 5. Verify NSString *message = @"{"\ "\"reqId\":1496822211362017764,"\ "\"identifier\":\"tibTuE59pZn1sCeZpNL5rDzpkpqV3EkDmRpFTizys9Gr3ZieLdGEGyq4h8jsVWW9zSaXSRnfYcVb1yTjUJ7vJai\"}"; BOOL verified = NO; ret = [[SignusUtils sharedInstance] verifyWithWalletHandle:walletHandle poolHandle:poolHandle did:myDid signature:message outVerified:&verified]; XCTAssertEqual(ret.code, WalletIncompatiblePoolError, @"SignusUtils::verifyWithWalletHandle() returned wrong code"); [TestUtils cleanupStorage]; } - (void)testVerifyWorksForGetUnknownNymFromLedger { [TestUtils cleanupStorage]; NSError *ret = nil; NSString *poolName = @"indy_verify_works_for_get_unknow_nym_from_ledger"; // 1. Create and open pool ledger config, get pool handle IndyHandle poolHandle = 0; ret = [[PoolUtils sharedInstance] createAndOpenPoolLedgerConfigWithName:poolName poolHandle:&poolHandle]; XCTAssertEqual(ret.code, Success, @"PoolUtils:createAndOpenPoolLedgerConfig:poolName failed"); // 2. Create and open wallet, get wallet handle IndyHandle walletHandle = 0; ret = [[WalletUtils sharedInstance] createAndOpenWalletWithPoolName:poolName xtype:nil handle:&walletHandle]; XCTAssertEqual(ret.code, Success, @"WalletUtils:createAndOpenWalletWithPoolName failed"); // 3. create did NSString *myDid; NSString *myDidJson = @"{\"seed\":\"0000000000000000000000000000Fake\"}"; ret = [[SignusUtils sharedInstance] createMyDidWithWalletHandle:walletHandle myDidJson:myDidJson outMyDid:&myDid outMyVerkey:nil outMyPk:nil]; XCTAssertEqual(ret.code, Success, @"SignusUtils::createMyDidWithWalletHandle() failed"); XCTAssertTrue(myDid, @"invalid did"); // 4. Store their did NSString *identityJson = [NSString stringWithFormat:@"{\"did\":\"%@\"}", myDid]; ret = [[SignusUtils sharedInstance] storeTheirDidWithWalletHandle:walletHandle identityJson:identityJson]; XCTAssertEqual(ret.code, Success, @"SignusUtils::storeTheirDidWithWalletHandle() failed"); // 5. Verify NSString *message = @"{"\ "\"reqId\":1496822211362017764,"\ "\"identifier\":\"tibTuE59pZn1sCeZpNL5rDzpkpqV3EkDmRpFTizys9Gr3ZieLdGEGyq4h8jsVWW9zSaXSRnfYcVb1yTjUJ7vJai\"}"; BOOL verified = NO; ret = [[SignusUtils sharedInstance] verifyWithWalletHandle:walletHandle poolHandle:poolHandle did:myDid signature:message outVerified:&verified]; XCTAssertEqual(ret.code, CommonInvalidState, @"SignusUtils::verifyWithWalletHandle() returned wrong code"); [TestUtils cleanupStorage]; } - (void)testIndyVerifyWorksForUnknownNym { [TestUtils cleanupStorage]; NSError *ret = nil; NSString *poolName = @"indy_verify_works_for_unknown_nym"; // 1. Create and open pool ledger config, get pool handle IndyHandle poolHandle = 0; ret = [[PoolUtils sharedInstance] createAndOpenPoolLedgerConfigWithName:poolName poolHandle:&poolHandle]; XCTAssertEqual(ret.code, Success, @"PoolUtils:createAndOpenPoolLedgerConfig:poolName failed"); // 2. Create and open wallet, get wallet handle IndyHandle walletHandle = 0; ret = [[WalletUtils sharedInstance] createAndOpenWalletWithPoolName:poolName xtype:nil handle:&walletHandle]; XCTAssertEqual(ret.code, Success, @"WalletUtils:createAndOpenWalletWithPoolName failed"); // 3. create trustee did NSString *trusteeDid; NSString *trusteeDidJson = @"{\"seed\":\"000000000000000000000000Trustee1\",\"cid\":true}"; ret = [[SignusUtils sharedInstance] createMyDidWithWalletHandle:walletHandle myDidJson:trusteeDidJson outMyDid:&trusteeDid outMyVerkey:nil outMyPk:nil]; XCTAssertEqual(ret.code, Success, @"SignusUtils::createMyDidWithWalletHandle() failed"); XCTAssertTrue(trusteeDid, @"invalid trustee"); // 4. create my did NSString *myDid; NSString *myVerKey; NSString *myDidJson = @"{\"seed\":\"00000000000000000000000000000My1\"}"; ret = [[SignusUtils sharedInstance] createMyDidWithWalletHandle:walletHandle myDidJson:myDidJson outMyDid:&myDid outMyVerkey:&myVerKey outMyPk:nil]; XCTAssertEqual(ret.code, Success, @"SignusUtils::createMyDidWithWalletHandle() failed"); XCTAssertTrue(myDid, @"invalid did"); // 5. Build nym request NSString *nymRequest; ret = [[LedgerUtils sharedInstance] buildNymRequestWithSubmitterDid:trusteeDid targetDid:myDid verkey:myVerKey alias:nil role:nil outRequest:&nymRequest]; XCTAssertEqual(ret.code, Success, @"LedgerUtils::buildNymRequestWithSubmitterDid() failed"); XCTAssertTrue([nymRequest isValid], @"invalid nymRequest"); // 6. sign and submit nym request NSString *nymResponse; ret = [[LedgerUtils sharedInstance] signAndSubmitRequestWithPoolHandle:poolHandle walletHandle:walletHandle submitterDid:trusteeDid requestJson:nymRequest outResponseJson:&nymResponse]; XCTAssertEqual(ret.code, Success, @"LedgerUtils::signAndSubmitRequestWithPoolHandle() failed"); // TODO: 111 ERROR XCTAssertTrue([nymResponse isValid], @"invalid nymResponse"); // 7. Verify NSString *message = @"{"\ "\"reqId\":1496822211362017764,"\ "\"signature\":\"tibTuE59pZn1sCeZpNL5rDzpkpqV3EkDmRpFTizys9Gr3ZieLdGEGyq4h8jsVWW9zSaXSRnfYcVb1yTjUJ7vJai\"}"; BOOL verified = NO; ret = [[SignusUtils sharedInstance] verifyWithWalletHandle:walletHandle poolHandle:poolHandle did:myDid signature:message outVerified:&verified]; XCTAssertEqual(ret.code, Success, @"SignusUtils::verifyWithWalletHandle() failed"); XCTAssertTrue(verified); [TestUtils cleanupStorage]; } @end