Differences From Artifact [10bb34008e]:
- File
CryptoPassphrase.m
— part of check-in
[007bd9985e]
at
2021-03-21 11:03:01
on branch trunk
— Allow swappable memory
Most OSes and/or ulimits do not allow allocating such large amounts of
unswappable memory. (user: js, size: 5734) [annotate] [blame] [check-ins using]
To Artifact [88cb4e5f09]:
- File CryptoPassphrase.m — part of check-in [aec6746a96] at 2021-04-28 21:51:03 on branch trunk — Adjust to ObjFW changes (user: js, size: 5676) [annotate] [blame] [check-ins using]
︙ | ︙ | |||
46 47 48 49 50 51 52 | @" -r --repeat Repeat input\n"]; } @implementation CryptoPassphrase - (void)applicationDidFinishLaunching { OFString *keyFilePath, *lengthString; | | | | | | | | | | 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 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 | @" -r --repeat Repeat input\n"]; } @implementation CryptoPassphrase - (void)applicationDidFinishLaunching { OFString *keyFilePath, *lengthString; const OFOptionsParserOption options[] = { { 'h', @"help", 0, NULL, NULL }, { '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]; OFUnichar option; OFMutableData *keyFile = nil; OFString *prompt; const char *promptCString; char *passphraseCString; size_t passphraseLength; OFSecureData *passphrase; while ((option = [optionsParser nextOption]) != '\0') { switch (option) { case 'h': showHelp(OFStdOut, true); [OFApplication terminate]; break; case ':': if (optionsParser.lastLongOption != nil) [OFStdErr writeFormat: @"%@: Argument for option --%@ missing\n", [OFApplication programName], optionsParser.lastLongOption]; else [OFStdErr writeFormat: @"%@: Argument for option -%C missing\n", [OFApplication programName], optionsParser.lastOption]; [OFApplication terminateWithStatus: 1]; break; case '?': if (optionsParser.lastLongOption != nil) [OFStdErr writeFormat: @"%@: Unknown option: --%@\n", [OFApplication programName], optionsParser.lastLongOption]; else [OFStdErr writeFormat: @"%@: Unknown option: -%C\n", [OFApplication programName], optionsParser.lastOption]; [OFApplication terminateWithStatus: 1]; break; } } if (optionsParser.remainingArguments.count != 1) { showHelp(OFStdErr, false); [OFApplication terminateWithStatus: 1]; } id <PasswordGenerator> generator = (_legacy ? [LegacyPasswordGenerator generator] : [NewPasswordGenerator generator]); |
︙ | ︙ | |||
132 133 134 135 136 137 138 | } @catch (OFInvalidFormatException *e) { invalid = true; } @catch (OFOutOfRangeException *e) { invalid = true; } if (invalid) { | | | 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 | } @catch (OFInvalidFormatException *e) { invalid = true; } @catch (OFOutOfRangeException *e) { invalid = true; } if (invalid) { [OFStdErr writeFormat: @"%@: Invalid length: %@\n", [OFApplication programName], lengthString]; [OFApplication terminateWithStatus: 1]; } } |
︙ | ︙ | |||
155 156 157 158 159 160 161 | passphraseLength = strlen(passphraseCString); @try { passphrase = [OFSecureData dataWithCount: passphraseLength + 1 allowsSwappableMemory: true]; memcpy(passphrase.mutableItems, passphraseCString, passphraseLength + 1); } @finally { | | | | < | | < | < | 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 | passphraseLength = strlen(passphraseCString); @try { passphrase = [OFSecureData dataWithCount: passphraseLength + 1 allowsSwappableMemory: true]; memcpy(passphrase.mutableItems, passphraseCString, passphraseLength + 1); } @finally { OFZeroMemory(passphraseCString, passphraseLength); } if (_repeat) { OFStringEncoding encoding = [OFLocale encoding]; prompt = [OFString stringWithFormat: @"Repeat passphrase for site \"%@\": ", generator.site]; passphraseCString = getpass([prompt cStringWithEncoding: encoding]); if (strcmp(passphraseCString, passphrase.items) != 0) { [OFStdErr writeString: @"Passphrases do not match!\n"]; [OFApplication terminateWithStatus: 1]; } OFZeroMemory(passphraseCString, strlen(passphraseCString)); } generator.keyFile = keyFile; generator.passphrase = passphrase; [generator derivePassword]; [OFStdOut writeBuffer: generator.output.items length: generator.length]; [OFStdOut writeBuffer: "\n" length: 1]; [OFApplication terminate]; } @end |