Skip to content

Commit 781f920

Browse files
committed
passit: add Orchard Street Wordlists
Updates #1
1 parent 07b61cb commit 781f920

File tree

7 files changed

+28488
-113
lines changed

7 files changed

+28488
-113
lines changed

embedded.go

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,47 @@ func (eg *embeddedGenerator) Password(r io.Reader) (string, error) {
2727
return readSliceN(r, eg.list)
2828
}
2929

30+
// OrchardStreetMedium is a Generator that returns a random word from
31+
// Sam Schlinkert's Orchard Street Medium List.
32+
//
33+
// It contains 8,192 words and has 13.000 bits of entropy per word. This list is
34+
// uniquely decodable and can be used with or without separators.
35+
//
36+
// This wordlist is licensed by Sam Schlinkert under a CC BY-SA 4.0 license.
37+
var OrchardStreetMedium Generator = &embeddedGenerator{raw: &wordlist.OrchardStreetMedium}
38+
39+
// OrchardStreetLong is a Generator that returns a random word from
40+
// Sam Schlinkert's Orchard Street Long List.
41+
//
42+
// It contains 17,576 words and has 14.101 bits of entropy per word. This list is
43+
// uniquely decodable and can be used with or without separators.
44+
//
45+
// This wordlist is licensed by Sam Schlinkert under a CC BY-SA 4.0 license.
46+
var OrchardStreetLong Generator = &embeddedGenerator{raw: &wordlist.OrchardStreetLong}
47+
48+
// OrchardStreetAlpha is a Generator that returns a random word from
49+
// Sam Schlinkert's Orchard Street Alpha List.
50+
//
51+
// It contains 1,296 words and has 10.340 bits of entropy per word. This list is
52+
// uniquely decodable and can be used with or without separators.
53+
//
54+
// This wordlist is licensed by Sam Schlinkert under a CC BY-SA 4.0 license.
55+
var OrchardStreetAlpha Generator = &embeddedGenerator{raw: &wordlist.OrchardStreetAlpha}
56+
57+
// OrchardStreetQWERTY is a Generator that returns a random word from
58+
// Sam Schlinkert's Orchard Street QWERTY List.
59+
//
60+
// It contains 1,296 words and has 10.340 bits of entropy per word. This list is
61+
// uniquely decodable and can be used with or without separators.
62+
//
63+
// This wordlist is licensed by Sam Schlinkert under a CC BY-SA 4.0 license.
64+
var OrchardStreetQWERTY Generator = &embeddedGenerator{raw: &wordlist.OrchardStreetQWERTY}
65+
3066
// STS10Wordlist is a Generator that returns a random word from Sam Schlinkert's
3167
// '1Password Replacement List'.
3268
//
33-
// It contains 18,208 words and has 14.152 bits of entropy per word.
69+
// It contains 18,208 words and has 14.152 bits of entropy per word. This list is
70+
// not uniquely decodable and should only be used with separators.
3471
//
3572
// This wordlist is licensed by Sam Schlinkert under a CC BY 3.0 license.
3673
var STS10Wordlist Generator = &embeddedGenerator{raw: &wordlist.STS10Wordlist}

embedded_test.go

Lines changed: 54 additions & 112 deletions
Original file line numberDiff line numberDiff line change
@@ -20,124 +20,66 @@ func allWordsValid(t *testing.T, list []string) {
2020
// These tests are currently the same, but keep them separate in case that changes.
2121
var allEmojiValid = allWordsValid
2222

23-
func TestSTS10Wordlist(t *testing.T) {
24-
const size = 8
25-
26-
tr := newTestRand()
27-
28-
pass, err := Repeat(STS10Wordlist, " ", size).Password(tr)
29-
require.NoError(t, err)
30-
31-
assert.Equal(t, "winner vertigo spurs believed dude runaways poorest tourists", pass)
32-
assert.Equal(t, size-1, strings.Count(pass, " "),
33-
`strings.Count(%q, " ")`, pass)
34-
assert.Truef(t, utf8.ValidString(pass),
35-
"utf8.ValidString(%q)", pass)
36-
37-
allWordsValid(t, STS10Wordlist.(*embeddedGenerator).list)
38-
}
39-
40-
func TestEFFLargeWordlist(t *testing.T) {
41-
const size = 8
42-
43-
tr := newTestRand()
44-
45-
pass, err := Repeat(EFFLargeWordlist, " ", size).Password(tr)
46-
require.NoError(t, err)
47-
48-
assert.Equal(t, "reprint wool pantry unworried mummify veneering securely munchkin", pass)
49-
assert.Equal(t, size-1, strings.Count(pass, " "),
50-
`strings.Count(%q, " ")`, pass)
51-
assert.Truef(t, utf8.ValidString(pass),
52-
"utf8.ValidString(%q)", pass)
53-
54-
allWordsValid(t, EFFLargeWordlist.(*embeddedGenerator).list)
55-
}
56-
57-
func TestEFFShortWordlist1(t *testing.T) {
58-
const size = 8
59-
60-
tr := newTestRand()
61-
62-
pass, err := Repeat(EFFShortWordlist1, " ", size).Password(tr)
63-
require.NoError(t, err)
64-
65-
assert.Equal(t, "bush vapor issue ruby carol sleep hula case", pass)
66-
assert.Equal(t, size-1, strings.Count(pass, " "),
67-
`strings.Count(%q, " ")`, pass)
68-
assert.Truef(t, utf8.ValidString(pass),
69-
"utf8.ValidString(%q)", pass)
70-
71-
allWordsValid(t, EFFShortWordlist1.(*embeddedGenerator).list)
72-
}
73-
74-
func TestEFFShortWordlist2(t *testing.T) {
75-
const size = 8
76-
77-
tr := newTestRand()
78-
79-
pass, err := Repeat(EFFShortWordlist2, " ", size).Password(tr)
80-
require.NoError(t, err)
81-
82-
assert.Equal(t, "barracuda vegetable idly podiatrist bossiness satchel hexagon boxlike", pass)
83-
assert.Equal(t, size-1, strings.Count(pass, " "),
84-
`strings.Count(%q, " ")`, pass)
85-
assert.Truef(t, utf8.ValidString(pass),
86-
"utf8.ValidString(%q)", pass)
87-
88-
allWordsValid(t, EFFShortWordlist2.(*embeddedGenerator).list)
89-
}
90-
91-
func TestEmoji13(t *testing.T) {
92-
const size = 25
93-
94-
tr := newTestRand()
95-
96-
for _, expect := range []string{
97-
"💙🏂🏽🧑🏽\u200d🦱🤙🏾🧗🏿\u200d♀️🧑🏻\u200d🤝\u200d🧑🏻🐭🚵🏿🚴🏿🏠💇🏾\u200d♂️💁🏻🙍🏾\u200d♂️👩🏾\u200d🦲🧑🏿\u200d🤝\u200d🧑🏼✨🖐🏿🎮🔑🏔️🔹🇩🇲💇🏼\u200d♀️🕶️🧙🏼",
98-
"🫕👳🏽\u200d♀️👩🏻\u200d💻👰🏿\u200d♀️🇲🇻🔃🖖🏻🧛🏿\u200d♂️👩🏼\u200d🤝\u200d👩🏻🧚🏿🇧🇦🇹🇻🇱🇹🍆🧑🏻\u200d🤝\u200d🧑🏾🌲👨🏼\u200d🦼🏌🏻\u200d♂️👨\u200d🚀😸👰🏽\u200d♀️🦖#️⃣👴🏼💂🏻",
99-
"🏌️\u200d♂️💲🐗🥇↘️👰🇨🇷👈🏽🦸🏿\u200d♂️🗺️🇭🇺🇯🇴🚣🏻👷🏽\u200d♂️🧖🏿🇬🇭🤙🏿🥾🤪⛹🏻👩🏻\u200d🌾☸️🧨▶️🐎",
100-
"🧑🏻\u200d🤝\u200d🧑🏾👨🏼\u200d🤝\u200d👨🏿🏆🕙🏆🏃🏻\u200d♂️🤿👨🏿\u200d⚕️🧑🏾🤛🏼🏋🏿🧑🏽\u200d🏭👮🏼\u200d♀️🙅🏾\u200d♂️Ⓜ️🧘🏾☑️⛴️🎙️🚭🦸🏻\u200d♂️🥷🏻📙👨🏾\u200d⚖️🍤",
23+
func TestEmbeddedWordlist(t *testing.T) {
24+
for _, tc := range []struct {
25+
name string
26+
gen Generator
27+
expect string
28+
}{
29+
{"OrchardStreetMedium", OrchardStreetMedium, "pavilion extinct stadium furnace shores pirates hospital influenced"},
30+
{"OrchardStreetLong", OrchardStreetLong, "agreed stopping brilliant elongated richness populous sprung grassland"},
31+
{"OrchardStreetAlpha", OrchardStreetAlpha, "bees told hymn pride boy scout hum bus"},
32+
{"OrchardStreetQWERTY", OrchardStreetQWERTY, "bids trio hurry queer buyer sect hull cadres"},
33+
{"STS10Wordlist", STS10Wordlist, "winner vertigo spurs believed dude runaways poorest tourists"},
34+
{"EFFLargeWordlist", EFFLargeWordlist, "reprint wool pantry unworried mummify veneering securely munchkin"},
35+
{"EFFShortWordlist1", EFFShortWordlist1, "bush vapor issue ruby carol sleep hula case"},
36+
{"EFFShortWordlist2", EFFShortWordlist2, "barracuda vegetable idly podiatrist bossiness satchel hexagon boxlike"},
10137
} {
102-
pass, err := Repeat(Emoji13, "", size).Password(tr)
103-
if !assert.NoError(t, err) {
104-
continue
105-
}
106-
107-
assert.Equal(t, expect, pass)
108-
assert.Equal(t, size, countEmojiInString(Emoji13.(*embeddedGenerator).list, pass),
109-
"countEmojiInString(%q)", pass)
110-
assert.Truef(t, utf8.ValidString(pass),
111-
"utf8.ValidString(%q)", pass)
38+
tc := tc
39+
t.Run(tc.name, func(t *testing.T) {
40+
const size = 8
41+
42+
tr := newTestRand()
43+
pass, err := Repeat(tc.gen, " ", size).Password(tr)
44+
require.NoError(t, err)
45+
46+
assert.Equal(t, tc.expect, pass)
47+
assert.Equal(t, size-1, strings.Count(pass, " "),
48+
`strings.Count(%q, " ")`, pass)
49+
assert.Truef(t, utf8.ValidString(pass),
50+
"utf8.ValidString(%q)", pass)
51+
52+
allWordsValid(t, tc.gen.(*embeddedGenerator).list)
53+
})
11254
}
113-
114-
allEmojiValid(t, Emoji13.(*embeddedGenerator).list)
11555
}
11656

117-
func TestEmoji15(t *testing.T) {
118-
const size = 25
119-
120-
tr := newTestRand()
121-
122-
for _, expect := range []string{
123-
"➡️🦸🏼\u200d♂️👩🏾\u200d🦳📱✍🏻🪣👨🏾\u200d🌾🤩🤵🏽\u200d♂️👮🏼🧗🏾\u200d♂️👷🏾\u200d♀️🧝🏾\u200d♂️👔🟨↗️🕵🏽👦🏽🏃🏽\u200d♂️🦶🤾🏿\u200d♂️⛺👮🏿👇🏽👳🏿",
124-
"🌀🦿👈🏽🏄🏽\u200d♀️🧑🏻\u200d🦰🔃🫣🏪🪿🧗🏽👃8️⃣👩🏿\u200d🦰🇹🇦👮🏼\u200d♂️👨🏼\u200d❤️\u200d👨🏿🧑🏿\u200d🦱🤸🏽\u200d♂️🛫👩🏻\u200d🦰👩🏽\u200d❤️\u200d💋\u200d👨🏾🦶🏾㊗️👩🏼\u200d🎤💁🏻\u200d♂️",
125-
"🧑🏿\u200d🤝\u200d🧑🏻🚶🏻\u200d♂️👨🏿\u200d⚖️🔟👨🏿\u200d🤝\u200d👨🏾👨\u200d👩\u200d👦🧝🏽\u200d♀️🔽🙋🏿\u200d♂️🧑🏼👩🏾\u200d🍼💆🏻\u200d♂️👩🏿\u200d🦽🐀💂🏻\u200d♀️🆑🍠🥸🤚🏾🚶🏻\u200d♂️🇦🇲💙👐💪🏾🫁",
126-
"👱🏻🧒🏿🧢🐖👨🏿\u200d✈️🦀🎅👨🏾\u200d❤️\u200d💋\u200d👨🏼👨🏼\u200d🦱🎫🥻🙆🏿\u200d♂️👩🏼\u200d❤️\u200d💋\u200d👨🏼👴🏿💪🏻💂🏿\u200d♂️🛌🌚🏈👩🏻\u200d🤝\u200d👨🏽🛀🏾👋🏾🧑🏼\u200d🤝\u200d🧑🏻🏫✋🏼",
57+
func TestEmoji(t *testing.T) {
58+
for _, tc := range []struct {
59+
name string
60+
gen Generator
61+
expect string
62+
}{
63+
{"Emoji13", Emoji13, "💙🏂🏽🧑🏽\u200d🦱🤙🏾🧗🏿\u200d♀️🧑🏻\u200d🤝\u200d🧑🏻🐭🚵🏿🚴🏿🏠💇🏾\u200d♂️💁🏻🙍🏾\u200d♂️👩🏾\u200d🦲🧑🏿\u200d🤝\u200d🧑🏼✨🖐🏿🎮🔑🏔️🔹🇩🇲💇🏼\u200d♀️🕶️🧙🏼🫕👳🏽\u200d♀️👩🏻\u200d💻👰🏿\u200d♀️🇲🇻🔃🖖🏻🧛🏿\u200d♂️👩🏼\u200d🤝\u200d👩🏻🧚🏿🇧🇦🇹🇻🇱🇹🍆🧑🏻\u200d🤝\u200d🧑🏾🌲👨🏼\u200d🦼🏌🏻\u200d♂️👨\u200d🚀😸👰🏽\u200d♀️🦖#️⃣👴🏼💂🏻🏌️\u200d♂️💲🐗🥇↘️👰🇨🇷👈🏽🦸🏿\u200d♂️🗺️🇭🇺🇯🇴🚣🏻👷🏽\u200d♂️🧖🏿🇬🇭🤙🏿🥾🤪⛹🏻👩🏻\u200d🌾☸️🧨▶️🐎🧑🏻\u200d🤝\u200d🧑🏾👨🏼\u200d🤝\u200d👨🏿🏆🕙🏆🏃🏻\u200d♂️🤿👨🏿\u200d⚕️🧑🏾🤛🏼🏋🏿🧑🏽\u200d🏭👮🏼\u200d♀️🙅🏾\u200d♂️Ⓜ️🧘🏾☑️⛴️🎙️🚭🦸🏻\u200d♂️🥷🏻📙👨🏾\u200d⚖️🍤"},
64+
{"Emoji15", Emoji15, "➡️🦸🏼\u200d♂️👩🏾\u200d🦳📱✍🏻🪣👨🏾\u200d🌾🤩🤵🏽\u200d♂️👮🏼🧗🏾\u200d♂️👷🏾\u200d♀️🧝🏾\u200d♂️👔🟨↗️🕵🏽👦🏽🏃🏽\u200d♂️🦶🤾🏿\u200d♂️⛺👮🏿👇🏽👳🏿🌀🦿👈🏽🏄🏽\u200d♀️🧑🏻\u200d🦰🔃🫣🏪🪿🧗🏽👃8️⃣👩🏿\u200d🦰🇹🇦👮🏼\u200d♂️👨🏼\u200d❤️\u200d👨🏿🧑🏿\u200d🦱🤸🏽\u200d♂️🛫👩🏻\u200d🦰👩🏽\u200d❤️\u200d💋\u200d👨🏾🦶🏾㊗️👩🏼\u200d🎤💁🏻\u200d♂️🧑🏿\u200d🤝\u200d🧑🏻🚶🏻\u200d♂️👨🏿\u200d⚖️🔟👨🏿\u200d🤝\u200d👨🏾👨\u200d👩\u200d👦🧝🏽\u200d♀️🔽🙋🏿\u200d♂️🧑🏼👩🏾\u200d🍼💆🏻\u200d♂️👩🏿\u200d🦽🐀💂🏻\u200d♀️🆑🍠🥸🤚🏾🚶🏻\u200d♂️🇦🇲💙👐💪🏾🫁👱🏻🧒🏿🧢🐖👨🏿\u200d✈️🦀🎅👨🏾\u200d❤️\u200d💋\u200d👨🏼👨🏼\u200d🦱🎫🥻🙆🏿\u200d♂️👩🏼\u200d❤️\u200d💋\u200d👨🏼👴🏿💪🏻💂🏿\u200d♂️🛌🌚🏈👩🏻\u200d🤝\u200d👨🏽🛀🏾👋🏾🧑🏼\u200d🤝\u200d🧑🏻🏫✋🏼"},
12765
} {
128-
pass, err := Repeat(Emoji15, "", size).Password(tr)
129-
if !assert.NoError(t, err) {
130-
continue
131-
}
132-
133-
assert.Equal(t, expect, pass)
134-
assert.Equal(t, size, countEmojiInString(Emoji15.(*embeddedGenerator).list, pass),
135-
"countEmojiInString(%q)", pass)
136-
assert.Truef(t, utf8.ValidString(pass),
137-
"utf8.ValidString(%q)", pass)
66+
tc := tc
67+
t.Run(tc.name, func(t *testing.T) {
68+
const size = 100
69+
70+
tr := newTestRand()
71+
pass, err := Repeat(tc.gen, "", size).Password(tr)
72+
require.NoError(t, err)
73+
74+
assert.Equal(t, tc.expect, pass)
75+
assert.Equal(t, size, countEmojiInString(tc.gen.(*embeddedGenerator).list, pass),
76+
"countEmojiInString(%q)", pass)
77+
assert.Truef(t, utf8.ValidString(pass),
78+
"utf8.ValidString(%q)", pass)
79+
80+
allEmojiValid(t, tc.gen.(*embeddedGenerator).list)
81+
})
13882
}
139-
140-
allEmojiValid(t, Emoji15.(*embeddedGenerator).list)
14183
}
14284

14385
func countEmojiInString(list []string, s string) int {

internal/wordlist/embed.go

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,42 @@ package wordlist
33
import _ "embed" // for go:embed
44

55
var (
6+
// OrchardStreetMedium is a wordlist that was taken from:
7+
// https://github.com/sts10/orchard-street-wordlists/blob/016e8d6634c03dd08afd5b14753784aff325ebd1/lists/orchard-street-medium.txt.
8+
//
9+
// orchard-street-medium.txt is licensed by Sam Schlinkert under a
10+
// CC BY-SA 4.0 license (https://creativecommons.org/licenses/by-sa/4.0/).
11+
//
12+
//go:embed orchard-street-medium.txt
13+
OrchardStreetMedium string
14+
15+
// OrchardStreetLong is a wordlist that was taken from:
16+
// https://github.com/sts10/orchard-street-wordlists/blob/016e8d6634c03dd08afd5b14753784aff325ebd1/lists/orchard-street-long.txt.
17+
//
18+
// orchard-street-long.txt is licensed by Sam Schlinkert under a
19+
// CC BY-SA 4.0 license (https://creativecommons.org/licenses/by-sa/4.0/).
20+
//
21+
//go:embed orchard-street-long.txt
22+
OrchardStreetLong string
23+
24+
// OrchardStreetMedium is a wordlist that was taken from:
25+
// https://github.com/sts10/orchard-street-wordlists/blob/016e8d6634c03dd08afd5b14753784aff325ebd1/lists/orchard-street-alpha.txt.
26+
//
27+
// orchard-street-alpha.txt is licensed by Sam Schlinkert under a
28+
// CC BY-SA 4.0 license (https://creativecommons.org/licenses/by-sa/4.0/).
29+
//
30+
//go:embed orchard-street-alpha.txt
31+
OrchardStreetAlpha string
32+
33+
// OrchardStreetLong is a wordlist that was taken from:
34+
// https://github.com/sts10/orchard-street-wordlists/blob/016e8d6634c03dd08afd5b14753784aff325ebd1/lists/orchard-street-qwerty.txt.
35+
//
36+
// orchard-street-qwerty.txt is licensed by Sam Schlinkert under a
37+
// CC BY-SA 4.0 license (https://creativecommons.org/licenses/by-sa/4.0/).
38+
//
39+
//go:embed orchard-street-qwerty.txt
40+
OrchardStreetQWERTY string
41+
642
// STS10Wordlist is a wordlist that was taken from:
743
// https://github.com/sts10/generated-wordlists/tree/e0daeebbffbb/lists/1password-replacement
844
// where it was called 1password-replacement.txt.

0 commit comments

Comments
 (0)