45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
-
+
-
+
-
+
|
@"(compatible with scrypt-genpass)\n"
@" -r --repeat Repeat input\n"];
}
@implementation ScryptPWGen
- (void)applicationDidFinishLaunching
{
OFString *keyfilePath, *lengthString;
OFString *keyFilePath, *lengthString;
const of_options_parser_option_t options[] = {
{ 'h', @"help", 0, NULL, NULL },
{ 'k', @"keyfile", 1, NULL, &keyfilePath },
{ 'k', @"keyfile", 1, NULL, &keyFilePath },
{ 'l', @"length", 1, NULL, &lengthString },
{ 'L', @"legacy", 0, &_legacy, NULL },
{ 'r', @"repeat", 0, &_repeat, NULL },
{ '\0', nil, 0, NULL, NULL }
};
OFOptionsParser *optionsParser =
[OFOptionsParser parserWithOptions: options];
of_unichar_t option;
OFMutableData *keyfile = nil;
OFMutableData *keyFile = nil;
OFString *prompt;
const char *promptCString;
char *passphrase;
while ((option = [optionsParser nextOption]) != '\0') {
switch (option) {
case 'h':
|
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
|
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
|
-
-
+
+
|
}
}
prompt = [OFString stringWithFormat: @"Passphrase for site \"%@\": ",
generator.site];
promptCString = [prompt cStringWithEncoding: [OFLocalization encoding]];
if (keyfilePath != nil)
keyfile = [OFMutableData dataWithContentsOfFile: keyfilePath];
if (keyFilePath != nil)
keyFile = [OFMutableData dataWithContentsOfFile: keyFilePath];
passphrase = getpass(promptCString);
@try {
if (_repeat) {
char *passphraseCopy = of_strdup(passphrase);
if (passphraseCopy == NULL)
|
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
|
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
|
-
+
-
-
+
+
|
} @finally {
of_explicit_memset(passphraseCopy, 0,
strlen(passphraseCopy));
free(passphraseCopy);
}
}
generator.keyfile = keyfile;
generator.keyFile = keyFile;
generator.passphrase = passphrase;
[generator derivePassword];
@try {
[of_stdout writeBuffer: generator.output
length: generator.length];
[of_stdout writeBuffer: "\n"
length: 1];
} @finally {
of_explicit_memset(generator.output, 0,
generator.length);
}
} @finally {
of_explicit_memset(passphrase, 0, strlen(passphrase));
if (keyfile != nil)
of_explicit_memset(keyfile.items, 0, keyfile.count);
if (keyFile != nil)
of_explicit_memset(keyFile.items, 0, keyFile.count);
}
[OFApplication terminate];
}
@end
|