CryptoPassphrase  Check-in [7691951aca]

Overview
Comment:Add new generation algorithm

The scrypt-genpass compatible one is now the legacy algorithm
(activated with -L or --legacy).

Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA3-256: 7691951aca34e42d06162fe9f07521f3ae410244749c6d62886a72f90d3cdfa5
User & Date: js on 2016-10-08 12:24:43
Other Links: manifest | tags
Context
2016-10-08
12:24
Implement repeat mode check-in: 23b99782e3 user: js tags: trunk
12:24
Add new generation algorithm check-in: 7691951aca user: js tags: trunk
12:24
Makefile: Add clean target check-in: fd7a1c4bcc user: js tags: trunk
Changes

Modified LegacyPasswordGenerator.h from [7bb80b96c0] to [7d7733bbc4].

16
17
18
19
20
21
22
23

24
25

26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
16
17
18
19
20
21
22

23
24

25
26
27
28
29
30
31








32







-
+

-
+






-
-
-
-
-
-
-
-

 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */

#import <ObjFW/ObjFW.h>
#import "PasswordGenerator.h"

@interface LegacyPasswordGenerator: OFObject
@interface LegacyPasswordGenerator: OFObject <PasswordGenerator>
{
	size_t _length;
	OFString *_site;
	const char *_passphrase;
	unsigned char *_output;
}

@property size_t length;
@property (copy) OFString *site;
@property const char *passphrase;
@property (readonly) unsigned char *output;

+ (instancetype)generator;
- (void)derivePassword;
@end

Modified LegacyPasswordGenerator.m from [cd3f3e4207] to [7a0b6ec41f].

19
20
21
22
23
24
25
26

27
28
29
30
31
32
33
34
35
36
37
38
39
40
41













42
43
44
45
46
47
48
19
20
21
22
23
24
25

26

27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60







-
+
-














+
+
+
+
+
+
+
+
+
+
+
+
+







 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */

#import "LegacyPasswordGenerator.h"

@implementation LegacyPasswordGenerator
@synthesize length = _length, site = _site, passphrase = _passphrase;
@synthesize site = _site, passphrase = _passphrase, output = _output;
@synthesize output = _output;

+ (instancetype)generator
{
	return [[[self alloc] init] autorelease];
}

- init
{
	self = [super init];

	_length = 16;

	return self;
}

- (void)setLength: (size_t)length
{
	if (length < 3)
		@throw [OFInvalidArgumentException exception];

	_length = length;
}

- (size_t)length
{
	return _length;
}

- (void)derivePassword
{
	OFSHA256Hash *siteHash = [OFSHA256Hash cryptoHash];
	[siteHash updateWithBuffer: [_site UTF8String]
			    length: [_site UTF8StringLength]];

Added NewPasswordGenerator.h version [dd4c86644f].

Added NewPasswordGenerator.m version [2fa12794b0].

Added PasswordGenerator.h version [65198b8a0b].

Modified ScryptPWGen.h from [4f629bacac] to [edee7e31d5].

21
22
23
24
25
26
27
28

29
30
21
22
23
24
25
26
27

28
29
30







-
+


 */

#import <ObjFW/ObjFW.h>

@interface ScryptPWGen: OFObject <OFApplicationDelegate>
{
	size_t _length;
	bool _repeat;
	bool _legacy, _repeat;
}
@end

Modified ScryptPWGen.m from [033c6ce89c] to [982ba32868].

19
20
21
22
23
24
25

26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41


42
43
44
45
46
47
48
49
50
51

52
53
54
55
56
57
58
59
60
61
62
63
64
65
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61

62
63
64
65
66
67
68







+
















+
+










+






-







 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */

#include <unistd.h>

#import "ScryptPWGen.h"
#import "NewPasswordGenerator.h"
#import "LegacyPasswordGenerator.h"

OF_APPLICATION_DELEGATE(ScryptPWGen)

static void
showHelp(OFStream *output, bool verbose)
{
	[output writeFormat: @"Usage: %@ [-hlr] site\n",
			     [OFApplication programName]];

	if (verbose)
		[output writeString:
		    @"\n"
		    @"Options:\n"
		    @"    -h  --help    Show this help\n"
		    @"    -l  --length  Length for the derived password\n"
		    @"    -L  --legacy  Use the legacy algorithm "
		    @"(compatible with scrypt-genpass)\n"
		    @"    -r  --repeat  Repeat input\n"];
}

@implementation ScryptPWGen
- (void)applicationDidFinishLaunching
{
	OFString *lengthStr;
	const of_options_parser_option_t options[] = {
		{ 'h', @"help", 0, NULL, NULL },
		{ 'l', @"length", 1, NULL, &lengthStr },
		{ 'L', @"legacy", 0, &_legacy, NULL },
		{ 'r', @"repeat", 0, &_repeat, NULL },
		{ '\0', nil, 0, NULL, NULL }
	};
	OFOptionsParser *optionsParser =
	    [OFOptionsParser parserWithOptions: options];
	of_unichar_t option;
	size_t length;
	char *passphrase;
	OFString *site, *prompt;

	while ((option = [optionsParser nextOption]) != '\0') {
		switch (option) {
		case 'h':
			showHelp(of_stdout, true);
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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122



123
124
125
126
127
128
129


130
131
132
133
134
135
136
137
138














139
140
141
142
143
144
145







+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+
+

-
-
-
+
+
+
+
+
+
+
-
-
+








-
-
-
-
-
-
-
-
-
-
-
-
-
-







				    optionsParser.lastOption];

			[OFApplication terminateWithStatus: 1];
			break;
		}
	}

	if ([[optionsParser remainingArguments] count] != 1) {
		showHelp(of_stderr, false);

		[OFApplication terminateWithStatus: 1];
	}

	site = [[optionsParser remainingArguments] firstObject];
	prompt = [OFString stringWithFormat: @"Passphrase for site \"%@\": ",
					     site];

	id <PasswordGenerator> generator = (_legacy
	    ? [LegacyPasswordGenerator generator]
	    : [NewPasswordGenerator generator]);
	generator.site = [[optionsParser remainingArguments] firstObject];

	if (lengthStr != nil) {
		bool invalid = false;

		@try {
			length = (size_t)[lengthStr decimalValue];

			if (length < 3)
			generator.length = (size_t)[lengthStr decimalValue];
		} @catch (OFInvalidArgumentException *e) {
			invalid = true;
		} @catch (OFInvalidFormatException *e) {
			invalid = true;
		}

				@throw [OFInvalidFormatException exception];
		} @catch (OFInvalidFormatException *e) {
		if (invalid) {
			[of_stderr writeFormat:
			    @"%@: Invalid length: %@\n",
			    [OFApplication programName], lengthStr];

			[OFApplication terminateWithStatus: 1];
		}
	}

	if ([[optionsParser remainingArguments] count] != 1) {
		showHelp(of_stderr, false);

		[OFApplication terminateWithStatus: 1];
	}

	prompt = [OFString stringWithFormat: @"Passphrase for site \"%@\": ",
					     site];

	LegacyPasswordGenerator *generator =
	    [LegacyPasswordGenerator generator];
	generator.length = length;
	generator.site = [[optionsParser remainingArguments] firstObject];

	passphrase = getpass(
	    [prompt cStringWithEncoding: [OFSystemInfo native8BitEncoding]]);
	@try {
		generator.passphrase = passphrase;

		[generator derivePassword];
		@try {