Hex Artifact Content

Artifact f7a5474fb249bef6cca54ba8bdcc657dad16f558:


0000: 23 21 20 2f 75 73 72 2f 62 69 6e 2f 65 6e 76 20  #! /usr/bin/env 
0010: 62 61 73 68 0a 0a 61 70 70 66 73 64 5f 6f 70 74  bash..appfsd_opt
0020: 69 6f 6e 73 3d 28 29 0a 0a 43 41 5f 43 45 52 54  ions=()..CA_CERT
0030: 5f 46 49 4c 45 3d 27 41 70 70 46 53 5f 43 41 2e  _FILE='AppFS_CA.
0040: 63 72 74 27 0a 43 41 5f 4b 45 59 5f 46 49 4c 45  crt'.CA_KEY_FILE
0050: 3d 27 41 70 70 46 53 5f 43 41 2e 6b 65 79 27 0a  ='AppFS_CA.key'.
0060: 65 78 70 6f 72 74 20 43 41 5f 43 45 52 54 5f 46  export CA_CERT_F
0070: 49 4c 45 20 43 41 5f 4b 45 59 5f 46 49 4c 45 0a  ILE CA_KEY_FILE.
0080: 0a 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 5f 61  .function call_a
0090: 70 70 66 73 64 28 29 20 7b 0a 09 61 70 70 66 73  ppfsd() {..appfs
00a0: 64 20 22 24 7b 61 70 70 66 73 64 5f 6f 70 74 69  d "${appfsd_opti
00b0: 6f 6e 73 5b 40 5d 7d 22 20 22 24 40 22 0a 7d 0a  ons[@]}" "$@".}.
00c0: 0a 66 75 6e 63 74 69 6f 6e 20 72 65 61 64 5f 70  .function read_p
00d0: 61 73 73 77 6f 72 64 28 29 20 7b 0a 09 6c 6f 63  assword() {..loc
00e0: 61 6c 20 70 72 6f 6d 70 74 20 76 61 72 69 61 62  al prompt variab
00f0: 6c 65 0a 0a 09 70 72 6f 6d 70 74 3d 22 24 31 22  le...prompt="$1"
0100: 0a 09 76 61 72 69 61 62 6c 65 3d 22 24 32 22 0a  ..variable="$2".
0110: 0a 09 69 66 20 5b 20 2d 7a 20 22 24 28 65 76 61  ..if [ -z "$(eva
0120: 6c 20 65 63 68 6f 20 27 24 27 24 7b 76 61 72 69  l echo '$'${vari
0130: 61 62 6c 65 7d 29 22 20 5d 3b 20 74 68 65 6e 0a  able})" ]; then.
0140: 09 09 65 63 68 6f 20 2d 6e 20 22 24 7b 70 72 6f  ..echo -n "${pro
0150: 6d 70 74 7d 22 20 3e 26 32 0a 0a 09 09 73 74 74  mpt}" >&2....stt
0160: 79 20 2d 65 63 68 6f 0a 09 09 49 46 53 3d 27 27  y -echo...IFS=''
0170: 20 72 65 61 64 20 2d 72 20 24 76 61 72 69 61 62   read -r $variab
0180: 6c 65 0a 09 09 73 74 74 79 20 65 63 68 6f 0a 09  le...stty echo..
0190: 09 65 63 68 6f 20 27 27 20 3e 26 32 0a 09 66 69  .echo '' >&2..fi
01a0: 0a 7d 0a 0a 66 75 6e 63 74 69 6f 6e 20 72 65 61  .}..function rea
01b0: 64 5f 74 65 78 74 28 29 20 7b 0a 09 6c 6f 63 61  d_text() {..loca
01c0: 6c 20 70 72 6f 6d 70 74 20 76 61 72 69 61 62 6c  l prompt variabl
01d0: 65 0a 0a 09 70 72 6f 6d 70 74 3d 22 24 31 22 0a  e...prompt="$1".
01e0: 09 76 61 72 69 61 62 6c 65 3d 22 24 32 22 0a 0a  .variable="$2"..
01f0: 09 69 66 20 5b 20 2d 7a 20 22 24 28 65 76 61 6c  .if [ -z "$(eval
0200: 20 65 63 68 6f 20 27 24 27 24 7b 76 61 72 69 61   echo '$'${varia
0210: 62 6c 65 7d 29 22 20 5d 3b 20 74 68 65 6e 0a 09  ble})" ]; then..
0220: 09 65 63 68 6f 20 2d 6e 20 22 24 7b 70 72 6f 6d  .echo -n "${prom
0230: 70 74 7d 22 20 3e 26 32 0a 0a 09 09 49 46 53 3d  pt}" >&2....IFS=
0240: 27 27 20 72 65 61 64 20 2d 72 20 24 76 61 72 69  '' read -r $vari
0250: 61 62 6c 65 0a 09 66 69 0a 7d 0a 0a 66 75 6e 63  able..fi.}..func
0260: 74 69 6f 6e 20 67 65 6e 65 72 61 74 65 5f 63 61  tion generate_ca
0270: 5f 63 65 72 74 5f 61 6e 64 5f 6b 65 79 28 29 20  _cert_and_key() 
0280: 7b 0a 09 72 65 61 64 5f 74 65 78 74 20 27 43 65  {..read_text 'Ce
0290: 72 74 69 66 69 63 61 74 65 20 41 75 74 68 6f 72  rtificate Author
02a0: 69 74 79 20 28 43 41 29 20 43 6f 6d 70 61 6e 79  ity (CA) Company
02b0: 20 4e 61 6d 65 20 28 4f 29 3a 20 27 20 43 41 5f   Name (O): ' CA_
02c0: 44 4e 5f 53 5f 4f 0a 09 72 65 61 64 5f 74 65 78  DN_S_O..read_tex
02d0: 74 20 27 43 65 72 74 69 66 69 63 61 74 65 20 41  t 'Certificate A
02e0: 75 74 68 6f 72 69 74 79 20 28 43 41 29 20 52 65  uthority (CA) Re
02f0: 73 70 6f 6e 73 69 62 6c 65 20 50 61 72 74 79 20  sponsible Party 
0300: 4e 61 6d 65 20 28 43 4e 29 3a 20 27 20 43 41 5f  Name (CN): ' CA_
0310: 44 4e 5f 53 5f 43 4e 0a 09 72 65 61 64 5f 70 61  DN_S_CN..read_pa
0320: 73 73 77 6f 72 64 20 27 50 61 73 73 77 6f 72 64  ssword 'Password
0330: 20 66 6f 72 20 43 65 72 74 69 66 69 63 61 74 65   for Certificate
0340: 20 41 75 74 68 6f 72 69 74 79 20 4b 65 79 3a 20   Authority Key: 
0350: 27 20 43 41 5f 50 41 53 53 57 4f 52 44 0a 0a 09  ' CA_PASSWORD...
0360: 65 78 70 6f 72 74 20 43 41 5f 44 4e 5f 53 5f 4f  export CA_DN_S_O
0370: 20 43 41 5f 44 4e 5f 53 5f 43 4e 20 43 41 5f 50   CA_DN_S_CN CA_P
0380: 41 53 53 57 4f 52 44 0a 0a 09 63 61 6c 6c 5f 61  ASSWORD...call_a
0390: 70 70 66 73 64 20 2d 2d 74 63 6c 20 27 0a 70 61  ppfsd --tcl '.pa
03a0: 63 6b 61 67 65 20 72 65 71 75 69 72 65 20 70 6b  ckage require pk
03b0: 69 0a 0a 73 65 74 20 66 69 6c 65 6e 61 6d 65 5f  i..set filename_
03c0: 63 65 72 74 20 24 3a 3a 65 6e 76 28 43 41 5f 43  cert $::env(CA_C
03d0: 45 52 54 5f 46 49 4c 45 29 0a 73 65 74 20 66 69  ERT_FILE).set fi
03e0: 6c 65 6e 61 6d 65 5f 6b 65 79 20 20 24 3a 3a 65  lename_key  $::e
03f0: 6e 76 28 43 41 5f 4b 45 59 5f 46 49 4c 45 29 0a  nv(CA_KEY_FILE).
0400: 0a 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65  .puts -nonewline
0410: 20 22 47 65 6e 65 72 61 74 69 6e 67 20 52 53 41   "Generating RSA
0420: 20 4b 65 79 2e 2e 2e 22 0a 66 6c 75 73 68 20 73   Key...".flush s
0430: 74 64 6f 75 74 0a 73 65 74 20 6b 65 79 20 5b 70  tdout.set key [p
0440: 6b 69 3a 3a 72 73 61 3a 3a 67 65 6e 65 72 61 74  ki::rsa::generat
0450: 65 20 32 30 34 38 5d 0a 70 75 74 73 20 22 20 44  e 2048].puts " D
0460: 6f 6e 65 2e 22 0a 0a 6c 61 70 70 65 6e 64 20 6b  one."..lappend k
0470: 65 79 20 73 75 62 6a 65 63 74 20 22 4f 3d 24 3a  ey subject "O=$:
0480: 3a 65 6e 76 28 43 41 5f 44 4e 5f 53 5f 4f 29 2c  :env(CA_DN_S_O),
0490: 43 4e 3d 24 3a 3a 65 6e 76 28 43 41 5f 44 4e 5f  CN=$::env(CA_DN_
04a0: 53 5f 43 4e 29 22 0a 0a 73 65 74 20 63 61 20 5b  S_CN)"..set ca [
04b0: 70 6b 69 3a 3a 78 35 30 39 3a 3a 63 72 65 61 74  pki::x509::creat
04c0: 65 5f 63 65 72 74 20 24 6b 65 79 20 24 6b 65 79  e_cert $key $key
04d0: 20 31 20 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e 64   1 [clock second
04e0: 73 5d 20 5b 63 6c 6f 63 6b 20 61 64 64 20 5b 63  s] [clock add [c
04f0: 6c 6f 63 6b 20 73 65 63 6f 6e 64 73 5d 20 35 20  lock seconds] 5 
0500: 79 65 61 72 73 5d 20 31 20 5b 6c 69 73 74 5d 20  years] 1 [list] 
0510: 31 5d 0a 0a 70 75 74 73 20 22 57 72 69 74 69 6e  1]..puts "Writin
0520: 67 20 5c 22 24 66 69 6c 65 6e 61 6d 65 5f 63 65  g \"$filename_ce
0530: 72 74 5c 22 22 0a 73 65 74 20 66 64 20 5b 6f 70  rt\"".set fd [op
0540: 65 6e 20 24 66 69 6c 65 6e 61 6d 65 5f 63 65 72  en $filename_cer
0550: 74 20 77 20 30 36 34 34 5d 0a 70 75 74 73 20 24  t w 0644].puts $
0560: 66 64 20 24 63 61 0a 63 6c 6f 73 65 20 24 66 64  fd $ca.close $fd
0570: 0a 0a 70 75 74 73 20 22 57 72 69 74 69 6e 67 20  ..puts "Writing 
0580: 5c 22 24 66 69 6c 65 6e 61 6d 65 5f 6b 65 79 5c  \"$filename_key\
0590: 22 22 0a 73 65 74 20 66 64 20 5b 6f 70 65 6e 20  "".set fd [open 
05a0: 24 66 69 6c 65 6e 61 6d 65 5f 6b 65 79 20 77 20  $filename_key w 
05b0: 30 34 30 30 5d 0a 70 75 74 73 20 24 66 64 20 5b  0400].puts $fd [
05c0: 70 6b 69 3a 3a 6b 65 79 20 24 6b 65 79 20 24 3a  pki::key $key $:
05d0: 3a 65 6e 76 28 43 41 5f 50 41 53 53 57 4f 52 44  :env(CA_PASSWORD
05e0: 29 5d 0a 63 6c 6f 73 65 20 24 66 64 0a 27 0a 7d  )].close $fd.'.}
05f0: 0a 0a 66 75 6e 63 74 69 6f 6e 20 67 65 6e 65 72  ..function gener
0600: 61 74 65 5f 6b 65 79 28 29 20 7b 0a 09 72 65 61  ate_key() {..rea
0610: 64 5f 70 61 73 73 77 6f 72 64 20 27 50 61 73 73  d_password 'Pass
0620: 77 6f 72 64 20 66 6f 72 20 53 69 74 65 20 4b 65  word for Site Ke
0630: 79 20 62 65 69 6e 67 20 67 65 6e 65 72 61 74 65  y being generate
0640: 64 3a 20 27 20 53 49 54 45 5f 50 41 53 53 57 4f  d: ' SITE_PASSWO
0650: 52 44 0a 0a 09 65 78 70 6f 72 74 20 53 49 54 45  RD...export SITE
0660: 5f 50 41 53 53 57 4f 52 44 0a 0a 09 63 61 6c 6c  _PASSWORD...call
0670: 5f 61 70 70 66 73 64 20 2d 2d 74 63 6c 20 27 0a  _appfsd --tcl '.
0680: 70 61 63 6b 61 67 65 20 72 65 71 75 69 72 65 20  package require 
0690: 70 6b 69 0a 0a 69 66 20 7b 5b 69 6e 66 6f 20 65  pki..if {[info e
06a0: 78 69 73 74 73 20 3a 3a 65 6e 76 28 53 49 54 45  xists ::env(SITE
06b0: 5f 4b 45 59 5f 46 49 4c 45 29 5d 7d 20 7b 0a 09  _KEY_FILE)]} {..
06c0: 73 65 74 20 66 69 6c 65 6e 61 6d 65 5f 6b 65 79  set filename_key
06d0: 20 24 3a 3a 65 6e 76 28 53 49 54 45 5f 4b 45 59   $::env(SITE_KEY
06e0: 5f 46 49 4c 45 29 0a 7d 20 65 6c 73 65 20 7b 0a  _FILE).} else {.
06f0: 09 73 65 74 20 66 69 6c 65 6e 61 6d 65 5f 6b 65  .set filename_ke
0700: 79 20 22 41 70 70 46 53 5f 53 69 74 65 2e 6b 65  y "AppFS_Site.ke
0710: 79 22 0a 7d 0a 0a 70 75 74 73 20 2d 6e 6f 6e 65  y".}..puts -none
0720: 77 6c 69 6e 65 20 22 47 65 6e 65 72 61 74 69 6e  wline "Generatin
0730: 67 20 52 53 41 20 4b 65 79 2e 2e 2e 22 0a 66 6c  g RSA Key...".fl
0740: 75 73 68 20 73 74 64 6f 75 74 0a 73 65 74 20 6b  ush stdout.set k
0750: 65 79 20 5b 70 6b 69 3a 3a 72 73 61 3a 3a 67 65  ey [pki::rsa::ge
0760: 6e 65 72 61 74 65 20 32 30 34 38 5d 0a 70 75 74  nerate 2048].put
0770: 73 20 22 20 44 6f 6e 65 2e 22 0a 0a 70 75 74 73  s " Done."..puts
0780: 20 22 57 72 69 74 69 6e 67 20 5c 22 24 66 69 6c   "Writing \"$fil
0790: 65 6e 61 6d 65 5f 6b 65 79 5c 22 22 0a 73 65 74  ename_key\"".set
07a0: 20 66 64 20 5b 6f 70 65 6e 20 24 66 69 6c 65 6e   fd [open $filen
07b0: 61 6d 65 5f 6b 65 79 20 77 20 30 34 30 30 5d 0a  ame_key w 0400].
07c0: 70 75 74 73 20 24 66 64 20 5b 70 6b 69 3a 3a 6b  puts $fd [pki::k
07d0: 65 79 20 24 6b 65 79 20 24 3a 3a 65 6e 76 28 53  ey $key $::env(S
07e0: 49 54 45 5f 50 41 53 53 57 4f 52 44 29 5d 0a 63  ITE_PASSWORD)].c
07f0: 6c 6f 73 65 20 24 66 64 0a 27 0a 7d 0a 0a 66 75  lose $fd.'.}..fu
0800: 6e 63 74 69 6f 6e 20 67 65 6e 65 72 61 74 65 5f  nction generate_
0810: 63 73 72 28 29 20 7b 0a 09 72 65 61 64 5f 74 65  csr() {..read_te
0820: 78 74 20 27 53 69 74 65 20 68 6f 73 74 6e 61 6d  xt 'Site hostnam
0830: 65 3a 20 27 20 53 49 54 45 5f 48 4f 53 54 4e 41  e: ' SITE_HOSTNA
0840: 4d 45 0a 0a 09 69 66 20 5b 20 2d 7a 20 22 24 7b  ME...if [ -z "${
0850: 53 49 54 45 5f 4b 45 59 5f 46 49 4c 45 7d 22 20  SITE_KEY_FILE}" 
0860: 5d 3b 20 74 68 65 6e 0a 09 09 53 49 54 45 5f 4b  ]; then...SITE_K
0870: 45 59 5f 46 49 4c 45 3d 22 41 70 70 46 53 5f 53  EY_FILE="AppFS_S
0880: 69 74 65 5f 24 7b 53 49 54 45 5f 48 4f 53 54 4e  ite_${SITE_HOSTN
0890: 41 4d 45 7d 2e 6b 65 79 22 0a 09 66 69 0a 0a 09  AME}.key"..fi...
08a0: 65 78 70 6f 72 74 20 53 49 54 45 5f 48 4f 53 54  export SITE_HOST
08b0: 4e 41 4d 45 20 53 49 54 45 5f 4b 45 59 5f 46 49  NAME SITE_KEY_FI
08c0: 4c 45 0a 0a 09 69 66 20 5b 20 2d 66 20 22 24 7b  LE...if [ -f "${
08d0: 53 49 54 45 5f 4b 45 59 5f 46 49 4c 45 7d 22 20  SITE_KEY_FILE}" 
08e0: 5d 3b 20 74 68 65 6e 0a 09 09 65 63 68 6f 20 27  ]; then...echo '
08f0: 4b 65 79 20 66 69 6c 65 20 61 6c 72 65 61 64 79  Key file already
0900: 20 65 78 69 73 74 73 2e 27 0a 09 09 69 66 20 63   exists.'...if c
0910: 61 74 20 22 24 7b 53 49 54 45 5f 4b 45 59 5f 46  at "${SITE_KEY_F
0920: 49 4c 45 7d 22 20 7c 20 67 72 65 70 20 2d 69 20  ILE}" | grep -i 
0930: 27 5e 50 72 6f 63 2d 54 79 70 65 3a 20 2e 2a 2c  '^Proc-Type: .*,
0940: 45 4e 43 52 59 50 54 45 44 27 20 3e 2f 64 65 76  ENCRYPTED' >/dev
0950: 2f 6e 75 6c 6c 3b 20 74 68 65 6e 0a 09 09 09 72  /null; then....r
0960: 65 61 64 5f 70 61 73 73 77 6f 72 64 20 27 50 61  ead_password 'Pa
0970: 73 73 77 6f 72 64 20 66 6f 72 20 28 65 78 69 73  ssword for (exis
0980: 74 69 6e 67 29 20 53 69 74 65 20 4b 65 79 3a 20  ting) Site Key: 
0990: 27 20 53 49 54 45 5f 50 41 53 53 57 4f 52 44 0a  ' SITE_PASSWORD.
09a0: 09 09 65 6c 73 65 0a 09 09 09 53 49 54 45 5f 50  ..else....SITE_P
09b0: 41 53 53 57 4f 52 44 3d 22 22 0a 09 09 66 69 0a  ASSWORD=""...fi.
09c0: 0a 09 09 65 78 70 6f 72 74 20 53 49 54 45 5f 50  ...export SITE_P
09d0: 41 53 53 57 4f 52 44 0a 09 65 6c 73 65 0a 09 09  ASSWORD..else...
09e0: 67 65 6e 65 72 61 74 65 5f 6b 65 79 0a 09 66 69  generate_key..fi
09f0: 0a 0a 63 61 6c 6c 5f 61 70 70 66 73 64 20 2d 2d  ..call_appfsd --
0a00: 74 63 6c 20 27 0a 70 61 63 6b 61 67 65 20 72 65  tcl '.package re
0a10: 71 75 69 72 65 20 70 6b 69 0a 0a 69 66 20 7b 5b  quire pki..if {[
0a20: 69 6e 66 6f 20 65 78 69 73 74 73 20 3a 3a 65 6e  info exists ::en
0a30: 76 28 53 49 54 45 5f 4b 45 59 5f 46 49 4c 45 29  v(SITE_KEY_FILE)
0a40: 5d 7d 20 7b 0a 20 20 20 20 20 20 20 20 73 65 74  ]} {.        set
0a50: 20 66 69 6c 65 6e 61 6d 65 5f 6b 65 79 20 24 3a   filename_key $:
0a60: 3a 65 6e 76 28 53 49 54 45 5f 4b 45 59 5f 46 49  :env(SITE_KEY_FI
0a70: 4c 45 29 0a 7d 20 65 6c 73 65 20 7b 0a 20 20 20  LE).} else {.   
0a80: 20 20 20 20 20 73 65 74 20 66 69 6c 65 6e 61 6d       set filenam
0a90: 65 5f 6b 65 79 20 22 41 70 70 46 53 5f 53 69 74  e_key "AppFS_Sit
0aa0: 65 2e 6b 65 79 22 0a 7d 0a 73 65 74 20 66 69 6c  e.key".}.set fil
0ab0: 65 6e 61 6d 65 5f 63 73 72 20 22 5b 66 69 6c 65  ename_csr "[file
0ac0: 20 72 6f 6f 74 6e 61 6d 65 20 24 66 69 6c 65 6e   rootname $filen
0ad0: 61 6d 65 5f 6b 65 79 5d 2e 63 73 72 22 0a 0a 73  ame_key].csr"..s
0ae0: 65 74 20 6b 65 79 20 5b 72 65 61 64 20 5b 6f 70  et key [read [op
0af0: 65 6e 20 24 66 69 6c 65 6e 61 6d 65 5f 6b 65 79  en $filename_key
0b00: 5d 5d 0a 0a 73 65 74 20 6b 65 79 20 5b 3a 3a 70  ]]..set key [::p
0b10: 6b 69 3a 3a 70 6b 63 73 3a 3a 70 61 72 73 65 5f  ki::pkcs::parse_
0b20: 6b 65 79 20 24 6b 65 79 20 24 3a 3a 65 6e 76 28  key $key $::env(
0b30: 53 49 54 45 5f 50 41 53 53 57 4f 52 44 29 5d 0a  SITE_PASSWORD)].
0b40: 0a 73 65 74 20 63 73 72 20 5b 3a 3a 70 6b 69 3a  .set csr [::pki:
0b50: 3a 70 6b 63 73 3a 3a 63 72 65 61 74 65 5f 63 73  :pkcs::create_cs
0b60: 72 20 24 6b 65 79 20 5b 6c 69 73 74 20 43 4e 20  r $key [list CN 
0b70: 24 3a 3a 65 6e 76 28 53 49 54 45 5f 48 4f 53 54  $::env(SITE_HOST
0b80: 4e 41 4d 45 29 5d 20 31 5d 0a 0a 70 75 74 73 20  NAME)] 1]..puts 
0b90: 22 57 72 69 74 69 6e 67 20 5c 22 24 66 69 6c 65  "Writing \"$file
0ba0: 6e 61 6d 65 5f 63 73 72 5c 22 22 0a 73 65 74 20  name_csr\"".set 
0bb0: 66 64 20 5b 6f 70 65 6e 20 24 66 69 6c 65 6e 61  fd [open $filena
0bc0: 6d 65 5f 63 73 72 20 77 20 30 36 34 34 5d 0a 70  me_csr w 0644].p
0bd0: 75 74 73 20 24 66 64 20 24 63 73 72 0a 63 6c 6f  uts $fd $csr.clo
0be0: 73 65 20 24 66 64 0a 27 0a 7d 0a 0a 66 75 6e 63  se $fd.'.}..func
0bf0: 74 69 6f 6e 20 67 65 6e 65 72 61 74 65 5f 63 65  tion generate_ce
0c00: 72 74 28 29 20 7b 0a 09 53 49 54 45 5f 43 53 52  rt() {..SITE_CSR
0c10: 5f 46 49 4c 45 3d 22 24 31 22 0a 0a 09 72 65 61  _FILE="$1"...rea
0c20: 64 5f 74 65 78 74 20 27 43 65 72 74 69 66 69 63  d_text 'Certific
0c30: 61 74 65 20 53 69 67 6e 69 6e 67 20 52 65 71 75  ate Signing Requ
0c40: 65 73 74 20 28 43 53 52 29 20 66 69 6c 65 3a 20  est (CSR) file: 
0c50: 27 20 53 49 54 45 5f 43 53 52 5f 46 49 4c 45 0a  ' SITE_CSR_FILE.
0c60: 0a 09 69 66 20 5b 20 2d 7a 20 22 24 7b 53 49 54  ..if [ -z "${SIT
0c70: 45 5f 43 53 52 5f 46 49 4c 45 7d 22 20 5d 3b 20  E_CSR_FILE}" ]; 
0c80: 74 68 65 6e 0a 09 09 67 65 6e 65 72 61 74 65 5f  then...generate_
0c90: 63 73 72 20 7c 7c 20 65 78 69 74 20 31 0a 0a 09  csr || exit 1...
0ca0: 09 53 49 54 45 5f 43 53 52 5f 46 49 4c 45 3d 22  .SITE_CSR_FILE="
0cb0: 24 28 65 63 68 6f 20 22 24 7b 53 49 54 45 5f 4b  $(echo "${SITE_K
0cc0: 45 59 5f 46 49 4c 45 7d 22 20 7c 20 73 65 64 20  EY_FILE}" | sed 
0cd0: 27 73 40 2e 5b 5e 5c 2e 5d 2a 24 40 40 27 29 2e  's@.[^\.]*$@@').
0ce0: 63 73 72 22 0a 09 66 69 0a 0a 09 69 66 20 5b 20  csr"..fi...if [ 
0cf0: 21 20 2d 65 20 22 24 7b 43 41 5f 43 45 52 54 5f  ! -e "${CA_CERT_
0d00: 46 49 4c 45 7d 22 20 2d 6f 20 21 20 2d 65 20 22  FILE}" -o ! -e "
0d10: 24 7b 43 41 5f 4b 45 59 5f 46 49 4c 45 7d 22 20  ${CA_KEY_FILE}" 
0d20: 5d 3b 20 74 68 65 6e 0a 09 09 72 65 61 64 5f 74  ]; then...read_t
0d30: 65 78 74 20 27 43 65 72 74 69 66 69 63 61 74 65  ext 'Certificate
0d40: 20 41 75 74 68 6f 72 69 74 79 20 28 43 41 29 20   Authority (CA) 
0d50: 43 65 72 74 69 66 69 63 61 74 65 20 46 69 6c 65  Certificate File
0d60: 6e 61 6d 65 3a 20 27 20 43 41 5f 43 45 52 54 5f  name: ' CA_CERT_
0d70: 46 49 4c 45 0a 09 09 72 65 61 64 5f 74 65 78 74  FILE...read_text
0d80: 20 27 43 65 72 74 69 66 69 63 61 74 65 20 41 75   'Certificate Au
0d90: 74 68 6f 72 69 74 79 20 28 43 41 29 20 4b 65 79  thority (CA) Key
0da0: 20 46 69 6c 65 6e 61 6d 65 3a 20 27 20 43 41 5f   Filename: ' CA_
0db0: 4b 45 59 5f 46 49 4c 45 0a 09 66 69 0a 0a 09 69  KEY_FILE..fi...i
0dc0: 66 20 63 61 74 20 22 24 7b 43 41 5f 4b 45 59 5f  f cat "${CA_KEY_
0dd0: 46 49 4c 45 7d 22 20 7c 20 67 72 65 70 20 2d 69  FILE}" | grep -i
0de0: 20 27 5e 50 72 6f 63 2d 54 79 70 65 3a 20 2e 2a   '^Proc-Type: .*
0df0: 2c 45 4e 43 52 59 50 54 45 44 27 20 3e 2f 64 65  ,ENCRYPTED' >/de
0e00: 76 2f 6e 75 6c 6c 3b 20 74 68 65 6e 0a 09 09 72  v/null; then...r
0e10: 65 61 64 5f 70 61 73 73 77 6f 72 64 20 27 43 65  ead_password 'Ce
0e20: 72 74 69 66 69 63 61 74 65 20 41 75 74 68 6f 72  rtificate Author
0e30: 69 74 79 20 28 43 41 29 20 50 61 73 73 77 6f 72  ity (CA) Passwor
0e40: 64 3a 20 27 20 43 41 5f 50 41 53 53 57 4f 52 44  d: ' CA_PASSWORD
0e50: 0a 09 66 69 0a 0a 09 53 49 54 45 5f 53 45 52 49  ..fi...SITE_SERI
0e60: 41 4c 5f 4e 55 4d 42 45 52 3d 22 24 28 75 75 69  AL_NUMBER="$(uui
0e70: 64 67 65 6e 20 7c 20 64 64 20 63 6f 6e 76 3d 75  dgen | dd conv=u
0e80: 63 61 73 65 20 32 3e 2f 64 65 76 2f 6e 75 6c 6c  case 2>/dev/null
0e90: 20 7c 20 73 65 64 20 27 73 40 2d 40 40 67 3b 73   | sed 's@-@@g;s
0ea0: 40 5e 40 69 62 61 73 65 3d 31 36 3b 20 40 27 20  @^@ibase=16; @' 
0eb0: 7c 20 62 63 20 2d 6c 71 29 22 0a 0a 09 65 78 70  | bc -lq)"...exp
0ec0: 6f 72 74 20 53 49 54 45 5f 43 53 52 5f 46 49 4c  ort SITE_CSR_FIL
0ed0: 45 20 53 49 54 45 5f 53 45 52 49 41 4c 5f 4e 55  E SITE_SERIAL_NU
0ee0: 4d 42 45 52 20 43 41 5f 43 45 52 54 5f 46 49 4c  MBER CA_CERT_FIL
0ef0: 45 20 43 41 5f 4b 45 59 5f 46 49 4c 45 20 43 41  E CA_KEY_FILE CA
0f00: 5f 50 41 53 53 57 4f 52 44 0a 0a 09 53 49 54 45  _PASSWORD...SITE
0f10: 5f 43 45 52 54 3d 22 24 28 63 61 6c 6c 5f 61 70  _CERT="$(call_ap
0f20: 70 66 73 64 20 2d 2d 74 63 6c 20 27 0a 70 61 63  pfsd --tcl '.pac
0f30: 6b 61 67 65 20 72 65 71 75 69 72 65 20 70 6b 69  kage require pki
0f40: 0a 0a 73 65 74 20 63 73 72 20 5b 72 65 61 64 20  ..set csr [read 
0f50: 5b 6f 70 65 6e 20 24 3a 3a 65 6e 76 28 53 49 54  [open $::env(SIT
0f60: 45 5f 43 53 52 5f 46 49 4c 45 29 5d 5d 0a 73 65  E_CSR_FILE)]].se
0f70: 74 20 63 73 72 20 5b 3a 3a 70 6b 69 3a 3a 70 6b  t csr [::pki::pk
0f80: 63 73 3a 3a 70 61 72 73 65 5f 63 73 72 20 24 63  cs::parse_csr $c
0f90: 73 72 5d 0a 0a 73 65 74 20 63 61 5f 6b 65 79 20  sr]..set ca_key 
0fa0: 5b 72 65 61 64 20 5b 6f 70 65 6e 20 24 3a 3a 65  [read [open $::e
0fb0: 6e 76 28 43 41 5f 4b 45 59 5f 46 49 4c 45 29 5d  nv(CA_KEY_FILE)]
0fc0: 5d 0a 73 65 74 20 63 61 5f 63 65 72 74 20 5b 72  ].set ca_cert [r
0fd0: 65 61 64 20 5b 6f 70 65 6e 20 24 3a 3a 65 6e 76  ead [open $::env
0fe0: 28 43 41 5f 43 45 52 54 5f 46 49 4c 45 29 5d 5d  (CA_CERT_FILE)]]
0ff0: 0a 0a 73 65 74 20 63 61 5f 6b 65 79 20 5b 3a 3a  ..set ca_key [::
1000: 70 6b 69 3a 3a 70 6b 63 73 3a 3a 70 61 72 73 65  pki::pkcs::parse
1010: 5f 6b 65 79 20 24 63 61 5f 6b 65 79 20 24 3a 3a  _key $ca_key $::
1020: 65 6e 76 28 43 41 5f 50 41 53 53 57 4f 52 44 29  env(CA_PASSWORD)
1030: 5d 0a 73 65 74 20 63 61 5f 63 65 72 74 20 5b 3a  ].set ca_cert [:
1040: 3a 70 6b 69 3a 3a 78 35 30 39 3a 3a 70 61 72 73  :pki::x509::pars
1050: 65 5f 63 65 72 74 20 24 63 61 5f 63 65 72 74 5d  e_cert $ca_cert]
1060: 0a 73 65 74 20 63 61 5f 6b 65 79 20 5b 63 6f 6e  .set ca_key [con
1070: 63 61 74 20 24 63 61 5f 6b 65 79 20 24 63 61 5f  cat $ca_key $ca_
1080: 63 65 72 74 5d 0a 0a 73 65 74 20 63 65 72 74 20  cert]..set cert 
1090: 5b 3a 3a 70 6b 69 3a 3a 78 35 30 39 3a 3a 63 72  [::pki::x509::cr
10a0: 65 61 74 65 5f 63 65 72 74 20 24 63 73 72 20 24  eate_cert $csr $
10b0: 63 61 5f 6b 65 79 20 24 3a 3a 65 6e 76 28 53 49  ca_key $::env(SI
10c0: 54 45 5f 53 45 52 49 41 4c 5f 4e 55 4d 42 45 52  TE_SERIAL_NUMBER
10d0: 29 20 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e 64 73  ) [clock seconds
10e0: 5d 20 5b 63 6c 6f 63 6b 20 61 64 64 20 5b 63 6c  ] [clock add [cl
10f0: 6f 63 6b 20 73 65 63 6f 6e 64 73 5d 20 31 20 79  ock seconds] 1 y
1100: 65 61 72 5d 20 30 20 5b 6c 69 73 74 5d 20 31 5d  ear] 0 [list] 1]
1110: 0a 0a 70 75 74 73 20 24 63 65 72 74 0a 27 29 22  ..puts $cert.')"
1120: 0a 0a 09 53 49 54 45 5f 53 55 42 4a 45 43 54 3d  ...SITE_SUBJECT=
1130: 22 24 28 65 63 68 6f 20 22 24 7b 53 49 54 45 5f  "$(echo "${SITE_
1140: 43 45 52 54 7d 22 20 7c 20 6f 70 65 6e 73 73 6c  CERT}" | openssl
1150: 20 78 35 30 39 20 2d 73 75 62 6a 65 63 74 20 2d   x509 -subject -
1160: 6e 6f 6f 75 74 20 7c 20 73 65 64 20 27 73 40 2e  noout | sed 's@.
1170: 2a 3d 20 40 40 27 29 22 0a 0a 09 65 63 68 6f 20  *= @@')"...echo 
1180: 22 24 7b 55 53 45 52 7d 40 24 7b 48 4f 53 54 4e  "${USER}@${HOSTN
1190: 41 4d 45 7d 20 24 28 64 61 74 65 29 3a 20 24 7b  AME} $(date): ${
11a0: 53 49 54 45 5f 53 45 52 49 41 4c 5f 4e 55 4d 42  SITE_SERIAL_NUMB
11b0: 45 52 7d 20 24 7b 53 49 54 45 5f 53 55 42 4a 45  ER} ${SITE_SUBJE
11c0: 43 54 7d 22 20 3e 3e 20 22 24 7b 43 41 5f 4b 45  CT}" >> "${CA_KE
11d0: 59 5f 46 49 4c 45 7d 2e 69 73 73 75 65 64 22 0a  Y_FILE}.issued".
11e0: 0a 09 65 63 68 6f 20 22 24 7b 53 49 54 45 5f 43  ..echo "${SITE_C
11f0: 45 52 54 7d 22 20 7c 20 28 0a 09 09 69 66 20 5b  ERT}" | (...if [
1200: 20 2d 7a 20 22 24 7b 53 49 54 45 5f 48 4f 53 54   -z "${SITE_HOST
1210: 4e 41 4d 45 7d 22 20 5d 3b 20 74 68 65 6e 0a 09  NAME}" ]; then..
1220: 09 09 63 61 74 0a 09 09 65 6c 73 65 0a 09 09 09  ..cat...else....
1230: 74 65 65 20 22 41 70 70 46 53 5f 53 69 74 65 5f  tee "AppFS_Site_
1240: 24 7b 53 49 54 45 5f 48 4f 53 54 4e 41 4d 45 7d  ${SITE_HOSTNAME}
1250: 2e 63 72 74 22 0a 09 09 66 69 0a 09 29 0a 7d 0a  .crt"...fi..).}.
1260: 0a 66 75 6e 63 74 69 6f 6e 20 67 65 6e 65 72 61  .function genera
1270: 74 65 5f 73 65 6c 66 73 69 67 6e 65 64 28 29 20  te_selfsigned() 
1280: 7b 0a 09 72 65 61 64 5f 70 61 73 73 77 6f 72 64  {..read_password
1290: 20 27 50 61 73 73 77 6f 72 64 20 66 6f 72 20 4b   'Password for K
12a0: 65 79 3a 20 27 20 53 49 54 45 5f 50 41 53 53 57  ey: ' SITE_PASSW
12b0: 4f 52 44 0a 09 72 65 61 64 5f 74 65 78 74 20 27  ORD..read_text '
12c0: 53 69 74 65 20 68 6f 73 74 6e 61 6d 65 3a 20 27  Site hostname: '
12d0: 20 53 49 54 45 5f 48 4f 53 54 4e 41 4d 45 0a 0a   SITE_HOSTNAME..
12e0: 09 53 49 54 45 5f 53 45 52 49 41 4c 5f 4e 55 4d  .SITE_SERIAL_NUM
12f0: 42 45 52 3d 22 24 28 75 75 69 64 67 65 6e 20 7c  BER="$(uuidgen |
1300: 20 64 64 20 63 6f 6e 76 3d 75 63 61 73 65 20 32   dd conv=ucase 2
1310: 3e 2f 64 65 76 2f 6e 75 6c 6c 20 7c 20 73 65 64  >/dev/null | sed
1320: 20 27 73 40 2d 40 40 67 3b 73 40 5e 40 69 62 61   's@-@@g;s@^@iba
1330: 73 65 3d 31 36 3b 20 40 27 20 7c 20 62 63 20 2d  se=16; @' | bc -
1340: 6c 71 29 22 0a 0a 09 65 78 70 6f 72 74 20 53 49  lq)"...export SI
1350: 54 45 5f 50 41 53 53 57 4f 52 44 20 53 49 54 45  TE_PASSWORD SITE
1360: 5f 48 4f 53 54 4e 41 4d 45 20 53 49 54 45 5f 53  _HOSTNAME SITE_S
1370: 45 52 49 41 4c 5f 4e 55 4d 42 45 52 0a 0a 09 63  ERIAL_NUMBER...c
1380: 61 6c 6c 5f 61 70 70 66 73 64 20 2d 2d 74 63 6c  all_appfsd --tcl
1390: 20 27 0a 70 61 63 6b 61 67 65 20 72 65 71 75 69   '.package requi
13a0: 72 65 20 70 6b 69 0a 0a 73 65 74 20 66 69 6c 65  re pki..set file
13b0: 6e 61 6d 65 5f 63 65 72 74 20 22 41 70 70 46 53  name_cert "AppFS
13c0: 5f 53 69 74 65 5f 24 3a 3a 65 6e 76 28 53 49 54  _Site_$::env(SIT
13d0: 45 5f 48 4f 53 54 4e 41 4d 45 29 2e 63 72 74 22  E_HOSTNAME).crt"
13e0: 0a 73 65 74 20 66 69 6c 65 6e 61 6d 65 5f 6b 65  .set filename_ke
13f0: 79 20 20 22 41 70 70 46 53 5f 53 69 74 65 5f 24  y  "AppFS_Site_$
1400: 3a 3a 65 6e 76 28 53 49 54 45 5f 48 4f 53 54 4e  ::env(SITE_HOSTN
1410: 41 4d 45 29 2e 6b 65 79 22 0a 0a 70 75 74 73 20  AME).key"..puts 
1420: 2d 6e 6f 6e 65 77 6c 69 6e 65 20 22 47 65 6e 65  -nonewline "Gene
1430: 72 61 74 69 6e 67 20 52 53 41 20 4b 65 79 2e 2e  rating RSA Key..
1440: 2e 22 0a 66 6c 75 73 68 20 73 74 64 6f 75 74 0a  .".flush stdout.
1450: 73 65 74 20 6b 65 79 20 5b 70 6b 69 3a 3a 72 73  set key [pki::rs
1460: 61 3a 3a 67 65 6e 65 72 61 74 65 20 32 30 34 38  a::generate 2048
1470: 5d 0a 70 75 74 73 20 22 20 44 6f 6e 65 2e 22 0a  ].puts " Done.".
1480: 0a 6c 61 70 70 65 6e 64 20 6b 65 79 20 73 75 62  .lappend key sub
1490: 6a 65 63 74 20 22 43 4e 3d 24 3a 3a 65 6e 76 28  ject "CN=$::env(
14a0: 53 49 54 45 5f 48 4f 53 54 4e 41 4d 45 29 22 0a  SITE_HOSTNAME)".
14b0: 0a 73 65 74 20 63 65 72 74 20 5b 70 6b 69 3a 3a  .set cert [pki::
14c0: 78 35 30 39 3a 3a 63 72 65 61 74 65 5f 63 65 72  x509::create_cer
14d0: 74 20 24 6b 65 79 20 24 6b 65 79 20 24 3a 3a 65  t $key $key $::e
14e0: 6e 76 28 53 49 54 45 5f 53 45 52 49 41 4c 5f 4e  nv(SITE_SERIAL_N
14f0: 55 4d 42 45 52 29 20 5b 63 6c 6f 63 6b 20 73 65  UMBER) [clock se
1500: 63 6f 6e 64 73 5d 20 5b 63 6c 6f 63 6b 20 61 64  conds] [clock ad
1510: 64 20 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e 64 73  d [clock seconds
1520: 5d 20 31 20 79 65 61 72 73 5d 20 31 20 5b 6c 69  ] 1 years] 1 [li
1530: 73 74 5d 20 31 5d 0a 0a 70 75 74 73 20 22 57 72  st] 1]..puts "Wr
1540: 69 74 69 6e 67 20 5c 22 24 66 69 6c 65 6e 61 6d  iting \"$filenam
1550: 65 5f 63 65 72 74 5c 22 22 0a 73 65 74 20 66 64  e_cert\"".set fd
1560: 20 5b 6f 70 65 6e 20 24 66 69 6c 65 6e 61 6d 65   [open $filename
1570: 5f 63 65 72 74 20 77 20 30 36 34 34 5d 0a 70 75  _cert w 0644].pu
1580: 74 73 20 24 66 64 20 24 63 65 72 74 0a 63 6c 6f  ts $fd $cert.clo
1590: 73 65 20 24 66 64 0a 0a 70 75 74 73 20 22 57 72  se $fd..puts "Wr
15a0: 69 74 69 6e 67 20 5c 22 24 66 69 6c 65 6e 61 6d  iting \"$filenam
15b0: 65 5f 6b 65 79 5c 22 22 0a 73 65 74 20 66 64 20  e_key\"".set fd 
15c0: 5b 6f 70 65 6e 20 24 66 69 6c 65 6e 61 6d 65 5f  [open $filename_
15d0: 6b 65 79 20 77 20 30 34 30 30 5d 0a 70 75 74 73  key w 0400].puts
15e0: 20 24 66 64 20 5b 70 6b 69 3a 3a 6b 65 79 20 24   $fd [pki::key $
15f0: 6b 65 79 20 24 3a 3a 65 6e 76 28 53 49 54 45 5f  key $::env(SITE_
1600: 50 41 53 53 57 4f 52 44 29 5d 0a 63 6c 6f 73 65  PASSWORD)].close
1610: 20 24 66 64 0a 27 0a 7d 0a 0a 66 75 6e 63 74 69   $fd.'.}..functi
1620: 6f 6e 20 73 69 67 6e 5f 73 69 74 65 28 29 20 7b  on sign_site() {
1630: 0a 09 53 49 54 45 5f 49 4e 44 45 58 5f 46 49 4c  ..SITE_INDEX_FIL
1640: 45 3d 22 24 31 22 0a 09 53 49 54 45 5f 4b 45 59  E="$1"..SITE_KEY
1650: 5f 46 49 4c 45 3d 22 24 32 22 0a 09 53 49 54 45  _FILE="$2"..SITE
1660: 5f 43 45 52 54 5f 46 49 4c 45 3d 22 24 33 22 0a  _CERT_FILE="$3".
1670: 0a 09 72 65 61 64 5f 74 65 78 74 20 27 41 70 70  ..read_text 'App
1680: 46 53 20 53 69 74 65 20 49 6e 64 65 78 20 66 69  FS Site Index fi
1690: 6c 65 3a 20 27 20 53 49 54 45 5f 49 4e 44 45 58  le: ' SITE_INDEX
16a0: 5f 46 49 4c 45 0a 09 72 65 61 64 5f 74 65 78 74  _FILE..read_text
16b0: 20 27 53 69 74 65 20 4b 65 79 20 66 69 6c 65 6e   'Site Key filen
16c0: 61 6d 65 3a 20 27 20 53 49 54 45 5f 4b 45 59 5f  ame: ' SITE_KEY_
16d0: 46 49 4c 45 0a 09 72 65 61 64 5f 74 65 78 74 20  FILE..read_text 
16e0: 27 53 69 74 65 20 43 65 72 74 69 66 69 63 61 74  'Site Certificat
16f0: 65 20 66 69 6c 65 6e 61 6d 65 3a 20 27 20 53 49  e filename: ' SI
1700: 54 45 5f 43 45 52 54 5f 46 49 4c 45 0a 0a 09 69  TE_CERT_FILE...i
1710: 66 20 63 61 74 20 22 24 7b 53 49 54 45 5f 4b 45  f cat "${SITE_KE
1720: 59 5f 46 49 4c 45 7d 22 20 7c 20 67 72 65 70 20  Y_FILE}" | grep 
1730: 2d 69 20 27 5e 50 72 6f 63 2d 54 79 70 65 3a 20  -i '^Proc-Type: 
1740: 2e 2a 2c 45 4e 43 52 59 50 54 45 44 27 20 3e 2f  .*,ENCRYPTED' >/
1750: 64 65 76 2f 6e 75 6c 6c 3b 20 74 68 65 6e 0a 09  dev/null; then..
1760: 09 72 65 61 64 5f 70 61 73 73 77 6f 72 64 20 22  .read_password "
1770: 50 61 73 73 77 6f 72 64 20 66 6f 72 20 4b 65 79  Password for Key
1780: 20 28 24 7b 53 49 54 45 5f 4b 45 59 5f 46 49 4c   (${SITE_KEY_FIL
1790: 45 7d 29 3a 20 22 20 53 49 54 45 5f 50 41 53 53  E}): " SITE_PASS
17a0: 57 4f 52 44 0a 09 65 6c 73 65 0a 09 09 53 49 54  WORD..else...SIT
17b0: 45 5f 50 41 53 53 57 4f 52 44 3d 22 22 0a 09 66  E_PASSWORD=""..f
17c0: 69 0a 0a 09 65 78 70 6f 72 74 20 53 49 54 45 5f  i...export SITE_
17d0: 49 4e 44 45 58 5f 46 49 4c 45 20 53 49 54 45 5f  INDEX_FILE SITE_
17e0: 4b 45 59 5f 46 49 4c 45 20 53 49 54 45 5f 43 45  KEY_FILE SITE_CE
17f0: 52 54 5f 46 49 4c 45 20 53 49 54 45 5f 50 41 53  RT_FILE SITE_PAS
1800: 53 57 4f 52 44 0a 0a 09 63 61 6c 6c 5f 61 70 70  SWORD...call_app
1810: 66 73 64 20 2d 2d 74 63 6c 20 22 24 28 63 61 74  fsd --tcl "$(cat
1820: 20 3c 3c 5c 5f 45 4f 46 5f 0a 70 61 63 6b 61 67   <<\_EOF_.packag
1830: 65 20 72 65 71 75 69 72 65 20 70 6b 69 0a 0a 73  e require pki..s
1840: 65 74 20 66 64 20 5b 6f 70 65 6e 20 24 3a 3a 65  et fd [open $::e
1850: 6e 76 28 53 49 54 45 5f 49 4e 44 45 58 5f 46 49  nv(SITE_INDEX_FI
1860: 4c 45 29 5d 0a 67 65 74 73 20 24 66 64 20 6c 69  LE)].gets $fd li
1870: 6e 65 0a 63 6c 6f 73 65 20 24 66 64 0a 0a 73 65  ne.close $fd..se
1880: 74 20 6c 69 6e 65 20 5b 73 70 6c 69 74 20 24 6c  t line [split $l
1890: 69 6e 65 20 22 2c 22 5d 0a 0a 23 20 44 61 74 61  ine ","]..# Data
18a0: 20 74 6f 20 62 65 20 73 69 67 6e 65 64 0a 73 65   to be signed.se
18b0: 74 20 64 61 74 61 20 5b 6a 6f 69 6e 20 5b 6c 72  t data [join [lr
18c0: 61 6e 67 65 20 24 6c 69 6e 65 20 30 20 31 5d 20  ange $line 0 1] 
18d0: 22 2c 22 5d 0a 0a 73 65 74 20 6b 65 79 20 5b 72  ","]..set key [r
18e0: 65 61 64 20 5b 6f 70 65 6e 20 24 3a 3a 65 6e 76  ead [open $::env
18f0: 28 53 49 54 45 5f 4b 45 59 5f 46 49 4c 45 29 5d  (SITE_KEY_FILE)]
1900: 5d 0a 73 65 74 20 6b 65 79 20 5b 3a 3a 70 6b 69  ].set key [::pki
1910: 3a 3a 70 6b 63 73 3a 3a 70 61 72 73 65 5f 6b 65  ::pkcs::parse_ke
1920: 79 20 24 6b 65 79 20 24 3a 3a 65 6e 76 28 53 49  y $key $::env(SI
1930: 54 45 5f 50 41 53 53 57 4f 52 44 29 5d 0a 0a 73  TE_PASSWORD)]..s
1940: 65 74 20 63 65 72 74 20 5b 72 65 61 64 20 5b 6f  et cert [read [o
1950: 70 65 6e 20 24 3a 3a 65 6e 76 28 53 49 54 45 5f  pen $::env(SITE_
1960: 43 45 52 54 5f 46 49 4c 45 29 5d 5d 0a 61 72 72  CERT_FILE)]].arr
1970: 61 79 20 73 65 74 20 63 65 72 74 5f 61 72 72 20  ay set cert_arr 
1980: 5b 3a 3a 70 6b 69 3a 3a 5f 70 61 72 73 65 5f 70  [::pki::_parse_p
1990: 65 6d 20 24 63 65 72 74 20 22 2d 2d 2d 2d 2d 42  em $cert "-----B
19a0: 45 47 49 4e 20 43 45 52 54 49 46 49 43 41 54 45  EGIN CERTIFICATE
19b0: 2d 2d 2d 2d 2d 22 20 22 2d 2d 2d 2d 2d 45 4e 44  -----" "-----END
19c0: 20 43 45 52 54 49 46 49 43 41 54 45 2d 2d 2d 2d   CERTIFICATE----
19d0: 2d 22 5d 0a 62 69 6e 61 72 79 20 73 63 61 6e 20  -"].binary scan 
19e0: 24 63 65 72 74 5f 61 72 72 28 64 61 74 61 29 20  $cert_arr(data) 
19f0: 48 2a 20 63 65 72 74 0a 0a 73 65 74 20 73 69 67  H* cert..set sig
1a00: 6e 61 74 75 72 65 20 5b 3a 3a 70 6b 69 3a 3a 73  nature [::pki::s
1a10: 69 67 6e 20 24 64 61 74 61 20 24 6b 65 79 5d 0a  ign $data $key].
1a20: 62 69 6e 61 72 79 20 73 63 61 6e 20 24 73 69 67  binary scan $sig
1a30: 6e 61 74 75 72 65 20 48 2a 20 73 69 67 6e 61 74  nature H* signat
1a40: 75 72 65 0a 0a 73 65 74 20 64 61 74 61 20 5b 73  ure..set data [s
1a50: 70 6c 69 74 20 24 64 61 74 61 20 22 2c 22 5d 0a  plit $data ","].
1a60: 6c 61 70 70 65 6e 64 20 64 61 74 61 20 24 63 65  lappend data $ce
1a70: 72 74 0a 6c 61 70 70 65 6e 64 20 64 61 74 61 20  rt.lappend data 
1a80: 24 73 69 67 6e 61 74 75 72 65 0a 0a 73 65 74 20  $signature..set 
1a90: 64 61 74 61 20 5b 6a 6f 69 6e 20 24 64 61 74 61  data [join $data
1aa0: 20 22 2c 22 5d 0a 0a 69 66 20 7b 21 5b 69 6e 66   ","]..if {![inf
1ab0: 6f 20 65 78 69 73 74 73 20 3a 3a 65 6e 76 28 41  o exists ::env(A
1ac0: 50 50 46 53 5f 53 49 47 4e 5f 49 4e 5f 50 4c 41  PPFS_SIGN_IN_PLA
1ad0: 43 45 29 5d 7d 20 7b 0a 09 73 65 74 20 66 64 20  CE)]} {..set fd 
1ae0: 5b 6f 70 65 6e 20 22 24 3a 3a 65 6e 76 28 53 49  [open "$::env(SI
1af0: 54 45 5f 49 4e 44 45 58 5f 46 49 4c 45 29 2e 6e  TE_INDEX_FILE).n
1b00: 65 77 22 20 22 77 22 20 30 36 34 34 5d 0a 09 70  ew" "w" 0644]..p
1b10: 75 74 73 20 24 66 64 20 24 64 61 74 61 0a 09 63  uts $fd $data..c
1b20: 6c 6f 73 65 20 24 66 64 0a 0a 09 66 69 6c 65 20  lose $fd...file 
1b30: 72 65 6e 61 6d 65 20 2d 66 6f 72 63 65 20 2d 2d  rename -force --
1b40: 20 22 24 3a 3a 65 6e 76 28 53 49 54 45 5f 49 4e   "$::env(SITE_IN
1b50: 44 45 58 5f 46 49 4c 45 29 2e 6e 65 77 22 20 24  DEX_FILE).new" $
1b60: 3a 3a 65 6e 76 28 53 49 54 45 5f 49 4e 44 45 58  ::env(SITE_INDEX
1b70: 5f 46 49 4c 45 29 0a 7d 20 65 6c 73 65 20 7b 0a  _FILE).} else {.
1b80: 09 73 65 74 20 66 64 20 5b 6f 70 65 6e 20 22 24  .set fd [open "$
1b90: 3a 3a 65 6e 76 28 53 49 54 45 5f 49 4e 44 45 58  ::env(SITE_INDEX
1ba0: 5f 46 49 4c 45 29 22 20 22 77 22 20 30 36 34 34  _FILE)" "w" 0644
1bb0: 5d 0a 09 70 75 74 73 20 24 66 64 20 24 64 61 74  ]..puts $fd $dat
1bc0: 61 0a 09 63 6c 6f 73 65 20 24 66 64 0a 7d 0a 0a  a..close $fd.}..
1bd0: 5f 45 4f 46 5f 0a 29 22 0a 7d 0a 0a 63 6d 64 3d  _EOF_.)".}..cmd=
1be0: 22 24 31 22 0a 73 68 69 66 74 0a 63 61 73 65 20  "$1".shift.case 
1bf0: 22 24 7b 63 6d 64 7d 22 20 69 6e 0a 09 67 65 6e  "${cmd}" in..gen
1c00: 65 72 61 74 65 2d 63 61 29 0a 09 09 67 65 6e 65  erate-ca)...gene
1c10: 72 61 74 65 5f 63 61 5f 63 65 72 74 5f 61 6e 64  rate_ca_cert_and
1c20: 5f 6b 65 79 20 22 24 40 22 20 7c 7c 20 65 78 69  _key "$@" || exi
1c30: 74 20 31 0a 09 09 3b 3b 0a 09 67 65 6e 65 72 61  t 1...;;..genera
1c40: 74 65 2d 6b 65 79 29 0a 09 09 23 20 48 69 64 64  te-key)...# Hidd
1c50: 65 6e 2c 20 75 73 65 72 73 20 73 68 6f 75 6c 64  en, users should
1c60: 20 75 73 65 20 22 67 65 6e 65 72 61 74 65 2d 63   use "generate-c
1c70: 73 72 22 20 69 6e 73 74 65 61 64 0a 09 09 67 65  sr" instead...ge
1c80: 6e 65 72 61 74 65 5f 6b 65 79 20 22 24 40 22 20  nerate_key "$@" 
1c90: 7c 7c 20 65 78 69 74 20 31 0a 09 09 3b 3b 0a 09  || exit 1...;;..
1ca0: 67 65 6e 65 72 61 74 65 2d 63 73 72 29 0a 09 09  generate-csr)...
1cb0: 67 65 6e 65 72 61 74 65 5f 63 73 72 20 22 24 40  generate_csr "$@
1cc0: 22 20 7c 7c 20 65 78 69 74 20 31 0a 09 09 3b 3b  " || exit 1...;;
1cd0: 0a 09 73 69 67 6e 2d 63 73 72 7c 67 65 6e 65 72  ..sign-csr|gener
1ce0: 61 74 65 2d 63 65 72 74 29 0a 09 09 67 65 6e 65  ate-cert)...gene
1cf0: 72 61 74 65 5f 63 65 72 74 20 22 24 40 22 20 7c  rate_cert "$@" |
1d00: 7c 20 65 78 69 74 20 31 0a 09 09 3b 3b 0a 09 67  | exit 1...;;..g
1d10: 65 6e 65 72 61 74 65 2d 73 65 6c 66 73 69 67 6e  enerate-selfsign
1d20: 65 64 29 0a 09 09 67 65 6e 65 72 61 74 65 5f 73  ed)...generate_s
1d30: 65 6c 66 73 69 67 6e 65 64 20 22 24 40 22 20 7c  elfsigned "$@" |
1d40: 7c 20 65 78 69 74 20 31 0a 09 09 3b 3b 0a 09 73  | exit 1...;;..s
1d50: 69 67 6e 2d 73 69 74 65 29 0a 09 09 73 69 67 6e  ign-site)...sign
1d60: 5f 73 69 74 65 20 22 24 40 22 20 7c 7c 20 65 78  _site "$@" || ex
1d70: 69 74 20 31 0a 09 09 3b 3b 0a 09 2a 29 0a 09 09  it 1...;;..*)...
1d80: 65 63 68 6f 20 27 55 73 61 67 65 3a 20 61 70 70  echo 'Usage: app
1d90: 66 73 2d 63 65 72 74 20 7b 67 65 6e 65 72 61 74  fs-cert {generat
1da0: 65 2d 73 65 6c 66 73 69 67 6e 65 64 7c 67 65 6e  e-selfsigned|gen
1db0: 65 72 61 74 65 2d 63 61 7c 67 65 6e 65 72 61 74  erate-ca|generat
1dc0: 65 2d 63 73 72 7c 73 69 67 6e 2d 63 73 72 7c 67  e-csr|sign-csr|g
1dd0: 65 6e 65 72 61 74 65 2d 63 65 72 74 7c 73 69 67  enerate-cert|sig
1de0: 6e 2d 73 69 74 65 7d 27 20 3e 26 32 0a 0a 09 09  n-site}' >&2....
1df0: 65 78 69 74 20 31 0a 09 09 3b 3b 0a 65 73 61 63  exit 1...;;.esac
1e00: 0a 0a 65 78 69 74 20 30 0a                       ..exit 0.