#import "MasterSecretTest.h"
#import "MasterSecret.h"
#import "Util.h"
#import "TestUtil.h"

@implementation MasterSecretTest
-(void) testKnownCalculateSharedSecret {
    NSData* dhResult = [NSMutableData dataWithLength:384];
    NSData* totalHash = [NSMutableData dataWithLength:32];
    Zid* initiatorZid = [Zid zidWithData:[NSMutableData dataWithLength:12]];
    Zid* responderZid = [Zid zidWithData:[NSMutableData dataWithLength:12]];
    NSData* sharedSecret = [MasterSecret calculateSharedSecretFromDhResult:dhResult
                                                              andTotalHash:totalHash
                                                           andInitiatorZid:initiatorZid
                                                           andResponderZid:responderZid];
    // the expected data here was obtained from the android redphone implementation
    NSData* expectedSharedSecret = [(@[@54,@78,@99,@226,@49,@17,@8,@135,@65,@33,@247,@134,@235,@29,@164,@217,@18,@44,@241,@18,@172,@63,@197,@178,@71,@42,@253,@150,@238,@173,@218,@131]) toUint8Data];
    test([sharedSecret isEqualToData:expectedSharedSecret]);
}
-(void) testKnownMasterSecret {
    NSData* sharedSecret = [NSMutableData dataWithLength:32];
    NSData* totalHash = [NSMutableData dataWithLength:32];
    Zid* initiatorZid = [Zid zidWithData:[NSMutableData dataWithLength:12]];
    Zid* responderZid = [Zid zidWithData:[NSMutableData dataWithLength:12]];
    
    // the expected data here was obtained from the android redphone implementation
    MasterSecret* m = [MasterSecret masterSecretFromSharedSecret:sharedSecret andTotalHash:totalHash andInitiatorZid:initiatorZid andResponderZid:responderZid];
    test([[m shortAuthenticationStringData] isEqualToData:[(@[@241,@140,@246,@102]) toUint8Data]]);
    test([[m initiatorSrtpKey] isEqualToData:[(@[@202,@139,@183,@119,@244,@164,@247,@11,@232,@161,@199,@120,@229,@49,@239,@141]) toUint8Data]]);
    test([[m responderSrtpKey] isEqualToData:[(@[@35,@126,@130,@159,@156,@218,@64,@6,@59,@170,@139,@77,@250,@103,@84,@152]) toUint8Data]]);
    test([[m initiatorSrtpSalt] isEqualToData:[(@[@92,@22,@129,@225,@169,@155,@6,@157,@34,@49,@76,@15,@196,@180]) toUint8Data]]);
    test([[m responderSrtpSalt] isEqualToData:[(@[@151,@124,@181,@201,@203,@218,@192,@141,@244,@247,@249,@144,@213,@133]) toUint8Data]]);
    test([[m initiatorMacKey] isEqualToData:[(@[@215,@167,@226,@196,@14,@124,@137,@75,@48,@110,@159,@47,@243,@238,@171,@213,@103,@181,@70,@206]) toUint8Data]]);
    test([[m responderMacKey] isEqualToData:[(@[@215,@225,@180,@37,@18,@248,@122,@2,@24,@12,@149,@241,@8,@193,@103,@102,@117,@50,@27,@138]) toUint8Data]]);
    test([[m initiatorZrtpKey] isEqualToData:[(@[@182,@239,@29,@23,@42,@7,@231,@48,@45,@244,@177,@84,@77,@62,@56,@48]) toUint8Data]]);
    test([[m responderZrtpKey] isEqualToData:[(@[@59,@57,@33,@50,@121,@161,@218,@19,@255,@246,@98,@228,@68,@142,@50,@175]) toUint8Data]]);
}
@end
