Skip to content

Commit

Permalink
add daefen and urbit pseudoword generators to match the web generator
Browse files Browse the repository at this point in the history
  • Loading branch information
atoponce committed Oct 18, 2021
1 parent 0f23253 commit 13d6550
Showing 1 changed file with 137 additions and 1 deletion.
138 changes: 137 additions & 1 deletion nodepassgen
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,8 @@ function printUsage() {
console.log(' Pseudowords, Random, System.')
console.log(' -p, --pseudowords OPTION Choose a Pseudowords option. Default is Apple.')
console.log(' OPTION must be one of:')
console.log(' Apple, Babble, Letterblock, Munemo, Proquints.')
console.log(' Apple, Babble, Daefen, Letterblock, Munemo,')
console.log(' Proquints, Urbit.')
console.log(' -r, --random SET Choose from a string set. Default is Base94.')
console.log(' SET must be one of:')
console.log(' Base256, Base220, Base188, Base94, Base85, Base64,')
Expand Down Expand Up @@ -970,6 +971,137 @@ function generateBabble(useEntropy) {
return [pass, pass.length, entropy.length * 8]
}

function generateDaefen(useEntropy) {
const syllables = []
const consonants = 'bcdfghjklmnprstvwz'
const vowels = 'aeiouy'
const entropy = getEntropy()

let pass = ''

// taken from https://github.com/alexvandesande/Daefen/blob/master/index.js
// vowel + consonant
for (let i = 0; i < vowels.length; i++) {
for (let j = 0; j < consonants.length; j++) {
syllables.push(vowels[i] + consonants[j])
}
}

// consonant + vowel
for (let i = 0; i < consonants.length; i++) {
for (let j = 0; j < vowels.length; j++) {
syllables.push(consonants[i] + vowels[j])
}
}

// consonant + vowel + vowel
for (let i = 0; i < consonants.length; i++) {
for (let j = 0; j < vowels.length; j++) {
for (let k = 0; k < vowels.length; k++) {
syllables.push(consonants[i] + vowels[j] + vowels[k])
}
}
}

// consonant + vowel + consonant
for (let i = 0; i < consonants.length; i++) {
for (let j = 0; j < vowels.length; j++) {
for (let k = 0; k < consonants.length; k++) {
syllables.push(consonants[i] + vowels[j] + consonants[k])
}
}
}

// vowel + consonant + vowel
for (let i = 0; i < vowels.length; i++) {
for (let j = 0; j < consonants.length; j++) {
for (let k = 0; k < vowels.length; k++) {
syllables.push(vowels[i] + consonants[j] + vowels[k])
}
}
}

const len = Math.ceil(entropy / Math.log2(syllables.length)) // 16 bits per "word"

var isConsonant = function (letter) {
return consonants.indexOf(letter) >= 0
}

for (let i = 0; i < len; i ++) {
let n = secRand(syllables.length, useEntropy)
let lastWord = pass.split('-').slice(-1)[0]

if (
pass === '' || lastWord.length === syllables[n].length ||
(
lastWord.length < 5 &&
isConsonant(lastWord.slice(-1)) &&
isConsonant(syllables[n].slice(0, 1))
)) {
pass += syllables[n]
} else {
pass += '-' + syllables[n]
}
}

pass = pass.replace(/\b[a-z]/g, function(f) {
return f.toUpperCase()
})

return [pass, pass.length, Math.floor(len * Math.log2(syllables.length))]
}

function generateUrbit(useEntropy) {
const prefixes = [
"doz", "mar", "bin", "wan", "sam", "lit", "sig", "hid", "fid", "lis", "sog", "dir", "wac", "sab", "wis", "sib",
"rig", "sol", "dop", "mod", "fog", "lid", "hop", "dar", "dor", "lor", "hod", "fol", "rin", "tog", "sil", "mir",
"hol", "pas", "lac", "rov", "liv", "dal", "sat", "lib", "tab", "han", "tic", "pid", "tor", "bol", "fos", "dot",
"los", "dil", "for", "pil", "ram", "tir", "win", "tad", "bic", "dif", "roc", "wid", "bis", "das", "mid", "lop",
"ril", "nar", "dap", "mol", "san", "loc", "nov", "sit", "nid", "tip", "sic", "rop", "wit", "nat", "pan", "min",
"rit", "pod", "mot", "tam", "tol", "sav", "pos", "nap", "nop", "som", "fin", "fon", "ban", "mor", "wor", "sip",
"ron", "nor", "bot", "wic", "soc", "wat", "dol", "mag", "pic", "dav", "bid", "bal", "tim", "tas", "mal", "lig",
"siv", "tag", "pad", "sal", "div", "dac", "tan", "sid", "fab", "tar", "mon", "ran", "nis", "wol", "mis", "pal",
"las", "dis", "map", "rab", "tob", "rol", "lat", "lon", "nod", "nav", "fig", "nom", "nib", "pag", "sop", "ral",
"bil", "had", "doc", "rid", "moc", "pac", "rav", "rip", "fal", "tod", "til", "tin", "hap", "mic", "fan", "pat",
"tac", "lab", "mog", "sim", "son", "pin", "lom", "ric", "tap", "fir", "has", "bos", "bat", "poc", "hac", "tid",
"hav", "sap", "lin", "dib", "hos", "dab", "bit", "bar", "rac", "par", "lod", "dos", "bor", "toc", "hil", "mac",
"tom", "dig", "fil", "fas", "mit", "hob", "har", "mig", "hin", "rad", "mas", "hal", "rag", "lag", "fad", "top",
"mop", "hab", "nil", "nos", "mil", "fop", "fam", "dat", "nol", "din", "hat", "nac", "ris", "fot", "rib", "hoc",
"nim", "lar", "fit", "wal", "rap", "sar", "nal", "mos", "lan", "don", "dan", "lad", "dov", "riv", "bac", "pol",
"lap", "tal", "pit", "nam", "bon", "ros", "ton", "fod", "pon", "sov", "noc", "sor", "lav", "mat", "mip", "fip"]
const suffixes = [
"zod", "nec", "bud", "wes", "sev", "per", "sut", "let", "ful", "pen", "syt", "dur", "wep", "ser", "wyl", "sun",
"ryp", "syx", "dyr", "nup", "heb", "peg", "lup", "dep", "dys", "put", "lug", "hec", "ryt", "tyv", "syd", "nex",
"lun", "mep", "lut", "sep", "pes", "del", "sul", "ped", "tem", "led", "tul", "met", "wen", "byn", "hex", "feb",
"pyl", "dul", "het", "mev", "rut", "tyl", "wyd", "tep", "bes", "dex", "sef", "wyc", "bur", "der", "nep", "pur",
"rys", "reb", "den", "nut", "sub", "pet", "rul", "syn", "reg", "tyd", "sup", "sem", "wyn", "rec", "meg", "net",
"sec", "mul", "nym", "tev", "web", "sum", "mut", "nyx", "rex", "teb", "fus", "hep", "ben", "mus", "wyx", "sym",
"sel", "ruc", "dec", "wex", "syr", "wet", "dyl", "myn", "mes", "det", "bet", "bel", "tux", "tug", "myr", "pel",
"syp", "ter", "meb", "set", "dut", "deg", "tex", "sur", "fel", "tud", "nux", "rux", "ren", "wyt", "nub", "med",
"lyt", "dus", "neb", "rum", "tyn", "seg", "lyx", "pun", "res", "red", "fun", "rev", "ref", "mec", "ted", "rus",
"bex", "leb", "dux", "ryn", "num", "pyx", "ryg", "ryx", "fep", "tyr", "tus", "tyc", "leg", "nem", "fer", "mer",
"ten", "lus", "nus", "syl", "tec", "mex", "pub", "rym", "tuc", "fyl", "lep", "deb", "ber", "mug", "hut", "tun",
"byl", "sud", "pem", "dev", "lur", "def", "bus", "bep", "run", "mel", "pex", "dyt", "byt", "typ", "lev", "myl",
"wed", "duc", "fur", "fex", "nul", "luc", "len", "ner", "lex", "rup", "ned", "lec", "ryd", "lyd", "fen", "wel",
"nyd", "hus", "rel", "rud", "nes", "hes", "fet", "des", "ret", "dun", "ler", "nyr", "seb", "hul", "ryl", "lud",
"rem", "lys", "fyn", "wer", "ryc", "sug", "nys", "nyl", "lyn", "dyn", "dem", "lux", "fed", "sed", "bec", "mun",
"lyr", "tes", "mud", "nyt", "byr", "sen", "weg", "fyr", "mur", "tel", "rep", "teg", "pec", "nel", "nev", "fes"]
const entropy = getEntropy()
const len = Math.ceil(entropy / 16) // 16 bits per "word"

let pass = '~'

for (let i = len; i > 0; i--) {
pass += prefixes[secRand(256, useEntropy)] + suffixes[secRand(256, useEntropy)]

if (i > 1) {
pass += '-'
}
}

return [pass, pass.length, len * 16]
}

function generatePseudowords(useEntropy) {
let checksum = false
let pseudoSet
Expand All @@ -987,13 +1119,17 @@ function generatePseudowords(useEntropy) {
} else if (pseudoSet.toLowerCase() === 'babble') {
checksum = true
ret = generateBabble(useEntropy)
} else if (pseudoSet.toLowerCase() === 'daefen') {
ret = generateDaefen(useEntropy)
} else if (pseudoSet.toLowerCase() === 'letterblock') {
checksum = true
ret = generateLetterblock(useEntropy)
} else if (pseudoSet.toLowerCase() === 'munemo') {
ret = generateMunemo(useEntropy)
} else if (pseudoSet.toLowerCase() === 'proquints') {
ret = generateProquints(useEntropy)
} else if (pseudoSet.toLowerCase() === 'urbit') {
ret = generateUrbit(useEntropy)
} else {
console.log('Unknown generator:', pseudoSet)
process.exit(1)
Expand Down

0 comments on commit 13d6550

Please sign in to comment.