iOS web browser with a focus on security and privacy
at master 130 lines 4.5 kB view raw
1/* 2 * Endless 3 * Copyright (c) 2015 joshua stein <jcs@jcs.org> 4 * 5 * See LICENSE file for redistribution terms. 6 */ 7 8#import "SSLCertificateViewController.h" 9 10@implementation SSLCertificateViewController 11 12#define CI_SIGALG_KEY @"Signature Algorithm" 13#define CI_EVORG_KEY @"Extended Validation: Organization" 14 15- (id)initWithSSLCertificate:(SSLCertificate *)cert 16{ 17 self = [super init]; 18 [self setCertificate:cert]; 19 20 self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"Done", nil) style:UIBarButtonItemStyleDone target:self.navigationController action:@selector(dismissModalViewControllerAnimated:)]; 21 22 certInfo = [[MutableOrderedDictionary alloc] init]; 23 24 MutableOrderedDictionary *i; 25 26 if ([cert negotiatedProtocol]) { 27 i = [[MutableOrderedDictionary alloc] init]; 28 [i setObject:[cert negotiatedProtocolString] forKey:@"Protocol"]; 29 [i setObject:[cert negotiatedCipherString] forKey:@"Cipher"]; 30 [certInfo setObject:i forKey:@"Connection Information"]; 31 } 32 33 i = [[MutableOrderedDictionary alloc] init]; 34 [i setObject:[NSString stringWithFormat:@"%@", [cert version]] forKey:@"Version"]; 35 [i setObject:[cert serialNumber] forKey:@"Serial Number"]; 36 [i setObject:[cert signatureAlgorithm] forKey:CI_SIGALG_KEY]; 37 if ([cert isEV]) 38 [i setObject:[cert evOrgName] forKey:CI_EVORG_KEY]; 39 [certInfo setObject:i forKey:@"Certificate Information"]; 40 41 i = [[MutableOrderedDictionary alloc] init]; 42 NSMutableDictionary *tcs = [[NSMutableDictionary alloc] initWithDictionary:[cert subject]]; 43 for (NSString *k in @[ X509_KEY_CN, X509_KEY_O, X509_KEY_OU, X509_KEY_STREET, X509_KEY_L, X509_KEY_ST, X509_KEY_ZIP, X509_KEY_C ]) { 44 NSString *val = [tcs objectForKey:k]; 45 if (val != nil) { 46 [i setObject:val forKey:k]; 47 [tcs removeObjectForKey:k]; 48 } 49 } 50 for (NSString *k in [tcs allKeys]) 51 [i setObject:[[cert subject] objectForKey:k] forKey:k]; 52 [certInfo setObject:i forKey:@"Issued To"]; 53 54 NSDateFormatter *df_local = [[NSDateFormatter alloc] init]; 55 [df_local setTimeZone:[NSTimeZone defaultTimeZone]]; 56 [df_local setDateFormat:@"yyyy-MM-dd 'at' HH:mm:ss zzz"]; 57 58 i = [[MutableOrderedDictionary alloc] init]; 59 [i setObject:[df_local stringFromDate:[cert validityNotBefore]] forKey:@"Begins On"]; 60 [i setObject:[df_local stringFromDate:[cert validityNotAfter]] forKey:@"Expires After"]; 61 [certInfo setObject:i forKey:@"Period of Validity"]; 62 63 i = [[MutableOrderedDictionary alloc] init]; 64 NSMutableDictionary *tci = [[NSMutableDictionary alloc] initWithDictionary:[cert issuer]]; 65 for (NSString *k in @[ X509_KEY_CN, X509_KEY_O, X509_KEY_OU, X509_KEY_STREET, X509_KEY_L, X509_KEY_ST, X509_KEY_ZIP, X509_KEY_C ]) { 66 NSString *val = [tci objectForKey:k]; 67 if (val != nil) { 68 [i setObject:val forKey:k]; 69 [tci removeObjectForKey:k]; 70 } 71 } 72 for (NSString *k in [tci allKeys]) 73 [i setObject:[[cert issuer] objectForKey:k] forKey:k]; 74 [certInfo setObject:i forKey:@"Issued By"]; 75 76 return self; 77} 78 79#pragma mark - Table view data source 80 81- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 82{ 83 return [certInfo count]; 84} 85 86- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section 87{ 88 return [certInfo keyAtIndex:section]; 89} 90 91- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 92{ 93 OrderedDictionary *group = [certInfo objectAtIndex:section]; 94 return [group count]; 95} 96 97- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 98{ 99 UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"cell"]; 100 101 OrderedDictionary *group = [certInfo objectAtIndex:[indexPath section]]; 102 NSString *k = [group keyAtIndex:[indexPath row]]; 103 104 cell.textLabel.text = k; 105 cell.detailTextLabel.text = [group objectForKey:k]; 106 107 if ([k isEqualToString:CI_SIGALG_KEY] && [[self certificate] hasWeakSignatureAlgorithm]) 108 cell.detailTextLabel.textColor = [UIColor redColor]; 109 else if ([k isEqualToString:CI_EVORG_KEY]) 110 cell.detailTextLabel.textColor = [UIColor colorWithRed:0 green:(183.0/255.0) blue:(82.0/255.0) alpha:1.0]; 111 112 return cell; 113} 114 115- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath 116{ 117 return NO; 118} 119 120- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath 121{ 122 return NO; 123} 124 125- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 126{ 127 [tableView deselectRowAtIndexPath:indexPath animated:YES]; 128} 129 130@end