pwman

Hex Artifact Content
Login

Artifact cdefa24f9edb38e424b02a9ecd24c88e2b05c5d24e19a6c3b6dd1f46cd545dc8:


0000: 2f 2a 0a 20 2a 20 20 50 57 4d 61 6e 20 2d 20 70  /*. *  PWMan - p
0010: 61 73 73 77 6f 72 64 20 6d 61 6e 61 67 65 72 20  assword manager 
0020: 61 70 70 6c 69 63 61 74 69 6f 6e 0a 20 2a 0a 20  application. *. 
0030: 2a 20 20 43 6f 70 79 72 69 67 68 74 20 28 43 29  *  Copyright (C)
0040: 20 32 30 30 32 20 20 49 76 61 6e 20 4b 65 6c 6c   2002  Ivan Kell
0050: 79 20 3c 69 76 61 6e 40 69 76 61 6e 6b 65 6c 6c  y <ivan@ivankell
0060: 79 2e 6e 65 74 3e 0a 20 2a 0a 20 2a 20 20 54 68  y.net>. *. *  Th
0070: 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20 66 72  is program is fr
0080: 65 65 20 73 6f 66 74 77 61 72 65 3b 20 79 6f 75  ee software; you
0090: 20 63 61 6e 20 72 65 64 69 73 74 72 69 62 75 74   can redistribut
00a0: 65 20 69 74 20 61 6e 64 2f 6f 72 20 6d 6f 64 69  e it and/or modi
00b0: 66 79 0a 20 2a 20 20 69 74 20 75 6e 64 65 72 20  fy. *  it under 
00c0: 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  the terms of the
00d0: 20 47 4e 55 20 47 65 6e 65 72 61 6c 20 50 75 62   GNU General Pub
00e0: 6c 69 63 20 4c 69 63 65 6e 73 65 20 61 73 20 70  lic License as p
00f0: 75 62 6c 69 73 68 65 64 20 62 79 0a 20 2a 20 20  ublished by. *  
0100: 74 68 65 20 46 72 65 65 20 53 6f 66 74 77 61 72  the Free Softwar
0110: 65 20 46 6f 75 6e 64 61 74 69 6f 6e 3b 20 65 69  e Foundation; ei
0120: 74 68 65 72 20 76 65 72 73 69 6f 6e 20 32 20 6f  ther version 2 o
0130: 66 20 74 68 65 20 4c 69 63 65 6e 73 65 2c 20 6f  f the License, o
0140: 72 0a 20 2a 20 20 28 61 74 20 79 6f 75 72 20 6f  r. *  (at your o
0150: 70 74 69 6f 6e 29 20 61 6e 79 20 6c 61 74 65 72  ption) any later
0160: 20 76 65 72 73 69 6f 6e 2e 0a 20 2a 0a 20 2a 20   version.. *. * 
0170: 20 54 68 69 73 20 70 72 6f 67 72 61 6d 20 69 73   This program is
0180: 20 64 69 73 74 72 69 62 75 74 65 64 20 69 6e 20   distributed in 
0190: 74 68 65 20 68 6f 70 65 20 74 68 61 74 20 69 74  the hope that it
01a0: 20 77 69 6c 6c 20 62 65 20 75 73 65 66 75 6c 2c   will be useful,
01b0: 0a 20 2a 20 20 62 75 74 20 57 49 54 48 4f 55 54  . *  but WITHOUT
01c0: 20 41 4e 59 20 57 41 52 52 41 4e 54 59 3b 20 77   ANY WARRANTY; w
01d0: 69 74 68 6f 75 74 20 65 76 65 6e 20 74 68 65 20  ithout even the 
01e0: 69 6d 70 6c 69 65 64 20 77 61 72 72 61 6e 74 79  implied warranty
01f0: 20 6f 66 0a 20 2a 20 20 4d 45 52 43 48 41 4e 54   of. *  MERCHANT
0200: 41 42 49 4c 49 54 59 20 6f 72 20 46 49 54 4e 45  ABILITY or FITNE
0210: 53 53 20 46 4f 52 20 41 20 50 41 52 54 49 43 55  SS FOR A PARTICU
0220: 4c 41 52 20 50 55 52 50 4f 53 45 2e 20 20 53 65  LAR PURPOSE.  Se
0230: 65 20 74 68 65 0a 20 2a 20 20 47 4e 55 20 47 65  e the. *  GNU Ge
0240: 6e 65 72 61 6c 20 50 75 62 6c 69 63 20 4c 69 63  neral Public Lic
0250: 65 6e 73 65 20 66 6f 72 20 6d 6f 72 65 20 64 65  ense for more de
0260: 74 61 69 6c 73 2e 0a 20 2a 0a 20 2a 20 20 59 6f  tails.. *. *  Yo
0270: 75 20 73 68 6f 75 6c 64 20 68 61 76 65 20 72 65  u should have re
0280: 63 65 69 76 65 64 20 61 20 63 6f 70 79 20 6f 66  ceived a copy of
0290: 20 74 68 65 20 47 4e 55 20 47 65 6e 65 72 61 6c   the GNU General
02a0: 20 50 75 62 6c 69 63 20 4c 69 63 65 6e 73 65 0a   Public License.
02b0: 20 2a 20 20 61 6c 6f 6e 67 20 77 69 74 68 20 74   *  along with t
02c0: 68 69 73 20 70 72 6f 67 72 61 6d 3b 20 69 66 20  his program; if 
02d0: 6e 6f 74 2c 20 77 72 69 74 65 20 74 6f 20 74 68  not, write to th
02e0: 65 20 46 72 65 65 20 53 6f 66 74 77 61 72 65 0a  e Free Software.
02f0: 20 2a 20 20 46 6f 75 6e 64 61 74 69 6f 6e 2c 20   *  Foundation, 
0300: 49 6e 63 2e 2c 20 35 39 20 54 65 6d 70 6c 65 20  Inc., 59 Temple 
0310: 50 6c 61 63 65 2c 20 53 75 69 74 65 20 33 33 30  Place, Suite 330
0320: 2c 20 42 6f 73 74 6f 6e 2c 20 4d 41 20 20 30 32  , Boston, MA  02
0330: 31 31 31 2d 31 33 30 37 20 20 55 53 41 0a 20 2a  111-1307  USA. *
0340: 2f 0a 0a 2f 2a 0a 20 2a 20 61 6c 6c 20 63 6f 64  /../*. * all cod
0350: 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 69  e in this file i
0360: 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 70 77 67  s taken from pwg
0370: 65 6e 0a 20 2a 20 28 63 29 20 32 30 30 31 20 54  en. * (c) 2001 T
0380: 68 65 6f 64 6f 72 65 20 54 73 27 6f 0a 20 2a 2f  heodore Ts'o. */
0390: 0a 0a 23 69 6e 63 6c 75 64 65 20 3c 75 6e 69 73  ..#include <unis
03a0: 74 64 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  td.h>.#include <
03b0: 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c 75  stdlib.h>.#inclu
03c0: 64 65 20 3c 73 79 73 2f 74 79 70 65 73 2e 68 3e  de <sys/types.h>
03d0: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74  .#include <sys/t
03e0: 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ime.h>.#include 
03f0: 3c 73 79 73 2f 73 74 61 74 2e 68 3e 0a 23 69 6e  <sys/stat.h>.#in
0400: 63 6c 75 64 65 20 3c 66 63 6e 74 6c 2e 68 3e 0a  clude <fcntl.h>.
0410: 23 69 6e 63 6c 75 64 65 20 3c 65 72 72 6e 6f 2e  #include <errno.
0420: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 70 77 6d  h>.#include <pwm
0430: 61 6e 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  an.h>.#include <
0440: 75 69 2e 68 3e 0a 0a 73 74 72 75 63 74 20 70 77  ui.h>..struct pw
0450: 67 65 6e 5f 65 6c 65 6d 65 6e 74 20 7b 0a 09 63  gen_element {..c
0460: 68 61 72 09 2a 73 74 72 3b 0a 09 69 6e 74 09 66  har.*str;..int.f
0470: 6c 61 67 73 3b 0a 7d 3b 0a 0a 2f 2a 0a 20 2a 20  lags;.};../*. * 
0480: 46 6c 61 67 73 20 66 6f 72 20 74 68 65 20 70 77  Flags for the pw
0490: 5f 65 6c 65 6d 65 6e 74 0a 20 2a 2f 0a 23 64 65  _element. */.#de
04a0: 66 69 6e 65 20 43 4f 4e 53 4f 4e 41 4e 54 09 30  fine CONSONANT.0
04b0: 78 30 30 30 31 0a 23 64 65 66 69 6e 65 20 56 4f  x0001.#define VO
04c0: 57 45 4c 09 09 30 78 30 30 30 32 0a 23 64 65 66  WEL..0x0002.#def
04d0: 69 6e 65 20 44 49 50 54 48 4f 4e 47 09 30 78 30  ine DIPTHONG.0x0
04e0: 30 30 34 0a 23 64 65 66 69 6e 65 20 4e 4f 54 5f  004.#define NOT_
04f0: 46 49 52 53 54 09 30 78 30 30 30 38 0a 0a 0a 73  FIRST.0x0008...s
0500: 74 72 75 63 74 20 70 77 67 65 6e 5f 65 6c 65 6d  truct pwgen_elem
0510: 65 6e 74 20 65 6c 65 6d 65 6e 74 73 5b 5d 20 3d  ent elements[] =
0520: 20 7b 0a 09 7b 20 22 61 22 2c 09 56 4f 57 45 4c   {..{ "a",.VOWEL
0530: 20 7d 2c 0a 09 7b 20 22 61 65 22 2c 20 56 4f 57   },..{ "ae", VOW
0540: 45 4c 20 7c 20 44 49 50 54 48 4f 4e 47 20 7d 2c  EL | DIPTHONG },
0550: 0a 09 7b 20 22 61 68 22 2c 09 56 4f 57 45 4c 20  ..{ "ah",.VOWEL 
0560: 7c 20 44 49 50 54 48 4f 4e 47 20 7d 2c 0a 09 7b  | DIPTHONG },..{
0570: 20 22 61 69 22 2c 20 56 4f 57 45 4c 20 7c 20 44   "ai", VOWEL | D
0580: 49 50 54 48 4f 4e 47 20 7d 2c 0a 09 7b 20 22 62  IPTHONG },..{ "b
0590: 22 2c 20 20 43 4f 4e 53 4f 4e 41 4e 54 20 7d 2c  ",  CONSONANT },
05a0: 0a 09 7b 20 22 63 22 2c 09 43 4f 4e 53 4f 4e 41  ..{ "c",.CONSONA
05b0: 4e 54 20 7d 2c 0a 09 7b 20 22 63 68 22 2c 20 43  NT },..{ "ch", C
05c0: 4f 4e 53 4f 4e 41 4e 54 20 7c 20 44 49 50 54 48  ONSONANT | DIPTH
05d0: 4f 4e 47 20 7d 2c 0a 09 7b 20 22 64 22 2c 09 43  ONG },..{ "d",.C
05e0: 4f 4e 53 4f 4e 41 4e 54 20 7d 2c 0a 09 7b 20 22  ONSONANT },..{ "
05f0: 65 22 2c 09 56 4f 57 45 4c 20 7d 2c 0a 09 7b 20  e",.VOWEL },..{ 
0600: 22 65 65 22 2c 20 56 4f 57 45 4c 20 7c 20 44 49  "ee", VOWEL | DI
0610: 50 54 48 4f 4e 47 20 7d 2c 0a 09 7b 20 22 65 69  PTHONG },..{ "ei
0620: 22 2c 09 56 4f 57 45 4c 20 7c 20 44 49 50 54 48  ",.VOWEL | DIPTH
0630: 4f 4e 47 20 7d 2c 0a 09 7b 20 22 66 22 2c 09 43  ONG },..{ "f",.C
0640: 4f 4e 53 4f 4e 41 4e 54 20 7d 2c 0a 09 7b 20 22  ONSONANT },..{ "
0650: 67 22 2c 09 43 4f 4e 53 4f 4e 41 4e 54 20 7d 2c  g",.CONSONANT },
0660: 0a 09 7b 20 22 67 68 22 2c 20 43 4f 4e 53 4f 4e  ..{ "gh", CONSON
0670: 41 4e 54 20 7c 20 44 49 50 54 48 4f 4e 47 20 7c  ANT | DIPTHONG |
0680: 20 4e 4f 54 5f 46 49 52 53 54 20 7d 2c 0a 09 7b   NOT_FIRST },..{
0690: 20 22 68 22 2c 09 43 4f 4e 53 4f 4e 41 4e 54 20   "h",.CONSONANT 
06a0: 7d 2c 0a 09 7b 20 22 69 22 2c 09 56 4f 57 45 4c  },..{ "i",.VOWEL
06b0: 20 7d 2c 0a 09 7b 20 22 69 65 22 2c 20 56 4f 57   },..{ "ie", VOW
06c0: 45 4c 20 7c 20 44 49 50 54 48 4f 4e 47 20 7d 2c  EL | DIPTHONG },
06d0: 0a 09 7b 20 22 6a 22 2c 09 43 4f 4e 53 4f 4e 41  ..{ "j",.CONSONA
06e0: 4e 54 20 7d 2c 0a 09 7b 20 22 6b 22 2c 09 43 4f  NT },..{ "k",.CO
06f0: 4e 53 4f 4e 41 4e 54 20 7d 2c 0a 09 7b 20 22 6c  NSONANT },..{ "l
0700: 22 2c 09 43 4f 4e 53 4f 4e 41 4e 54 20 7d 2c 0a  ",.CONSONANT },.
0710: 09 7b 20 22 6d 22 2c 09 43 4f 4e 53 4f 4e 41 4e  .{ "m",.CONSONAN
0720: 54 20 7d 2c 0a 09 7b 20 22 6e 22 2c 09 43 4f 4e  T },..{ "n",.CON
0730: 53 4f 4e 41 4e 54 20 7d 2c 0a 09 7b 20 22 6e 67  SONANT },..{ "ng
0740: 22 2c 09 43 4f 4e 53 4f 4e 41 4e 54 20 7c 20 44  ",.CONSONANT | D
0750: 49 50 54 48 4f 4e 47 20 7c 20 4e 4f 54 5f 46 49  IPTHONG | NOT_FI
0760: 52 53 54 20 7d 2c 0a 09 7b 20 22 6f 22 2c 09 56  RST },..{ "o",.V
0770: 4f 57 45 4c 20 7d 2c 0a 09 7b 20 22 6f 68 22 2c  OWEL },..{ "oh",
0780: 09 56 4f 57 45 4c 20 7c 20 44 49 50 54 48 4f 4e  .VOWEL | DIPTHON
0790: 47 20 7d 2c 0a 09 7b 20 22 6f 6f 22 2c 09 56 4f  G },..{ "oo",.VO
07a0: 57 45 4c 20 7c 20 44 49 50 54 48 4f 4e 47 7d 2c  WEL | DIPTHONG},
07b0: 0a 09 7b 20 22 70 22 2c 09 43 4f 4e 53 4f 4e 41  ..{ "p",.CONSONA
07c0: 4e 54 20 7d 2c 0a 09 7b 20 22 70 68 22 2c 09 43  NT },..{ "ph",.C
07d0: 4f 4e 53 4f 4e 41 4e 54 20 7c 20 44 49 50 54 48  ONSONANT | DIPTH
07e0: 4f 4e 47 20 7d 2c 0a 09 7b 20 22 71 75 22 2c 09  ONG },..{ "qu",.
07f0: 43 4f 4e 53 4f 4e 41 4e 54 20 7c 20 44 49 50 54  CONSONANT | DIPT
0800: 48 4f 4e 47 7d 2c 0a 09 7b 20 22 72 22 2c 09 43  HONG},..{ "r",.C
0810: 4f 4e 53 4f 4e 41 4e 54 20 7d 2c 0a 09 7b 20 22  ONSONANT },..{ "
0820: 73 22 2c 09 43 4f 4e 53 4f 4e 41 4e 54 20 7d 2c  s",.CONSONANT },
0830: 0a 09 7b 20 22 73 68 22 2c 09 43 4f 4e 53 4f 4e  ..{ "sh",.CONSON
0840: 41 4e 54 20 7c 20 44 49 50 54 48 4f 4e 47 7d 2c  ANT | DIPTHONG},
0850: 0a 09 7b 20 22 74 22 2c 09 43 4f 4e 53 4f 4e 41  ..{ "t",.CONSONA
0860: 4e 54 20 7d 2c 0a 09 7b 20 22 74 68 22 2c 09 43  NT },..{ "th",.C
0870: 4f 4e 53 4f 4e 41 4e 54 20 7c 20 44 49 50 54 48  ONSONANT | DIPTH
0880: 4f 4e 47 7d 2c 0a 09 7b 20 22 75 22 2c 09 56 4f  ONG},..{ "u",.VO
0890: 57 45 4c 20 7d 2c 0a 09 7b 20 22 76 22 2c 09 43  WEL },..{ "v",.C
08a0: 4f 4e 53 4f 4e 41 4e 54 20 7d 2c 0a 09 7b 20 22  ONSONANT },..{ "
08b0: 77 22 2c 09 43 4f 4e 53 4f 4e 41 4e 54 20 7d 2c  w",.CONSONANT },
08c0: 0a 09 7b 20 22 78 22 2c 09 43 4f 4e 53 4f 4e 41  ..{ "x",.CONSONA
08d0: 4e 54 20 7d 2c 0a 09 7b 20 22 79 22 2c 09 43 4f  NT },..{ "y",.CO
08e0: 4e 53 4f 4e 41 4e 54 20 7d 2c 0a 09 7b 20 22 7a  NSONANT },..{ "z
08f0: 22 2c 09 43 4f 4e 53 4f 4e 41 4e 54 20 7d 0a 7d  ",.CONSONANT }.}
0900: 3b 0a 0a 23 64 65 66 69 6e 65 20 4e 55 4d 5f 45  ;..#define NUM_E
0910: 4c 45 4d 45 4e 54 53 20 28 73 69 7a 65 6f 66 28  LEMENTS (sizeof(
0920: 65 6c 65 6d 65 6e 74 73 29 20 2f 20 73 69 7a 65  elements) / size
0930: 6f 66 20 28 73 74 72 75 63 74 20 70 77 67 65 6e  of (struct pwgen
0940: 5f 65 6c 65 6d 65 6e 74 29 29 0a 0a 63 68 61 72  _element))..char
0950: 20 2a 70 77 67 65 6e 28 63 68 61 72 20 2a 62 75   *pwgen(char *bu
0960: 66 2c 20 69 6e 74 20 73 69 7a 65 29 0a 7b 0a 09  f, int size).{..
0970: 69 6e 74 09 63 2c 20 69 2c 20 6c 65 6e 2c 20 66  int.c, i, len, f
0980: 6c 61 67 73 2c 20 66 65 61 74 75 72 65 5f 66 6c  lags, feature_fl
0990: 61 67 73 3b 0a 09 69 6e 74 09 70 72 65 76 2c 20  ags;..int.prev, 
09a0: 73 68 6f 75 6c 64 5f 62 65 2c 20 66 69 72 73 74  should_be, first
09b0: 3b 0a 09 63 68 61 72 09 2a 73 74 72 3b 0a 0a 09  ;..char.*str;...
09c0: 69 66 28 62 75 66 20 3d 3d 20 4e 55 4c 4c 29 7b  if(buf == NULL){
09d0: 0a 09 09 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 28  ...buf = malloc(
09e0: 73 69 7a 65 29 3b 0a 09 7d 0a 0a 09 63 20 3d 20  size);..}...c = 
09f0: 30 3b 0a 09 70 72 65 76 20 3d 20 30 3b 0a 09 73  0;..prev = 0;..s
0a00: 68 6f 75 6c 64 5f 62 65 20 3d 20 30 3b 0a 09 66  hould_be = 0;..f
0a10: 69 72 73 74 20 3d 20 31 3b 0a 0a 09 73 68 6f 75  irst = 1;...shou
0a20: 6c 64 5f 62 65 20 3d 20 70 77 67 65 6e 5f 72 61  ld_be = pwgen_ra
0a30: 6e 64 6f 6d 5f 6e 75 6d 62 65 72 28 31 29 20 3f  ndom_number(1) ?
0a40: 20 56 4f 57 45 4c 20 3a 20 43 4f 4e 53 4f 4e 41   VOWEL : CONSONA
0a50: 4e 54 3b 0a 09 0a 09 77 68 69 6c 65 20 28 63 20  NT;....while (c 
0a60: 3c 20 73 69 7a 65 29 20 7b 0a 09 09 69 20 3d 20  < size) {...i = 
0a70: 70 77 67 65 6e 5f 72 61 6e 64 6f 6d 5f 6e 75 6d  pwgen_random_num
0a80: 62 65 72 28 4e 55 4d 5f 45 4c 45 4d 45 4e 54 53  ber(NUM_ELEMENTS
0a90: 29 3b 0a 09 09 73 74 72 20 3d 20 65 6c 65 6d 65  );...str = eleme
0aa0: 6e 74 73 5b 69 5d 2e 73 74 72 3b 0a 09 09 6c 65  nts[i].str;...le
0ab0: 6e 20 3d 20 73 74 72 6c 65 6e 28 73 74 72 29 3b  n = strlen(str);
0ac0: 0a 09 09 66 6c 61 67 73 20 3d 20 65 6c 65 6d 65  ...flags = eleme
0ad0: 6e 74 73 5b 69 5d 2e 66 6c 61 67 73 3b 0a 09 09  nts[i].flags;...
0ae0: 2f 2a 20 46 69 6c 74 65 72 20 6f 6e 20 74 68 65  /* Filter on the
0af0: 20 62 61 73 69 63 20 74 79 70 65 20 6f 66 20 74   basic type of t
0b00: 68 65 20 6e 65 78 74 20 65 6c 65 6d 65 6e 74 20  he next element 
0b10: 2a 2f 0a 09 09 69 66 20 28 28 66 6c 61 67 73 20  */...if ((flags 
0b20: 26 20 73 68 6f 75 6c 64 5f 62 65 29 20 3d 3d 20  & should_be) == 
0b30: 30 29 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a  0)....continue;.
0b40: 09 09 2f 2a 20 48 61 6e 64 6c 65 20 74 68 65 20  ../* Handle the 
0b50: 4e 4f 54 5f 46 49 52 53 54 20 66 6c 61 67 20 2a  NOT_FIRST flag *
0b60: 2f 0a 09 09 69 66 20 28 66 69 72 73 74 20 26 26  /...if (first &&
0b70: 20 28 66 6c 61 67 73 20 26 20 4e 4f 54 5f 46 49   (flags & NOT_FI
0b80: 52 53 54 29 29 0a 09 09 09 63 6f 6e 74 69 6e 75  RST))....continu
0b90: 65 3b 0a 09 09 2f 2a 20 44 6f 6e 27 74 20 61 6c  e;.../* Don't al
0ba0: 6c 6f 77 20 56 4f 57 45 4c 20 66 6f 6c 6c 6f 77  low VOWEL follow
0bb0: 65 64 20 61 20 56 6f 77 65 6c 2f 44 69 70 74 68  ed a Vowel/Dipth
0bc0: 6f 6e 67 20 70 61 69 72 20 2a 2f 0a 09 09 69 66  ong pair */...if
0bd0: 20 28 28 70 72 65 76 20 26 20 56 4f 57 45 4c 29   ((prev & VOWEL)
0be0: 20 26 26 20 28 66 6c 61 67 73 20 26 20 56 4f 57   && (flags & VOW
0bf0: 45 4c 29 20 26 26 0a 09 09 20 20 20 20 28 66 6c  EL) &&...    (fl
0c00: 61 67 73 20 26 20 44 49 50 54 48 4f 4e 47 29 29  ags & DIPTHONG))
0c10: 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09  ....continue;...
0c20: 2f 2a 20 44 6f 6e 27 74 20 61 6c 6c 6f 77 20 75  /* Don't allow u
0c30: 73 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 74 68  s to overflow th
0c40: 65 20 62 75 66 66 65 72 20 2a 2f 0a 09 09 69 66  e buffer */...if
0c50: 20 28 6c 65 6e 20 3e 20 73 69 7a 65 2d 63 29 0a   (len > size-c).
0c60: 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 2f  ...continue;.../
0c70: 2a 0a 09 09 20 2a 20 4f 4b 2c 20 77 65 20 66 6f  *... * OK, we fo
0c80: 75 6e 64 20 61 6e 20 65 6c 65 6d 65 6e 74 20 77  und an element w
0c90: 68 69 63 68 20 6d 61 74 63 68 65 73 20 6f 75 72  hich matches our
0ca0: 20 63 72 69 74 65 72 69 61 2c 0a 09 09 20 2a 20   criteria,... * 
0cb0: 6c 65 74 27 73 20 64 6f 20 69 74 21 0a 09 09 20  let's do it!... 
0cc0: 2a 2f 0a 09 09 73 74 72 63 70 79 28 62 75 66 2b  */...strcpy(buf+
0cd0: 63 2c 20 73 74 72 29 3b 0a 0a 09 09 2f 2a 20 48  c, str);..../* H
0ce0: 61 6e 64 6c 65 20 50 57 5f 4f 4e 45 5f 43 41 53  andle PW_ONE_CAS
0cf0: 45 20 2a 2f 0a 09 09 69 66 20 28 28 66 69 72 73  E */...if ((firs
0d00: 74 20 7c 7c 20 66 6c 61 67 73 20 26 20 43 4f 4e  t || flags & CON
0d10: 53 4f 4e 41 4e 54 29 20 26 26 20 28 70 77 67 65  SONANT) && (pwge
0d20: 6e 5f 72 61 6e 64 6f 6d 5f 6e 75 6d 62 65 72 28  n_random_number(
0d30: 31 30 29 20 3c 20 33 29 29 20 7b 0a 09 09 09 62  10) < 3)) {....b
0d40: 75 66 5b 63 5d 20 3d 20 74 6f 75 70 70 65 72 28  uf[c] = toupper(
0d50: 62 75 66 5b 63 5d 29 3b 0a 09 09 7d 0a 09 09 0a  buf[c]);...}....
0d60: 09 09 63 20 2b 3d 20 6c 65 6e 3b 0a 09 09 0a 09  ..c += len;.....
0d70: 09 2f 2a 20 54 69 6d 65 20 74 6f 20 73 74 6f 70  ./* Time to stop
0d80: 3f 20 2a 2f 0a 09 09 69 66 20 28 63 20 3e 3d 20  ? */...if (c >= 
0d90: 73 69 7a 65 29 0a 09 09 09 62 72 65 61 6b 3b 0a  size)....break;.
0da0: 09 09 0a 09 09 2f 2a 0a 09 09 20 2a 20 48 61 6e  ...../*... * Han
0db0: 64 6c 65 20 50 57 5f 4f 4e 45 5f 4e 55 4d 42 45  dle PW_ONE_NUMBE
0dc0: 52 0a 09 09 20 2a 2f 0a 09 09 69 66 20 28 21 66  R... */...if (!f
0dd0: 69 72 73 74 20 26 26 20 28 70 77 67 65 6e 5f 72  irst && (pwgen_r
0de0: 61 6e 64 6f 6d 5f 6e 75 6d 62 65 72 28 31 30 29  andom_number(10)
0df0: 20 3c 20 33 29 29 20 7b 0a 09 09 09 62 75 66 5b   < 3)) {....buf[
0e00: 63 2b 2b 5d 20 3d 20 70 77 67 65 6e 5f 72 61 6e  c++] = pwgen_ran
0e10: 64 6f 6d 5f 6e 75 6d 62 65 72 28 39 29 2b 27 30  dom_number(9)+'0
0e20: 27 3b 0a 09 09 09 62 75 66 5b 63 5d 20 3d 20 30  ';....buf[c] = 0
0e30: 3b 0a 09 09 09 09 0a 09 09 09 66 69 72 73 74 20  ;.........first 
0e40: 3d 20 31 3b 0a 09 09 09 70 72 65 76 20 3d 20 30  = 1;....prev = 0
0e50: 3b 0a 09 09 09 73 68 6f 75 6c 64 5f 62 65 20 3d  ;....should_be =
0e60: 20 70 77 67 65 6e 5f 72 61 6e 64 6f 6d 5f 6e 75   pwgen_random_nu
0e70: 6d 62 65 72 28 31 29 20 3f 20 56 4f 57 45 4c 20  mber(1) ? VOWEL 
0e80: 3a 20 43 4f 4e 53 4f 4e 41 4e 54 3b 0a 09 09 09  : CONSONANT;....
0e90: 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 09 09  continue;...}...
0ea0: 09 09 0a 09 09 2f 2a 0a 09 09 20 2a 20 4f 4b 2c  ...../*... * OK,
0eb0: 20 66 69 67 75 72 65 20 6f 75 74 20 77 68 61 74   figure out what
0ec0: 20 74 68 65 20 6e 65 78 74 20 65 6c 65 6d 65 6e   the next elemen
0ed0: 74 20 73 68 6f 75 6c 64 20 62 65 0a 09 09 20 2a  t should be... *
0ee0: 2f 0a 09 09 69 66 20 28 73 68 6f 75 6c 64 5f 62  /...if (should_b
0ef0: 65 20 3d 3d 20 43 4f 4e 53 4f 4e 41 4e 54 29 20  e == CONSONANT) 
0f00: 7b 0a 09 09 09 73 68 6f 75 6c 64 5f 62 65 20 3d  {....should_be =
0f10: 20 56 4f 57 45 4c 3b 0a 09 09 7d 20 65 6c 73 65   VOWEL;...} else
0f20: 20 7b 20 2f 2a 20 73 68 6f 75 6c 64 5f 62 65 20   { /* should_be 
0f30: 3d 3d 20 56 4f 57 45 4c 20 2a 2f 0a 09 09 09 69  == VOWEL */....i
0f40: 66 20 28 28 70 72 65 76 20 26 20 56 4f 57 45 4c  f ((prev & VOWEL
0f50: 29 20 7c 7c 0a 09 09 09 20 20 20 20 28 66 6c 61  ) ||....    (fla
0f60: 67 73 20 26 20 44 49 50 54 48 4f 4e 47 29 20 7c  gs & DIPTHONG) |
0f70: 7c 0a 09 09 09 20 20 20 20 28 70 77 67 65 6e 5f  |....    (pwgen_
0f80: 72 61 6e 64 6f 6d 5f 6e 75 6d 62 65 72 28 31 30  random_number(10
0f90: 29 20 3e 20 33 29 29 0a 09 09 09 09 73 68 6f 75  ) > 3)).....shou
0fa0: 6c 64 5f 62 65 20 3d 20 43 4f 4e 53 4f 4e 41 4e  ld_be = CONSONAN
0fb0: 54 3b 0a 09 09 09 65 6c 73 65 0a 09 09 09 09 73  T;....else.....s
0fc0: 68 6f 75 6c 64 5f 62 65 20 3d 20 56 4f 57 45 4c  hould_be = VOWEL
0fd0: 3b 0a 09 09 7d 0a 09 09 70 72 65 76 20 3d 20 66  ;...}...prev = f
0fe0: 6c 61 67 73 3b 0a 09 09 66 69 72 73 74 20 3d 20  lags;...first = 
0ff0: 30 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 20 62  0;..}...return b
1000: 75 66 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 48 41  uf;.}..#ifdef HA
1010: 56 45 5f 44 52 41 4e 44 34 38 0a 65 78 74 65 72  VE_DRAND48.exter
1020: 6e 20 64 6f 75 62 6c 65 20 64 72 61 6e 64 34 38  n double drand48
1030: 28 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 42  ();.#endif../* B
1040: 6f 72 72 6f 77 65 64 2f 61 64 61 70 74 65 64 20  orrowed/adapted 
1050: 66 72 6f 6d 20 65 32 66 73 70 72 6f 67 73 27 73  from e2fsprogs's
1060: 20 55 55 49 44 20 67 65 6e 65 72 61 74 69 6f 6e   UUID generation
1070: 20 63 6f 64 65 20 2a 2f 0a 73 74 61 74 69 63 20   code */.static 
1080: 69 6e 74 20 70 77 67 65 6e 5f 67 65 74 5f 72 61  int pwgen_get_ra
1090: 6e 64 6f 6d 5f 66 64 28 76 6f 69 64 29 0a 7b 0a  ndom_fd(void).{.
10a0: 09 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c 09  .struct timeval.
10b0: 74 76 3b 0a 09 73 74 61 74 69 63 20 69 6e 74 09  tv;..static int.
10c0: 66 64 20 3d 20 2d 32 3b 0a 09 69 6e 74 09 09 69  fd = -2;..int..i
10d0: 3b 0a 0a 09 69 66 20 28 66 64 20 3d 3d 20 2d 32  ;...if (fd == -2
10e0: 29 20 7b 0a 09 09 67 65 74 74 69 6d 65 6f 66 64  ) {...gettimeofd
10f0: 61 79 28 26 74 76 2c 20 30 29 3b 0a 09 09 66 64  ay(&tv, 0);...fd
1100: 20 3d 20 6f 70 65 6e 28 22 2f 64 65 76 2f 75 72   = open("/dev/ur
1110: 61 6e 64 6f 6d 22 2c 20 4f 5f 52 44 4f 4e 4c 59  andom", O_RDONLY
1120: 29 3b 0a 09 09 69 66 20 28 66 64 20 3d 3d 20 2d  );...if (fd == -
1130: 31 29 0a 09 09 09 66 64 20 3d 20 6f 70 65 6e 28  1)....fd = open(
1140: 22 2f 64 65 76 2f 72 61 6e 64 6f 6d 22 2c 20 4f  "/dev/random", O
1150: 5f 52 44 4f 4e 4c 59 20 7c 20 4f 5f 4e 4f 4e 42  _RDONLY | O_NONB
1160: 4c 4f 43 4b 29 3b 0a 23 69 66 64 65 66 20 48 41  LOCK);.#ifdef HA
1170: 56 45 5f 44 52 41 4e 44 34 38 0a 09 09 73 72 61  VE_DRAND48...sra
1180: 6e 64 34 38 28 28 74 76 2e 74 76 5f 73 65 63 3c  nd48((tv.tv_sec<
1190: 3c 39 29 20 5e 20 28 67 65 74 70 67 72 70 28 29  <9) ^ (getpgrp()
11a0: 3c 3c 31 35 29 20 5e 0a 09 09 09 28 67 65 74 70  <<15) ^....(getp
11b0: 69 64 28 29 29 20 5e 20 28 74 76 2e 74 76 5f 75  id()) ^ (tv.tv_u
11c0: 73 65 63 3e 3e 31 31 29 29 3b 0a 23 65 6c 73 65  sec>>11));.#else
11d0: 0a 09 09 73 72 61 6e 64 6f 6d 28 28 67 65 74 70  ...srandom((getp
11e0: 69 64 28 29 20 3c 3c 20 31 36 29 20 5e 20 28 67  id() << 16) ^ (g
11f0: 65 74 70 67 72 70 28 29 20 3c 3c 20 38 29 20 5e  etpgrp() << 8) ^
1200: 20 67 65 74 75 69 64 28 29 20 0a 09 09 20 20 20   getuid() ...   
1210: 20 20 20 5e 20 74 76 2e 74 76 5f 73 65 63 20 5e     ^ tv.tv_sec ^
1220: 20 74 76 2e 74 76 5f 75 73 65 63 29 3b 0a 23 65   tv.tv_usec);.#e
1230: 6e 64 69 66 0a 09 7d 0a 09 2f 2a 20 43 72 61 6e  ndif..}../* Cran
1240: 6b 20 74 68 65 20 72 61 6e 64 6f 6d 20 6e 75 6d  k the random num
1250: 62 65 72 20 67 65 6e 65 72 61 74 6f 72 20 61 20  ber generator a 
1260: 66 65 77 20 74 69 6d 65 73 20 2a 2f 0a 09 67 65  few times */..ge
1270: 74 74 69 6d 65 6f 66 64 61 79 28 26 74 76 2c 20  ttimeofday(&tv, 
1280: 30 29 3b 0a 09 66 6f 72 20 28 69 20 3d 20 28 74  0);..for (i = (t
1290: 76 2e 74 76 5f 73 65 63 20 5e 20 74 76 2e 74 76  v.tv_sec ^ tv.tv
12a0: 5f 75 73 65 63 29 20 26 20 30 78 31 46 3b 20 69  _usec) & 0x1F; i
12b0: 20 3e 20 30 3b 20 69 2d 2d 29 0a 23 69 66 64 65   > 0; i--).#ifde
12c0: 66 20 48 41 56 45 5f 44 52 41 4e 44 34 38 0a 09  f HAVE_DRAND48..
12d0: 09 64 72 61 6e 64 34 38 28 29 3b 0a 23 65 6c 73  .drand48();.#els
12e0: 65 0a 09 09 72 61 6e 64 28 29 3b 0a 23 65 6e 64  e...rand();.#end
12f0: 69 66 0a 09 72 65 74 75 72 6e 20 66 64 3b 0a 7d  if..return fd;.}
1300: 0a 0a 2f 2a 0a 20 2a 20 47 65 6e 65 72 61 74 65  ../*. * Generate
1310: 20 61 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72   a random number
1320: 20 6e 2c 20 77 68 65 72 65 20 30 20 3c 3d 20 6e   n, where 0 <= n
1330: 20 3c 20 6d 61 78 5f 6e 75 6d 2c 20 75 73 69 6e   < max_num, usin
1340: 67 0a 20 2a 20 2f 64 65 76 2f 75 72 61 6e 64 6f  g. * /dev/urando
1350: 6d 20 69 66 20 70 6f 73 73 69 62 6c 65 2e 0a 20  m if possible.. 
1360: 2a 2f 0a 69 6e 74 20 70 77 67 65 6e 5f 72 61 6e  */.int pwgen_ran
1370: 64 6f 6d 5f 6e 75 6d 62 65 72 28 69 6e 74 20 6d  dom_number(int m
1380: 61 78 5f 6e 75 6d 29 0a 7b 0a 09 69 6e 74 20 69  ax_num).{..int i
1390: 2c 20 66 64 20 3d 20 70 77 67 65 6e 5f 67 65 74  , fd = pwgen_get
13a0: 5f 72 61 6e 64 6f 6d 5f 66 64 28 29 3b 0a 09 69  _random_fd();..i
13b0: 6e 74 20 6c 6f 73 65 5f 63 6f 75 6e 74 65 72 20  nt lose_counter 
13c0: 3d 20 30 2c 20 6e 62 79 74 65 73 3d 34 3b 0a 09  = 0, nbytes=4;..
13d0: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 72 61 6e  unsigned int ran
13e0: 64 3b 0a 09 63 68 61 72 20 2a 63 70 20 3d 20 28  d;..char *cp = (
13f0: 63 68 61 72 20 2a 29 20 26 72 61 6e 64 3b 0a 0a  char *) &rand;..
1400: 09 69 66 20 28 66 64 20 3e 3d 20 30 29 20 7b 0a  .if (fd >= 0) {.
1410: 09 09 77 68 69 6c 65 20 28 6e 62 79 74 65 73 20  ..while (nbytes 
1420: 3e 20 30 29 20 7b 0a 09 09 09 69 20 3d 20 72 65  > 0) {....i = re
1430: 61 64 28 66 64 2c 20 63 70 2c 20 6e 62 79 74 65  ad(fd, cp, nbyte
1440: 73 29 3b 0a 09 09 09 69 66 20 28 28 69 20 3c 20  s);....if ((i < 
1450: 30 29 20 26 26 0a 09 09 09 20 20 20 20 28 28 65  0) &&....    ((e
1460: 72 72 6e 6f 20 3d 3d 20 45 49 4e 54 52 29 20 7c  rrno == EINTR) |
1470: 7c 20 28 65 72 72 6e 6f 20 3d 3d 20 45 41 47 41  | (errno == EAGA
1480: 49 4e 29 29 29 0a 09 09 09 09 63 6f 6e 74 69 6e  IN))).....contin
1490: 75 65 3b 0a 09 09 09 69 66 20 28 69 20 3c 3d 20  ue;....if (i <= 
14a0: 30 29 20 7b 0a 09 09 09 09 69 66 20 28 6c 6f 73  0) {.....if (los
14b0: 65 5f 63 6f 75 6e 74 65 72 2b 2b 20 3d 3d 20 38  e_counter++ == 8
14c0: 29 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  )......break;...
14d0: 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d  ..continue;....}
14e0: 0a 09 09 09 6e 62 79 74 65 73 20 2d 3d 20 69 3b  ....nbytes -= i;
14f0: 0a 09 09 09 63 70 20 2b 3d 20 69 3b 0a 09 09 09  ....cp += i;....
1500: 6c 6f 73 65 5f 63 6f 75 6e 74 65 72 20 3d 20 30  lose_counter = 0
1510: 3b 0a 09 09 7d 0a 09 7d 0a 09 69 66 20 28 6e 62  ;...}..}..if (nb
1520: 79 74 65 73 20 3d 3d 20 30 29 0a 09 09 72 65 74  ytes == 0)...ret
1530: 75 72 6e 20 28 72 61 6e 64 20 25 20 6d 61 78 5f  urn (rand % max_
1540: 6e 75 6d 29 3b 0a 0a 09 2f 2a 20 4f 4b 2c 20 77  num);.../* OK, w
1550: 65 20 77 65 72 65 6e 27 74 20 61 62 6c 65 20 74  e weren't able t
1560: 6f 20 75 73 65 20 2f 64 65 76 2f 72 61 6e 64 6f  o use /dev/rando
1570: 6d 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20  m, fall back to 
1580: 72 61 6e 64 2f 72 61 6e 64 34 38 20 2a 2f 0a 0a  rand/rand48 */..
1590: 23 69 66 64 65 66 20 52 41 4e 44 34 38 0a 09 72  #ifdef RAND48..r
15a0: 65 74 75 72 6e 20 28 28 69 6e 74 29 20 28 28 64  eturn ((int) ((d
15b0: 72 61 6e 64 34 38 28 29 20 2a 20 6d 61 78 5f 6e  rand48() * max_n
15c0: 75 6d 29 29 29 3b 0a 23 65 6c 73 65 0a 09 72 65  um)));.#else..re
15d0: 74 75 72 6e 20 28 28 69 6e 74 29 20 28 72 61 6e  turn ((int) (ran
15e0: 64 6f 6d 28 29 20 2f 20 28 28 66 6c 6f 61 74 29  dom() / ((float)
15f0: 20 52 41 4e 44 5f 4d 41 58 29 20 2a 20 6d 61 78   RAND_MAX) * max
1600: 5f 6e 75 6d 29 29 3b 0a 23 65 6e 64 69 66 0a 7d  _num));.#endif.}
1610: 0a 0a 63 68 61 72 20 0a 2a 70 77 67 65 6e 5f 61  ..char .*pwgen_a
1620: 73 6b 28 63 68 61 72 20 2a 70 77 29 0a 7b 0a 09  sk(char *pw).{..
1630: 69 6e 74 20 69 3b 0a 09 75 69 5f 73 74 61 74 75  int i;..ui_statu
1640: 73 6c 69 6e 65 5f 61 73 6b 5f 6e 75 6d 28 22 4c  sline_ask_num("L
1650: 65 6e 67 74 68 20 6f 66 20 50 61 73 73 77 6f 72  ength of Passwor
1660: 64 28 64 65 66 61 75 6c 74 20 35 29 3a 5c 74 22  d(default 5):\t"
1670: 2c 20 26 69 29 3b 0a 0a 09 69 66 28 69 20 3d 3d  , &i);...if(i ==
1680: 20 30 29 7b 0a 09 09 69 20 3d 20 35 3b 0a 09 7d   0){...i = 5;..}
1690: 20 65 6c 73 65 20 69 66 28 69 20 3e 20 53 54 52   else if(i > STR
16a0: 49 4e 47 5f 53 48 4f 52 54 29 20 7b 0a 09 09 69  ING_SHORT) {...i
16b0: 20 3d 20 53 54 52 49 4e 47 5f 53 48 4f 52 54 3b   = STRING_SHORT;
16c0: 0a 09 7d 0a 09 70 77 20 3d 20 70 77 67 65 6e 28  ..}..pw = pwgen(
16d0: 70 77 2c 20 69 29 3b 0a 0a 09 72 65 74 75 72 6e  pw, i);...return
16e0: 20 70 77 3b 0a 7d 0a 0a 69 6e 74 20 0a 70 77 67   pw;.}..int .pwg
16f0: 65 6e 5f 69 6e 64 65 70 28 29 0a 7b 0a 09 63 68  en_indep().{..ch
1700: 61 72 20 70 61 73 73 5b 53 54 52 49 4e 47 5f 53  ar pass[STRING_S
1710: 48 4f 52 54 5d 2c 20 74 65 78 74 5b 53 54 52 49  HORT], text[STRI
1720: 4e 47 5f 4c 4f 4e 47 5d 3b 0a 0a 09 70 77 67 65  NG_LONG];...pwge
1730: 6e 5f 61 73 6b 28 70 61 73 73 29 3b 0a 0a 09 73  n_ask(pass);...s
1740: 6e 70 72 69 6e 74 66 28 74 65 78 74 2c 20 53 54  nprintf(text, ST
1750: 52 49 4e 47 5f 4c 4f 4e 47 2c 20 22 47 65 6e 65  RING_LONG, "Gene
1760: 72 61 74 65 64 20 50 61 73 73 77 6f 72 64 3a 20  rated Password: 
1770: 25 73 22 2c 20 70 61 73 73 29 3b 0a 09 75 69 5f  %s", pass);..ui_
1780: 73 74 61 74 75 73 6c 69 6e 65 5f 6d 73 67 28 74  statusline_msg(t
1790: 65 78 74 29 3b 0a 7d 0a                          ext);.}.