pEpObjCTests/PEPSessionTest.m
author Dirk Zimmermann <dirk@pep-project.org>
Wed, 14 Mar 2018 08:33:04 +0100
changeset 526 93eed7194515
parent 525 4ac6cca59c29
child 527 83824eeb44ba
permissions -rw-r--r--
IOSAD-72 encrypt for identity error handling
andreas@392
     1
//
andreas@392
     2
//  PEPSessionTest.m
andreas@392
     3
//  pEpObjCAdapterTests
andreas@392
     4
//
andreas@392
     5
//  Created by Andreas Buff on 18.01.18.
andreas@392
     6
//  Copyright © 2018 p≡p. All rights reserved.
andreas@392
     7
//
andreas@392
     8
andreas@392
     9
#import <XCTest/XCTest.h>
andreas@392
    10
andreas@392
    11
#import "PEPObjCAdapter.h"
andreas@392
    12
#import "NSDictionary+Extension.h"
andreas@392
    13
#import "PEPIdentity.h"
andreas@392
    14
#import "PEPMessage.h"
andreas@392
    15
andreas@392
    16
#import "PEPTestUtils.h"
andreas@392
    17
#import "PEPTestSyncDelegate.h"
andreas@392
    18
andreas@392
    19
@interface PEPSessionTest : XCTestCase
andreas@392
    20
@end
andreas@392
    21
andreas@392
    22
@implementation PEPSessionTest
andreas@392
    23
andreas@392
    24
- (void)setUp
andreas@392
    25
{
andreas@392
    26
    [super setUp];
andreas@416
    27
    [PEPObjCAdapter setUnecryptedSubjectEnabled:NO];
andreas@416
    28
andreas@392
    29
    [self pEpCleanUp];
andreas@392
    30
}
andreas@392
    31
dirk@525
    32
- (void)tearDown
dirk@525
    33
{
andreas@392
    34
    [self pEpCleanUp];
andreas@392
    35
    [super tearDown];
andreas@392
    36
}
andreas@392
    37
andreas@392
    38
- (void)testSyncSession
andreas@392
    39
{
andreas@392
    40
    PEPSession *session = [PEPSession new];
dirk@474
    41
dirk@474
    42
    // Dummy to set up the DB, since this is currenty only triggered by session use,
dirk@474
    43
    // which PEPObjCAdapter.startSync does not trigger.
dirk@474
    44
    [session getLog];
dirk@474
    45
andreas@392
    46
    PEPTestSyncDelegate *syncDelegate = [[PEPTestSyncDelegate alloc] init];
andreas@392
    47
andreas@392
    48
    // This should attach session just created
andreas@392
    49
    [PEPObjCAdapter startSync:syncDelegate];
andreas@392
    50
andreas@392
    51
    PEPIdentity *identMe = [[PEPIdentity alloc]
andreas@392
    52
                            initWithAddress:@"pep.test.iosgenkey@pep-project.org"
andreas@392
    53
                            userID:@"Me"
andreas@392
    54
                            userName:@"pEp Test iOS GenKey"
andreas@392
    55
                            isOwn:YES];
andreas@392
    56
andreas@392
    57
    [session mySelf:identMe];
andreas@392
    58
andreas@392
    59
    bool res = [syncDelegate waitUntilSent:1];
andreas@392
    60
andreas@392
    61
    // Can't currently work, engine doesn't contain sync.
andreas@392
    62
    XCTAssertFalse(res);
andreas@392
    63
andreas@392
    64
    // This should detach session just created
andreas@392
    65
    [PEPObjCAdapter stopSync];
andreas@392
    66
}
andreas@392
    67
andreas@392
    68
- (void)testTrustWords
andreas@392
    69
{
andreas@392
    70
    PEPSession *session = [PEPSession new];
andreas@392
    71
andreas@392
    72
    NSArray *trustwords = [session trustwords:@"DB47DB47DB47DB47DB47DB47DB47DB47DB47DB47"
andreas@392
    73
                                  forLanguage:@"en" shortened:false];
andreas@392
    74
    XCTAssertEqual([trustwords count], 10);
andreas@392
    75
andreas@392
    76
    for(id word in trustwords)
andreas@392
    77
        XCTAssertEqualObjects(word, @"BAPTISMAL");
andreas@392
    78
}
andreas@392
    79
andreas@392
    80
- (void)testGenKey
andreas@392
    81
{
andreas@392
    82
    PEPSession *session = [PEPSession new];
andreas@392
    83
andreas@392
    84
    PEPIdentity *identMe = [[PEPIdentity alloc]
andreas@392
    85
                            initWithAddress:@"pep.test.iosgenkey@pep-project.org"
andreas@392
    86
                            userID:@"Me"
andreas@392
    87
                            userName:@"pEp Test iOS GenKey"
andreas@392
    88
                            isOwn:YES];
andreas@392
    89
andreas@392
    90
    [session mySelf:identMe];
andreas@392
    91
andreas@392
    92
    XCTAssertNotNil(identMe.fingerPrint);
andreas@392
    93
    XCTAssertNotEqual(identMe.commType, PEP_ct_unknown);
andreas@392
    94
dirk@498
    95
    XCTAssertTrue([identMe isPEPUser:session]);
andreas@392
    96
}
andreas@392
    97
andreas@392
    98
- (void)testMySelfCommType
andreas@392
    99
{
andreas@392
   100
    PEPSession *session = [PEPSession new];
andreas@392
   101
andreas@392
   102
    PEPIdentity *identMe = [[PEPIdentity alloc]
andreas@392
   103
                            initWithAddress:@"pep.test.iosgenkey@pep-project.org"
andreas@392
   104
                            userID:@"Me"
andreas@392
   105
                            userName:@"pEp Test iOS GenKey"
andreas@392
   106
                            isOwn:YES];
andreas@392
   107
andreas@392
   108
    [session mySelf:identMe];
andreas@392
   109
andreas@392
   110
    XCTAssertNotNil(identMe.fingerPrint);
andreas@392
   111
    XCTAssertNotEqual(identMe.commType, PEP_ct_unknown);
andreas@392
   112
dirk@498
   113
    XCTAssertTrue([identMe isPEPUser:session]);
andreas@392
   114
andreas@392
   115
    dispatch_queue_t queue = dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0);
andreas@392
   116
    dispatch_sync(queue, ^{
andreas@392
   117
        PEPSession *session2 = [PEPSession new];
andreas@392
   118
andreas@392
   119
        // Now simulate an update from the app, which usually only caches
andreas@392
   120
        // kPepUsername, kPepAddress and optionally kPepUserID.
andreas@392
   121
        PEPIdentity *identMe2 = [[PEPIdentity alloc]
andreas@392
   122
                                 initWithAddress:identMe.address
andreas@392
   123
                                 userID:identMe.userID
andreas@392
   124
                                 userName:identMe.userName
andreas@392
   125
                                 isOwn:NO];
andreas@392
   126
        [session2 mySelf:identMe2];
andreas@392
   127
        XCTAssertNotNil(identMe2.fingerPrint);
dirk@498
   128
        XCTAssertTrue([identMe2 isPEPUser:session]);
andreas@392
   129
        XCTAssertEqualObjects(identMe2.fingerPrint, identMe.fingerPrint);
andreas@392
   130
andreas@392
   131
        // Now pretend the app only knows kPepUsername and kPepAddress
andreas@411
   132
        PEPIdentity *identMe3 = [PEPTestUtils foreignPepIdentityWithAddress:identMe.address
andreas@411
   133
                                                                   userName:identMe.userName];
andreas@392
   134
        [session2 mySelf:identMe3];
andreas@392
   135
        XCTAssertNotNil(identMe3.fingerPrint);
dirk@498
   136
        XCTAssertFalse([identMe3 isPEPUser:session]);
andreas@392
   137
        XCTAssertEqualObjects(identMe3.fingerPrint, identMe.fingerPrint);
andreas@392
   138
andreas@392
   139
        XCTAssertEqualObjects(identMe.address, identMe2.address);
andreas@392
   140
        XCTAssertEqualObjects(identMe.address, identMe3.address);
andreas@392
   141
        XCTAssertEqual(identMe.commType, identMe2.commType);
andreas@392
   142
        XCTAssertEqual(identMe.commType, identMe3.commType);
andreas@392
   143
    });
andreas@392
   144
}
andreas@392
   145
dirk@435
   146
- (void)testPartnerWithoutFingerPrint
dirk@435
   147
{
dirk@435
   148
    PEPSession *session = [PEPSession new];
dirk@435
   149
dirk@435
   150
    PEPIdentity *identRandom = [[PEPIdentity alloc]
dirk@435
   151
                                initWithAddress:@"does_not_exist@example.com"
dirk@435
   152
                                userID:@"got_out"
dirk@435
   153
                                userName:@"No Way Not Even Alice"
dirk@435
   154
                                isOwn:NO];
dirk@435
   155
dirk@435
   156
    [session updateIdentity:identRandom];
dirk@435
   157
    XCTAssertNil(identRandom.fingerPrint);
dirk@435
   158
}
dirk@435
   159
dirk@437
   160
- (void)testImportPartnerKeys
dirk@436
   161
{
dirk@488
   162
    XCTAssertNotNil([self checkImportingKeyFilePath:@"6FF00E97_sec.asc"
dirk@488
   163
                                            address:@"pep.test.alice@pep-project.org"
dirk@488
   164
                                             userID:@"This Is Alice"
dirk@488
   165
                                        fingerPrint:@"4ABE3AAF59AC32CFE4F86500A9411D176FF00E97"
dirk@488
   166
                                            session: nil]);
dirk@436
   167
dirk@488
   168
    XCTAssertNotNil([self checkImportingKeyFilePath:@"0xC9C2EE39.asc"
dirk@488
   169
                                            address:@"pep.test.bob@pep-project.org"
dirk@488
   170
                                             userID:@"This Is Bob"
dirk@488
   171
                                        fingerPrint:@"BFCDB7F301DEEEBBF947F29659BFF488C9C2EE39"
dirk@488
   172
                                            session: nil]);
dirk@436
   173
}
dirk@436
   174
dirk@439
   175
- (void)testIdentityRating
dirk@439
   176
{
dirk@439
   177
    PEPSession *session = [PEPSession new];
dirk@439
   178
dirk@439
   179
    PEPIdentity *me = [self
dirk@439
   180
                       checkMySelfImportingKeyFilePath:@"6FF00E97_sec.asc"
dirk@439
   181
                       address:@"pep.test.alice@pep-project.org"
dirk@439
   182
                       userID:@"Alice_User_ID"
dirk@491
   183
                       fingerPrint:@"4ABE3AAF59AC32CFE4F86500A9411D176FF00E97"
dirk@491
   184
                       session:session];
dirk@439
   185
    XCTAssertEqual([session identityRating:me], PEP_rating_trusted_and_anonymized);
dirk@439
   186
dirk@439
   187
    PEPIdentity *alice = [self
dirk@439
   188
                          checkImportingKeyFilePath:@"6FF00E97_sec.asc"
dirk@439
   189
                          address:@"pep.test.alice@pep-project.org"
dirk@439
   190
                          userID:@"This Is Alice"
dirk@456
   191
                          fingerPrint:@"4ABE3AAF59AC32CFE4F86500A9411D176FF00E97"
dirk@456
   192
                          session: session];
dirk@488
   193
    XCTAssertNotNil(alice);
dirk@439
   194
    XCTAssertEqual([session identityRating:alice], PEP_rating_reliable);
dirk@439
   195
}
dirk@439
   196
dirk@446
   197
- (void)testIdentityRatingTrustResetMistrustUndo
dirk@445
   198
{
dirk@445
   199
    PEPSession *session = [PEPSession new];
dirk@445
   200
dirk@460
   201
    PEPIdentity *me = [[PEPIdentity alloc]
dirk@460
   202
                       initWithAddress:@"me@example.org"
dirk@460
   203
                       userID:@"me_myself"
dirk@460
   204
                       userName:@"Me Me"
dirk@460
   205
                       isOwn:YES];
dirk@460
   206
    [session mySelf:me];
dirk@460
   207
    XCTAssertNotNil(me.fingerPrint);
dirk@445
   208
    XCTAssertEqual([session identityRating:me], PEP_rating_trusted_and_anonymized);
dirk@445
   209
dirk@445
   210
    PEPIdentity *alice = [self
dirk@445
   211
                          checkImportingKeyFilePath:@"6FF00E97_sec.asc"
dirk@445
   212
                          address:@"pep.test.alice@pep-project.org"
dirk@445
   213
                          userID:@"This Is Alice"
dirk@456
   214
                          fingerPrint:@"4ABE3AAF59AC32CFE4F86500A9411D176FF00E97"
dirk@456
   215
                          session: session];
dirk@488
   216
    XCTAssertNotNil(alice);
dirk@445
   217
    XCTAssertEqual([session identityRating:alice], PEP_rating_reliable);
dirk@445
   218
dirk@446
   219
    [session trustPersonalKey:alice];
dirk@446
   220
    XCTAssertEqual([session identityRating:alice], PEP_rating_trusted);
dirk@446
   221
dirk@446
   222
    [session keyResetTrust:alice];
dirk@446
   223
    XCTAssertEqual([session identityRating:alice], PEP_rating_reliable);
dirk@446
   224
dirk@445
   225
    [session keyMistrusted:alice];
dirk@445
   226
    XCTAssertEqual([session identityRating:alice], PEP_rating_have_no_key);
dirk@445
   227
dirk@445
   228
    [session undoLastMistrust];
dirk@445
   229
    XCTAssertEqual([session identityRating:alice], PEP_rating_reliable);
dirk@446
   230
dirk@446
   231
    [session trustPersonalKey:alice];
dirk@446
   232
    XCTAssertEqual([session identityRating:alice], PEP_rating_trusted);
dirk@446
   233
dirk@446
   234
    [session keyResetTrust:alice];
dirk@450
   235
    XCTAssertEqual([session identityRating:alice], PEP_rating_have_no_key);
dirk@445
   236
}
dirk@445
   237
dirk@478
   238
/** ENGINE-384 */
dirk@472
   239
- (void)testIdentityRatingCrash
dirk@472
   240
{
dirk@472
   241
    PEPSession *session = [PEPSession new];
dirk@472
   242
dirk@472
   243
    PEPIdentity *me = [[PEPIdentity alloc]
dirk@472
   244
                       initWithAddress:@"me@example.org"
dirk@472
   245
                       userID:@"me_myself"
dirk@472
   246
                       userName:@"Me Me"
dirk@472
   247
                       isOwn:YES];
dirk@472
   248
    [session mySelf:me];
dirk@472
   249
    XCTAssertNotNil(me.fingerPrint);
dirk@472
   250
    XCTAssertEqual([session identityRating:me], PEP_rating_trusted_and_anonymized);
dirk@472
   251
dirk@472
   252
    PEPIdentity *alice = [self
dirk@472
   253
                          checkImportingKeyFilePath:@"6FF00E97_sec.asc"
dirk@472
   254
                          address:@"pep.test.alice@pep-project.org"
dirk@472
   255
                          userID:@"This Is Alice"
dirk@472
   256
                          fingerPrint:@"4ABE3AAF59AC32CFE4F86500A9411D176FF00E97"
dirk@472
   257
                          session: session];
dirk@488
   258
    XCTAssertNotNil(alice);
dirk@472
   259
    XCTAssertEqual([session identityRating:alice], PEP_rating_reliable);
dirk@472
   260
dirk@472
   261
    [session trustPersonalKey:alice];
dirk@472
   262
    XCTAssertEqual([session identityRating:alice], PEP_rating_trusted);
dirk@472
   263
dirk@472
   264
    [session keyResetTrust:alice];
dirk@472
   265
    XCTAssertEqual([session identityRating:alice], PEP_rating_reliable);
dirk@472
   266
dirk@472
   267
    [session keyMistrusted:alice];
dirk@472
   268
    XCTAssertEqual([session identityRating:alice], PEP_rating_have_no_key);
dirk@472
   269
dirk@472
   270
    [session undoLastMistrust];
dirk@472
   271
dirk@472
   272
    [session trustPersonalKey:alice];
dirk@472
   273
    XCTAssertEqual([session identityRating:alice], PEP_rating_trusted);
dirk@472
   274
dirk@472
   275
    [session keyResetTrust:alice];
dirk@472
   276
    XCTAssertEqual([session identityRating:alice], PEP_rating_have_no_key);
dirk@472
   277
dirk@478
   278
    // This line provoked the crash
dirk@472
   279
    [session trustPersonalKey:alice];
dirk@472
   280
}
dirk@472
   281
dirk@458
   282
/**
dirk@458
   283
 Try to provoke a SQLITE_BUSY (ENGINE-374)
dirk@458
   284
 */
dirk@458
   285
- (void)testIdentityRatingTrustResetMistrustUndoBusy
dirk@458
   286
{
dirk@458
   287
    PEPSession *session = [PEPSession new];
dirk@458
   288
dirk@459
   289
    PEPIdentity *me = [[PEPIdentity alloc]
dirk@459
   290
                       initWithAddress:@"me@example.org"
dirk@459
   291
                       userID:@"me_myself"
dirk@459
   292
                       userName:@"Me Me"
dirk@459
   293
                       isOwn:YES];
dirk@459
   294
    [session mySelf:me];
dirk@459
   295
    XCTAssertNotNil(me.fingerPrint);
dirk@458
   296
    XCTAssertEqual([session identityRating:me], PEP_rating_trusted_and_anonymized);
dirk@458
   297
dirk@458
   298
    PEPIdentity *alice = [self
dirk@458
   299
                          checkImportingKeyFilePath:@"6FF00E97_sec.asc"
dirk@458
   300
                          address:@"pep.test.alice@pep-project.org"
dirk@458
   301
                          userID:@"This Is Alice"
dirk@458
   302
                          fingerPrint:@"4ABE3AAF59AC32CFE4F86500A9411D176FF00E97"
dirk@458
   303
                          session: session];
dirk@488
   304
    XCTAssertNotNil(alice);
dirk@458
   305
    XCTAssertEqual([session identityRating:alice], PEP_rating_reliable);
dirk@458
   306
dirk@458
   307
    void (^encryptingBlock)(void) = ^{
dirk@458
   308
        PEPSession *innerSession = [PEPSession new];
dirk@458
   309
        PEPMessage *msg = [PEPMessage new];
dirk@458
   310
        msg.from = me;
dirk@458
   311
        msg.to = @[alice];
dirk@458
   312
        msg.shortMessage = @"The subject";
dirk@458
   313
        msg.longMessage = @"Lots and lots of text";
dirk@476
   314
        msg.direction = PEP_dir_outgoing;
dirk@526
   315
dirk@526
   316
        PEP_STATUS status;
dirk@526
   317
        NSError *error = nil;
dirk@526
   318
        PEPMessage *encMsg = [innerSession
dirk@526
   319
                              encryptMessage:msg
dirk@526
   320
                              identity:me
dirk@526
   321
                              status:&status error:&error];
dirk@458
   322
        XCTAssertEqual(status, PEP_STATUS_OK);
dirk@526
   323
        XCTAssertNotNil(encMsg);
dirk@458
   324
    };
dirk@458
   325
dirk@458
   326
    dispatch_group_t backgroundGroup = dispatch_group_create();
dirk@458
   327
    dispatch_group_async(backgroundGroup,
dirk@458
   328
                         dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0), encryptingBlock);
dirk@458
   329
dirk@458
   330
    [session trustPersonalKey:alice];
dirk@458
   331
    XCTAssertEqual([session identityRating:alice], PEP_rating_trusted);
dirk@458
   332
dirk@458
   333
    [session keyResetTrust:alice];
dirk@458
   334
    XCTAssertEqual([session identityRating:alice], PEP_rating_reliable);
dirk@458
   335
dirk@458
   336
    [session keyMistrusted:alice];
dirk@458
   337
    XCTAssertEqual([session identityRating:alice], PEP_rating_have_no_key);
dirk@458
   338
dirk@458
   339
    [session undoLastMistrust];
dirk@458
   340
    XCTAssertEqual([session identityRating:alice], PEP_rating_reliable);
dirk@458
   341
dirk@458
   342
    [session trustPersonalKey:alice];
dirk@458
   343
    XCTAssertEqual([session identityRating:alice], PEP_rating_trusted);
dirk@458
   344
dirk@458
   345
    [session keyResetTrust:alice];
dirk@458
   346
    XCTAssertEqual([session identityRating:alice], PEP_rating_have_no_key);
dirk@458
   347
dirk@458
   348
    dispatch_group_wait(backgroundGroup, DISPATCH_TIME_FOREVER);
dirk@458
   349
}
dirk@458
   350
andreas@392
   351
- (void)testOutgoingColors
andreas@392
   352
{
andreas@392
   353
    PEPSession *session = [PEPSession new];
andreas@392
   354
andreas@392
   355
    // Our test user :
andreas@392
   356
    // pEp Test Alice (test key don't use) <pep.test.alice@pep-project.org>
andreas@392
   357
    // 4ABE3AAF59AC32CFE4F86500A9411D176FF00E97
dirk@488
   358
    XCTAssertTrue([PEPTestUtils importBundledKey:@"6FF00E97_sec.asc" session:session]);
andreas@392
   359
andreas@392
   360
    // Our test user :
dirk@440
   361
    PEPIdentity *identAlice = [self
dirk@440
   362
                               checkMySelfImportingKeyFilePath:@"6FF00E97_sec.asc"
dirk@440
   363
                               address:@"pep.test.alice@pep-project.org"
dirk@440
   364
                               userID:@"Alice_User_ID"
dirk@491
   365
                               fingerPrint:@"4ABE3AAF59AC32CFE4F86500A9411D176FF00E97"
dirk@491
   366
                               session:session];
andreas@392
   367
andreas@392
   368
    //Message
andreas@392
   369
dirk@441
   370
    {
dirk@441
   371
        PEPIdentity *identUnknownBob = [[PEPIdentity alloc]
dirk@441
   372
                                        initWithAddress:@"pep.test.unknown.bob@pep-project.org"
dirk@441
   373
                                        userID:@"4242" userName:@"pEp Test Bob Unknown"
dirk@441
   374
                                        isOwn:NO];
dirk@441
   375
dirk@441
   376
        PEPMessage *msgGray = [PEPMessage new];
dirk@441
   377
        msgGray.from = identAlice;
dirk@441
   378
        msgGray.to = @[identUnknownBob];
dirk@441
   379
        msgGray.shortMessage = @"All Gray Test";
dirk@441
   380
        msgGray.longMessage = @"This is a text content";
dirk@441
   381
        msgGray.direction = PEP_dir_outgoing;
dirk@441
   382
dirk@441
   383
        // Test with unknown Bob
dirk@441
   384
        PEP_rating clr = [session outgoingColorForMessage:msgGray];
dirk@441
   385
        XCTAssertEqual(clr, PEP_rating_unencrypted);
dirk@441
   386
    }
dirk@441
   387
dirk@441
   388
    PEPIdentity *identBob = [self
dirk@441
   389
                             checkImportingKeyFilePath:@"0xC9C2EE39.asc"
dirk@441
   390
                             address:@"pep.test.bob@pep-project.org"
dirk@441
   391
                             userID:@"42"
dirk@456
   392
                             fingerPrint:@"BFCDB7F301DEEEBBF947F29659BFF488C9C2EE39"
dirk@456
   393
                             session: session];
dirk@488
   394
    XCTAssertNotNil(identBob);
dirk@438
   395
andreas@392
   396
    PEPMessage *msg = [PEPMessage new];
andreas@392
   397
    msg.from = identAlice;
dirk@438
   398
    msg.to = @[identBob];
dirk@441
   399
    msg.shortMessage = @"All Gray Test";
andreas@392
   400
    msg.longMessage = @"This is a text content";
andreas@392
   401
    msg.direction = PEP_dir_outgoing;
andreas@392
   402
dirk@441
   403
    // Should be yellow, since no handshake happened.
andreas@392
   404
    PEP_rating clr = [session outgoingColorForMessage:msg];
dirk@420
   405
    XCTAssertEqual(clr, PEP_rating_reliable);
andreas@392
   406
andreas@392
   407
    clr = [session identityRating:identBob];
dirk@420
   408
    XCTAssertEqual(clr, PEP_rating_reliable);
andreas@392
   409
andreas@392
   410
    // Let' say we got that handshake, set PEP_ct_confirmed in Bob's identity
andreas@392
   411
    [session trustPersonalKey:identBob];
andreas@392
   412
andreas@392
   413
    // This time it should be green
andreas@392
   414
    clr = [session outgoingColorForMessage:msg];
dirk@420
   415
    XCTAssertEqual(clr, PEP_rating_trusted);
andreas@392
   416
andreas@392
   417
    clr = [session identityRating:identBob];
dirk@420
   418
    XCTAssertEqual(clr, PEP_rating_trusted);
andreas@392
   419
andreas@392
   420
    // Let' say we undo handshake
andreas@392
   421
    [session keyResetTrust:identBob];
andreas@392
   422
andreas@392
   423
    // Yellow ?
andreas@392
   424
    clr = [session outgoingColorForMessage:msg];
dirk@420
   425
    XCTAssertEqual(clr, PEP_rating_reliable);
andreas@392
   426
andreas@392
   427
    // mistrust Bob
andreas@392
   428
    [session keyMistrusted:identBob];
andreas@392
   429
dirk@444
   430
    identBob.fingerPrint = nil;
dirk@441
   431
    [session updateIdentity:identBob];
dirk@441
   432
    XCTAssertNil(identBob.fingerPrint);
dirk@441
   433
andreas@392
   434
    // Gray == PEP_rating_unencrypted
andreas@392
   435
    clr = [session outgoingColorForMessage:msg];
dirk@420
   436
    XCTAssertEqual(clr, PEP_rating_unencrypted);
andreas@392
   437
dirk@444
   438
    // Undo
dirk@443
   439
    [session undoLastMistrust];
dirk@444
   440
    [session updateIdentity:identBob];
dirk@444
   441
    XCTAssertNotNil(identBob.fingerPrint);
andreas@392
   442
andreas@392
   443
    // Back to yellow
andreas@392
   444
    clr = [session outgoingColorForMessage:msg];
dirk@420
   445
    XCTAssertEqual(clr, PEP_rating_reliable);
dirk@444
   446
    XCTAssertEqual([session identityRating:identBob], PEP_rating_reliable);
andreas@392
   447
andreas@392
   448
    // Trust again
andreas@392
   449
    [session trustPersonalKey:identBob];
andreas@392
   450
andreas@392
   451
    // Back to green
andreas@392
   452
    clr = [session outgoingColorForMessage:msg];
dirk@420
   453
    XCTAssertEqual(clr, PEP_rating_trusted);
andreas@392
   454
andreas@392
   455
    // Now let see if it turns back yellow if we add an unconfirmed folk.
andreas@392
   456
    // pEp Test John (test key, don't use) <pep.test.john@pep-project.org>
andreas@392
   457
    // AA2E4BEB93E5FE33DEFD8BE1135CD6D170DCF575
dirk@488
   458
    XCTAssertTrue([PEPTestUtils importBundledKey:@"0x70DCF575.asc" session:session]);
andreas@392
   459
andreas@392
   460
    PEPIdentity *identJohn = [[PEPIdentity alloc]
andreas@392
   461
                              initWithAddress:@"pep.test.john@pep-project.org"
andreas@392
   462
                              userID:@"101" userName:@"pEp Test John"
andreas@392
   463
                              isOwn:NO
andreas@392
   464
                              fingerPrint:@"AA2E4BEB93E5FE33DEFD8BE1135CD6D170DCF575"];
andreas@392
   465
andreas@392
   466
    [session updateIdentity:identJohn];
andreas@392
   467
andreas@411
   468
    msg.cc = @[[PEPTestUtils foreignPepIdentityWithAddress:@"pep.test.john@pep-project.org"
andreas@411
   469
                                                  userName:@"pEp Test John"]];
andreas@392
   470
    // Yellow ?
andreas@392
   471
    clr = [session outgoingColorForMessage:msg];
dirk@420
   472
    XCTAssertEqual(clr, PEP_rating_reliable);
andreas@392
   473
dirk@522
   474
    NSError *error = nil;
dirk@524
   475
    PEPMessage *encMsg = [session encryptMessage:msg extraKeys:nil status:nil error:&error];
dirk@522
   476
    XCTAssertNotNil(encMsg);
dirk@522
   477
    XCTAssertNil(error);
andreas@392
   478
dirk@522
   479
    XCTAssertEqualObjects(encMsg.shortMessage, @"p≡p");
dirk@522
   480
    XCTAssertTrue([encMsg.longMessage containsString:@"p≡p"]);
andreas@392
   481
}
andreas@392
   482
andreas@392
   483
andreas@392
   484
- (void)testOutgoingBccColors
andreas@392
   485
{
andreas@392
   486
    PEPSession *session = [PEPSession new];
andreas@392
   487
andreas@392
   488
    // Our test user :
andreas@392
   489
    // pEp Test Alice (test key don't use) <pep.test.alice@pep-project.org>
andreas@392
   490
    // 4ABE3AAF59AC32CFE4F86500A9411D176FF00E97
dirk@488
   491
    XCTAssertTrue([PEPTestUtils importBundledKey:@"6FF00E97_sec.asc" session:session]);
andreas@392
   492
andreas@392
   493
    PEPIdentity *identAlice = [[PEPIdentity alloc]
andreas@392
   494
                               initWithAddress:@"pep.test.alice@pep-project.org"
andreas@392
   495
                               userID:ownUserId
andreas@392
   496
                               userName:@"pEp Test Alice"
andreas@392
   497
                               isOwn:YES
andreas@392
   498
                               fingerPrint:@"4ABE3AAF59AC32CFE4F86500A9411D176FF00E97"];
andreas@392
   499
andreas@392
   500
    [session mySelf:identAlice];
andreas@392
   501
andreas@392
   502
    PEPMessage *msg = [PEPMessage new];
andreas@392
   503
    msg.from = identAlice;
andreas@392
   504
    msg.to = @[[[PEPIdentity alloc] initWithAddress:@"pep.test.bob@pep-project.org"
andreas@392
   505
                                             userID:@"42" userName:@"pEp Test Bob" isOwn:NO]];
andreas@392
   506
    msg.shortMessage = @"All Green Test";
andreas@392
   507
    msg.longMessage = @"This is a text content";
andreas@392
   508
    msg.direction = PEP_dir_outgoing;
andreas@392
   509
andreas@392
   510
    // Test with unknown Bob
andreas@392
   511
    PEP_rating clr = [session outgoingColorForMessage:msg];
dirk@420
   512
    XCTAssertEqual(clr, PEP_rating_unencrypted);
andreas@392
   513
andreas@392
   514
    // Now let see with bob's pubkey already known
andreas@392
   515
    // pEp Test Bob (test key, don't use) <pep.test.bob@pep-project.org>
andreas@392
   516
    // BFCDB7F301DEEEBBF947F29659BFF488C9C2EE39
dirk@488
   517
    XCTAssertTrue([PEPTestUtils importBundledKey:@"0xC9C2EE39.asc" session:session]);
andreas@392
   518
andreas@392
   519
    PEPIdentity *identBob = [[PEPIdentity alloc]
andreas@392
   520
                             initWithAddress:@"pep.test.bob@pep-project.org"
andreas@392
   521
                             userID:@"42" userName:@"pEp Test Bob"
andreas@392
   522
                             isOwn:NO
andreas@392
   523
                             fingerPrint:@"BFCDB7F301DEEEBBF947F29659BFF488C9C2EE39"];
andreas@392
   524
andreas@392
   525
    [session updateIdentity:identBob];
andreas@392
   526
andreas@392
   527
    // Should be yellow, since no handshake happened.
andreas@392
   528
    clr = [session outgoingColorForMessage:msg];
dirk@420
   529
    XCTAssertEqual(clr, PEP_rating_reliable);
andreas@392
   530
andreas@392
   531
    clr = [session identityRating:identBob];
dirk@420
   532
    XCTAssertEqual(clr, PEP_rating_reliable);
andreas@392
   533
andreas@392
   534
    // Let' say we got that handshake, set PEP_ct_confirmed in Bob's identity
andreas@392
   535
    [session trustPersonalKey:identBob];
andreas@392
   536
andreas@392
   537
    // This time it should be green
andreas@392
   538
    clr = [session outgoingColorForMessage:msg];
dirk@420
   539
    XCTAssertEqual(clr, PEP_rating_trusted);
andreas@392
   540
andreas@392
   541
    clr = [session identityRating:identBob];
dirk@420
   542
    XCTAssertEqual(clr, PEP_rating_trusted);
andreas@392
   543
andreas@392
   544
    // Now let see if it turns back yellow if we add an unconfirmed folk.
andreas@392
   545
    // pEp Test John (test key, don't use) <pep.test.john@pep-project.org>
andreas@392
   546
    // AA2E4BEB93E5FE33DEFD8BE1135CD6D170DCF575
dirk@488
   547
    XCTAssertTrue([PEPTestUtils importBundledKey:@"0x70DCF575.asc" session:session]);
andreas@392
   548
andreas@392
   549
    PEPIdentity *identJohn = [[PEPIdentity alloc]
andreas@392
   550
                              initWithAddress:@"pep.test.john@pep-project.org"
andreas@392
   551
                              userID:@"101" userName:@"pEp Test John"
andreas@392
   552
                              isOwn:NO
andreas@392
   553
                              fingerPrint:@"AA2E4BEB93E5FE33DEFD8BE1135CD6D170DCF575"];
andreas@392
   554
andreas@392
   555
    [session updateIdentity:identJohn];
andreas@392
   556
andreas@392
   557
    msg.bcc = @[[[PEPIdentity alloc] initWithAddress:@"pep.test.john@pep-project.org"
andreas@392
   558
                                              userID:@"101" userName:@"pEp Test John" isOwn:NO]];
andreas@392
   559
andreas@392
   560
    // Yellow ?
andreas@392
   561
    clr = [session outgoingColorForMessage:msg];
dirk@420
   562
    XCTAssertEqual(clr, PEP_rating_reliable);
andreas@392
   563
andreas@392
   564
    [session trustPersonalKey:identJohn];
andreas@392
   565
andreas@392
   566
    // This time it should be green
andreas@392
   567
    clr = [session outgoingColorForMessage:msg];
dirk@420
   568
    XCTAssertEqual(clr, PEP_rating_trusted);
andreas@392
   569
andreas@392
   570
    clr = [session identityRating:identJohn];
dirk@420
   571
    XCTAssertEqual(clr, PEP_rating_trusted);
andreas@392
   572
}
andreas@392
   573
andreas@392
   574
- (void)testDontEncryptForMistrusted
andreas@392
   575
{
andreas@392
   576
    PEPSession *session = [PEPSession new];
andreas@392
   577
andreas@392
   578
    // Our test user :
andreas@392
   579
    // pEp Test Alice (test key don't use) <pep.test.alice@pep-project.org>
andreas@392
   580
    // 4ABE3AAF59AC32CFE4F86500A9411D176FF00E97
dirk@488
   581
    XCTAssertTrue([PEPTestUtils importBundledKey:@"6FF00E97_sec.asc" session:session]);
andreas@392
   582
andreas@392
   583
    PEPIdentity *identAlice = [[PEPIdentity alloc]
andreas@392
   584
                               initWithAddress:@"pep.test.alice@pep-project.org"
andreas@392
   585
                               userID:ownUserId
andreas@392
   586
                               userName:@"pEp Test Alice"
andreas@392
   587
                               isOwn:YES
andreas@392
   588
                               fingerPrint:@"4ABE3AAF59AC32CFE4F86500A9411D176FF00E97"];
andreas@392
   589
andreas@392
   590
    [session mySelf:identAlice];
andreas@392
   591
andreas@392
   592
    // pEp Test Bob (test key, don't use) <pep.test.bob@pep-project.org>
andreas@392
   593
    // BFCDB7F301DEEEBBF947F29659BFF488C9C2EE39
dirk@488
   594
    XCTAssertTrue([PEPTestUtils importBundledKey:@"0xC9C2EE39.asc" session:session]);
andreas@392
   595
andreas@392
   596
    PEPIdentity *identBob = [[PEPIdentity alloc]
andreas@392
   597
                             initWithAddress:@"pep.test.bob@pep-project.org"
andreas@392
   598
                             userID:@"42" userName:@"pEp Test Bob"
andreas@392
   599
                             isOwn:NO
andreas@392
   600
                             fingerPrint:@"BFCDB7F301DEEEBBF947F29659BFF488C9C2EE39"];
andreas@392
   601
andreas@392
   602
    [session updateIdentity:identBob];
andreas@392
   603
andreas@392
   604
    // mistrust Bob
andreas@392
   605
    [session keyMistrusted:identBob];
andreas@392
   606
andreas@392
   607
    PEPMessage *msg = [PEPMessage new];
andreas@392
   608
    msg.from = identAlice;
andreas@392
   609
    msg.to = @[[[PEPIdentity alloc] initWithAddress:@"pep.test.bob@pep-project.org" userID:@"42"
andreas@392
   610
                                           userName:@"pEp Test Bob" isOwn:NO]];
andreas@392
   611
    msg.shortMessage = @"All Green Test";
andreas@392
   612
    msg.longMessage = @"This is a text content";
andreas@392
   613
    msg.direction = PEP_dir_outgoing;
andreas@392
   614
andreas@392
   615
    // Gray == PEP_rating_unencrypted
andreas@392
   616
    PEP_rating clr = [session outgoingColorForMessage:msg];
dirk@420
   617
    XCTAssertEqual(clr, PEP_rating_unencrypted);
andreas@392
   618
dirk@522
   619
    NSError *error = nil;
dirk@524
   620
    PEPMessage *encMsg = [session encryptMessage:msg extraKeys:nil status:nil error:&error];
dirk@522
   621
    XCTAssertNotNil(encMsg);
dirk@522
   622
    XCTAssertNil(error);
andreas@392
   623
dirk@522
   624
    XCTAssertNotEqualObjects(encMsg.attachments[0][@"mimeType"], @"application/pgp-encrypted");
andreas@392
   625
andreas@392
   626
    [self pEpCleanUp];
andreas@392
   627
}
andreas@392
   628
andreas@392
   629
- (void)testRevoke
andreas@392
   630
{
andreas@392
   631
    PEPSession *session = [PEPSession new];
andreas@392
   632
andreas@392
   633
    // Our test user :
andreas@392
   634
    // pEp Test Alice (test key don't use) <pep.test.alice@pep-project.org>
andreas@392
   635
    // 4ABE3AAF59AC32CFE4F86500A9411D176FF00E97
dirk@488
   636
    XCTAssertTrue([PEPTestUtils importBundledKey:@"6FF00E97_sec.asc" session:session]);
andreas@392
   637
    NSString *fpr = @"4ABE3AAF59AC32CFE4F86500A9411D176FF00E97";
andreas@392
   638
andreas@392
   639
    PEPIdentity *identAlice = [[PEPIdentity alloc]
andreas@392
   640
                               initWithAddress:@"pep.test.alice@pep-project.org"
andreas@392
   641
                               userID:ownUserId
andreas@392
   642
                               userName:@"pEp Test Alice"
andreas@392
   643
                               isOwn:YES
andreas@392
   644
                               fingerPrint:fpr];
andreas@392
   645
andreas@392
   646
    [session mySelf:identAlice];
andreas@392
   647
andreas@392
   648
    PEPIdentity *identAlice2 = [identAlice mutableCopy];
andreas@392
   649
andreas@392
   650
    // This will revoke key
andreas@392
   651
    [session keyMistrusted:identAlice2];
andreas@416
   652
    identAlice2.fingerPrint = nil;
andreas@416
   653
    [session mySelf:identAlice];
andreas@416
   654
andreas@392
   655
    // Check fingerprint is different
andreas@392
   656
    XCTAssertNotEqualObjects(identAlice2.fingerPrint, fpr);
andreas@392
   657
}
andreas@392
   658
andreas@392
   659
- (void)testMailToMyself
andreas@392
   660
{
andreas@392
   661
    PEPSession *session = [PEPSession new];
andreas@392
   662
andreas@392
   663
    // Our test user :
andreas@392
   664
    // pEp Test Alice (test key don't use) <pep.test.alice@pep-project.org>
andreas@392
   665
    // 4ABE3AAF59AC32CFE4F86500A9411D176FF00E97
dirk@488
   666
    XCTAssertTrue([PEPTestUtils importBundledKey:@"6FF00E97_sec.asc" session:session]);
andreas@392
   667
andreas@392
   668
    PEPIdentity *identAlice = [[PEPIdentity alloc]
andreas@392
   669
                               initWithAddress:@"pep.test.alice@pep-project.org"
andreas@392
   670
                               userID:ownUserId
andreas@392
   671
                               userName:@"pEp Test Alice"
andreas@392
   672
                               isOwn:YES
andreas@392
   673
                               fingerPrint:@"4ABE3AAF59AC32CFE4F86500A9411D176FF00E97"];
andreas@392
   674
andreas@392
   675
    [session mySelf:identAlice];
andreas@392
   676
andreas@392
   677
    PEPMessage *msg = [PEPMessage new];
andreas@392
   678
    msg.from = identAlice;
andreas@392
   679
    msg.to = @[identAlice];
andreas@392
   680
    msg.shortMessage = @"Mail to Myself";
andreas@392
   681
    msg.longMessage = @"This is a text content";
andreas@392
   682
    msg.direction = PEP_dir_outgoing;
andreas@392
   683
andreas@392
   684
    PEP_rating clr = [session outgoingColorForMessage:msg];
dirk@420
   685
    XCTAssertEqual(clr, PEP_rating_trusted_and_anonymized);
andreas@392
   686
dirk@522
   687
    NSError *error = nil;
dirk@524
   688
    PEPMessage *encMsg = [session encryptMessage:msg extraKeys:nil status:nil error:&error];
dirk@522
   689
    XCTAssertNotNil(encMsg);
dirk@522
   690
    XCTAssertNil(error);
andreas@392
   691
dirk@522
   692
    NSArray *keys;
andreas@392
   693
dirk@522
   694
    error = nil;
dirk@517
   695
    PEPMessage *decmsg = [session
dirk@522
   696
                          decryptMessage:encMsg
dirk@517
   697
                          rating:&clr
dirk@523
   698
                          extraKeys:&keys
dirk@524
   699
                          status:nil
dirk@517
   700
                          error:&error];
dirk@517
   701
    XCTAssertNotNil(decmsg);
dirk@514
   702
    XCTAssertNil(error);
dirk@420
   703
    XCTAssertEqual(clr, PEP_rating_trusted_and_anonymized);
andreas@392
   704
}
andreas@392
   705
andreas@392
   706
- (void)testEncryptedMailFromMutt
andreas@392
   707
{
andreas@392
   708
    PEPSession *session = [PEPSession new];
andreas@392
   709
andreas@392
   710
    // This is the public key for test001@peptest.ch
dirk@488
   711
    XCTAssertTrue([PEPTestUtils importBundledKey:@"A3FC7F0A.asc" session:session]);
andreas@392
   712
andreas@392
   713
    // This is the secret key for test001@peptest.ch
dirk@488
   714
    XCTAssertTrue([PEPTestUtils importBundledKey:@"A3FC7F0A_sec.asc" session:session]);
andreas@392
   715
andreas@392
   716
    // Mail from mutt, already processed into message dict by the app.
dirk@465
   717
    NSMutableDictionary *msgDict = [[PEPTestUtils
dirk@465
   718
                                     unarchiveDictionary:@"msg_to_A3FC7F0A_from_mutt.ser"]
dirk@465
   719
                                    mutableCopy];
andreas@392
   720
    [msgDict removeObjectForKey:kPepLongMessage];
andreas@392
   721
    [msgDict removeObjectForKey:kPepLongMessageFormatted];
andreas@392
   722
andreas@392
   723
    // Also extracted "live" from the app.
dirk@465
   724
    NSMutableDictionary *accountDict = [[PEPTestUtils
dirk@465
   725
                                         unarchiveDictionary:@"account_A3FC7F0A.ser"]
dirk@465
   726
                                        mutableCopy];
andreas@392
   727
    [accountDict removeObjectForKey:kPepCommType];
andreas@392
   728
    [accountDict removeObjectForKey:kPepFingerprint];
andreas@392
   729
    PEPIdentity *identMe = [[PEPIdentity alloc] initWithDictionary:accountDict];
andreas@392
   730
andreas@392
   731
    [session mySelf:identMe];
andreas@392
   732
    XCTAssertNotNil(identMe.fingerPrint);
andreas@392
   733
andreas@392
   734
    NSArray* keys;
andreas@392
   735
    PEPMessage *msg = [PEPMessage new];
andreas@392
   736
    [msg setValuesForKeysWithDictionary:msgDict];
dirk@514
   737
dirk@514
   738
    // Technically, the mail is encrypted, but the signatures don't match
dirk@514
   739
    NSError *error;
dirk@517
   740
    PEPMessage *pepDecryptedMail = [session
dirk@517
   741
                                    decryptMessage:msg
dirk@517
   742
                                    rating:nil
dirk@523
   743
                                    extraKeys:&keys
dirk@524
   744
                                    status:nil
dirk@517
   745
                                    error:&error];
dirk@517
   746
    XCTAssertNotNil(pepDecryptedMail);
dirk@514
   747
    XCTAssertNil(error);
dirk@514
   748
andreas@392
   749
    XCTAssertNotNil(pepDecryptedMail.longMessage);
andreas@392
   750
}
andreas@392
   751
andreas@392
   752
- (void)testOutgoingContactColor
andreas@392
   753
{
andreas@392
   754
    PEPSession *session = [PEPSession new];
andreas@392
   755
andreas@411
   756
    PEPIdentity *partner1Orig = [PEPTestUtils foreignPepIdentityWithAddress:@"partner1@dontcare.me"
andreas@411
   757
                                                                   userName:@"Partner 1"];
andreas@392
   758
    NSString *pubKeyPartner1 = [PEPTestUtils loadResourceByName:@"partner1_F2D281C2789DD7F6_pub.asc"];
andreas@392
   759
    XCTAssertNotNil(pubKeyPartner1);
andreas@392
   760
    [session importKey:pubKeyPartner1];
andreas@392
   761
andreas@392
   762
    PEP_rating color = [session identityRating:partner1Orig];
andreas@392
   763
    XCTAssertEqual(color, PEP_rating_reliable);
andreas@392
   764
}
andreas@392
   765
andreas@392
   766
- (void)testGetTrustwords
andreas@392
   767
{
andreas@392
   768
    PEPSession *session = [PEPSession new];
andreas@392
   769
andreas@392
   770
    PEPIdentity *partner1Orig = [[PEPIdentity alloc]
andreas@392
   771
                                 initWithAddress:@"partner1@dontcare.me" userID:@"partner1"
andreas@392
   772
                                 userName:@"partner1"
andreas@392
   773
                                 isOwn:NO fingerPrint:@"F0CD3F7B422E5D587ABD885BF2D281C2789DD7F6"];
andreas@392
   774
andreas@392
   775
    PEPIdentity *meOrig = [[PEPIdentity alloc]
andreas@392
   776
                           initWithAddress:@"me@dontcare.me" userID:@"me"
andreas@392
   777
                           userName:@"me"
andreas@392
   778
                           isOwn:NO fingerPrint:@"CC1F73F6FB774BF08B197691E3BFBCA9248FC681"];
andreas@392
   779
andreas@392
   780
    NSString *pubKeyPartner1 = [PEPTestUtils loadResourceByName:@"partner1_F2D281C2789DD7F6_pub.asc"];
andreas@392
   781
    XCTAssertNotNil(pubKeyPartner1);
andreas@392
   782
    NSString *pubKeyMe = [PEPTestUtils loadResourceByName:@"meATdontcare_E3BFBCA9248FC681_pub.asc"];
andreas@392
   783
    XCTAssertNotNil(pubKeyMe);
andreas@392
   784
    NSString *secKeyMe = [PEPTestUtils loadResourceByName:@"meATdontcare_E3BFBCA9248FC681_sec.asc"];
andreas@392
   785
    XCTAssertNotNil(secKeyMe);
andreas@392
   786
andreas@392
   787
    NSString *trustwordsFull = [session getTrustwordsIdentity1:meOrig identity2:partner1Orig
andreas@392
   788
                                                      language:nil full:YES];
andreas@392
   789
    XCTAssertEqualObjects(trustwordsFull,
andreas@392
   790
                          @"EMERSON GASPER TOKENISM BOLUS COLLAGE DESPISE BEDDED ENCRYPTION IMAGINE BEDFORD");
andreas@392
   791
andreas@392
   792
    NSString *trustwordsFullEnglish = [session getTrustwordsIdentity1:meOrig identity2:partner1Orig
andreas@392
   793
                                                             language:@"en" full:YES];
andreas@392
   794
    XCTAssertEqualObjects(trustwordsFullEnglish, trustwordsFull);
andreas@392
   795
andreas@392
   796
    NSString *trustwordsUndefined = [session getTrustwordsIdentity1:meOrig identity2:partner1Orig
andreas@392
   797
                                                           language:@"ZZ" full:YES];
andreas@392
   798
    XCTAssertNil(trustwordsUndefined);
andreas@392
   799
}
andreas@392
   800
dirk@418
   801
- (void)testStringToRating
dirk@418
   802
{
dirk@418
   803
    PEPSession *session = [PEPSession new];
dirk@418
   804
    XCTAssertEqual([session ratingFromString:@"cannot_decrypt"], PEP_rating_cannot_decrypt);
dirk@418
   805
    XCTAssertEqual([session ratingFromString:@"have_no_key"], PEP_rating_have_no_key);
dirk@418
   806
    XCTAssertEqual([session ratingFromString:@"unencrypted"], PEP_rating_unencrypted);
dirk@418
   807
    XCTAssertEqual([session ratingFromString:@"unencrypted_for_some"],
dirk@418
   808
                   PEP_rating_unencrypted_for_some);
dirk@418
   809
    XCTAssertEqual([session ratingFromString:@"unreliable"], PEP_rating_unreliable);
dirk@418
   810
    XCTAssertEqual([session ratingFromString:@"reliable"], PEP_rating_reliable);
dirk@418
   811
    XCTAssertEqual([session ratingFromString:@"trusted"], PEP_rating_trusted);
dirk@418
   812
    XCTAssertEqual([session ratingFromString:@"trusted_and_anonymized"],
dirk@418
   813
                   PEP_rating_trusted_and_anonymized);
dirk@418
   814
    XCTAssertEqual([session ratingFromString:@"fully_anonymous"], PEP_rating_fully_anonymous);
dirk@418
   815
    XCTAssertEqual([session ratingFromString:@"mistrust"], PEP_rating_mistrust);
dirk@418
   816
    XCTAssertEqual([session ratingFromString:@"b0rken"], PEP_rating_b0rken);
dirk@418
   817
    XCTAssertEqual([session ratingFromString:@"under_attack"], PEP_rating_under_attack);
dirk@418
   818
    XCTAssertEqual([session ratingFromString:@"undefined"], PEP_rating_undefined);
dirk@418
   819
    XCTAssertEqual([session ratingFromString:@"does not exist111"], PEP_rating_undefined);
dirk@418
   820
}
dirk@418
   821
dirk@418
   822
- (void)testRatingToString
dirk@418
   823
{
dirk@418
   824
    PEPSession *session = [PEPSession new];
dirk@418
   825
    XCTAssertEqualObjects([session stringFromRating:PEP_rating_cannot_decrypt], @"cannot_decrypt");
dirk@418
   826
    XCTAssertEqualObjects([session stringFromRating:PEP_rating_have_no_key], @"have_no_key");
dirk@418
   827
    XCTAssertEqualObjects([session stringFromRating:PEP_rating_unencrypted], @"unencrypted");
dirk@418
   828
    XCTAssertEqualObjects([session stringFromRating:PEP_rating_unencrypted_for_some],
dirk@418
   829
                          @"unencrypted_for_some");
dirk@418
   830
    XCTAssertEqualObjects([session stringFromRating:PEP_rating_unreliable], @"unreliable");
dirk@418
   831
    XCTAssertEqualObjects([session stringFromRating:PEP_rating_reliable], @"reliable");
dirk@418
   832
    XCTAssertEqualObjects([session stringFromRating:PEP_rating_trusted], @"trusted");
dirk@418
   833
    XCTAssertEqualObjects([session stringFromRating:PEP_rating_trusted_and_anonymized],
dirk@418
   834
                          @"trusted_and_anonymized");
dirk@418
   835
    XCTAssertEqualObjects([session stringFromRating:PEP_rating_fully_anonymous],
dirk@418
   836
                          @"fully_anonymous");
dirk@418
   837
    XCTAssertEqualObjects([session stringFromRating:PEP_rating_mistrust], @"mistrust");
dirk@418
   838
    XCTAssertEqualObjects([session stringFromRating:PEP_rating_b0rken], @"b0rken");
dirk@418
   839
    XCTAssertEqualObjects([session stringFromRating:PEP_rating_under_attack], @"under_attack");
dirk@418
   840
    XCTAssertEqualObjects([session stringFromRating:PEP_rating_undefined], @"undefined");
dirk@418
   841
    XCTAssertEqualObjects([session stringFromRating:500], @"undefined");
dirk@418
   842
}
dirk@418
   843
dirk@431
   844
- (void)testIsPEPUser
dirk@431
   845
{
dirk@431
   846
    PEPSession *session = [PEPSession new];
dirk@431
   847
dirk@431
   848
    PEPIdentity *identMe = [[PEPIdentity alloc]
dirk@431
   849
                            initWithAddress:@"me-myself-and-i@pep-project.org"
dirk@431
   850
                            userID:@"me-myself-and-i"
dirk@452
   851
                            userName:@"pEp Me"
dirk@431
   852
                            isOwn:YES];
dirk@431
   853
    [session mySelf:identMe];
dirk@431
   854
    XCTAssertNotNil(identMe.fingerPrint);
dirk@432
   855
dirk@432
   856
    // PEP_CANNOT_FIND_PERSON == 902
dirk@453
   857
    XCTAssertTrue([session isPEPUser:identMe]);
dirk@431
   858
}
dirk@431
   859
dirk@449
   860
- (void)testXEncStatusForOutgoingEncryptedMail
dirk@449
   861
{
dirk@449
   862
    [self helperXEncStatusForOutgoingEncryptdMailToSelf:NO expectedRating:PEP_rating_reliable];
dirk@449
   863
}
dirk@449
   864
dirk@449
   865
- (void)testXEncStatusForOutgoingSelfEncryptedMail
dirk@449
   866
{
dirk@449
   867
    [self helperXEncStatusForOutgoingEncryptdMailToSelf:YES
dirk@449
   868
                                         expectedRating:PEP_rating_trusted_and_anonymized];
dirk@449
   869
}
dirk@449
   870
dirk@456
   871
- (void)testEncryptMessagesWithoutKeys
dirk@456
   872
{
dirk@456
   873
    PEPSession *session = [PEPSession new];
dirk@456
   874
dirk@456
   875
    PEPIdentity *identMe = [[PEPIdentity alloc]
dirk@456
   876
                            initWithAddress:@"me-myself-and-i@pep-project.org"
dirk@456
   877
                            userID:@"me-myself-and-i"
dirk@456
   878
                            userName:@"pEp Me"
dirk@456
   879
                            isOwn:YES];
dirk@456
   880
    [session mySelf:identMe];
dirk@456
   881
    XCTAssertNotNil(identMe.fingerPrint);
dirk@456
   882
dirk@456
   883
    PEPIdentity *identAlice = [[PEPIdentity alloc]
dirk@456
   884
                               initWithAddress:@"alice@pep-project.org"
dirk@456
   885
                               userID:@"alice"
dirk@456
   886
                               userName:@"pEp Test Alice"
dirk@456
   887
                               isOwn:NO];
dirk@456
   888
dirk@456
   889
    PEPMessage *msg = [PEPMessage new];
dirk@456
   890
    msg.from = identMe;
dirk@456
   891
    msg.to = @[identAlice];
dirk@456
   892
    msg.shortMessage = @"Mail to Alice";
dirk@456
   893
    msg.longMessage = @"Alice?";
dirk@456
   894
    msg.direction = PEP_dir_outgoing;
dirk@456
   895
dirk@456
   896
    PEP_rating clr = [session outgoingColorForMessage:msg];
dirk@456
   897
    XCTAssertEqual(clr, PEP_rating_unencrypted);
dirk@456
   898
dirk@522
   899
    NSError *error = nil;
dirk@524
   900
    PEPMessage *encMsg = [session encryptMessage:msg extraKeys:nil status:nil error:&error];
dirk@522
   901
    XCTAssertNotNil(encMsg);
dirk@522
   902
    XCTAssertNil(error);
dirk@456
   903
dirk@456
   904
    XCTAssertNotNil(encMsg);
dirk@456
   905
dirk@456
   906
    PEPStringList *keys;
dirk@514
   907
    PEP_rating pEpRating;
dirk@522
   908
    error = nil;
dirk@517
   909
    PEPMessage *decMsg = [session
dirk@517
   910
                          decryptMessage:encMsg
dirk@517
   911
                          rating:&pEpRating
dirk@523
   912
                          extraKeys:&keys
dirk@524
   913
                          status:nil
dirk@517
   914
                          error:&error];
dirk@517
   915
    XCTAssertNotNil(decMsg);
dirk@514
   916
    XCTAssertNil(error);
dirk@514
   917
dirk@456
   918
    XCTAssertEqual(pEpRating, PEP_rating_unencrypted);
dirk@456
   919
    XCTAssertNotNil(decMsg);
dirk@456
   920
}
dirk@456
   921
dirk@456
   922
/**
dirk@456
   923
 ENGINE-364. Tries to invoke trustPersonalKey on an identity without key,
dirk@456
   924
 giving it a fake fingerprint.
dirk@456
   925
 */
dirk@456
   926
- (void)testTrustPersonalKey
dirk@456
   927
{
dirk@456
   928
    PEPSession *session = [PEPSession new];
dirk@456
   929
dirk@456
   930
    PEPIdentity *identMe = [[PEPIdentity alloc]
dirk@456
   931
                            initWithAddress:@"me-myself-and-i@pep-project.org"
dirk@456
   932
                            userID:@"me-myself-and-i"
dirk@456
   933
                            userName:@"pEp Me"
dirk@456
   934
                            isOwn:YES];
dirk@456
   935
    [session mySelf:identMe];
dirk@456
   936
    XCTAssertNotNil(identMe.fingerPrint);
dirk@456
   937
dirk@456
   938
    // The fingerprint is definitely wrong, we don't have a key
dirk@456
   939
    PEPIdentity *identAlice = [[PEPIdentity alloc]
dirk@456
   940
                               initWithAddress:@"alice@pep-project.org"
dirk@456
   941
                               userID:@"alice"
dirk@456
   942
                               userName:@"pEp Test Alice"
dirk@456
   943
                               isOwn:NO
dirk@456
   944
                               fingerPrint:@"4ABE3AAF59AC32CFE4F86500A9411D176FF00E97"];
dirk@456
   945
dirk@456
   946
    [session trustPersonalKey:identAlice];
dirk@456
   947
}
dirk@456
   948
dirk@457
   949
/**
dirk@457
   950
 ENGINE-381
dirk@457
   951
 */
dirk@457
   952
- (void)testVolatileIdentityRating
dirk@457
   953
{
dirk@457
   954
    PEPSession *session = [PEPSession new];
dirk@457
   955
dirk@457
   956
    PEPIdentity *identMe = [[PEPIdentity alloc]
dirk@457
   957
                            initWithAddress:@"me-myself-and-i@pep-project.org"
dirk@457
   958
                            userID:@"me-myself-and-i"
dirk@457
   959
                            userName:@"pEp Me"
dirk@457
   960
                            isOwn:YES];
dirk@457
   961
    [session mySelf:identMe];
dirk@457
   962
    XCTAssertNotNil(identMe.fingerPrint);
dirk@457
   963
dirk@457
   964
    PEPIdentity *identAlice = [self
dirk@457
   965
                               checkImportingKeyFilePath:@"6FF00E97_sec.asc"
dirk@457
   966
                               address:@"pep.test.alice@pep-project.org"
dirk@457
   967
                               userID:@"alice_user_id"
dirk@457
   968
                               fingerPrint:@"4ABE3AAF59AC32CFE4F86500A9411D176FF00E97"
dirk@457
   969
                               session: session];
dirk@488
   970
    XCTAssertNotNil(identAlice);
dirk@457
   971
dirk@457
   972
    dispatch_group_t identityRatingGroup = dispatch_group_create();
dirk@457
   973
dirk@457
   974
    void (^ratingBlock)(void) = ^{
dirk@457
   975
        PEPSession *innerSession = [PEPSession new];
dirk@457
   976
        PEP_rating rating = [innerSession identityRating:identAlice];
dirk@457
   977
        XCTAssertEqual(rating, PEP_rating_reliable);
dirk@457
   978
    };
dirk@457
   979
dirk@479
   980
    for (int i = 0; i < 4; ++i) {
dirk@457
   981
        dispatch_group_async(identityRatingGroup,
dirk@457
   982
                             dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0),
dirk@457
   983
                             ratingBlock);
dirk@457
   984
    }
dirk@457
   985
dirk@479
   986
    for (int i = 0; i < 4; ++i) {
dirk@457
   987
        ratingBlock();
dirk@457
   988
    }
dirk@457
   989
dirk@457
   990
    dispatch_group_wait(identityRatingGroup, DISPATCH_TIME_FOREVER);
dirk@457
   991
}
dirk@457
   992
dirk@449
   993
#pragma mark - configUnencryptedSubject
dirk@449
   994
dirk@449
   995
- (void)testConfigUnencryptedSubject
dirk@449
   996
{
dirk@449
   997
    // Setup Config to encrypt subject
dirk@449
   998
    [PEPObjCAdapter setUnecryptedSubjectEnabled:NO];
dirk@449
   999
dirk@449
  1000
    // Write mail to yourself ...
dirk@449
  1001
    PEPMessage *encMessage = [self mailWrittenToMySelf];
dirk@449
  1002
dirk@449
  1003
    // ... and assert subject is encrypted
dirk@449
  1004
    XCTAssertEqualObjects(encMessage.shortMessage, @"p≡p", @"Subject should be encrypted");
dirk@449
  1005
}
dirk@449
  1006
dirk@449
  1007
- (void)testConfigUnencryptedSubject_encryptedSubjectDisabled
dirk@449
  1008
{
dirk@449
  1009
    // Setup Config to not encrypt subject
dirk@449
  1010
    [PEPObjCAdapter setUnecryptedSubjectEnabled:YES];
dirk@449
  1011
dirk@449
  1012
    // Write mail to yourself ...
dirk@449
  1013
    PEPMessage *encMessage = [self mailWrittenToMySelf];
dirk@449
  1014
dirk@449
  1015
    // ... and assert the subject is not encrypted
dirk@449
  1016
    XCTAssertNotEqualObjects(encMessage.shortMessage, @"p≡p", @"Subject should not be encrypted");
dirk@449
  1017
}
dirk@449
  1018
andreas@392
  1019
#pragma mark - Helpers
andreas@392
  1020
dirk@439
  1021
- (PEPIdentity *)checkImportingKeyFilePath:(NSString *)filePath address:(NSString *)address
dirk@439
  1022
                                    userID:(NSString *)userID
dirk@439
  1023
                               fingerPrint:(NSString *)fingerPrint
dirk@456
  1024
                                   session:(PEPSession *)session
dirk@437
  1025
{
dirk@456
  1026
    if (!session) {
dirk@456
  1027
        session = [PEPSession new];
dirk@456
  1028
    }
dirk@437
  1029
dirk@488
  1030
    BOOL success = [PEPTestUtils importBundledKey:filePath session:session];
dirk@488
  1031
    XCTAssertTrue(success);
dirk@437
  1032
dirk@488
  1033
    if (success) {
dirk@488
  1034
        // Our test user:
dirk@488
  1035
        PEPIdentity *identTest = [[PEPIdentity alloc]
dirk@488
  1036
                                  initWithAddress:address
dirk@488
  1037
                                  userID:userID
dirk@488
  1038
                                  userName:[NSString stringWithFormat:@"Some User Name %@", userID]
dirk@488
  1039
                                  isOwn:NO];
dirk@437
  1040
dirk@488
  1041
        [session updateIdentity:identTest];
dirk@488
  1042
        XCTAssertNotNil(identTest.fingerPrint);
dirk@488
  1043
        XCTAssertEqualObjects(identTest.fingerPrint, fingerPrint);
dirk@439
  1044
dirk@488
  1045
        return identTest;
dirk@488
  1046
    } else {
dirk@488
  1047
        return nil;
dirk@488
  1048
    }
dirk@439
  1049
}
dirk@439
  1050
dirk@439
  1051
- (PEPIdentity *)checkMySelfImportingKeyFilePath:(NSString *)filePath address:(NSString *)address
dirk@439
  1052
                                          userID:(NSString *)userID
dirk@439
  1053
                                     fingerPrint:(NSString *)fingerPrint
dirk@491
  1054
                                         session:(PEPSession *)session
dirk@439
  1055
{
dirk@494
  1056
    XCTAssertTrue([PEPTestUtils importBundledKey:filePath session:session]);
dirk@439
  1057
dirk@439
  1058
    // Our test user:
dirk@439
  1059
    PEPIdentity *identTest = [[PEPIdentity alloc]
dirk@439
  1060
                              initWithAddress:address
dirk@439
  1061
                              userID:userID
dirk@439
  1062
                              userName:[NSString stringWithFormat:@"Some User Name %@", userID]
dirk@439
  1063
                              isOwn:YES
dirk@439
  1064
                              fingerPrint: fingerPrint];
dirk@439
  1065
dirk@502
  1066
    NSError *error;
dirk@502
  1067
    XCTAssertTrue([session setOwnKey:identTest fingerprint:fingerPrint error:&error]);
dirk@502
  1068
    XCTAssertNil(error);
dirk@439
  1069
    XCTAssertNotNil(identTest.fingerPrint);
dirk@439
  1070
    XCTAssertEqualObjects(identTest.fingerPrint, fingerPrint);
dirk@439
  1071
dirk@439
  1072
    return identTest;
dirk@437
  1073
}
dirk@437
  1074
dirk@433
  1075
/**
dirk@433
  1076
 Verifies that a partner ID is really a correct Identity.
dirk@433
  1077
 Usually used on identities imported as keys, since the engine has problems with them.
dirk@433
  1078
 */
dirk@433
  1079
- (void)updateAndVerifyPartnerIdentity:(PEPIdentity *)partnerIdentity session:(PEPSession *)session
dirk@433
  1080
{
dirk@433
  1081
    XCTAssertNotNil(partnerIdentity.fingerPrint);
dirk@433
  1082
    [session updateIdentity:partnerIdentity];
dirk@433
  1083
    XCTAssertNotNil(partnerIdentity.fingerPrint);
dirk@433
  1084
    NSString *fingerprint = partnerIdentity.fingerPrint;
dirk@433
  1085
    partnerIdentity.fingerPrint = nil;
dirk@433
  1086
    [session updateIdentity:partnerIdentity];
dirk@433
  1087
    XCTAssertNotNil(partnerIdentity.fingerPrint);
dirk@433
  1088
    XCTAssertEqualObjects(partnerIdentity.fingerPrint, fingerprint);
dirk@433
  1089
}
dirk@433
  1090
andreas@416
  1091
- (PEPMessage *)mailWrittenToMySelf
andreas@416
  1092
{
andreas@416
  1093
    PEPSession *session = [PEPSession new];
andreas@416
  1094
andreas@416
  1095
    // Write a e-mail to yourself ...
andreas@416
  1096
    PEPIdentity *me = [PEPTestUtils ownPepIdentityWithAddress:@"me@peptest.ch"
andreas@416
  1097
                                                     userName:@"userName"];
andreas@416
  1098
    [session mySelf:me];
andreas@416
  1099
andreas@416
  1100
    NSString *shortMessage = @"Subject";
andreas@416
  1101
    NSString *longMessage = @"Oh, this is a long body text!";
andreas@416
  1102
    PEPMessage *mail = [PEPTestUtils mailFrom:me
andreas@416
  1103
                                      toIdent:me
andreas@416
  1104
                                 shortMessage:shortMessage
andreas@416
  1105
                                  longMessage:longMessage
andreas@416
  1106
                                     outgoing:YES];
dirk@526
  1107
    NSError *error = nil;
dirk@526
  1108
    PEP_STATUS status = PEP_UNKNOWN_ERROR;
dirk@526
  1109
    PEPMessage *encMessage = [session encryptMessage:mail identity:me status:&status error:&error];
dirk@526
  1110
    XCTAssertNil(error);
andreas@416
  1111
andreas@416
  1112
    return encMessage;
andreas@416
  1113
}
andreas@416
  1114
andreas@392
  1115
- (PEPMessage *)internalEncryptToMySelfKeys:(PEPStringList **)keys
andreas@392
  1116
{
andreas@392
  1117
    PEPSession *session = [PEPSession new];
andreas@411
  1118
    
andreas@411
  1119
    PEPIdentity *me = [PEPTestUtils ownPepIdentityWithAddress:@"me@peptest.ch"
andreas@411
  1120
                                                     userName:@"userName"];
andreas@392
  1121
    [session mySelf:me];
andreas@392
  1122
    XCTAssertNotNil(me.fingerPrint);
andreas@392
  1123
andreas@392
  1124
    // Create draft
andreas@392
  1125
    NSString *shortMessage = @"Subject";
andreas@392
  1126
    NSString *longMessage = @"Oh, this is a long body text!";
andreas@392
  1127
    PEPMessage *mail = [PEPTestUtils mailFrom:me toIdent:me shortMessage:shortMessage longMessage:longMessage outgoing:YES];
andreas@392
  1128
dirk@526
  1129
    PEP_STATUS status;
dirk@526
  1130
    NSError *error = nil;
dirk@526
  1131
    PEPMessage *encMessage = [session encryptMessage:mail identity:me status:&status error:&error];
andreas@392
  1132
    XCTAssertEqual(status, 0);
andreas@392
  1133
    XCTAssertEqualObjects(encMessage.shortMessage, @"p≡p");
andreas@392
  1134
dirk@514
  1135
    PEP_rating rating;
dirk@526
  1136
    error = nil;
dirk@517
  1137
    PEPMessage *unencDict = [session
dirk@517
  1138
                             decryptMessage:encMessage
dirk@517
  1139
                             rating:&rating
dirk@523
  1140
                             extraKeys:keys
dirk@524
  1141
                             status:nil
dirk@517
  1142
                             error:&error];
dirk@517
  1143
    XCTAssertNotNil(unencDict);
dirk@514
  1144
    XCTAssertNil(error);
dirk@514
  1145
andreas@392
  1146
    XCTAssertGreaterThanOrEqual(rating, PEP_rating_reliable);
andreas@392
  1147
andreas@392
  1148
    XCTAssertEqualObjects(unencDict.shortMessage, shortMessage);
andreas@392
  1149
    XCTAssertEqualObjects(unencDict.longMessage, longMessage);
andreas@392
  1150
andreas@392
  1151
    return unencDict;
andreas@392
  1152
}
andreas@392
  1153
andreas@392
  1154
- (void)pEpCleanUp
andreas@392
  1155
{
dirk@470
  1156
    [PEPTestUtils cleanUp];
andreas@392
  1157
}
andreas@392
  1158
dirk@424
  1159
- (void)helperXEncStatusForOutgoingEncryptdMailToSelf:(BOOL)toSelf
dirk@424
  1160
                                       expectedRating:(PEP_rating)expectedRating
dirk@422
  1161
{
dirk@422
  1162
    PEPSession *session = [PEPSession new];
dirk@422
  1163
dirk@422
  1164
    // Partner pubkey for the test:
dirk@422
  1165
    // pEp Test Alice (test key don't use) <pep.test.alice@pep-project.org>
dirk@422
  1166
    // 4ABE3AAF59AC32CFE4F86500A9411D176FF00E97
dirk@494
  1167
    XCTAssertTrue([PEPTestUtils importBundledKey:@"0x6FF00E97.asc" session:session]);
dirk@422
  1168
dirk@422
  1169
    PEPIdentity *identAlice = [[PEPIdentity alloc]
dirk@422
  1170
                               initWithAddress:@"pep.test.alice@pep-project.org"
dirk@422
  1171
                               userID:ownUserId
dirk@422
  1172
                               userName:@"pEp Test Alice"
dirk@422
  1173
                               isOwn:NO
dirk@433
  1174
                               fingerPrint:@"4ABE3AAF59AC32CFE4F86500A9411D176FF00E97"];
dirk@433
  1175
    [self updateAndVerifyPartnerIdentity:identAlice session:session];
dirk@422
  1176
dirk@422
  1177
    PEPIdentity *identMe = [[PEPIdentity alloc]
dirk@422
  1178
                               initWithAddress:@"me-myself-and-i@pep-project.org"
dirk@422
  1179
                               userID:@"me-myself-and-i"
dirk@452
  1180
                               userName:@"pEp Me"
dirk@422
  1181
                               isOwn:YES];
dirk@422
  1182
    [session mySelf:identMe];
dirk@422
  1183
    XCTAssertNotNil(identMe.fingerPrint);
dirk@422
  1184
dirk@422
  1185
    PEPMessage *msg = [PEPMessage new];
dirk@422
  1186
    msg.from = identMe;
dirk@422
  1187
    msg.to = @[identAlice];
dirk@422
  1188
    msg.shortMessage = @"Mail to Alice";
dirk@422
  1189
    msg.longMessage = @"Alice?";
dirk@422
  1190
    msg.direction = PEP_dir_outgoing;
dirk@422
  1191
dirk@422
  1192
    PEP_rating clr = [session outgoingColorForMessage:msg];
dirk@424
  1193
    XCTAssertEqual(clr, PEP_rating_reliable);
dirk@422
  1194
dirk@423
  1195
    PEPMessage *encMsg;
dirk@424
  1196
dirk@424
  1197
    PEP_STATUS statusEnc = PEP_VERSION_MISMATCH;
dirk@526
  1198
    NSError *error = nil;
dirk@424
  1199
    if (toSelf) {
dirk@526
  1200
        encMsg = [session encryptMessage:msg identity:identMe status:&statusEnc error:&error];
dirk@522
  1201
        XCTAssertEqual(statusEnc, PEP_STATUS_OK);
dirk@424
  1202
    } else {
dirk@524
  1203
        encMsg = [session encryptMessage:msg extraKeys:nil status:nil error:&error];
dirk@522
  1204
        XCTAssertNotNil(encMsg);
dirk@522
  1205
        XCTAssertNil(error);
dirk@424
  1206
    }
dirk@423
  1207
    XCTAssertNotNil(encMsg);
dirk@423
  1208
dirk@423
  1209
    PEPStringList *keys;
dirk@514
  1210
    PEP_rating pEpRating;
dirk@526
  1211
    error = nil;
dirk@517
  1212
    PEPMessage *decMsg = [session
dirk@517
  1213
                          decryptMessage:encMsg
dirk@517
  1214
                          rating:&pEpRating
dirk@523
  1215
                          extraKeys:&keys
dirk@524
  1216
                          status:nil
dirk@517
  1217
                          error:&error];
dirk@514
  1218
    XCTAssertNil(error);
dirk@517
  1219
    XCTAssertNotNil(decMsg);
dirk@514
  1220
dirk@424
  1221
    XCTAssertEqual(pEpRating, expectedRating);
dirk@423
  1222
dirk@423
  1223
    NSArray * encStatusField = nil;
dirk@423
  1224
    for (NSArray *field in decMsg.optionalFields) {
dirk@423
  1225
        NSString *header = [field[0] lowercaseString];
dirk@423
  1226
        if ([header isEqualToString:@"x-encstatus"]) {
dirk@423
  1227
            encStatusField = field;
dirk@423
  1228
        }
dirk@423
  1229
    }
dirk@423
  1230
    XCTAssertNotNil(encStatusField);
dirk@423
  1231
    if (encStatusField) {
dirk@423
  1232
        PEP_rating outgoingRating = [session ratingFromString:encStatusField[1]];
dirk@424
  1233
        XCTAssertEqual(outgoingRating, expectedRating);
dirk@423
  1234
    }
dirk@422
  1235
}
dirk@422
  1236
andreas@392
  1237
@end