11#import "EncryptionController.h" 
   12#import "SFHFKeychainUtils.h" 
   13#import "TSXAdditions.h" 
   15@interface EncryptionController (Private)
 
   17- (BOOL)verifyPassword:(
Encryptor *)decryptor;
 
   18- (NSData *)encryptedVerificationData;
 
   19- (void)setEncryptedVerificationData:(
Encryptor *)encryptor;
 
   21- (NSString *)keychainServerName;
 
   22- (NSString *)keychainUsername;
 
   23- (void)setKeychainPassword:(NSString *)password;
 
   24- (NSString *)keychainPassword;
 
   25- (NSString *)keychainDefaultPassword;
 
   39    if (_shared_encryption_controller == nil)
 
   43  return _shared_encryption_controller;
 
   46#pragma mark Getting an encryptor or decryptor 
   50  if (_shared_encryptor)
 
   51    return _shared_encryptor;
 
   53  NSString *saved_password = [
self keychainPassword];
 
   54  if (saved_password == nil)
 
   56    saved_password = [
self keychainDefaultPassword];
 
   57    Encryptor *encryptor = [[[
Encryptor alloc] initWithPassword:saved_password] autorelease];
 
   58    [
self setEncryptedVerificationData:encryptor];
 
   59    _shared_encryptor = [encryptor retain];
 
   63    Encryptor *encryptor = [[[
Encryptor alloc] initWithPassword:saved_password] autorelease];
 
   64    if ([
self verifyPassword:encryptor])
 
   65      _shared_encryptor = [encryptor retain];
 
   68  return _shared_encryptor;
 
   74  return [
self encryptor];
 
   81@implementation EncryptionController (Private)
 
   84#pragma mark Keychain password storage 
   86- (NSString *)keychainServerName
 
   88  return [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleName"];
 
   91- (NSString *)keychainUsername
 
   93  return @"master.password";
 
   96- (void)setKeychainPassword:(NSString *)password
 
  102                               andServerName:[
self keychainServerName]
 
  109                     forServerName:[
self keychainServerName]
 
  114- (NSString *)keychainPassword
 
  118                                     andServerName:[
self keychainServerName]
 
  122- (NSString *)keychainDefaultPassword
 
  124  NSString *password = [[NSUserDefaults standardUserDefaults] stringForKey:@"UUID"];
 
  125  if ([password length] == 0)
 
  127    password = [NSString stringWithUUID];
 
  128    [[NSUserDefaults standardUserDefaults] setObject:password forKey:@"UUID"];
 
  129    [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"TSXMasterPasswordVerification"];
 
  135#pragma mark Verification of encryption key against verification data 
  137- (BOOL)verifyPassword:(
Encryptor *)decryptor
 
  139  return [[decryptor plaintextPassword]
 
  140      isEqualToString:[decryptor decryptString:[
self encryptedVerificationData]]];
 
  143- (NSData *)encryptedVerificationData
 
  145  return [[NSUserDefaults standardUserDefaults] dataForKey:@"TSXMasterPasswordVerification"];
 
  148- (void)setEncryptedVerificationData:(
Encryptor *)encryptor
 
  150  [[NSUserDefaults standardUserDefaults]
 
  151      setObject:[encryptor encryptString:[encryptor plaintextPassword]]
 
  152         forKey:@"TSXMasterPasswordVerification"];