iOS web browser with a focus on security and privacy
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