diff --git a/nodepassgen b/nodepassgen index 47cd663..4d0d915 100755 --- a/nodepassgen +++ b/nodepassgen @@ -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,') @@ -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 @@ -987,6 +1119,8 @@ 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) @@ -994,6 +1128,8 @@ function generatePseudowords(useEntropy) { 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)