Hex Artifact Content

Artifact f15837cdac5cc308a033e61550632189b08885f60d4bcdb6bd3c69a1901b59cb:


0000: 2f 2a 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20  /*. * Copyright 
0010: 28 43 29 20 31 39 39 37 2d 31 39 39 39 20 4d 61  (C) 1997-1999 Ma
0020: 74 74 20 4e 65 77 6d 61 6e 20 3c 6d 61 74 74 40  tt Newman <matt@
0030: 6e 6f 76 61 64 69 67 6d 2e 63 6f 6d 3e 0a 20 2a  novadigm.com>. *
0040: 20 73 6f 6d 65 20 6d 6f 64 69 66 69 63 61 74 69   some modificati
0050: 6f 6e 73 3a 0a 20 2a 09 43 6f 70 79 72 69 67 68  ons:. *.Copyrigh
0060: 74 20 28 43 29 20 32 30 30 30 20 41 6a 75 62 61  t (C) 2000 Ajuba
0070: 20 53 6f 6c 75 74 69 6f 6e 73 0a 20 2a 09 43 6f   Solutions. *.Co
0080: 70 79 72 69 67 68 74 20 28 43 29 20 32 30 30 32  pyright (C) 2002
0090: 20 41 63 74 69 76 65 53 74 61 74 65 20 43 6f 72   ActiveState Cor
00a0: 70 6f 72 61 74 69 6f 6e 0a 20 2a 09 43 6f 70 79  poration. *.Copy
00b0: 72 69 67 68 74 20 28 43 29 20 32 30 30 34 20 53  right (C) 2004 S
00c0: 74 61 72 66 69 73 68 20 53 79 73 74 65 6d 73 0a  tarfish Systems.
00d0: 20 2a 09 43 6f 70 79 72 69 67 68 74 20 28 43 29   *.Copyright (C)
00e0: 20 32 30 32 33 20 42 72 69 61 6e 20 4f 27 48 61   2023 Brian O'Ha
00f0: 67 61 6e 0a 20 2a 0a 20 2a 20 54 4c 53 20 28 61  gan. *. * TLS (a
0100: 6b 61 20 53 53 4c 29 20 43 68 61 6e 6e 65 6c 20  ka SSL) Channel 
0110: 2d 20 63 61 6e 20 62 65 20 6c 61 79 65 72 65 64  - can be layered
0120: 20 6f 6e 20 61 6e 79 20 62 69 2d 64 69 72 65 63   on any bi-direc
0130: 74 69 6f 6e 61 6c 0a 20 2a 20 54 63 6c 5f 43 68  tional. * Tcl_Ch
0140: 61 6e 6e 65 6c 20 28 4e 6f 74 65 3a 20 52 65 71  annel (Note: Req
0150: 75 69 72 65 73 20 54 72 66 20 43 6f 72 65 20 50  uires Trf Core P
0160: 61 74 63 68 29 0a 20 2a 0a 20 2a 20 54 68 69 73  atch). *. * This
0170: 20 77 61 73 20 62 75 69 6c 74 20 28 61 6c 6d 6f   was built (almo
0180: 73 74 29 20 66 72 6f 6d 20 73 63 72 61 74 63 68  st) from scratch
0190: 20 62 61 73 65 64 20 75 70 6f 6e 20 6f 62 73 65   based upon obse
01a0: 72 76 61 74 69 6f 6e 20 6f 66 0a 20 2a 20 4f 70  rvation of. * Op
01b0: 65 6e 53 53 4c 20 30 2e 39 2e 32 42 0a 20 2a 0a  enSSL 0.9.2B. *.
01c0: 20 2a 20 41 64 64 69 74 69 6f 6e 20 63 72 65 64   * Addition cred
01d0: 69 74 20 69 73 20 64 75 65 20 66 6f 72 20 41 6e  it is due for An
01e0: 64 72 65 61 73 20 4b 75 70 72 69 65 73 20 28 61  dreas Kupries (a
01f0: 2e 6b 75 70 72 69 65 73 40 77 65 73 74 65 6e 64  .kupries@westend
0200: 2e 63 6f 6d 29 2c 20 66 6f 72 0a 20 2a 20 70 72  .com), for. * pr
0210: 6f 76 69 64 69 6e 67 20 74 68 65 20 54 63 6c 5f  oviding the Tcl_
0220: 52 65 70 6c 61 63 65 43 68 61 6e 6e 65 6c 20 6d  ReplaceChannel m
0230: 65 63 68 61 6e 69 73 6d 20 61 6e 64 20 77 6f 72  echanism and wor
0240: 6b 69 6e 67 20 63 6c 6f 73 65 6c 79 20 77 69 74  king closely wit
0250: 68 20 6d 65 0a 20 2a 20 74 6f 20 65 6e 68 61 6e  h me. * to enhan
0260: 63 65 20 69 74 20 74 6f 20 73 75 70 70 6f 72 74  ce it to support
0270: 20 66 75 6c 6c 20 66 69 6c 65 65 76 65 6e 74 20   full fileevent 
0280: 73 65 6d 61 6e 74 69 63 73 2e 0a 20 2a 0a 20 2a  semantics.. *. *
0290: 20 41 6c 73 6f 20 77 6f 72 6b 20 64 6f 6e 65 20   Also work done 
02a0: 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77 20 70 65  by the follow pe
02b0: 6f 70 6c 65 20 70 72 6f 76 69 64 65 64 20 74 68  ople provided th
02c0: 65 20 69 6d 70 65 74 75 73 20 74 6f 20 64 6f 20  e impetus to do 
02d0: 74 68 69 73 20 22 72 69 67 68 74 22 3a 0a 20 2a  this "right":. *
02e0: 09 74 63 6c 53 53 4c 20 28 43 6f 6c 69 6e 20 4d  .tclSSL (Colin M
02f0: 63 43 6f 72 6d 61 63 6b 2c 20 53 68 61 72 65 64  cCormack, Shared
0300: 20 54 65 63 68 6e 6f 6c 6f 67 79 29 0a 20 2a 09   Technology). *.
0310: 53 53 4c 74 63 6c 20 28 50 65 74 65 72 20 41 6e  SSLtcl (Peter An
0320: 74 6d 61 6e 29 0a 20 2a 0a 20 2a 2f 0a 0a 23 69  tman). *. */..#i
0330: 6e 63 6c 75 64 65 20 22 74 6c 73 49 6e 74 2e 68  nclude "tlsInt.h
0340: 22 0a 23 69 6e 63 6c 75 64 65 20 22 74 63 6c 4f  ".#include "tclO
0350: 70 74 73 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  pts.h".#include 
0360: 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75  <stdio.h>.#inclu
0370: 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69  de <stdlib.h>.#i
0380: 6e 63 6c 75 64 65 20 22 74 6c 73 55 75 69 64 2e  nclude "tlsUuid.
0390: 68 22 0a 0a 2f 2a 20 4d 69 6e 20 4f 70 65 6e 53  h"../* Min OpenS
03a0: 53 4c 20 76 65 72 73 69 6f 6e 20 2a 2f 0a 23 69  SL version */.#i
03b0: 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f  f OPENSSL_VERSIO
03c0: 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31  N_NUMBER < 0x101
03d0: 30 31 30 30 30 4c 0a 23 65 72 72 6f 72 20 22 4f  01000L.#error "O
03e0: 6e 6c 79 20 4f 70 65 6e 53 53 4c 20 76 31 2e 31  nly OpenSSL v1.1
03f0: 2e 31 20 6f 72 20 6c 61 74 65 72 20 69 73 20 73  .1 or later is s
0400: 75 70 70 6f 72 74 65 64 22 0a 23 65 6e 64 69 66  upported".#endif
0410: 0a 0a 2f 2a 0a 20 2a 20 45 78 74 65 72 6e 61 6c  ../*. * External
0420: 20 66 75 6e 63 74 69 6f 6e 73 0a 20 2a 2f 0a 0a   functions. */..
0430: 2f 2a 0a 20 2a 20 46 6f 72 77 61 72 64 20 64 65  /*. * Forward de
0440: 63 6c 61 72 61 74 69 6f 6e 73 0a 20 2a 2f 0a 0a  clarations. */..
0450: 23 64 65 66 69 6e 65 20 46 32 4e 28 6b 65 79 2c  #define F2N(key,
0460: 20 64 73 70 29 20 5c 0a 09 28 28 28 6b 65 79 29   dsp) \..(((key)
0470: 20 3d 3d 20 4e 55 4c 4c 29 20 3f 20 28 63 68 61   == NULL) ? (cha
0480: 72 20 2a 29 4e 55 4c 4c 20 3a 20 5c 0a 09 09 54  r *)NULL : \...T
0490: 63 6c 5f 54 72 61 6e 73 6c 61 74 65 46 69 6c 65  cl_TranslateFile
04a0: 4e 61 6d 65 28 69 6e 74 65 72 70 2c 20 28 6b 65  Name(interp, (ke
04b0: 79 29 2c 20 28 64 73 70 29 29 29 0a 23 64 65 66  y), (dsp))).#def
04c0: 69 6e 65 20 52 45 41 53 4f 4e 28 29 09 45 52 52  ine REASON().ERR
04d0: 5f 72 65 61 73 6f 6e 5f 65 72 72 6f 72 5f 73 74  _reason_error_st
04e0: 72 69 6e 67 28 45 52 52 5f 67 65 74 5f 65 72 72  ring(ERR_get_err
04f0: 6f 72 28 29 29 0a 0a 73 74 61 74 69 63 20 76 6f  or())..static vo
0500: 69 64 09 49 6e 66 6f 43 61 6c 6c 62 61 63 6b 28  id.InfoCallback(
0510: 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20  const SSL *ssl, 
0520: 69 6e 74 20 77 68 65 72 65 2c 20 69 6e 74 20 72  int where, int r
0530: 65 74 29 3b 0a 0a 73 74 61 74 69 63 20 54 63 6c  et);..static Tcl
0540: 5f 4f 62 6a 43 6d 64 50 72 6f 63 20 43 69 70 68  _ObjCmdProc Ciph
0550: 65 72 73 4f 62 6a 43 6d 64 3b 0a 73 74 61 74 69  ersObjCmd;.stati
0560: 63 20 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63  c Tcl_ObjCmdProc
0570: 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64   HandshakeObjCmd
0580: 3b 0a 73 74 61 74 69 63 20 54 63 6c 5f 4f 62 6a  ;.static Tcl_Obj
0590: 43 6d 64 50 72 6f 63 20 49 6d 70 6f 72 74 4f 62  CmdProc ImportOb
05a0: 6a 43 6d 64 3b 0a 73 74 61 74 69 63 20 54 63 6c  jCmd;.static Tcl
05b0: 5f 4f 62 6a 43 6d 64 50 72 6f 63 20 53 74 61 74  _ObjCmdProc Stat
05c0: 75 73 4f 62 6a 43 6d 64 3b 0a 73 74 61 74 69 63  usObjCmd;.static
05d0: 20 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 20   Tcl_ObjCmdProc 
05e0: 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 3b 0a 73  VersionObjCmd;.s
05f0: 74 61 74 69 63 20 54 63 6c 5f 4f 62 6a 43 6d 64  tatic Tcl_ObjCmd
0600: 50 72 6f 63 20 4d 69 73 63 4f 62 6a 43 6d 64 3b  Proc MiscObjCmd;
0610: 0a 73 74 61 74 69 63 20 54 63 6c 5f 4f 62 6a 43  .static Tcl_ObjC
0620: 6d 64 50 72 6f 63 20 55 6e 69 6d 70 6f 72 74 4f  mdProc UnimportO
0630: 62 6a 43 6d 64 3b 0a 0a 73 74 61 74 69 63 20 53  bjCmd;..static S
0640: 53 4c 5f 43 54 58 20 2a 43 54 58 5f 49 6e 69 74  SL_CTX *CTX_Init
0650: 28 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72  (State *statePtr
0660: 2c 20 69 6e 74 20 69 73 53 65 72 76 65 72 2c 20  , int isServer, 
0670: 69 6e 74 20 70 72 6f 74 6f 2c 20 63 68 61 72 20  int proto, char 
0680: 2a 6b 65 79 2c 0a 09 09 63 68 61 72 20 2a 63 65  *key,...char *ce
0690: 72 74 66 69 6c 65 2c 20 75 6e 73 69 67 6e 65 64  rtfile, unsigned
06a0: 20 63 68 61 72 20 2a 6b 65 79 5f 61 73 6e 31 2c   char *key_asn1,
06b0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
06c0: 63 65 72 74 5f 61 73 6e 31 2c 0a 09 09 69 6e 74  cert_asn1,...int
06d0: 20 6b 65 79 5f 61 73 6e 31 5f 6c 65 6e 2c 20 69   key_asn1_len, i
06e0: 6e 74 20 63 65 72 74 5f 61 73 6e 31 5f 6c 65 6e  nt cert_asn1_len
06f0: 2c 20 63 68 61 72 20 2a 43 41 64 69 72 2c 20 63  , char *CAdir, c
0700: 68 61 72 20 2a 43 41 66 69 6c 65 2c 0a 09 09 63  har *CAfile,...c
0710: 68 61 72 20 2a 63 69 70 68 65 72 73 2c 20 63 68  har *ciphers, ch
0720: 61 72 20 2a 44 48 70 61 72 61 6d 73 29 3b 0a 0a  ar *DHparams);..
0730: 73 74 61 74 69 63 20 69 6e 74 09 54 6c 73 4c 69  static int.TlsLi
0740: 62 49 6e 69 74 28 69 6e 74 20 75 6e 69 6e 69 74  bInit(int uninit
0750: 69 61 6c 69 7a 65 29 3b 0a 0a 23 64 65 66 69 6e  ialize);..#defin
0760: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32  e TLS_PROTO_SSL2
0770: 09 09 30 78 30 31 0a 23 64 65 66 69 6e 65 20 54  ..0x01.#define T
0780: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 09 09 30  LS_PROTO_SSL3..0
0790: 78 30 32 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f  x02.#define TLS_
07a0: 50 52 4f 54 4f 5f 54 4c 53 31 09 09 30 78 30 34  PROTO_TLS1..0x04
07b0: 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f  .#define TLS_PRO
07c0: 54 4f 5f 54 4c 53 31 5f 31 09 30 78 30 38 0a 23  TO_TLS1_1.0x08.#
07d0: 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f  define TLS_PROTO
07e0: 5f 54 4c 53 31 5f 32 09 30 78 31 30 0a 23 64 65  _TLS1_2.0x10.#de
07f0: 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  fine TLS_PROTO_T
0800: 4c 53 31 5f 33 09 30 78 32 30 0a 23 64 65 66 69  LS1_3.0x20.#defi
0810: 6e 65 20 45 4e 41 42 4c 45 44 28 66 6c 61 67 2c  ne ENABLED(flag,
0820: 20 6d 61 73 6b 29 09 28 28 28 66 6c 61 67 29 20   mask).(((flag) 
0830: 26 20 28 6d 61 73 6b 29 29 20 3d 3d 20 28 6d 61  & (mask)) == (ma
0840: 73 6b 29 29 0a 0a 2f 2a 0a 20 2a 20 57 65 20 6c  sk))../*. * We l
0850: 6f 73 65 20 74 68 65 20 74 63 6c 20 70 61 73 73  ose the tcl pass
0860: 77 6f 72 64 20 63 61 6c 6c 62 61 63 6b 20 77 68  word callback wh
0870: 65 6e 20 77 65 20 75 73 65 20 74 68 65 20 52 53  en we use the RS
0880: 41 20 42 53 41 46 45 20 53 53 4c 2d 43 20 31 2e  A BSAFE SSL-C 1.
0890: 31 2e 32 0a 20 2a 20 6c 69 62 72 61 72 69 65 73  1.2. * libraries
08a0: 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20   instead of the 
08b0: 63 75 72 72 65 6e 74 20 4f 70 65 6e 53 53 4c 20  current OpenSSL 
08c0: 6c 69 62 72 61 72 69 65 73 2e 0a 20 2a 2f 0a 0a  libraries.. */..
08d0: 23 69 66 64 65 66 20 42 53 41 46 45 0a 23 64 65  #ifdef BSAFE.#de
08e0: 66 69 6e 65 20 50 52 45 5f 4f 50 45 4e 53 53 4c  fine PRE_OPENSSL
08f0: 5f 30 5f 39 5f 34 20 31 0a 23 65 6e 64 69 66 0a  _0_9_4 1.#endif.
0900: 0a 2f 2a 0a 20 2a 20 50 72 65 20 4f 70 65 6e 53  ./*. * Pre OpenS
0910: 53 4c 20 30 2e 39 2e 34 20 43 6f 6d 70 61 74 0a  SL 0.9.4 Compat.
0920: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 54 41   */..#ifndef STA
0930: 43 4b 5f 4f 46 0a 23 64 65 66 69 6e 65 20 53 54  CK_OF.#define ST
0940: 41 43 4b 5f 4f 46 28 78 29 09 09 09 53 54 41 43  ACK_OF(x)...STAC
0950: 4b 0a 23 64 65 66 69 6e 65 20 73 6b 5f 53 53 4c  K.#define sk_SSL
0960: 5f 43 49 50 48 45 52 5f 6e 75 6d 28 73 6b 29 09  _CIPHER_num(sk).
0970: 09 73 6b 5f 6e 75 6d 28 28 73 6b 29 29 0a 23 64  .sk_num((sk)).#d
0980: 65 66 69 6e 65 20 73 6b 5f 53 53 4c 5f 43 49 50  efine sk_SSL_CIP
0990: 48 45 52 5f 76 61 6c 75 65 28 20 73 6b 2c 20 69  HER_value( sk, i
09a0: 6e 64 65 78 29 09 28 53 53 4c 5f 43 49 50 48 45  ndex).(SSL_CIPHE
09b0: 52 2a 29 73 6b 5f 76 61 6c 75 65 28 28 73 6b 29  R*)sk_value((sk)
09c0: 2c 20 28 69 6e 64 65 78 29 29 0a 23 65 6e 64 69  , (index)).#endi
09d0: 66 0a 0a 2f 2a 0a 20 2a 20 54 68 72 65 61 64 2d  f../*. * Thread-
09e0: 53 61 66 65 20 54 4c 53 20 43 6f 64 65 0a 20 2a  Safe TLS Code. *
09f0: 2f 0a 0a 23 69 66 64 65 66 20 54 43 4c 5f 54 48  /..#ifdef TCL_TH
0a00: 52 45 41 44 53 0a 23 64 65 66 69 6e 65 20 4f 50  READS.#define OP
0a10: 45 4e 53 53 4c 5f 54 48 52 45 41 44 5f 44 45 46  ENSSL_THREAD_DEF
0a20: 49 4e 45 53 0a 23 69 6e 63 6c 75 64 65 20 3c 6f  INES.#include <o
0a30: 70 65 6e 73 73 6c 2f 6f 70 65 6e 73 73 6c 63 6f  penssl/opensslco
0a40: 6e 66 2e 68 3e 0a 0a 23 69 66 64 65 66 20 4f 50  nf.h>..#ifdef OP
0a50: 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 0a 23 69  ENSSL_THREADS.#i
0a60: 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f  nclude <openssl/
0a70: 63 72 79 70 74 6f 2e 68 3e 0a 0a 2f 2a 0a 20 2a  crypto.h>../*. *
0a80: 20 54 68 72 65 61 64 65 64 20 6f 70 65 72 61 74   Threaded operat
0a90: 69 6f 6e 20 72 65 71 75 69 72 65 73 20 6c 6f 63  ion requires loc
0aa0: 6b 69 6e 67 20 63 61 6c 6c 62 61 63 6b 73 0a 20  king callbacks. 
0ab0: 2a 20 42 61 73 65 64 20 66 72 6f 6d 20 2f 63 72  * Based from /cr
0ac0: 79 70 74 6f 2f 63 72 79 70 74 6c 69 62 2e 63 20  ypto/cryptlib.c 
0ad0: 6f 66 20 4f 70 65 6e 53 53 4c 20 61 6e 64 20 4e  of OpenSSL and N
0ae0: 53 4f 70 65 6e 53 53 4c 2e 0a 20 2a 2f 0a 0a 73  SOpenSSL.. */..s
0af0: 74 61 74 69 63 20 54 63 6c 5f 4d 75 74 65 78 20  tatic Tcl_Mutex 
0b00: 2a 6c 6f 63 6b 73 20 3d 20 4e 55 4c 4c 3b 0a 73  *locks = NULL;.s
0b10: 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 73 43  tatic int locksC
0b20: 6f 75 6e 74 20 3d 20 30 3b 0a 73 74 61 74 69 63  ount = 0;.static
0b30: 20 54 63 6c 5f 4d 75 74 65 78 20 69 6e 69 74 5f   Tcl_Mutex init_
0b40: 6d 78 3b 0a 0a 76 6f 69 64 20 43 72 79 70 74 6f  mx;..void Crypto
0b50: 54 68 72 65 61 64 4c 6f 63 6b 43 61 6c 6c 62 61  ThreadLockCallba
0b60: 63 6b 28 0a 20 20 20 20 69 6e 74 20 6d 6f 64 65  ck(.    int mode
0b70: 2c 0a 20 20 20 20 69 6e 74 20 6e 2c 0a 20 20 20  ,.    int n,.   
0b80: 20 54 43 4c 5f 55 4e 55 53 45 44 28 63 6f 6e 73   TCL_UNUSED(cons
0b90: 74 20 63 68 61 72 20 2a 29 2c 0a 20 20 20 20 54  t char *),.    T
0ba0: 43 4c 5f 55 4e 55 53 45 44 28 69 6e 74 29 29 0a  CL_UNUSED(int)).
0bb0: 7b 0a 09 69 66 20 28 6d 6f 64 65 20 26 20 43 52  {..if (mode & CR
0bc0: 59 50 54 4f 5f 4c 4f 43 4b 29 20 7b 0a 09 09 2f  YPTO_LOCK) {.../
0bd0: 2a 20 54 68 69 73 20 64 65 62 75 67 67 69 6e 67  * This debugging
0be0: 20 69 73 20 74 75 72 6e 65 64 20 6f 66 66 20 62   is turned off b
0bf0: 79 20 64 65 66 61 75 6c 74 20 2d 2d 20 69 74 27  y default -- it'
0c00: 73 20 74 6f 6f 20 6e 6f 69 73 79 2e 20 2a 2f 0a  s too noisy. */.
0c10: 09 09 2f 2a 20 64 70 72 69 6e 74 66 28 22 43 61  ../* dprintf("Ca
0c20: 6c 6c 65 64 20 74 6f 20 6c 6f 63 6b 20 28 6e 3d  lled to lock (n=
0c30: 25 69 20 6f 66 20 25 69 29 22 2c 20 6e 2c 20 6c  %i of %i)", n, l
0c40: 6f 63 6b 73 43 6f 75 6e 74 29 3b 20 2a 2f 0a 09  ocksCount); */..
0c50: 09 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28 26  .Tcl_MutexLock(&
0c60: 6c 6f 63 6b 73 5b 6e 5d 29 3b 0a 09 7d 20 65 6c  locks[n]);..} el
0c70: 73 65 20 7b 0a 09 09 2f 2a 20 64 70 72 69 6e 74  se {.../* dprint
0c80: 66 28 22 43 61 6c 6c 65 64 20 74 6f 20 75 6e 6c  f("Called to unl
0c90: 6f 63 6b 20 28 6e 3d 25 69 20 6f 66 20 25 69 29  ock (n=%i of %i)
0ca0: 22 2c 20 6e 2c 20 6c 6f 63 6b 73 43 6f 75 6e 74  ", n, locksCount
0cb0: 29 3b 20 2a 2f 0a 09 09 54 63 6c 5f 4d 75 74 65  ); */...Tcl_Mute
0cc0: 78 55 6e 6c 6f 63 6b 28 26 6c 6f 63 6b 73 5b 6e  xUnlock(&locks[n
0cd0: 5d 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 64 70 72 69  ]);..}.../* dpri
0ce0: 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 22 29  ntf("Returning")
0cf0: 3b 20 2a 2f 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d  ; */...return;.}
0d00: 0a 0a 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  ..unsigned long 
0d10: 43 72 79 70 74 6f 54 68 72 65 61 64 49 64 43 61  CryptoThreadIdCa
0d20: 6c 6c 62 61 63 6b 28 76 6f 69 64 29 20 7b 0a 09  llback(void) {..
0d30: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 72 65  unsigned long re
0d40: 74 3b 0a 0a 09 64 70 72 69 6e 74 66 28 22 43 61  t;...dprintf("Ca
0d50: 6c 6c 65 64 22 29 3b 0a 0a 09 72 65 74 20 3d 20  lled");...ret = 
0d60: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
0d70: 54 63 6c 5f 47 65 74 43 75 72 72 65 6e 74 54 68  Tcl_GetCurrentTh
0d80: 72 65 61 64 28 29 3b 0a 0a 09 64 70 72 69 6e 74  read();...dprint
0d90: 66 28 22 52 65 74 75 72 6e 69 6e 67 20 25 6c 75  f("Returning %lu
0da0: 22 2c 20 72 65 74 29 3b 0a 0a 09 72 65 74 75 72  ", ret);...retur
0db0: 6e 28 72 65 74 29 3b 0a 7d 0a 23 65 6e 64 69 66  n(ret);.}.#endif
0dc0: 20 2f 2a 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45   /* OPENSSL_THRE
0dd0: 41 44 53 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a  ADS */.#endif /*
0de0: 20 54 43 4c 5f 54 48 52 45 41 44 53 20 2a 2f 0a   TCL_THREADS */.
0df0: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
0e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
0e40: 2a 20 49 6e 66 6f 43 61 6c 6c 62 61 63 6b 20 2d  * InfoCallback -
0e50: 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69 74 6f 72 73  -. *. *.Monitors
0e60: 20 53 53 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   SSL connection 
0e70: 70 72 6f 63 65 73 73 0a 20 2a 0a 20 2a 20 52 65  process. *. * Re
0e80: 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20  sults:. *.None. 
0e90: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
0ea0: 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c  s:. *.Calls call
0eb0: 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64  back (if defined
0ec0: 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ). *. *---------
0ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73  ----------. */.s
0f10: 74 61 74 69 63 20 76 6f 69 64 0a 49 6e 66 6f 43  tatic void.InfoC
0f20: 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53  allback(const SS
0f30: 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 77 68 65 72  L *ssl, int wher
0f40: 65 2c 20 69 6e 74 20 72 65 74 29 0a 7b 0a 20 20  e, int ret).{.  
0f50: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74    State *statePt
0f60: 72 20 3d 20 28 53 74 61 74 65 2a 29 53 53 4c 5f  r = (State*)SSL_
0f70: 67 65 74 5f 61 70 70 5f 64 61 74 61 28 28 53 53  get_app_data((SS
0f80: 4c 20 2a 29 73 73 6c 29 3b 0a 20 20 20 20 54 63  L *)ssl);.    Tc
0f90: 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20  l_Obj *cmdPtr;. 
0fa0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d     const char *m
0fb0: 61 6a 6f 72 2c 20 2a 6d 69 6e 6f 72 3b 0a 0a 20  ajor, *minor;.. 
0fc0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
0fd0: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73  ed");..    if (s
0fe0: 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63  tatePtr->callbac
0ff0: 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e  k == (Tcl_Obj*)N
1000: 55 4c 4c 29 0a 09 72 65 74 75 72 6e 3b 0a 0a 20  ULL)..return;.. 
1010: 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f     cmdPtr = Tcl_
1020: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61  DuplicateObj(sta
1030: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29  tePtr->callback)
1040: 3b 0a 0a 23 69 66 20 30 0a 20 20 20 20 69 66 20  ;..#if 0.    if 
1050: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f  (where & SSL_CB_
1060: 41 4c 45 52 54 29 20 7b 0a 09 73 65 76 20 3d 20  ALERT) {..sev = 
1070: 53 53 4c 5f 61 6c 65 72 74 5f 74 79 70 65 5f 73  SSL_alert_type_s
1080: 74 72 69 6e 67 5f 6c 6f 6e 67 28 72 65 74 29 3b  tring_long(ret);
1090: 0a 09 69 66 20 28 73 74 72 63 6d 70 28 20 73 65  ..if (strcmp( se
10a0: 76 2c 20 22 66 61 74 61 6c 22 29 3d 3d 30 29 20  v, "fatal")==0) 
10b0: 7b 09 2f 2a 20 4d 61 70 20 74 6f 20 65 72 72 6f  {./* Map to erro
10c0: 72 20 2a 2f 0a 09 20 20 20 20 54 6c 73 5f 45 72  r */..    Tls_Er
10d0: 72 6f 72 28 73 74 61 74 65 50 74 72 2c 20 53 53  ror(statePtr, SS
10e0: 4c 5f 45 52 52 4f 52 28 73 73 6c 2c 20 30 29 29  L_ERROR(ssl, 0))
10f0: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 3b 0a 09  ;..    return;..
1100: 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  }.    }.#endif. 
1110: 20 20 20 69 66 20 28 77 68 65 72 65 20 26 20 53     if (where & S
1120: 53 4c 5f 43 42 5f 48 41 4e 44 53 48 41 4b 45 5f  SL_CB_HANDSHAKE_
1130: 53 54 41 52 54 29 20 7b 0a 09 6d 61 6a 6f 72 20  START) {..major 
1140: 3d 20 22 68 61 6e 64 73 68 61 6b 65 22 3b 0a 09  = "handshake";..
1150: 6d 69 6e 6f 72 20 3d 20 22 73 74 61 72 74 22 3b  minor = "start";
1160: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
1170: 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 48  where & SSL_CB_H
1180: 41 4e 44 53 48 41 4b 45 5f 44 4f 4e 45 29 20 7b  ANDSHAKE_DONE) {
1190: 0a 09 6d 61 6a 6f 72 20 3d 20 22 68 61 6e 64 73  ..major = "hands
11a0: 68 61 6b 65 22 3b 0a 09 6d 69 6e 6f 72 20 3d 20  hake";..minor = 
11b0: 22 64 6f 6e 65 22 3b 0a 20 20 20 20 7d 20 65 6c  "done";.    } el
11c0: 73 65 20 7b 0a 09 69 66 20 28 77 68 65 72 65 20  se {..if (where 
11d0: 26 20 53 53 4c 5f 43 42 5f 41 4c 45 52 54 29 09  & SSL_CB_ALERT).
11e0: 09 6d 61 6a 6f 72 20 3d 20 22 61 6c 65 72 74 22  .major = "alert"
11f0: 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 72  ;..else if (wher
1200: 65 20 26 20 53 53 4c 5f 53 54 5f 43 4f 4e 4e 45  e & SSL_ST_CONNE
1210: 43 54 29 09 6d 61 6a 6f 72 20 3d 20 22 63 6f 6e  CT).major = "con
1220: 6e 65 63 74 22 3b 0a 09 65 6c 73 65 20 69 66 20  nect";..else if 
1230: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 53 54 5f  (where & SSL_ST_
1240: 41 43 43 45 50 54 29 09 09 6d 61 6a 6f 72 20 3d  ACCEPT)..major =
1250: 20 22 61 63 63 65 70 74 22 3b 0a 09 65 6c 73 65   "accept";..else
1260: 09 09 09 09 09 6d 61 6a 6f 72 20 3d 20 22 75 6e  .....major = "un
1270: 6b 6e 6f 77 6e 22 3b 0a 0a 09 69 66 20 28 77 68  known";...if (wh
1280: 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 52 45 41  ere & SSL_CB_REA
1290: 44 29 09 09 6d 69 6e 6f 72 20 3d 20 22 72 65 61  D)..minor = "rea
12a0: 64 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68  d";..else if (wh
12b0: 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 57 52 49  ere & SSL_CB_WRI
12c0: 54 45 29 09 09 6d 69 6e 6f 72 20 3d 20 22 77 72  TE)..minor = "wr
12d0: 69 74 65 22 3b 0a 09 65 6c 73 65 20 69 66 20 28  ite";..else if (
12e0: 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 4c  where & SSL_CB_L
12f0: 4f 4f 50 29 09 09 6d 69 6e 6f 72 20 3d 20 22 6c  OOP)..minor = "l
1300: 6f 6f 70 22 3b 0a 09 65 6c 73 65 20 69 66 20 28  oop";..else if (
1310: 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 45  where & SSL_CB_E
1320: 58 49 54 29 09 09 6d 69 6e 6f 72 20 3d 20 22 65  XIT)..minor = "e
1330: 78 69 74 22 3b 0a 09 65 6c 73 65 09 09 09 09 09  xit";..else.....
1340: 6d 69 6e 6f 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e  minor = "unknown
1350: 22 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63  ";.    }..    Tc
1360: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
1370: 6c 65 6d 65 6e 74 28 20 73 74 61 74 65 50 74 72  lement( statePtr
1380: 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  ->interp, cmdPtr
1390: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74  ,..    Tcl_NewSt
13a0: 72 69 6e 67 4f 62 6a 28 20 22 69 6e 66 6f 22 2c  ringObj( "info",
13b0: 20 2d 31 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f   -1));..    Tcl_
13c0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
13d0: 6d 65 6e 74 28 20 73 74 61 74 65 50 74 72 2d 3e  ment( statePtr->
13e0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a  interp, cmdPtr,.
13f0: 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69  .    Tcl_NewStri
1400: 6e 67 4f 62 6a 28 20 54 63 6c 5f 47 65 74 43 68  ngObj( Tcl_GetCh
1410: 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50  annelName(stateP
1420: 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 20 29  tr->self), -1) )
1430: 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  ;..    Tcl_ListO
1440: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
1450: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72   statePtr->inter
1460: 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20  p, cmdPtr,..    
1470: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
1480: 28 20 6d 61 6a 6f 72 2c 20 2d 31 29 20 29 3b 0a  ( major, -1) );.
1490: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
14a0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 20 73  AppendElement( s
14b0: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c  tatePtr->interp,
14c0: 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63   cmdPtr,..    Tc
14d0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 20  l_NewStringObj( 
14e0: 6d 69 6e 6f 72 2c 20 2d 31 29 20 29 3b 0a 0a 20  minor, -1) );.. 
14f0: 20 20 20 69 66 20 28 77 68 65 72 65 20 26 20 28     if (where & (
1500: 53 53 4c 5f 43 42 5f 4c 4f 4f 50 7c 53 53 4c 5f  SSL_CB_LOOP|SSL_
1510: 43 42 5f 45 58 49 54 29 29 20 7b 0a 09 54 63 6c  CB_EXIT)) {..Tcl
1520: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
1530: 65 6d 65 6e 74 28 20 73 74 61 74 65 50 74 72 2d  ement( statePtr-
1540: 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  >interp, cmdPtr,
1550: 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72  ..    Tcl_NewStr
1560: 69 6e 67 4f 62 6a 28 20 53 53 4c 5f 73 74 61 74  ingObj( SSL_stat
1570: 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 73 73  e_string_long(ss
1580: 6c 29 2c 20 2d 31 29 20 29 3b 0a 20 20 20 20 7d  l), -1) );.    }
1590: 20 65 6c 73 65 20 69 66 20 28 77 68 65 72 65 20   else if (where 
15a0: 26 20 53 53 4c 5f 43 42 5f 41 4c 45 52 54 29 20  & SSL_CB_ALERT) 
15b0: 7b 0a 09 63 6f 6e 73 74 20 63 68 61 72 20 2a 63  {..const char *c
15c0: 70 20 3d 20 28 63 68 61 72 20 2a 29 20 53 53 4c  p = (char *) SSL
15d0: 5f 61 6c 65 72 74 5f 64 65 73 63 5f 73 74 72 69  _alert_desc_stri
15e0: 6e 67 5f 6c 6f 6e 67 28 72 65 74 29 3b 0a 0a 09  ng_long(ret);...
15f0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
1600: 64 45 6c 65 6d 65 6e 74 28 20 73 74 61 74 65 50  dElement( stateP
1610: 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50  tr->interp, cmdP
1620: 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77  tr,..    Tcl_New
1630: 53 74 72 69 6e 67 4f 62 6a 28 20 63 70 2c 20 2d  StringObj( cp, -
1640: 31 29 20 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65  1) );.    } else
1650: 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41   {..Tcl_ListObjA
1660: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 20 73 74  ppendElement( st
1670: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20  atePtr->interp, 
1680: 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c  cmdPtr,..    Tcl
1690: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 20 53  _NewStringObj( S
16a0: 53 4c 5f 73 74 61 74 65 5f 73 74 72 69 6e 67 5f  SL_state_string_
16b0: 6c 6f 6e 67 28 73 73 6c 29 2c 20 2d 31 29 20 29  long(ssl), -1) )
16c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f  ;.    }.    Tcl_
16d0: 50 72 65 73 65 72 76 65 28 20 28 43 6c 69 65 6e  Preserve( (Clien
16e0: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 2d  tData) statePtr-
16f0: 3e 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63  >interp);.    Tc
1700: 6c 5f 50 72 65 73 65 72 76 65 28 20 28 43 6c 69  l_Preserve( (Cli
1710: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74  entData) statePt
1720: 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 49 6e 63  r);..    Tcl_Inc
1730: 72 52 65 66 43 6f 75 6e 74 28 20 63 6d 64 50 74  rRefCount( cmdPt
1740: 72 29 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 54  r);.    (void) T
1750: 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 73 74 61  cl_EvalObjEx(sta
1760: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63  tePtr->interp, c
1770: 6d 64 50 74 72 2c 20 54 43 4c 5f 45 56 41 4c 5f  mdPtr, TCL_EVAL_
1780: 47 4c 4f 42 41 4c 29 3b 0a 20 20 20 20 54 63 6c  GLOBAL);.    Tcl
1790: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 20 63  _DecrRefCount( c
17a0: 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c  mdPtr);..    Tcl
17b0: 5f 52 65 6c 65 61 73 65 28 20 28 43 6c 69 65 6e  _Release( (Clien
17c0: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29  tData) statePtr)
17d0: 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73  ;.    Tcl_Releas
17e0: 65 28 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20  e( (ClientData) 
17f0: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70  statePtr->interp
1800: 29 3b 0a 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  );..}.../*. *---
1810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1850: 0a 20 2a 0a 20 2a 20 56 65 72 69 66 79 43 61 6c  . *. * VerifyCal
1860: 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 4d  lback --. *. *.M
1870: 6f 6e 69 74 6f 72 73 20 53 53 4c 20 63 65 72 74  onitors SSL cert
1880: 69 66 69 63 61 74 65 20 76 61 6c 69 64 61 74 69  ificate validati
1890: 6f 6e 20 70 72 6f 63 65 73 73 2e 0a 20 2a 09 54  on process.. *.T
18a0: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 77 68  his is called wh
18b0: 65 6e 65 76 65 72 20 61 20 63 65 72 74 69 66 69  enever a certifi
18c0: 63 61 74 65 20 69 73 20 69 6e 73 70 65 63 74 65  cate is inspecte
18d0: 64 0a 20 2a 09 6f 72 20 64 65 63 69 64 65 64 20  d. *.or decided 
18e0: 69 6e 76 61 6c 69 64 2e 0a 20 2a 0a 20 2a 20 52  invalid.. *. * R
18f0: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 63 61 6c  esults:. *.A cal
1900: 6c 62 61 63 6b 20 62 6f 75 6e 64 20 74 6f 20 74  lback bound to t
1910: 68 65 20 73 6f 63 6b 65 74 20 6d 61 79 20 72 65  he socket may re
1920: 74 75 72 6e 20 6f 6e 65 20 6f 66 3a 0a 20 2a 09  turn one of:. *.
1930: 20 20 20 20 30 09 09 09 2d 20 74 68 65 20 63 65      0...- the ce
1940: 72 74 69 66 69 63 61 74 65 20 69 73 20 64 65 65  rtificate is dee
1950: 6d 65 64 20 69 6e 76 61 6c 69 64 0a 20 2a 09 20  med invalid. *. 
1960: 20 20 20 31 09 09 09 2d 20 74 68 65 20 63 65 72     1...- the cer
1970: 74 69 66 69 63 61 74 65 20 69 73 20 64 65 65 6d  tificate is deem
1980: 65 64 20 76 61 6c 69 64 0a 20 2a 09 20 20 20 20  ed valid. *.    
1990: 65 6d 70 74 79 20 73 74 72 69 6e 67 09 2d 20 6e  empty string.- n
19a0: 6f 20 63 68 61 6e 67 65 20 74 6f 20 63 65 72 74  o change to cert
19b0: 69 66 69 63 61 74 65 20 76 61 6c 69 64 61 74 69  ificate validati
19c0: 6f 6e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  on. *. * Side ef
19d0: 66 65 63 74 73 3a 0a 20 2a 09 54 68 65 20 65 72  fects:. *.The er
19e0: 72 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63  r field of the c
19f0: 75 72 72 65 6e 74 6c 79 20 6f 70 65 72 61 74 69  urrently operati
1a00: 76 65 20 53 74 61 74 65 20 69 73 20 73 65 74 0a  ve State is set.
1a10: 20 2a 09 20 20 74 6f 20 61 20 73 74 72 69 6e 67   *.  to a string
1a20: 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 65 20   describing the 
1a30: 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20  SSL negotiation 
1a40: 66 61 69 6c 75 72 65 20 72 65 61 73 6f 6e 0a 20  failure reason. 
1a50: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
1a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a90: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
1aa0: 69 63 20 69 6e 74 0a 56 65 72 69 66 79 43 61 6c  ic int.VerifyCal
1ab0: 6c 62 61 63 6b 28 69 6e 74 20 6f 6b 2c 20 58 35  lback(int ok, X5
1ac0: 30 39 5f 53 54 4f 52 45 5f 43 54 58 20 2a 63 74  09_STORE_CTX *ct
1ad0: 78 29 0a 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  x).{.    Tcl_Obj
1ae0: 20 2a 63 6d 64 50 74 72 2c 20 2a 72 65 73 75 6c   *cmdPtr, *resul
1af0: 74 3b 0a 20 20 20 20 63 68 61 72 20 2a 65 72 72  t;.    char *err
1b00: 53 74 72 2c 20 2a 73 74 72 69 6e 67 3b 0a 20 20  Str, *string;.  
1b10: 20 20 54 63 6c 5f 53 69 7a 65 20 6c 65 6e 67 74    Tcl_Size lengt
1b20: 68 3b 0a 20 20 20 20 53 53 4c 20 20 20 2a 73 73  h;.    SSL   *ss
1b30: 6c 09 09 3d 20 28 53 53 4c 2a 29 58 35 30 39 5f  l..= (SSL*)X509_
1b40: 53 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65 78  STORE_CTX_get_ex
1b50: 5f 64 61 74 61 28 63 74 78 2c 20 53 53 4c 5f 67  _data(ctx, SSL_g
1b60: 65 74 5f 65 78 5f 64 61 74 61 5f 58 35 30 39 5f  et_ex_data_X509_
1b70: 53 54 4f 52 45 5f 43 54 58 5f 69 64 78 28 29 29  STORE_CTX_idx())
1b80: 3b 0a 20 20 20 20 58 35 30 39 20 20 2a 63 65 72  ;.    X509  *cer
1b90: 74 09 09 3d 20 58 35 30 39 5f 53 54 4f 52 45 5f  t..= X509_STORE_
1ba0: 43 54 58 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f  CTX_get_current_
1bb0: 63 65 72 74 28 63 74 78 29 3b 0a 20 20 20 20 53  cert(ctx);.    S
1bc0: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 09 3d  tate *statePtr.=
1bd0: 20 28 53 74 61 74 65 2a 29 53 53 4c 5f 67 65 74   (State*)SSL_get
1be0: 5f 61 70 70 5f 64 61 74 61 28 73 73 6c 29 3b 0a  _app_data(ssl);.
1bf0: 20 20 20 20 69 6e 74 20 64 65 70 74 68 09 09 3d      int depth..=
1c00: 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f   X509_STORE_CTX_
1c10: 67 65 74 5f 65 72 72 6f 72 5f 64 65 70 74 68 28  get_error_depth(
1c20: 63 74 78 29 3b 0a 20 20 20 20 69 6e 74 20 65 72  ctx);.    int er
1c30: 72 09 09 3d 20 58 35 30 39 5f 53 54 4f 52 45 5f  r..= X509_STORE_
1c40: 43 54 58 5f 67 65 74 5f 65 72 72 6f 72 28 63 74  CTX_get_error(ct
1c50: 78 29 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66  x);..    dprintf
1c60: 28 22 56 65 72 69 66 79 3a 20 25 64 22 2c 20 6f  ("Verify: %d", o
1c70: 6b 29 3b 0a 0a 20 20 20 20 69 66 20 28 21 6f 6b  k);..    if (!ok
1c80: 29 20 7b 0a 09 65 72 72 53 74 72 20 3d 20 28 63  ) {..errStr = (c
1c90: 68 61 72 20 2a 29 58 35 30 39 5f 76 65 72 69 66  har *)X509_verif
1ca0: 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 72  y_cert_error_str
1cb0: 69 6e 67 28 65 72 72 29 3b 0a 20 20 20 20 7d 20  ing(err);.    } 
1cc0: 65 6c 73 65 20 7b 0a 09 65 72 72 53 74 72 20 3d  else {..errStr =
1cd0: 20 28 63 68 61 72 20 2a 29 30 3b 0a 20 20 20 20   (char *)0;.    
1ce0: 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65  }..    if (state
1cf0: 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d  Ptr->callback ==
1d00: 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 73 74   NULL) {..if (st
1d10: 61 74 65 50 74 72 2d 3e 76 66 6c 61 67 73 20 26  atePtr->vflags &
1d20: 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c   SSL_VERIFY_FAIL
1d30: 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54  _IF_NO_PEER_CERT
1d40: 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  ) {..    return 
1d50: 6f 6b 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20  ok;..} else {.. 
1d60: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 09 7d 0a     return 1;..}.
1d70: 20 20 20 20 7d 0a 20 20 20 20 63 6d 64 50 74 72      }.    cmdPtr
1d80: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65   = Tcl_Duplicate
1d90: 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61  Obj(statePtr->ca
1da0: 6c 6c 62 61 63 6b 29 3b 0a 0a 20 20 20 20 54 63  llback);..    Tc
1db0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
1dc0: 6c 65 6d 65 6e 74 28 20 73 74 61 74 65 50 74 72  lement( statePtr
1dd0: 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  ->interp, cmdPtr
1de0: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74  ,..    Tcl_NewSt
1df0: 72 69 6e 67 4f 62 6a 28 20 22 76 65 72 69 66 79  ringObj( "verify
1e00: 22 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 54 63  ", -1));..    Tc
1e10: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
1e20: 6c 65 6d 65 6e 74 28 20 73 74 61 74 65 50 74 72  lement( statePtr
1e30: 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  ->interp, cmdPtr
1e40: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74  ,..    Tcl_NewSt
1e50: 72 69 6e 67 4f 62 6a 28 20 54 63 6c 5f 47 65 74  ringObj( Tcl_Get
1e60: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74  ChannelName(stat
1e70: 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29  ePtr->self), -1)
1e80: 20 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73   );..    Tcl_Lis
1e90: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
1ea0: 74 28 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74  t( statePtr->int
1eb0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20  erp, cmdPtr,..  
1ec0: 20 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28    Tcl_NewIntObj(
1ed0: 20 64 65 70 74 68 29 20 29 3b 0a 0a 20 20 20 20   depth) );..    
1ee0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
1ef0: 64 45 6c 65 6d 65 6e 74 28 20 73 74 61 74 65 50  dElement( stateP
1f00: 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50  tr->interp, cmdP
1f10: 74 72 2c 0a 09 20 20 20 20 54 6c 73 5f 4e 65 77  tr,..    Tls_New
1f20: 58 35 30 39 4f 62 6a 28 20 73 74 61 74 65 50 74  X509Obj( statePt
1f30: 72 2d 3e 69 6e 74 65 72 70 2c 20 63 65 72 74 29  r->interp, cert)
1f40: 20 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73   );..    Tcl_Lis
1f50: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
1f60: 74 28 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74  t( statePtr->int
1f70: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20  erp, cmdPtr,..  
1f80: 20 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28    Tcl_NewIntObj(
1f90: 20 6f 6b 29 20 29 3b 0a 0a 20 20 20 20 54 63 6c   ok) );..    Tcl
1fa0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
1fb0: 65 6d 65 6e 74 28 20 73 74 61 74 65 50 74 72 2d  ement( statePtr-
1fc0: 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  >interp, cmdPtr,
1fd0: 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72  ..    Tcl_NewStr
1fe0: 69 6e 67 4f 62 6a 28 20 65 72 72 53 74 72 20 3f  ingObj( errStr ?
1ff0: 20 65 72 72 53 74 72 20 3a 20 22 22 2c 20 2d 31   errStr : "", -1
2000: 29 20 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72  ) );..    Tcl_Pr
2010: 65 73 65 72 76 65 28 20 28 43 6c 69 65 6e 74 44  eserve( (ClientD
2020: 61 74 61 29 20 73 74 61 74 65 50 74 72 2d 3e 69  ata) statePtr->i
2030: 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f  nterp);.    Tcl_
2040: 50 72 65 73 65 72 76 65 28 20 28 43 6c 69 65 6e  Preserve( (Clien
2050: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29  tData) statePtr)
2060: 3b 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d  ;..    statePtr-
2070: 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43  >flags |= TLS_TC
2080: 4c 5f 43 41 4c 4c 42 41 43 4b 3b 0a 0a 20 20 20  L_CALLBACK;..   
2090: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
20a0: 74 28 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20  t( cmdPtr);.    
20b0: 69 66 20 28 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  if (Tcl_EvalObjE
20c0: 78 28 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65  x(statePtr->inte
20d0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 43 4c 5f  rp, cmdPtr, TCL_
20e0: 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 20 21 3d 20  EVAL_GLOBAL) != 
20f0: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 2f 2a 20 49 74  TCL_OK) {../* It
2100: 20 67 6f 74 20 61 6e 20 65 72 72 6f 72 20 2d 20   got an error - 
2110: 72 65 6a 65 63 74 20 74 68 65 20 63 65 72 74 69  reject the certi
2120: 66 69 63 61 74 65 2e 09 09 2a 2f 0a 09 54 63 6c  ficate...*/..Tcl
2130: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72  _BackgroundError
2140: 28 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65  ( statePtr->inte
2150: 72 70 29 3b 0a 09 6f 6b 20 3d 20 30 3b 0a 20 20  rp);..ok = 0;.  
2160: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 75    } else {..resu
2170: 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52  lt = Tcl_GetObjR
2180: 65 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d 3e  esult(statePtr->
2190: 69 6e 74 65 72 70 29 3b 0a 09 73 74 72 69 6e 67  interp);..string
21a0: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
21b0: 46 72 6f 6d 4f 62 6a 28 72 65 73 75 6c 74 2c 20  FromObj(result, 
21c0: 26 6c 65 6e 67 74 68 29 3b 0a 09 2f 2a 20 41 6e  &length);../* An
21d0: 20 65 6d 70 74 79 20 72 65 73 75 6c 74 20 6c 65   empty result le
21e0: 61 76 65 73 20 76 65 72 69 66 69 63 61 74 69 6f  aves verificatio
21f0: 6e 20 75 6e 63 68 61 6e 67 65 64 2e 09 2a 2f 0a  n unchanged..*/.
2200: 09 69 66 20 28 73 74 72 69 6e 67 20 21 3d 20 4e  .if (string != N
2210: 55 4c 4c 20 26 26 20 6c 65 6e 67 74 68 20 3e 20  ULL && length > 
2220: 30 29 20 7b 0a 09 20 20 20 20 69 66 20 28 54 63  0) {..    if (Tc
2230: 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
2240: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70  statePtr->interp
2250: 2c 20 72 65 73 75 6c 74 2c 20 26 6f 6b 29 20 21  , result, &ok) !
2260: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 54 63  = TCL_OK) {...Tc
2270: 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f  l_BackgroundErro
2280: 72 28 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65  r(statePtr->inte
2290: 72 70 29 3b 0a 09 09 6f 6b 20 3d 20 30 3b 0a 09  rp);...ok = 0;..
22a0: 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a 20      }..}.    }. 
22b0: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
22c0: 75 6e 74 28 20 63 6d 64 50 74 72 29 3b 0a 0a 20  unt( cmdPtr);.. 
22d0: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61     statePtr->fla
22e0: 67 73 20 26 3d 20 7e 28 54 4c 53 5f 54 43 4c 5f  gs &= ~(TLS_TCL_
22f0: 43 41 4c 4c 42 41 43 4b 29 3b 0a 0a 20 20 20 20  CALLBACK);..    
2300: 54 63 6c 5f 52 65 6c 65 61 73 65 28 20 28 43 6c  Tcl_Release( (Cl
2310: 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50  ientData) stateP
2320: 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c  tr);.    Tcl_Rel
2330: 65 61 73 65 28 20 28 43 6c 69 65 6e 74 44 61 74  ease( (ClientDat
2340: 61 29 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74  a) statePtr->int
2350: 65 72 70 29 3b 0a 0a 20 20 20 20 72 65 74 75 72  erp);..    retur
2360: 6e 28 6f 6b 29 3b 09 2f 2a 20 42 79 20 64 65 66  n(ok);./* By def
2370: 61 75 6c 74 2c 20 6c 65 61 76 65 20 76 65 72 69  ault, leave veri
2380: 66 69 63 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67  fication unchang
2390: 65 64 2e 09 2a 2f 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  ed..*/.}.../*. *
23a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23e0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 45 72  ---. *. * Tls_Er
23f0: 72 6f 72 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c  ror --. *. *.Cal
2400: 6c 73 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68  ls callback with
2410: 20 24 66 64 20 61 6e 64 20 24 6d 73 67 20 2d 20   $fd and $msg - 
2420: 73 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  so the callback 
2430: 63 61 6e 20 64 65 63 69 64 65 0a 20 2a 09 77 68  can decide. *.wh
2440: 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 65 72  at to do with er
2450: 72 6f 72 73 2e 0a 20 2a 0a 20 2a 20 53 69 64 65  rors.. *. * Side
2460: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 54 68 65   effects:. *.The
2470: 20 65 72 72 20 66 69 65 6c 64 20 6f 66 20 74 68   err field of th
2480: 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 72  e currently oper
2490: 61 74 69 76 65 20 53 74 61 74 65 20 69 73 20 73  ative State is s
24a0: 65 74 0a 20 2a 09 20 20 74 6f 20 61 20 73 74 72  et. *.  to a str
24b0: 69 6e 67 20 64 65 73 63 72 69 62 69 6e 67 20 74  ing describing t
24c0: 68 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69  he SSL negotiati
24d0: 6f 6e 20 66 61 69 6c 75 72 65 20 72 65 61 73 6f  on failure reaso
24e0: 6e 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  n. *------------
24f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2520: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64  -------. */.void
2530: 0a 54 6c 73 5f 45 72 72 6f 72 28 53 74 61 74 65  .Tls_Error(State
2540: 20 2a 73 74 61 74 65 50 74 72 2c 20 63 68 61 72   *statePtr, char
2550: 20 2a 6d 73 67 29 0a 7b 0a 20 20 20 20 54 63 6c   *msg).{.    Tcl
2560: 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 0a 20  _Obj *cmdPtr;.. 
2570: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
2580: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6d  ed");..    if (m
2590: 73 67 20 26 26 20 2a 6d 73 67 29 20 7b 0a 09 54  sg && *msg) {..T
25a0: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28  cl_SetErrorCode(
25b0: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70  statePtr->interp
25c0: 2c 20 22 53 53 4c 22 2c 20 6d 73 67 2c 20 28 63  , "SSL", msg, (c
25d0: 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 20 20 20  har *)NULL);.   
25e0: 20 7d 20 65 6c 73 65 20 7b 0a 09 6d 73 67 20 3d   } else {..msg =
25f0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 54   Tcl_GetString(T
2600: 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_GetObjResult(
2610: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70  statePtr->interp
2620: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74  ));.    }.    st
2630: 61 74 65 50 74 72 2d 3e 65 72 72 20 3d 20 6d 73  atePtr->err = ms
2640: 67 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74  g;..    if (stat
2650: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d  ePtr->callback =
2660: 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c  = (Tcl_Obj*)NULL
2670: 29 20 7b 0a 09 63 68 61 72 20 62 75 66 5b 42 55  ) {..char buf[BU
2680: 46 53 49 5a 5d 3b 0a 09 73 70 72 69 6e 74 66 28  FSIZ];..sprintf(
2690: 62 75 66 2c 20 22 53 53 4c 20 63 68 61 6e 6e 65  buf, "SSL channe
26a0: 6c 20 5c 22 25 73 5c 22 3a 20 65 72 72 6f 72 3a  l \"%s\": error:
26b0: 20 25 73 22 2c 0a 09 20 20 20 20 54 63 6c 5f 47   %s",..    Tcl_G
26c0: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74  etChannelName(st
26d0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 6d  atePtr->self), m
26e0: 73 67 29 3b 0a 09 54 63 6c 5f 53 65 74 52 65 73  sg);..Tcl_SetRes
26f0: 75 6c 74 28 20 73 74 61 74 65 50 74 72 2d 3e 69  ult( statePtr->i
2700: 6e 74 65 72 70 2c 20 62 75 66 2c 20 54 43 4c 5f  nterp, buf, TCL_
2710: 56 4f 4c 41 54 49 4c 45 29 3b 0a 09 54 63 6c 5f  VOLATILE);..Tcl_
2720: 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28  BackgroundError(
2730: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72   statePtr->inter
2740: 70 29 3b 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20  p);..return;.   
2750: 20 7d 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20   }.    cmdPtr = 
2760: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a  Tcl_DuplicateObj
2770: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62  (statePtr->callb
2780: 61 63 6b 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c  ack);..    Tcl_L
2790: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
27a0: 65 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 69 6e  ent(statePtr->in
27b0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20  terp, cmdPtr,.. 
27c0: 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67     Tcl_NewString
27d0: 4f 62 6a 28 22 65 72 72 6f 72 22 2c 20 2d 31 29  Obj("error", -1)
27e0: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  );..    Tcl_List
27f0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
2800: 28 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72  (statePtr->inter
2810: 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20  p, cmdPtr,..    
2820: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
2830: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e  (Tcl_GetChannelN
2840: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65  ame(statePtr->se
2850: 6c 66 29 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20  lf), -1));..    
2860: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
2870: 64 45 6c 65 6d 65 6e 74 28 73 74 61 74 65 50 74  dElement(statePt
2880: 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  r->interp, cmdPt
2890: 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53  r,..    Tcl_NewS
28a0: 74 72 69 6e 67 4f 62 6a 28 6d 73 67 2c 20 2d 31  tringObj(msg, -1
28b0: 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65  ));..    Tcl_Pre
28c0: 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74  serve((ClientDat
28d0: 61 29 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74  a) statePtr->int
28e0: 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50 72  erp);.    Tcl_Pr
28f0: 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61  eserve((ClientDa
2900: 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a  ta) statePtr);..
2910: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
2920: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20  ount(cmdPtr);.  
2930: 20 20 69 66 20 28 54 63 6c 5f 45 76 61 6c 4f 62    if (Tcl_EvalOb
2940: 6a 45 78 28 73 74 61 74 65 50 74 72 2d 3e 69 6e  jEx(statePtr->in
2950: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 43  terp, cmdPtr, TC
2960: 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 20 21  L_EVAL_GLOBAL) !
2970: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c  = TCL_OK) {..Tcl
2980: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72  _BackgroundError
2990: 28 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72  (statePtr->inter
29a0: 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63  p);.    }.    Tc
29b0: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63  l_DecrRefCount(c
29c0: 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c  mdPtr);..    Tcl
29d0: 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74  _Release((Client
29e0: 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b  Data) statePtr);
29f0: 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65  .    Tcl_Release
2a00: 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74  ((ClientData) st
2a10: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 29 3b  atePtr->interp);
2a20: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
2a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
2a70: 0a 20 2a 20 50 61 73 73 77 6f 72 64 43 61 6c 6c  . * PasswordCall
2a80: 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61  back --. *. *.Ca
2a90: 6c 6c 65 64 20 77 68 65 6e 20 61 20 70 61 73 73  lled when a pass
2aa0: 77 6f 72 64 20 69 73 20 6e 65 65 64 65 64 20 74  word is needed t
2ab0: 6f 20 75 6e 70 61 63 6b 20 52 53 41 20 61 6e 64  o unpack RSA and
2ac0: 20 50 45 4d 20 6b 65 79 73 2e 0a 20 2a 09 45 76   PEM keys.. *.Ev
2ad0: 61 6c 73 20 61 6e 79 20 62 6f 75 6e 64 20 70 61  als any bound pa
2ae0: 73 73 77 6f 72 64 20 73 63 72 69 70 74 20 61 6e  ssword script an
2af0: 64 20 72 65 74 75 72 6e 73 20 74 68 65 20 72 65  d returns the re
2b00: 73 75 6c 74 20 61 73 0a 20 2a 09 74 68 65 20 70  sult as. *.the p
2b10: 61 73 73 77 6f 72 64 20 73 74 72 69 6e 67 2e 0a  assword string..
2b20: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
2b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b60: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 23 69 66 64 65 66  -----. */.#ifdef
2b70: 20 50 52 45 5f 4f 50 45 4e 53 53 4c 5f 30 5f 39   PRE_OPENSSL_0_9
2b80: 5f 34 0a 2f 2a 0a 20 2a 20 4e 6f 20 77 61 79 20  _4./*. * No way 
2b90: 74 6f 20 68 61 6e 64 6c 65 20 75 73 65 72 2d 64  to handle user-d
2ba0: 61 74 61 20 74 68 65 72 65 66 6f 72 65 20 6e 6f  ata therefore no
2bb0: 20 77 61 79 20 77 69 74 68 6f 75 74 20 61 20 67   way without a g
2bc0: 6c 6f 62 61 6c 0a 20 2a 20 76 61 72 69 61 62 6c  lobal. * variabl
2bd0: 65 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20  e to access the 
2be0: 54 63 6c 20 69 6e 74 65 72 70 72 65 74 65 72 2e  Tcl interpreter.
2bf0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 50  .*/.static int.P
2c00: 61 73 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b 28  asswordCallback(
2c10: 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53 45 44 28  .    TCL_UNUSED(
2c20: 63 68 61 72 20 2a 29 20 2f 2a 20 62 75 66 20 2a  char *) /* buf *
2c30: 2f 2c 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53 45  /,.    TCL_UNUSE
2c40: 44 28 69 6e 74 29 20 2f 2a 20 73 69 7a 65 20 2a  D(int) /* size *
2c50: 2f 2c 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53 45  /,.    TCL_UNUSE
2c60: 44 28 69 6e 74 29 20 2f 2a 20 76 65 72 69 66 79  D(int) /* verify
2c70: 20 2a 2f 29 0a 7b 0a 20 20 20 20 72 65 74 75 72   */).{.    retur
2c80: 6e 20 2d 31 3b 0a 7d 0a 23 65 6c 73 65 0a 73 74  n -1;.}.#else.st
2c90: 61 74 69 63 20 69 6e 74 0a 50 61 73 73 77 6f 72  atic int.Passwor
2ca0: 64 43 61 6c 6c 62 61 63 6b 28 0a 20 20 20 20 63  dCallback(.    c
2cb0: 68 61 72 20 2a 62 75 66 2c 0a 20 20 20 20 69 6e  har *buf,.    in
2cc0: 74 20 73 69 7a 65 2c 0a 20 20 20 20 54 43 4c 5f  t size,.    TCL_
2cd0: 55 4e 55 53 45 44 28 69 6e 74 29 2c 20 2f 2a 20  UNUSED(int), /* 
2ce0: 76 65 72 69 66 79 20 2a 2f 0a 20 20 20 20 76 6f  verify */.    vo
2cf0: 69 64 20 2a 75 64 61 74 61 29 0a 7b 0a 20 20 20  id *udata).{.   
2d00: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72   State *statePtr
2d10: 09 3d 20 28 53 74 61 74 65 20 2a 29 20 75 64 61  .= (State *) uda
2d20: 74 61 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65  ta;.    Tcl_Inte
2d30: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61  rp *interp.= sta
2d40: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20  tePtr->interp;. 
2d50: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50     Tcl_Obj *cmdP
2d60: 74 72 3b 0a 20 20 20 20 69 6e 74 20 72 65 73 75  tr;.    int resu
2d70: 6c 74 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66  lt;..    dprintf
2d80: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
2d90: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70   if (statePtr->p
2da0: 61 73 73 77 6f 72 64 20 3d 3d 20 4e 55 4c 4c 29  assword == NULL)
2db0: 20 7b 0a 09 69 66 20 28 54 63 6c 5f 45 76 61 6c   {..if (Tcl_Eval
2dc0: 45 78 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a  Ex(interp, "tls:
2dd0: 3a 70 61 73 73 77 6f 72 64 22 2c 20 2d 31 2c 20  :password", -1, 
2de0: 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29  TCL_EVAL_GLOBAL)
2df0: 0a 09 09 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a  ...== TCL_OK) {.
2e00: 09 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
2e10: 2a 72 65 74 20 3d 20 54 63 6c 5f 47 65 74 53 74  *ret = Tcl_GetSt
2e20: 72 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72  ringResult(inter
2e30: 70 29 3b 0a 09 20 20 20 20 73 74 72 6e 63 70 79  p);..    strncpy
2e40: 28 62 75 66 2c 20 72 65 74 2c 20 28 73 69 7a 65  (buf, ret, (size
2e50: 5f 74 29 20 73 69 7a 65 29 3b 0a 09 20 20 20 20  _t) size);..    
2e60: 72 65 74 75 72 6e 20 28 69 6e 74 29 73 74 72 6c  return (int)strl
2e70: 65 6e 28 72 65 74 29 3b 0a 09 7d 20 65 6c 73 65  en(ret);..} else
2e80: 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 2d   {..    return -
2e90: 31 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20  1;..}.    }..   
2ea0: 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75   cmdPtr = Tcl_Du
2eb0: 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65  plicateObj(state
2ec0: 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a  Ptr->password);.
2ed0: 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76  .    Tcl_Preserv
2ee0: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73  e((ClientData) s
2ef0: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 29  tatePtr->interp)
2f00: 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72  ;.    Tcl_Preser
2f10: 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20  ve((ClientData) 
2f20: 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20  statePtr);..    
2f30: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
2f40: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65  (cmdPtr);.    re
2f50: 73 75 6c 74 20 3d 20 54 63 6c 5f 45 76 61 6c 4f  sult = Tcl_EvalO
2f60: 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 63 6d 64  bjEx(interp, cmd
2f70: 50 74 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c  Ptr, TCL_EVAL_GL
2f80: 4f 42 41 4c 29 3b 0a 20 20 20 20 69 66 20 28 72  OBAL);.    if (r
2f90: 65 73 75 6c 74 20 21 3d 20 54 43 4c 5f 4f 4b 29  esult != TCL_OK)
2fa0: 20 7b 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75   {..Tcl_Backgrou
2fb0: 6e 64 45 72 72 6f 72 28 73 74 61 74 65 50 74 72  ndError(statePtr
2fc0: 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 7d  ->interp);.    }
2fd0: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66  .    Tcl_DecrRef
2fe0: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a  Count(cmdPtr);..
2ff0: 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28      Tcl_Release(
3000: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61  (ClientData) sta
3010: 74 65 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f  tePtr);.    Tcl_
3020: 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44  Release((ClientD
3030: 61 74 61 29 20 73 74 61 74 65 50 74 72 2d 3e 69  ata) statePtr->i
3040: 6e 74 65 72 70 29 3b 0a 0a 20 20 20 20 69 66 20  nterp);..    if 
3050: 28 72 65 73 75 6c 74 20 3d 3d 20 54 43 4c 5f 4f  (result == TCL_O
3060: 4b 29 20 7b 0a 09 63 6f 6e 73 74 20 63 68 61 72  K) {..const char
3070: 20 2a 72 65 74 20 3d 20 54 63 6c 5f 47 65 74 53   *ret = Tcl_GetS
3080: 74 72 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65  tringResult(inte
3090: 72 70 29 3b 0a 09 73 74 72 6e 63 70 79 28 62 75  rp);..strncpy(bu
30a0: 66 2c 20 72 65 74 2c 20 28 73 69 7a 65 5f 74 29  f, ret, (size_t)
30b0: 20 73 69 7a 65 29 3b 0a 09 72 65 74 75 72 6e 20   size);..return 
30c0: 28 69 6e 74 29 73 74 72 6c 65 6e 28 72 65 74 29  (int)strlen(ret)
30d0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
30e0: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d  return -1;.    }
30f0: 0a 7d 0a 23 65 6e 64 69 66 0a 0c 0a 2f 2a 0a 20  .}.#endif.../*. 
3100: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
3110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3140: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 69 70 68 65  ----. *. * Ciphe
3150: 72 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69 73 74  rsObjCmd -- list
3160: 20 61 76 61 69 6c 61 62 6c 65 20 63 69 70 68 65   available ciphe
3170: 72 73 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72  rs. *. *.This pr
3180: 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b  ocedure is invok
3190: 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68  ed to process th
31a0: 65 20 22 74 6c 73 3a 3a 63 69 70 68 65 72 73 22  e "tls::ciphers"
31b0: 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09 74 6f 20 6c   command. *.to l
31c0: 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20 63 69  ist available ci
31d0: 70 68 65 72 73 2c 20 62 61 73 65 64 20 75 70 6f  phers, based upo
31e0: 6e 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63  n protocol selec
31f0: 74 65 64 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  ted.. *. * Resul
3200: 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72  ts:. *.A standar
3210: 64 20 54 63 6c 20 72 65 73 75 6c 74 20 6c 69 73  d Tcl result lis
3220: 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  t.. *. * Side ef
3230: 66 65 63 74 73 3a 0a 20 2a 09 63 6f 6e 73 74 72  fects:. *.constr
3240: 75 63 74 73 20 61 6e 64 20 64 65 73 74 72 6f 79  ucts and destroy
3250: 73 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 28 43  s SSL context (C
3260: 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  TX). *. *-------
3270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
32a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
32b0: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
32c0: 61 72 20 2a 70 72 6f 74 6f 63 6f 6c 73 5b 5d 20  ar *protocols[] 
32d0: 3d 20 7b 0a 20 20 20 20 22 73 73 6c 32 22 2c 20  = {.    "ssl2", 
32e0: 22 73 73 6c 33 22 2c 20 22 74 6c 73 31 22 2c 20  "ssl3", "tls1", 
32f0: 22 74 6c 73 31 2e 31 22 2c 20 22 74 6c 73 31 2e  "tls1.1", "tls1.
3300: 32 22 2c 20 22 74 6c 73 31 2e 33 22 2c 20 4e 55  2", "tls1.3", NU
3310: 4c 4c 0a 7d 3b 0a 65 6e 75 6d 20 70 72 6f 74 6f  LL.};.enum proto
3320: 63 6f 6c 20 7b 0a 20 20 20 20 54 4c 53 5f 53 53  col {.    TLS_SS
3330: 4c 32 2c 20 54 4c 53 5f 53 53 4c 33 2c 20 54 4c  L2, TLS_SSL3, TL
3340: 53 5f 54 4c 53 31 2c 20 54 4c 53 5f 54 4c 53 31  S_TLS1, TLS_TLS1
3350: 5f 31 2c 20 54 4c 53 5f 54 4c 53 31 5f 32 2c 20  _1, TLS_TLS1_2, 
3360: 54 4c 53 5f 54 4c 53 31 5f 33 2c 20 54 4c 53 5f  TLS_TLS1_3, TLS_
3370: 4e 4f 4e 45 0a 7d 3b 0a 0a 73 74 61 74 69 63 20  NONE.};..static 
3380: 69 6e 74 0a 43 69 70 68 65 72 73 4f 62 6a 43 6d  int.CiphersObjCm
3390: 64 28 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53 45  d(.    TCL_UNUSE
33a0: 44 28 76 6f 69 64 20 2a 29 2c 0a 20 20 20 20 54  D(void *),.    T
33b0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
33c0: 70 2c 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63 2c  p,.    int objc,
33d0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 09 2a 63 6f  .    Tcl_Obj.*co
33e0: 6e 73 74 20 6f 62 6a 76 5b 5d 29 0a 7b 0a 20 20  nst objv[]).{.  
33f0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74    Tcl_Obj *objPt
3400: 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 53  r = NULL;.    SS
3410: 4c 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c  L_CTX *ctx = NUL
3420: 4c 3b 0a 20 20 20 20 53 53 4c 20 2a 73 73 6c 20  L;.    SSL *ssl 
3430: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 54 41 43  = NULL;.    STAC
3440: 4b 5f 4f 46 28 53 53 4c 5f 43 49 50 48 45 52 29  K_OF(SSL_CIPHER)
3450: 20 2a 73 6b 3b 0a 20 20 20 20 63 6f 6e 73 74 20   *sk;.    const 
3460: 63 68 61 72 20 2a 63 70 3b 0a 20 20 20 20 63 68  char *cp;.    ch
3470: 61 72 20 62 75 66 5b 42 55 46 53 49 5a 5d 3b 0a  ar buf[BUFSIZ];.
3480: 20 20 20 20 69 6e 74 20 69 6e 64 65 78 2c 20 76      int index, v
3490: 65 72 62 6f 73 65 20 3d 20 30 3b 0a 0a 20 20 20  erbose = 0;..   
34a0: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
34b0: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 28 6f 62  ");..    if ((ob
34c0: 6a 63 20 3c 20 32 29 20 7c 7c 20 28 6f 62 6a 63  jc < 2) || (objc
34d0: 20 3e 20 33 29 29 20 7b 0a 09 54 63 6c 5f 57 72   > 3)) {..Tcl_Wr
34e0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
34f0: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 70 72 6f  p, 1, objv, "pro
3500: 74 6f 63 6f 6c 20 3f 76 65 72 62 6f 73 65 3f 22  tocol ?verbose?"
3510: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
3520: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
3530: 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78  if (Tcl_GetIndex
3540: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
3550: 6f 62 6a 76 5b 31 5d 2c 20 70 72 6f 74 6f 63 6f  objv[1], protoco
3560: 6c 73 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20  ls, "protocol", 
3570: 30 2c 20 26 69 6e 64 65 78 29 20 21 3d 20 54 43  0, &index) != TC
3580: 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20  L_OK) {..return 
3590: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
35a0: 0a 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3e  .    if ((objc >
35b0: 20 32 29 20 26 26 20 54 63 6c 5f 47 65 74 42 6f   2) && Tcl_GetBo
35c0: 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
35d0: 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76  erp, objv[2], &v
35e0: 65 72 62 6f 73 65 29 20 21 3d 20 54 43 4c 5f 4f  erbose) != TCL_O
35f0: 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c  K) {..return TCL
3600: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
3610: 20 20 73 77 69 74 63 68 20 28 28 65 6e 75 6d 20    switch ((enum 
3620: 70 72 6f 74 6f 63 6f 6c 29 69 6e 64 65 78 29 20  protocol)index) 
3630: 7b 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 53  {.    case TLS_S
3640: 53 4c 32 3a 0a 09 54 63 6c 5f 41 70 70 65 6e 64  SL2:..Tcl_Append
3650: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
3660: 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c  rotocols[index],
3670: 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74   ": protocol not
3680: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68   supported", (ch
3690: 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 74  ar *)NULL);..ret
36a0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
36b0: 20 20 20 63 61 73 65 20 54 4c 53 5f 53 53 4c 33     case TLS_SSL3
36c0: 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f  :.#if defined(NO
36d0: 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65  _SSL3) || define
36e0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c  d(OPENSSL_NO_SSL
36f0: 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50  3) || defined(OP
3700: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45  ENSSL_NO_SSL3_ME
3710: 54 48 4f 44 29 0a 09 54 63 6c 5f 41 70 70 65 6e  THOD)..Tcl_Appen
3720: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
3730: 22 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75  "protocol not su
3740: 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20  pported", (char 
3750: 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e  *)NULL);..return
3760: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73   TCL_ERROR;.#els
3770: 65 0a 09 63 74 78 20 3d 20 53 53 4c 5f 43 54 58  e..ctx = SSL_CTX
3780: 5f 6e 65 77 28 53 53 4c 76 33 5f 6d 65 74 68 6f  _new(SSLv3_metho
3790: 64 28 29 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e  d()); break;.#en
37a0: 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4c 53  dif.    case TLS
37b0: 5f 54 4c 53 31 3a 0a 23 69 66 20 64 65 66 69 6e  _TLS1:.#if defin
37c0: 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64  ed(NO_TLS1) || d
37d0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
37e0: 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e  O_TLS1) || defin
37f0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
3800: 53 31 5f 4d 45 54 48 4f 44 29 0a 09 54 63 6c 5f  S1_METHOD)..Tcl_
3810: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
3820: 65 72 70 2c 20 22 70 72 6f 74 6f 63 6f 6c 20 6e  erp, "protocol n
3830: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28  ot supported", (
3840: 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72  char *)NULL);..r
3850: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
3860: 0a 23 65 6c 73 65 0a 09 63 74 78 20 3d 20 53 53  .#else..ctx = SS
3870: 4c 5f 43 54 58 5f 6e 65 77 28 54 4c 53 76 31 5f  L_CTX_new(TLSv1_
3880: 6d 65 74 68 6f 64 28 29 29 3b 20 62 72 65 61 6b  method()); break
3890: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  ;.#endif.    cas
38a0: 65 20 54 4c 53 5f 54 4c 53 31 5f 31 3a 0a 23 69  e TLS_TLS1_1:.#i
38b0: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53  f defined(NO_TLS
38c0: 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  1_1) || defined(
38d0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
38e0: 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50  1) || defined(OP
38f0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f  ENSSL_NO_TLS1_1_
3900: 4d 45 54 48 4f 44 29 0a 09 54 63 6c 5f 41 70 70  METHOD)..Tcl_App
3910: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
3920: 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65  , protocols[inde
3930: 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20  x], ": protocol 
3940: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20  not supported", 
3950: 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09  (char *)NULL);..
3960: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
3970: 3b 0a 23 65 6c 73 65 0a 09 63 74 78 20 3d 20 53  ;.#else..ctx = S
3980: 53 4c 5f 43 54 58 5f 6e 65 77 28 54 4c 53 76 31  SL_CTX_new(TLSv1
3990: 5f 31 5f 6d 65 74 68 6f 64 28 29 29 3b 20 62 72  _1_method()); br
39a0: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  eak;.#endif.#if 
39b0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f  defined(NO_TLS1_
39c0: 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50  2) || defined(OP
39d0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29  ENSSL_NO_TLS1_2)
39e0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e   || defined(OPEN
39f0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45  SSL_NO_TLS1_2_ME
3a00: 54 48 4f 44 29 0a 09 54 63 6c 5f 41 70 70 65 6e  THOD)..Tcl_Appen
3a10: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
3a20: 22 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75  "protocol not su
3a30: 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20  pported", (char 
3a40: 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e  *)NULL);..return
3a50: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73   TCL_ERROR;.#els
3a60: 65 0a 09 63 74 78 20 3d 20 53 53 4c 5f 43 54 58  e..ctx = SSL_CTX
3a70: 5f 6e 65 77 28 54 4c 53 76 31 5f 32 5f 6d 65 74  _new(TLSv1_2_met
3a80: 68 6f 64 28 29 29 3b 20 62 72 65 61 6b 3b 0a 23  hod()); break;.#
3a90: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
3aa0: 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20  d(NO_TLS1_3) || 
3ab0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
3ac0: 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65  NO_TLS1_3) || de
3ad0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
3ae0: 5f 54 4c 53 31 5f 33 5f 4d 45 54 48 4f 44 29 0a  _TLS1_3_METHOD).
3af0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
3b00: 74 28 69 6e 74 65 72 70 2c 20 22 70 72 6f 74 6f  t(interp, "proto
3b10: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65  col not supporte
3b20: 64 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c  d", (char *)NULL
3b30: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
3b40: 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 63 74 78  RROR;.#else..ctx
3b50: 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 54   = SSL_CTX_new(T
3b60: 4c 53 5f 6d 65 74 68 6f 64 28 29 29 3b 20 62 72  LS_method()); br
3b70: 65 61 6b 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65  eak;..SSL_CTX_se
3b80: 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73  t_min_proto_vers
3b90: 69 6f 6e 20 28 63 74 78 2c 20 54 4c 53 31 5f 33  ion (ctx, TLS1_3
3ba0: 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 53 53 4c 5f  _VERSION);..SSL_
3bb0: 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70 72 6f 74  CTX_set_max_prot
3bc0: 6f 5f 76 65 72 73 69 6f 6e 20 28 63 74 78 2c 20  o_version (ctx, 
3bd0: 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b  TLS1_3_VERSION);
3be0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61  .#endif.    defa
3bf0: 75 6c 74 3a 0a 09 09 62 72 65 61 6b 3b 0a 20 20  ult:...break;.  
3c00: 20 20 7d 0a 20 20 20 20 69 66 20 28 63 74 78 20    }.    if (ctx 
3c10: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f  == NULL) {..Tcl_
3c20: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
3c30: 65 72 70 2c 20 52 45 41 53 4f 4e 28 29 2c 20 28  erp, REASON(), (
3c40: 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72  char *)NULL);..r
3c50: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
3c60: 0a 20 20 20 20 7d 0a 20 20 20 20 73 73 6c 20 3d  .    }.    ssl =
3c70: 20 53 53 4c 5f 6e 65 77 28 63 74 78 29 3b 0a 20   SSL_new(ctx);. 
3c80: 20 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55     if (ssl == NU
3c90: 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  LL) {..Tcl_Appen
3ca0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
3cb0: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20  REASON(), (char 
3cc0: 2a 29 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54  *)NULL);..SSL_CT
3cd0: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65  X_free(ctx);..re
3ce0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
3cf0: 20 20 20 20 7d 0a 20 20 20 20 6f 62 6a 50 74 72      }.    objPtr
3d00: 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62   = Tcl_NewListOb
3d10: 6a 28 20 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20  j( 0, NULL);..  
3d20: 20 20 69 66 20 28 21 76 65 72 62 6f 73 65 29 20    if (!verbose) 
3d30: 7b 0a 09 66 6f 72 20 28 69 6e 64 65 78 20 3d 20  {..for (index = 
3d40: 30 3b 20 3b 20 69 6e 64 65 78 2b 2b 29 20 7b 0a  0; ; index++) {.
3d50: 09 20 20 20 20 63 70 20 3d 20 28 63 68 61 72 2a  .    cp = (char*
3d60: 29 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 5f  )SSL_get_cipher_
3d70: 6c 69 73 74 28 20 73 73 6c 2c 20 69 6e 64 65 78  list( ssl, index
3d80: 29 3b 0a 09 20 20 20 20 69 66 20 28 63 70 20 3d  );..    if (cp =
3d90: 3d 20 4e 55 4c 4c 29 20 62 72 65 61 6b 3b 0a 09  = NULL) break;..
3da0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
3db0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 20 69 6e  ppendElement( in
3dc0: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 0a 09 09  terp, objPtr,...
3dd0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
3de0: 28 20 63 70 2c 20 2d 31 29 20 29 3b 0a 09 7d 0a  ( cp, -1) );..}.
3df0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 73 6b      } else {..sk
3e00: 20 3d 20 53 53 4c 5f 67 65 74 5f 63 69 70 68 65   = SSL_get_ciphe
3e10: 72 73 28 73 73 6c 29 3b 0a 0a 09 66 6f 72 20 28  rs(ssl);...for (
3e20: 69 6e 64 65 78 20 3d 20 30 3b 20 69 6e 64 65 78  index = 0; index
3e30: 20 3c 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52   < sk_SSL_CIPHER
3e40: 5f 6e 75 6d 28 73 6b 29 3b 20 69 6e 64 65 78 2b  _num(sk); index+
3e50: 2b 29 20 7b 0a 09 20 20 20 20 73 69 7a 65 5f 74  +) {..    size_t
3e60: 20 69 3b 0a 09 20 20 20 20 53 53 4c 5f 43 49 50   i;..    SSL_CIP
3e70: 48 45 52 5f 64 65 73 63 72 69 70 74 69 6f 6e 28  HER_description(
3e80: 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76   sk_SSL_CIPHER_v
3e90: 61 6c 75 65 28 20 73 6b 2c 20 69 6e 64 65 78 29  alue( sk, index)
3ea0: 2c 0a 09 09 09 09 20 20 20 20 62 75 66 2c 20 73  ,.....    buf, s
3eb0: 69 7a 65 6f 66 28 62 75 66 29 29 3b 0a 09 20 20  izeof(buf));..  
3ec0: 20 20 66 6f 72 20 28 69 20 3d 20 73 74 72 6c 65    for (i = strle
3ed0: 6e 28 62 75 66 29 20 2d 20 31 3b 20 69 20 3b 20  n(buf) - 1; i ; 
3ee0: 69 2d 2d 29 20 7b 0a 09 09 69 66 20 28 62 75 66  i--) {...if (buf
3ef0: 5b 69 5d 20 3d 3d 20 27 20 27 20 7c 7c 20 62 75  [i] == ' ' || bu
3f00: 66 5b 69 5d 20 3d 3d 20 27 5c 6e 27 20 7c 7c 0a  f[i] == '\n' ||.
3f10: 09 09 20 20 20 20 62 75 66 5b 69 5d 20 3d 3d 20  ..    buf[i] == 
3f20: 27 5c 72 27 20 7c 7c 20 62 75 66 5b 69 5d 20 3d  '\r' || buf[i] =
3f30: 3d 20 27 5c 74 27 29 20 7b 0a 09 09 20 20 20 20  = '\t') {...    
3f40: 62 75 66 5b 69 5d 20 3d 20 27 5c 30 27 3b 0a 09  buf[i] = '\0';..
3f50: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20  .} else {...    
3f60: 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 20 20 20 20  break;...}..    
3f70: 7d 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  }..    Tcl_ListO
3f80: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
3f90: 20 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c   interp, objPtr,
3fa0: 0a 09 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  ...Tcl_NewString
3fb0: 4f 62 6a 28 20 62 75 66 2c 20 2d 31 29 20 29 3b  Obj( buf, -1) );
3fc0: 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 53 53  ..}.    }.    SS
3fd0: 4c 5f 66 72 65 65 28 73 73 6c 29 3b 0a 20 20 20  L_free(ssl);.   
3fe0: 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74   SSL_CTX_free(ct
3ff0: 78 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74  x);..    Tcl_Set
4000: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
4010: 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72  , objPtr);.    r
4020: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
4030: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
4040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
4080: 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64   HandshakeObjCmd
4090: 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 63   --. *. *.This c
40a0: 6f 6d 6d 61 6e 64 20 69 73 20 75 73 65 64 20 74  ommand is used t
40b0: 6f 20 76 65 72 69 66 79 20 77 68 65 74 68 65 72  o verify whether
40c0: 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 20 69   the handshake i
40d0: 73 20 63 6f 6d 70 6c 65 74 65 0a 20 2a 09 6f 72  s complete. *.or
40e0: 20 6e 6f 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75   not.. *. * Resu
40f0: 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61  lts:. *.A standa
4100: 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 20 31  rd Tcl result. 1
4110: 20 6d 65 61 6e 73 20 68 61 6e 64 73 68 61 6b 65   means handshake
4120: 20 63 6f 6d 70 6c 65 74 65 2c 20 30 20 6d 65 61   complete, 0 mea
4130: 6e 73 20 70 65 6e 64 69 6e 67 2e 0a 20 2a 0a 20  ns pending.. *. 
4140: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
4150: 20 2a 09 4d 61 79 20 66 6f 72 63 65 20 53 53 4c   *.May force SSL
4160: 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 74 6f 20   negotiation to 
4170: 74 61 6b 65 20 70 6c 61 63 65 2e 0a 20 2a 0a 20  take place.. *. 
4180: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
4190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
41a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
41b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
41c0: 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63  ----. */..static
41d0: 20 69 6e 74 20 48 61 6e 64 73 68 61 6b 65 4f 62   int HandshakeOb
41e0: 6a 43 6d 64 28 0a 20 20 20 20 54 43 4c 5f 55 4e  jCmd(.    TCL_UN
41f0: 55 53 45 44 28 76 6f 69 64 20 2a 29 2c 0a 20 20  USED(void *),.  
4200: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
4210: 74 65 72 70 2c 0a 20 20 20 20 69 6e 74 20 6f 62  terp,.    int ob
4220: 6a 63 2c 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  jc,.    Tcl_Obj 
4230: 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 0a 7b  *const objv[]).{
4240: 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c  .    Tcl_Channel
4250: 20 63 68 61 6e 3b 20 20 20 20 20 20 20 20 2f 2a   chan;        /*
4260: 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20   The channel to 
4270: 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a  set a mode on. *
4280: 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61  /.    State *sta
4290: 74 65 50 74 72 3b 20 20 20 20 20 20 20 20 2f 2a  tePtr;        /*
42a0: 20 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f   client state fo
42b0: 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a  r ssl socket */.
42c0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
42d0: 65 72 72 53 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20  errStr = NULL;. 
42e0: 20 20 20 69 6e 74 20 72 65 74 20 3d 20 31 3b 0a     int ret = 1;.
42f0: 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20 30 3b      int err = 0;
4300: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
4310: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66  alled");..    if
4320: 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09   (objc != 2) {..
4330: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
4340: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
4350: 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72  , "channel");..r
4360: 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29  eturn(TCL_ERROR)
4370: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 61  ;.    }..    cha
4380: 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e  n = Tcl_GetChann
4390: 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  el(interp, Tcl_G
43a0: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
43b0: 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66  ), NULL);.    if
43c0: 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43   (chan == (Tcl_C
43d0: 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a  hannel) NULL) {.
43e0: 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f  .return(TCL_ERRO
43f0: 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  R);.    }..    /
4400: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f  * Make sure to o
4410: 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f  perate on the to
4420: 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f  pmost channel */
4430: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f  .    chan = Tcl_
4440: 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68  GetTopChannel(ch
4450: 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c  an);.    if (Tcl
4460: 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28  _GetChannelType(
4470: 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61  chan) != Tls_Cha
4480: 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54  nnelType()) {..T
4490: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
44a0: 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61  interp, "bad cha
44b0: 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65  nnel \"", Tcl_Ge
44c0: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61  tChannelName(cha
44d0: 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61  n),..."\": not a
44e0: 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 28   TLS channel", (
44f0: 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72  char *)NULL);..r
4500: 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29  eturn(TCL_ERROR)
4510: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61 74  ;.    }.    stat
4520: 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29  ePtr = (State *)
4530: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e  Tcl_GetChannelIn
4540: 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29  stanceData(chan)
4550: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
4560: 43 61 6c 6c 69 6e 67 20 54 6c 73 5f 57 61 69 74  Calling Tls_Wait
4570: 46 6f 72 43 6f 6e 6e 65 63 74 22 29 3b 0a 20 20  ForConnect");.  
4580: 20 20 72 65 74 20 3d 20 54 6c 73 5f 57 61 69 74    ret = Tls_Wait
4590: 46 6f 72 43 6f 6e 6e 65 63 74 28 73 74 61 74 65  ForConnect(state
45a0: 50 74 72 2c 20 26 65 72 72 2c 20 31 29 3b 0a 20  Ptr, &err, 1);. 
45b0: 20 20 20 64 70 72 69 6e 74 66 28 22 54 6c 73 5f     dprintf("Tls_
45c0: 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 20 72  WaitForConnect r
45d0: 65 74 75 72 6e 65 64 3a 20 25 69 22 2c 20 72 65  eturned: %i", re
45e0: 74 29 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 74  t);..    if (ret
45f0: 20 3c 20 30 20 26 26 20 28 28 73 74 61 74 65 50   < 0 && ((stateP
4600: 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f  tr->flags & TLS_
4610: 54 43 4c 5f 41 53 59 4e 43 29 20 26 26 20 28 65  TCL_ASYNC) && (e
4620: 72 72 20 3d 3d 20 45 41 47 41 49 4e 29 29 29 20  rr == EAGAIN))) 
4630: 7b 0a 09 64 70 72 69 6e 74 66 28 22 41 73 79 6e  {..dprintf("Asyn
4640: 63 20 73 65 74 20 61 6e 64 20 65 72 72 20 3d 20  c set and err = 
4650: 45 41 47 41 49 4e 22 29 3b 0a 09 72 65 74 20 3d  EAGAIN");..ret =
4660: 20 30 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69   0;.    } else i
4670: 66 20 28 72 65 74 20 3c 20 30 29 20 7b 0a 09 65  f (ret < 0) {..e
4680: 72 72 53 74 72 20 3d 20 73 74 61 74 65 50 74 72  rrStr = statePtr
4690: 2d 3e 65 72 72 3b 0a 09 54 63 6c 5f 52 65 73 65  ->err;..Tcl_Rese
46a0: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b  tResult(interp);
46b0: 0a 09 54 63 6c 5f 53 65 74 45 72 72 6e 6f 28 65  ..Tcl_SetErrno(e
46c0: 72 72 29 3b 0a 0a 09 69 66 20 28 21 65 72 72 53  rr);...if (!errS
46d0: 74 72 20 7c 7c 20 28 2a 65 72 72 53 74 72 20 3d  tr || (*errStr =
46e0: 3d 20 30 29 29 20 7b 0a 09 20 20 20 20 65 72 72  = 0)) {..    err
46f0: 53 74 72 20 3d 20 54 63 6c 5f 50 6f 73 69 78 45  Str = Tcl_PosixE
4700: 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 09 7d  rror(interp);..}
4710: 0a 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  ...Tcl_AppendRes
4720: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 68 61 6e  ult(interp, "han
4730: 64 73 68 61 6b 65 20 66 61 69 6c 65 64 3a 20 22  dshake failed: "
4740: 2c 20 65 72 72 53 74 72 2c 20 28 63 68 61 72 20  , errStr, (char 
4750: 2a 29 4e 55 4c 4c 29 3b 0a 09 64 70 72 69 6e 74  *)NULL);..dprint
4760: 66 28 22 52 65 74 75 72 6e 69 6e 67 20 54 43 4c  f("Returning TCL
4770: 5f 45 52 52 4f 52 20 77 69 74 68 20 68 61 6e 64  _ERROR with hand
4780: 73 68 61 6b 65 20 66 61 69 6c 65 64 3a 20 25 73  shake failed: %s
4790: 22 2c 20 65 72 72 53 74 72 29 3b 0a 09 72 65 74  ", errStr);..ret
47a0: 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a  urn(TCL_ERROR);.
47b0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66      } else {..if
47c0: 20 28 65 72 72 20 21 3d 20 30 29 20 7b 0a 09 20   (err != 0) {.. 
47d0: 20 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20     dprintf("Got 
47e0: 61 6e 20 65 72 72 6f 72 20 77 69 74 68 20 61 20  an error with a 
47f0: 63 6f 6d 70 6c 65 74 65 64 20 68 61 6e 64 73 68  completed handsh
4800: 61 6b 65 3a 20 65 72 72 20 3d 20 25 69 22 2c 20  ake: err = %i", 
4810: 65 72 72 29 3b 0a 09 7d 0a 09 72 65 74 20 3d 20  err);..}..ret = 
4820: 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70  1;.    }..    dp
4830: 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67  rintf("Returning
4840: 20 54 43 4c 5f 4f 4b 20 77 69 74 68 20 64 61 74   TCL_OK with dat
4850: 61 20 5c 22 25 69 5c 22 22 2c 20 72 65 74 29 3b  a \"%i\"", ret);
4860: 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  .    Tcl_SetObjR
4870: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
4880: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 65 74 29  l_NewIntObj(ret)
4890: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 54 43  );.    return(TC
48a0: 4c 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d  L_OK);.}../*. *-
48b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
48c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
48d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
48e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
48f0: 2d 2d 0a 20 2a 0a 20 2a 20 49 6d 70 6f 72 74 4f  --. *. * ImportO
4900: 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54  bjCmd --. *. *.T
4910: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73  his procedure is
4920: 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63   invoked to proc
4930: 65 73 73 20 74 68 65 20 22 73 73 6c 22 20 63 6f  ess the "ssl" co
4940: 6d 6d 61 6e 64 0a 20 2a 0a 20 2a 09 54 68 65 20  mmand. *. *.The 
4950: 73 73 6c 20 63 6f 6d 6d 61 6e 64 20 70 75 73 68  ssl command push
4960: 65 73 20 53 53 4c 20 6f 76 65 72 20 61 20 28 6e  es SSL over a (n
4970: 65 77 6c 79 20 63 6f 6e 6e 65 63 74 65 64 29 20  ewly connected) 
4980: 74 63 70 20 73 6f 63 6b 65 74 0a 20 2a 0a 20 2a  tcp socket. *. *
4990: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73   Results:. *.A s
49a0: 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75  tandard Tcl resu
49b0: 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  lt.. *. * Side e
49c0: 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d  ffects:. *.May m
49d0: 6f 64 69 66 79 20 74 68 65 20 62 65 68 61 76 69  odify the behavi
49e0: 6f 72 20 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e  or of an IO chan
49f0: 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  nel.. *. *------
4a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
4a40: 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 49 6d  /..static int.Im
4a50: 70 6f 72 74 4f 62 6a 43 6d 64 28 0a 20 20 20 20  portObjCmd(.    
4a60: 54 43 4c 5f 55 4e 55 53 45 44 28 76 6f 69 64 20  TCL_UNUSED(void 
4a70: 2a 29 2c 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65  *),.    Tcl_Inte
4a80: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 20 20  rp *interp,.    
4a90: 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 20 20 54 63  int objc,.    Tc
4aa0: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a  l_Obj *const obj
4ab0: 76 5b 5d 29 0a 7b 0a 20 20 20 20 54 63 6c 5f 43  v[]).{.    Tcl_C
4ac0: 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a  hannel chan;../*
4ad0: 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20   The channel to 
4ae0: 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a  set a mode on. *
4af0: 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61  /.    State *sta
4b00: 74 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e  tePtr;../* clien
4b10: 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20  t state for ssl 
4b20: 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 53 53  socket */.    SS
4b30: 4c 5f 43 54 58 20 2a 63 74 78 09 09 3d 20 4e 55  L_CTX *ctx..= NU
4b40: 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  LL;.    Tcl_Obj 
4b50: 2a 73 63 72 69 70 74 09 09 3d 20 4e 55 4c 4c 3b  *script..= NULL;
4b60: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 61  .    Tcl_Obj *pa
4b70: 73 73 77 6f 72 64 09 09 3d 20 4e 55 4c 4c 3b 0a  ssword..= NULL;.
4b80: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20      Tcl_DString 
4b90: 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e  upperChannelTran
4ba0: 73 6c 61 74 69 6f 6e 2c 20 75 70 70 65 72 43 68  slation, upperCh
4bb0: 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 2c 20 75  annelBlocking, u
4bc0: 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64  pperChannelEncod
4bd0: 69 6e 67 2c 20 75 70 70 65 72 43 68 61 6e 6e 65  ing, upperChanne
4be0: 6c 45 4f 46 43 68 61 72 3b 0a 20 20 20 20 69 6e  lEOFChar;.    in
4bf0: 74 20 69 64 78 3b 0a 20 20 20 20 54 63 6c 5f 53  t idx;.    Tcl_S
4c00: 69 7a 65 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74  ize len;.    int
4c10: 20 66 6c 61 67 73 09 09 09 3d 20 54 4c 53 5f 54   flags...= TLS_T
4c20: 43 4c 5f 49 4e 49 54 3b 0a 20 20 20 20 69 6e 74  CL_INIT;.    int
4c30: 20 73 65 72 76 65 72 09 09 09 3d 20 30 3b 09 2f   server...= 0;./
4c40: 2a 20 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  * is connection 
4c50: 69 6e 63 6f 6d 69 6e 67 20 6f 72 20 6f 75 74 67  incoming or outg
4c60: 6f 69 6e 67 3f 20 2a 2f 0a 20 20 20 20 63 68 61  oing? */.    cha
4c70: 72 20 2a 6b 65 79 66 69 6c 65 09 09 3d 20 4e 55  r *keyfile..= NU
4c80: 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 65  LL;.    char *ce
4c90: 72 74 66 69 6c 65 09 09 3d 20 4e 55 4c 4c 3b 0a  rtfile..= NULL;.
4ca0: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
4cb0: 72 20 2a 6b 65 79 09 09 3d 20 4e 55 4c 4c 3b 0a  r *key..= NULL;.
4cc0: 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6b 65 79      Tcl_Size key
4cd0: 5f 6c 65 6e 09 09 3d 20 30 3b 0a 20 20 20 20 75  _len..= 0;.    u
4ce0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63 65  nsigned char *ce
4cf0: 72 74 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  rt..= NULL;.    
4d00: 54 63 6c 5f 53 69 7a 65 20 63 65 72 74 5f 6c 65  Tcl_Size cert_le
4d10: 6e 09 09 3d 20 30 3b 0a 20 20 20 20 63 68 61 72  n..= 0;.    char
4d20: 20 2a 63 69 70 68 65 72 73 09 09 3d 20 4e 55 4c   *ciphers..= NUL
4d30: 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 43 41 66  L;.    char *CAf
4d40: 69 6c 65 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20  ile..= NULL;.   
4d50: 20 63 68 61 72 20 2a 43 41 64 69 72 09 09 09 3d   char *CAdir...=
4d60: 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20   NULL;.    char 
4d70: 2a 44 48 70 61 72 61 6d 73 09 09 3d 20 4e 55 4c  *DHparams..= NUL
4d80: 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 6d 6f 64  L;.    char *mod
4d90: 65 6c 09 09 09 3d 20 4e 55 4c 4c 3b 0a 23 69 66  el...= NULL;.#if
4da0: 6e 64 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ndef OPENSSL_NO_
4db0: 54 4c 53 45 58 54 0a 20 20 20 20 63 68 61 72 20  TLSEXT.    char 
4dc0: 2a 73 65 72 76 65 72 6e 61 6d 65 09 09 3d 20 4e  *servername..= N
4dd0: 55 4c 4c 3b 09 2f 2a 20 68 6f 73 74 6e 61 6d 65  ULL;./* hostname
4de0: 20 66 6f 72 20 53 65 72 76 65 72 20 4e 61 6d 65   for Server Name
4df0: 20 49 6e 64 69 63 61 74 69 6f 6e 20 2a 2f 0a 23   Indication */.#
4e00: 65 6e 64 69 66 0a 20 20 20 20 69 6e 74 20 73 73  endif.    int ss
4e10: 6c 32 20 3d 20 30 2c 20 73 73 6c 33 20 3d 20 30  l2 = 0, ssl3 = 0
4e20: 3b 0a 20 20 20 20 69 6e 74 20 74 6c 73 31 20 3d  ;.    int tls1 =
4e30: 20 31 2c 20 74 6c 73 31 5f 31 20 3d 20 31 2c 20   1, tls1_1 = 1, 
4e40: 74 6c 73 31 5f 32 20 3d 20 31 2c 20 74 6c 73 31  tls1_2 = 1, tls1
4e50: 5f 33 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20  _3 = 1;.    int 
4e60: 70 72 6f 74 6f 20 3d 20 30 3b 0a 20 20 20 20 69  proto = 0;.    i
4e70: 6e 74 20 76 65 72 69 66 79 20 3d 20 30 2c 20 72  nt verify = 0, r
4e80: 65 71 75 69 72 65 20 3d 20 30 2c 20 72 65 71 75  equire = 0, requ
4e90: 65 73 74 20 3d 20 31 3b 0a 0a 20 20 20 20 64 70  est = 1;..    dp
4ea0: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
4eb0: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f  ..#if defined(NO
4ec0: 5f 54 4c 53 31 29 20 26 26 20 64 65 66 69 6e 65  _TLS1) && define
4ed0: 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20  d(NO_TLS1_1) && 
4ee0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f  defined(NO_TLS1_
4ef0: 32 29 20 26 26 20 64 65 66 69 6e 65 64 28 4e 4f  2) && defined(NO
4f00: 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66  _TLS1_3) && !def
4f10: 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 0a 20 20  ined(NO_SSL3).  
4f20: 20 20 73 73 6c 33 20 3d 20 31 3b 0a 23 65 6e 64    ssl3 = 1;.#end
4f30: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e  if.#if defined(N
4f40: 4f 5f 54 4c 53 31 29 0a 20 20 20 20 74 6c 73 31  O_TLS1).    tls1
4f50: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66   = 0;.#endif.#if
4f60: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31   defined(NO_TLS1
4f70: 5f 31 29 0a 20 20 20 20 74 6c 73 31 5f 31 20 3d  _1).    tls1_1 =
4f80: 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64   0;.#endif.#if d
4f90: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32  efined(NO_TLS1_2
4fa0: 29 0a 20 20 20 20 74 6c 73 31 5f 32 20 3d 20 30  ).    tls1_2 = 0
4fb0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  ;.#endif.#if def
4fc0: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 0a  ined(NO_TLS1_3).
4fd0: 20 20 20 20 74 6c 73 31 5f 33 20 3d 20 30 3b 0a      tls1_3 = 0;.
4fe0: 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 20 28  #endif..    if (
4ff0: 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c  objc < 2) {..Tcl
5000: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
5010: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
5020: 63 68 61 6e 6e 65 6c 20 3f 6f 70 74 69 6f 6e 73  channel ?options
5030: 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  ?");..return TCL
5040: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
5050: 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65     chan = Tcl_Ge
5060: 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c  tChannel(interp,
5070: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
5080: 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a  bjv[1]), NULL);.
5090: 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20      if (chan == 
50a0: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55  (Tcl_Channel) NU
50b0: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43  LL) {..return TC
50c0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
50d0: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 4d 61      /*.     * Ma
50e0: 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61  ke sure to opera
50f0: 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73  te on the topmos
5100: 74 20 63 68 61 6e 6e 65 6c 0a 20 20 20 20 20 2a  t channel.     *
5110: 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c  /.    chan = Tcl
5120: 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63  _GetTopChannel(c
5130: 68 61 6e 29 3b 0a 0a 20 20 20 20 66 6f 72 20 28  han);..    for (
5140: 69 64 78 20 3d 20 32 3b 20 69 64 78 20 3c 20 6f  idx = 2; idx < o
5150: 62 6a 63 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 63  bjc; idx++) {..c
5160: 68 61 72 20 2a 6f 70 74 20 3d 20 54 63 6c 5f 47  har *opt = Tcl_G
5170: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 69 64  etString(objv[id
5180: 78 5d 29 3b 0a 0a 09 69 66 20 28 6f 70 74 5b 30  x]);...if (opt[0
5190: 5d 20 21 3d 20 27 2d 27 29 0a 09 20 20 20 20 62  ] != '-')..    b
51a0: 72 65 61 6b 3b 0a 0a 09 4f 50 54 53 54 52 28 22  reak;...OPTSTR("
51b0: 2d 63 61 64 69 72 22 2c 20 43 41 64 69 72 29 3b  -cadir", CAdir);
51c0: 0a 09 4f 50 54 53 54 52 28 22 2d 63 61 66 69 6c  ..OPTSTR("-cafil
51d0: 65 22 2c 20 43 41 66 69 6c 65 29 3b 0a 09 4f 50  e", CAfile);..OP
51e0: 54 53 54 52 28 22 2d 63 65 72 74 66 69 6c 65 22  TSTR("-certfile"
51f0: 2c 20 63 65 72 74 66 69 6c 65 29 3b 0a 09 4f 50  , certfile);..OP
5200: 54 53 54 52 28 22 2d 63 69 70 68 65 72 22 2c 20  TSTR("-cipher", 
5210: 63 69 70 68 65 72 73 29 3b 0a 09 4f 50 54 4f 42  ciphers);..OPTOB
5220: 4a 28 22 2d 63 6f 6d 6d 61 6e 64 22 2c 20 73 63  J("-command", sc
5230: 72 69 70 74 29 3b 0a 09 4f 50 54 53 54 52 28 22  ript);..OPTSTR("
5240: 2d 64 68 70 61 72 61 6d 73 22 2c 20 44 48 70 61  -dhparams", DHpa
5250: 72 61 6d 73 29 3b 0a 09 4f 50 54 53 54 52 28 22  rams);..OPTSTR("
5260: 2d 6b 65 79 66 69 6c 65 22 2c 20 6b 65 79 66 69  -keyfile", keyfi
5270: 6c 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 6d  le);..OPTSTR("-m
5280: 6f 64 65 6c 22 2c 20 6d 6f 64 65 6c 29 3b 0a 09  odel", model);..
5290: 4f 50 54 4f 42 4a 28 22 2d 70 61 73 73 77 6f 72  OPTOBJ("-passwor
52a0: 64 22 2c 20 70 61 73 73 77 6f 72 64 29 3b 0a 09  d", password);..
52b0: 4f 50 54 42 4f 4f 4c 28 22 2d 72 65 71 75 69 72  OPTBOOL("-requir
52c0: 65 22 2c 20 72 65 71 75 69 72 65 29 3b 0a 09 4f  e", require);..O
52d0: 50 54 42 4f 4f 4c 28 22 2d 72 65 71 75 65 73 74  PTBOOL("-request
52e0: 22 2c 20 72 65 71 75 65 73 74 29 3b 0a 09 4f 50  ", request);..OP
52f0: 54 42 4f 4f 4c 28 22 2d 73 65 72 76 65 72 22 2c  TBOOL("-server",
5300: 20 73 65 72 76 65 72 29 3b 0a 23 69 66 6e 64 65   server);.#ifnde
5310: 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  f OPENSSL_NO_TLS
5320: 45 58 54 0a 09 4f 50 54 53 54 52 28 20 22 2d 73  EXT..OPTSTR( "-s
5330: 65 72 76 65 72 6e 61 6d 65 22 2c 20 73 65 72 76  ervername", serv
5340: 65 72 6e 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a  ername);.#endif.
5350: 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 73 6c 32  ..OPTBOOL("-ssl2
5360: 22 2c 20 73 73 6c 32 29 3b 0a 09 4f 50 54 42 4f  ", ssl2);..OPTBO
5370: 4f 4c 28 22 2d 73 73 6c 33 22 2c 20 73 73 6c 33  OL("-ssl3", ssl3
5380: 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c  );..OPTBOOL("-tl
5390: 73 31 22 2c 20 74 6c 73 31 29 3b 0a 09 4f 50 54  s1", tls1);..OPT
53a0: 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 31 22 2c 20  BOOL("-tls1.1", 
53b0: 74 6c 73 31 5f 31 29 3b 0a 09 4f 50 54 42 4f 4f  tls1_1);..OPTBOO
53c0: 4c 28 22 2d 74 6c 73 31 2e 32 22 2c 20 74 6c 73  L("-tls1.2", tls
53d0: 31 5f 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22  1_2);..OPTBOOL("
53e0: 2d 74 6c 73 31 2e 33 22 2c 20 74 6c 73 31 5f 33  -tls1.3", tls1_3
53f0: 29 0a 09 4f 50 54 42 59 54 45 28 22 2d 63 65 72  )..OPTBYTE("-cer
5400: 74 22 2c 20 63 65 72 74 2c 20 63 65 72 74 5f 6c  t", cert, cert_l
5410: 65 6e 29 3b 0a 09 4f 50 54 42 59 54 45 28 22 2d  en);..OPTBYTE("-
5420: 6b 65 79 22 2c 20 6b 65 79 2c 20 6b 65 79 5f 6c  key", key, key_l
5430: 65 6e 29 3b 0a 0a 09 4f 50 54 42 41 44 28 22 6f  en);...OPTBAD("o
5440: 70 74 69 6f 6e 22 2c 20 22 2d 63 61 64 69 72 2c  ption", "-cadir,
5450: 20 2d 63 61 66 69 6c 65 2c 20 2d 63 65 72 74 2c   -cafile, -cert,
5460: 20 2d 63 65 72 74 66 69 6c 65 2c 20 2d 63 69 70   -certfile, -cip
5470: 68 65 72 2c 20 2d 63 6f 6d 6d 61 6e 64 2c 20 2d  her, -command, -
5480: 64 68 70 61 72 61 6d 73 2c 20 2d 6b 65 79 2c 20  dhparams, -key, 
5490: 2d 6b 65 79 66 69 6c 65 2c 20 2d 6d 6f 64 65 6c  -keyfile, -model
54a0: 2c 20 2d 70 61 73 73 77 6f 72 64 2c 20 2d 72 65  , -password, -re
54b0: 71 75 69 72 65 2c 20 2d 72 65 71 75 65 73 74 2c  quire, -request,
54c0: 20 2d 73 65 72 76 65 72 2c 20 2d 73 65 72 76 65   -server, -serve
54d0: 72 6e 61 6d 65 2c 20 2d 73 73 6c 32 2c 20 2d 73  rname, -ssl2, -s
54e0: 73 6c 33 2c 20 2d 74 6c 73 31 2c 20 2d 74 6c 73  sl3, -tls1, -tls
54f0: 31 2e 31 2c 20 2d 74 6c 73 31 2e 32 2c 20 6f 72  1.1, -tls1.2, or
5500: 20 74 6c 73 31 2e 33 22 29 3b 0a 0a 09 72 65 74   tls1.3");...ret
5510: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
5520: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 72 65 71     }.    if (req
5530: 75 65 73 74 29 09 20 20 20 20 76 65 72 69 66 79  uest).    verify
5540: 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 43   |= SSL_VERIFY_C
5550: 4c 49 45 4e 54 5f 4f 4e 43 45 20 7c 20 53 53 4c  LIENT_ONCE | SSL
5560: 5f 56 45 52 49 46 59 5f 50 45 45 52 3b 0a 20 20  _VERIFY_PEER;.  
5570: 20 20 69 66 20 28 72 65 71 75 65 73 74 20 26 26    if (request &&
5580: 20 72 65 71 75 69 72 65 29 20 76 65 72 69 66 79   require) verify
5590: 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 46   |= SSL_VERIFY_F
55a0: 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43  AIL_IF_NO_PEER_C
55b0: 45 52 54 3b 0a 20 20 20 20 69 66 20 28 76 65 72  ERT;.    if (ver
55c0: 69 66 79 20 3d 3d 20 30 29 09 76 65 72 69 66 79  ify == 0).verify
55d0: 20 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 4e 4f   = SSL_VERIFY_NO
55e0: 4e 45 3b 0a 0a 20 20 20 20 70 72 6f 74 6f 20 7c  NE;..    proto |
55f0: 3d 20 28 73 73 6c 32 20 3f 20 54 4c 53 5f 50 52  = (ssl2 ? TLS_PR
5600: 4f 54 4f 5f 53 53 4c 32 20 3a 20 30 29 3b 0a 20  OTO_SSL2 : 0);. 
5610: 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 73 73 6c     proto |= (ssl
5620: 33 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53  3 ? TLS_PROTO_SS
5630: 4c 33 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f  L3 : 0);.    pro
5640: 74 6f 20 7c 3d 20 28 74 6c 73 31 20 3f 20 54 4c  to |= (tls1 ? TL
5650: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 20 3a 20 30  S_PROTO_TLS1 : 0
5660: 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20  );.    proto |= 
5670: 28 74 6c 73 31 5f 31 20 3f 20 54 4c 53 5f 50 52  (tls1_1 ? TLS_PR
5680: 4f 54 4f 5f 54 4c 53 31 5f 31 20 3a 20 30 29 3b  OTO_TLS1_1 : 0);
5690: 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74  .    proto |= (t
56a0: 6c 73 31 5f 32 20 3f 20 54 4c 53 5f 50 52 4f 54  ls1_2 ? TLS_PROT
56b0: 4f 5f 54 4c 53 31 5f 32 20 3a 20 30 29 3b 0a 20  O_TLS1_2 : 0);. 
56c0: 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73     proto |= (tls
56d0: 31 5f 33 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f  1_3 ? TLS_PROTO_
56e0: 54 4c 53 31 5f 33 20 3a 20 30 29 3b 0a 0a 20 20  TLS1_3 : 0);..  
56f0: 20 20 2f 2a 20 72 65 73 65 74 20 74 6f 20 4e 55    /* reset to NU
5700: 4c 4c 20 69 66 20 62 6c 61 6e 6b 20 73 74 72 69  LL if blank stri
5710: 6e 67 20 70 72 6f 76 69 64 65 64 20 2a 2f 0a 20  ng provided */. 
5720: 20 20 20 69 66 20 28 63 65 72 74 20 26 26 20 21     if (cert && !
5730: 2a 63 65 72 74 29 09 09 20 20 20 20 20 20 20 20  *cert)..        
5740: 63 65 72 74 09 20 20 20 20 20 20 20 20 3d 20 4e  cert.        = N
5750: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 6b 65 79  ULL;.    if (key
5760: 20 26 26 20 21 2a 6b 65 79 29 09 09 20 20 20 20   && !*key)..    
5770: 20 20 20 20 6b 65 79 09 20 20 20 20 20 20 20 20      key.        
5780: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28  = NULL;.    if (
5790: 63 65 72 74 66 69 6c 65 20 26 26 20 21 2a 63 65  certfile && !*ce
57a0: 72 74 66 69 6c 65 29 20 20 20 20 20 20 20 20 20  rtfile)         
57b0: 63 65 72 74 66 69 6c 65 09 3d 20 4e 55 4c 4c 3b  certfile.= NULL;
57c0: 0a 20 20 20 20 69 66 20 28 6b 65 79 66 69 6c 65  .    if (keyfile
57d0: 20 26 26 20 21 2a 6b 65 79 66 69 6c 65 29 09 09   && !*keyfile)..
57e0: 6b 65 79 66 69 6c 65 09 20 20 20 20 20 20 20 20  keyfile.        
57f0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28  = NULL;.    if (
5800: 63 69 70 68 65 72 73 20 26 26 20 21 2a 63 69 70  ciphers && !*cip
5810: 68 65 72 73 29 09 20 20 20 20 20 20 20 20 63 69  hers).        ci
5820: 70 68 65 72 73 09 20 20 20 20 20 20 20 20 3d 20  phers.        = 
5830: 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43 41  NULL;.    if (CA
5840: 66 69 6c 65 20 26 26 20 21 2a 43 41 66 69 6c 65  file && !*CAfile
5850: 29 09 20 20 20 20 20 20 20 20 43 41 66 69 6c 65  ).        CAfile
5860: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b  .        = NULL;
5870: 0a 20 20 20 20 69 66 20 28 43 41 64 69 72 20 26  .    if (CAdir &
5880: 26 20 21 2a 43 41 64 69 72 29 09 20 20 20 20 20  & !*CAdir).     
5890: 20 20 20 43 41 64 69 72 09 20 20 20 20 20 20 20     CAdir.       
58a0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20   = NULL;.    if 
58b0: 28 44 48 70 61 72 61 6d 73 20 26 26 20 21 2a 44  (DHparams && !*D
58c0: 48 70 61 72 61 6d 73 29 09 20 20 20 20 20 20 20  Hparams).       
58d0: 20 44 48 70 61 72 61 6d 73 20 20 20 20 20 20 20   DHparams       
58e0: 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a   = NULL;..    /*
58f0: 20 6e 65 77 20 53 53 4c 20 73 74 61 74 65 20 2a   new SSL state *
5900: 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 09 09  /.    statePtr..
5910: 3d 20 28 53 74 61 74 65 20 2a 29 20 63 6b 61 6c  = (State *) ckal
5920: 6c 6f 63 28 28 75 6e 73 69 67 6e 65 64 29 20 73  loc((unsigned) s
5930: 69 7a 65 6f 66 28 53 74 61 74 65 29 29 3b 0a 20  izeof(State));. 
5940: 20 20 20 6d 65 6d 73 65 74 28 73 74 61 74 65 50     memset(stateP
5950: 74 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53 74  tr, 0, sizeof(St
5960: 61 74 65 29 29 3b 0a 0a 20 20 20 20 73 74 61 74  ate));..    stat
5970: 65 50 74 72 2d 3e 66 6c 61 67 73 09 3d 20 66 6c  ePtr->flags.= fl
5980: 61 67 73 3b 0a 20 20 20 20 73 74 61 74 65 50 74  ags;.    statePt
5990: 72 2d 3e 69 6e 74 65 72 70 09 3d 20 69 6e 74 65  r->interp.= inte
59a0: 72 70 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72  rp;.    statePtr
59b0: 2d 3e 76 66 6c 61 67 73 09 3d 20 76 65 72 69 66  ->vflags.= verif
59c0: 79 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d  y;.    statePtr-
59d0: 3e 65 72 72 09 3d 20 22 22 3b 0a 0a 20 20 20 20  >err.= "";..    
59e0: 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 73 63 72 69  /* allocate scri
59f0: 70 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 63  pt */.    if (sc
5a00: 72 69 70 74 29 20 7b 0a 09 28 76 6f 69 64 29 20  ript) {..(void) 
5a10: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
5a20: 6d 4f 62 6a 28 73 63 72 69 70 74 2c 20 26 6c 65  mObj(script, &le
5a30: 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a  n);..if (len) {.
5a40: 09 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 63  .    statePtr->c
5a50: 61 6c 6c 62 61 63 6b 20 3d 20 73 63 72 69 70 74  allback = script
5a60: 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  ;..    Tcl_IncrR
5a70: 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72  efCount(statePtr
5a80: 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 7d 0a  ->callback);..}.
5a90: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c      }..    /* al
5aa0: 6c 6f 63 61 74 65 20 70 61 73 73 77 6f 72 64 20  locate password 
5ab0: 2a 2f 0a 20 20 20 20 69 66 20 28 70 61 73 73 77  */.    if (passw
5ac0: 6f 72 64 29 20 7b 0a 09 28 76 6f 69 64 29 20 54  ord) {..(void) T
5ad0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
5ae0: 4f 62 6a 28 70 61 73 73 77 6f 72 64 2c 20 26 6c  Obj(password, &l
5af0: 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b  en);..if (len) {
5b00: 0a 09 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  ..    statePtr->
5b10: 70 61 73 73 77 6f 72 64 20 3d 20 70 61 73 73 77  password = passw
5b20: 6f 72 64 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e  ord;..    Tcl_In
5b30: 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65  crRefCount(state
5b40: 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a  Ptr->password);.
5b50: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  .}.    }..    if
5b60: 20 28 6d 6f 64 65 6c 20 21 3d 20 4e 55 4c 4c 29   (model != NULL)
5b70: 20 7b 0a 09 69 6e 74 20 6d 6f 64 65 3b 0a 09 2f   {..int mode;../
5b80: 2a 20 47 65 74 20 74 68 65 20 22 6d 6f 64 65 6c  * Get the "model
5b90: 22 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 63 68  " context */..ch
5ba0: 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e  an = Tcl_GetChan
5bb0: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 6d 6f 64 65  nel(interp, mode
5bc0: 6c 2c 20 26 6d 6f 64 65 29 3b 0a 09 69 66 20 28  l, &mode);..if (
5bd0: 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61  chan == (Tcl_Cha
5be0: 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 20  nnel) NULL) {.. 
5bf0: 20 20 20 54 6c 73 5f 46 72 65 65 28 28 76 6f 69     Tls_Free((voi
5c00: 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09  d *)statePtr);..
5c10: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
5c20: 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20  RROR;..}.../*.. 
5c30: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f  * Make sure to o
5c40: 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f  perate on the to
5c50: 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 0a 09 20  pmost channel.. 
5c60: 2a 2f 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47  */..chan = Tcl_G
5c70: 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61  etTopChannel(cha
5c80: 6e 29 3b 0a 09 69 66 20 28 54 63 6c 5f 47 65 74  n);..if (Tcl_Get
5c90: 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e  ChannelType(chan
5ca0: 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c  ) != Tls_Channel
5cb0: 54 79 70 65 28 29 29 20 7b 0a 09 20 20 20 20 54  Type()) {..    T
5cc0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
5cd0: 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61  interp, "bad cha
5ce0: 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65  nnel \"", Tcl_Ge
5cf0: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61  tChannelName(cha
5d00: 6e 29 2c 0a 09 09 20 20 20 20 22 5c 22 3a 20 6e  n),...    "\": n
5d10: 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c  ot a TLS channel
5d20: 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29  ", (char *)NULL)
5d30: 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28  ;..    Tls_Free(
5d40: 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72  (void *)statePtr
5d50: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54  );..    return T
5d60: 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09 63 74  CL_ERROR;..}..ct
5d70: 78 20 3d 20 28 28 53 74 61 74 65 20 2a 29 54 63  x = ((State *)Tc
5d80: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74  l_GetChannelInst
5d90: 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 29 2d  anceData(chan))-
5da0: 3e 63 74 78 3b 0a 20 20 20 20 7d 20 65 6c 73 65  >ctx;.    } else
5db0: 20 7b 0a 09 69 66 20 28 28 63 74 78 20 3d 20 43   {..if ((ctx = C
5dc0: 54 58 5f 49 6e 69 74 28 73 74 61 74 65 50 74 72  TX_Init(statePtr
5dd0: 2c 20 73 65 72 76 65 72 2c 20 70 72 6f 74 6f 2c  , server, proto,
5de0: 20 6b 65 79 66 69 6c 65 2c 20 63 65 72 74 66 69   keyfile, certfi
5df0: 6c 65 2c 20 6b 65 79 2c 0a 09 09 63 65 72 74 2c  le, key,...cert,
5e00: 20 6b 65 79 5f 6c 65 6e 2c 20 63 65 72 74 5f 6c   key_len, cert_l
5e10: 65 6e 2c 20 43 41 64 69 72 2c 20 43 41 66 69 6c  en, CAdir, CAfil
5e20: 65 2c 20 63 69 70 68 65 72 73 2c 0a 09 09 44 48  e, ciphers,...DH
5e30: 70 61 72 61 6d 73 29 29 20 3d 3d 20 4e 55 4c 4c  params)) == NULL
5e40: 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65  ) {..    Tls_Fre
5e50: 65 28 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50  e((void *)stateP
5e60: 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  tr);..    return
5e70: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20   TCL_ERROR;..}. 
5e80: 20 20 20 7d 0a 0a 20 20 20 20 73 74 61 74 65 50     }..    stateP
5e90: 74 72 2d 3e 63 74 78 20 3d 20 63 74 78 3b 0a 0a  tr->ctx = ctx;..
5ea0: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 57 65      /*.     * We
5eb0: 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 73 75   need to make su
5ec0: 72 65 20 74 68 61 74 20 74 68 65 20 63 68 61 6e  re that the chan
5ed0: 6e 65 6c 20 77 6f 72 6b 73 20 69 6e 20 62 69 6e  nel works in bin
5ee0: 61 72 79 20 28 66 6f 72 20 74 68 65 0a 20 20 20  ary (for the.   
5ef0: 20 20 2a 20 65 6e 63 72 79 70 74 69 6f 6e 20 6e    * encryption n
5f00: 6f 74 20 74 6f 20 67 65 74 20 67 6f 6f 66 65 64  ot to get goofed
5f10: 20 75 70 29 2e 0a 20 20 20 20 20 2a 20 57 65 20   up)..     * We 
5f20: 6f 6e 6c 79 20 77 61 6e 74 20 74 6f 20 61 64 6a  only want to adj
5f30: 75 73 74 20 74 68 65 20 62 75 66 66 65 72 69 6e  ust the bufferin
5f40: 67 20 69 6e 20 70 72 65 2d 76 32 20 63 68 61 6e  g in pre-v2 chan
5f50: 6e 65 6c 73 2c 20 77 68 65 72 65 0a 20 20 20 20  nels, where.    
5f60: 20 2a 20 65 61 63 68 20 63 68 61 6e 6e 65 6c 20   * each channel 
5f70: 69 6e 20 74 68 65 20 73 74 61 63 6b 20 6d 61 69  in the stack mai
5f80: 6e 74 61 69 6e 65 64 20 69 74 73 20 6f 77 6e 20  ntained its own 
5f90: 62 75 66 66 65 72 73 2e 0a 20 20 20 20 20 2a 2f  buffers..     */
5fa0: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
5fb0: 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e  Init(&upperChann
5fc0: 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a  elTranslation);.
5fd0: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49      Tcl_DStringI
5fe0: 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65  nit(&upperChanne
5ff0: 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20  lBlocking);.    
6000: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28  Tcl_DStringInit(
6010: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46  &upperChannelEOF
6020: 43 68 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44  Char);.    Tcl_D
6030: 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65  StringInit(&uppe
6040: 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67  rChannelEncoding
6050: 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68  );.    Tcl_GetCh
6060: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65  annelOption(inte
6070: 72 70 2c 20 63 68 61 6e 2c 20 22 2d 65 6f 66 63  rp, chan, "-eofc
6080: 68 61 72 22 2c 20 26 75 70 70 65 72 43 68 61 6e  har", &upperChan
6090: 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20  nelEOFChar);.   
60a0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f   Tcl_GetChannelO
60b0: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68  ption(interp, ch
60c0: 61 6e 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c  an, "-encoding",
60d0: 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e   &upperChannelEn
60e0: 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c  coding);.    Tcl
60f0: 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f  _GetChannelOptio
6100: 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20  n(interp, chan, 
6110: 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20  "-translation", 
6120: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61  &upperChannelTra
6130: 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54  nslation);.    T
6140: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74  cl_GetChannelOpt
6150: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e  ion(interp, chan
6160: 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 26  , "-blocking", &
6170: 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63  upperChannelBloc
6180: 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 53  king);.    Tcl_S
6190: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28  etChannelOption(
61a0: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d  interp, chan, "-
61b0: 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 22 62  translation", "b
61c0: 69 6e 61 72 79 22 29 3b 0a 20 20 20 20 54 63 6c  inary");.    Tcl
61d0: 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f  _SetChannelOptio
61e0: 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20  n(interp, chan, 
61f0: 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 22 74 72  "-blocking", "tr
6200: 75 65 22 29 3b 0a 20 20 20 20 64 70 72 69 6e 74  ue");.    dprint
6210: 66 28 22 43 6f 6e 73 75 6d 69 6e 67 20 54 63 6c  f("Consuming Tcl
6220: 20 63 68 61 6e 6e 65 6c 20 25 73 22 2c 20 54 63   channel %s", Tc
6230: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65  l_GetChannelName
6240: 28 63 68 61 6e 29 29 3b 0a 20 20 20 20 73 74 61  (chan));.    sta
6250: 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 20 54 63  tePtr->self = Tc
6260: 6c 5f 53 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69  l_StackChannel(i
6270: 6e 74 65 72 70 2c 20 54 6c 73 5f 43 68 61 6e 6e  nterp, Tls_Chann
6280: 65 6c 54 79 70 65 28 29 2c 20 73 74 61 74 65 50  elType(), stateP
6290: 74 72 2c 20 28 54 43 4c 5f 52 45 41 44 41 42 4c  tr, (TCL_READABL
62a0: 45 20 7c 20 54 43 4c 5f 57 52 49 54 41 42 4c 45  E | TCL_WRITABLE
62b0: 29 2c 20 63 68 61 6e 29 3b 0a 20 20 20 20 64 70  ), chan);.    dp
62c0: 72 69 6e 74 66 28 22 43 72 65 61 74 65 64 20 63  rintf("Created c
62d0: 68 61 6e 6e 65 6c 20 6e 61 6d 65 64 20 25 73 22  hannel named %s"
62e0: 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  , Tcl_GetChannel
62f0: 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73  Name(statePtr->s
6300: 65 6c 66 29 29 3b 0a 20 20 20 20 69 66 20 28 73  elf));.    if (s
6310: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d  tatePtr->self ==
6320: 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e   (Tcl_Channel) N
6330: 55 4c 4c 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 4e  ULL) {../*.. * N
6340: 6f 20 75 73 65 20 6f 66 20 54 63 6c 5f 45 76 65  o use of Tcl_Eve
6350: 6e 74 75 61 6c 6c 79 46 72 65 65 20 62 65 63 61  ntuallyFree beca
6360: 75 73 65 20 6e 6f 20 70 6f 73 73 69 62 6c 65 20  use no possible 
6370: 54 63 6c 5f 50 72 65 73 65 72 76 65 2e 0a 09 20  Tcl_Preserve... 
6380: 2a 2f 0a 09 54 6c 73 5f 46 72 65 65 28 28 76 6f  */..Tls_Free((vo
6390: 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a  id *)statePtr);.
63a0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
63b0: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63  R;.    }..    Tc
63c0: 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69  l_SetChannelOpti
63d0: 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65  on(interp, state
63e0: 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 74 72 61  Ptr->self, "-tra
63f0: 6e 73 6c 61 74 69 6f 6e 22 2c 20 54 63 6c 5f 44  nslation", Tcl_D
6400: 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70  StringValue(&upp
6410: 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61  erChannelTransla
6420: 74 69 6f 6e 29 29 3b 0a 20 20 20 20 54 63 6c 5f  tion));.    Tcl_
6430: 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e  SetChannelOption
6440: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74  (interp, statePt
6450: 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 6e 63 6f 64  r->self, "-encod
6460: 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e  ing", Tcl_DStrin
6470: 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61  gValue(&upperCha
6480: 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 29 3b 0a  nnelEncoding));.
6490: 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e      Tcl_SetChann
64a0: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c  elOption(interp,
64b0: 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c   statePtr->self,
64c0: 20 22 2d 65 6f 66 63 68 61 72 22 2c 20 54 63 6c   "-eofchar", Tcl
64d0: 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75  _DStringValue(&u
64e0: 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68  pperChannelEOFCh
64f0: 61 72 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65  ar));.    Tcl_Se
6500: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69  tChannelOption(i
6510: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d  nterp, statePtr-
6520: 3e 73 65 6c 66 2c 20 22 2d 62 6c 6f 63 6b 69 6e  >self, "-blockin
6530: 67 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56  g", Tcl_DStringV
6540: 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e  alue(&upperChann
6550: 65 6c 42 6c 6f 63 6b 69 6e 67 29 29 3b 0a 0a 20  elBlocking));.. 
6560: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 53 4c     /*.     * SSL
6570: 20 49 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a   Initialization.
6580: 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 73 74 61       */..    sta
6590: 74 65 50 74 72 2d 3e 73 73 6c 20 3d 20 53 53 4c  tePtr->ssl = SSL
65a0: 5f 6e 65 77 28 73 74 61 74 65 50 74 72 2d 3e 63  _new(statePtr->c
65b0: 74 78 29 3b 0a 20 20 20 20 69 66 20 28 21 73 74  tx);.    if (!st
65c0: 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09  atePtr->ssl) {..
65d0: 2f 2a 20 53 53 4c 20 6c 69 62 72 61 72 79 20 65  /* SSL library e
65e0: 72 72 6f 72 20 2a 2f 0a 09 54 63 6c 5f 41 70 70  rror */..Tcl_App
65f0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
6600: 2c 20 22 63 6f 75 6c 64 6e 27 74 20 63 6f 6e 73  , "couldn't cons
6610: 74 72 75 63 74 20 73 73 6c 20 73 65 73 73 69 6f  truct ssl sessio
6620: 6e 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20  n: ", REASON(), 
6630: 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09  (char *)NULL);..
6640: 54 6c 73 5f 46 72 65 65 28 28 76 6f 69 64 20 2a  Tls_Free((void *
6650: 29 73 74 61 74 65 50 74 72 29 3b 0a 09 72 65 74  )statePtr);..ret
6660: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
6670: 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 4f 50     }..#ifndef OP
6680: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 45 58 54 0a  ENSSL_NO_TLSEXT.
6690: 20 20 20 20 69 66 20 28 73 65 72 76 65 72 6e 61      if (serverna
66a0: 6d 65 29 20 7b 0a 09 69 66 20 28 21 53 53 4c 5f  me) {..if (!SSL_
66b0: 73 65 74 5f 74 6c 73 65 78 74 5f 68 6f 73 74 5f  set_tlsext_host_
66c0: 6e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73  name(statePtr->s
66d0: 73 6c 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 20  sl, servername) 
66e0: 26 26 20 72 65 71 75 69 72 65 29 20 7b 0a 09 20  && require) {.. 
66f0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
6700: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 73 65 74  ult(interp, "set
6710: 74 69 6e 67 20 54 4c 53 20 68 6f 73 74 20 6e 61  ting TLS host na
6720: 6d 65 20 65 78 74 65 6e 73 69 6f 6e 20 66 61 69  me extension fai
6730: 6c 65 64 22 2c 20 28 63 68 61 72 20 2a 29 4e 55  led", (char *)NU
6740: 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72  LL);..    Tls_Fr
6750: 65 65 28 28 76 6f 69 64 20 2a 29 73 74 61 74 65  ee((void *)state
6760: 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72  Ptr);..    retur
6770: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a  n TCL_ERROR;..}.
6780: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
6790: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20    /*.     * SSL 
67a0: 43 61 6c 6c 62 61 63 6b 73 0a 20 20 20 20 20 2a  Callbacks.     *
67b0: 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 61 70  /.    SSL_set_ap
67c0: 70 5f 64 61 74 61 28 73 74 61 74 65 50 74 72 2d  p_data(statePtr-
67d0: 3e 73 73 6c 2c 20 28 76 6f 69 64 20 2a 29 73 74  >ssl, (void *)st
67e0: 61 74 65 50 74 72 29 3b 09 2f 2a 20 70 6f 69 6e  atePtr);./* poin
67f0: 74 20 62 61 63 6b 20 74 6f 20 75 73 20 2a 2f 0a  t back to us */.
6800: 20 20 20 20 53 53 4c 5f 73 65 74 5f 76 65 72 69      SSL_set_veri
6810: 66 79 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  fy(statePtr->ssl
6820: 2c 20 76 65 72 69 66 79 2c 20 56 65 72 69 66 79  , verify, Verify
6830: 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 53  Callback);.    S
6840: 53 4c 5f 43 54 58 5f 73 65 74 5f 69 6e 66 6f 5f  SL_CTX_set_info_
6850: 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 74  callback(statePt
6860: 72 2d 3e 63 74 78 2c 20 49 6e 66 6f 43 61 6c 6c  r->ctx, InfoCall
6870: 62 61 63 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  back);..    /* C
6880: 72 65 61 74 65 20 54 63 6c 5f 43 68 61 6e 6e 65  reate Tcl_Channe
6890: 6c 20 42 49 4f 20 48 61 6e 64 6c 65 72 20 2a 2f  l BIO Handler */
68a0: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 70  .    statePtr->p
68b0: 5f 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 5f 74  _bio.= BIO_new_t
68c0: 63 6c 28 73 74 61 74 65 50 74 72 2c 20 42 49 4f  cl(statePtr, BIO
68d0: 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 20 20 20 20 73  _NOCLOSE);.    s
68e0: 74 61 74 65 50 74 72 2d 3e 62 69 6f 09 3d 20 42  tatePtr->bio.= B
68f0: 49 4f 5f 6e 65 77 28 42 49 4f 5f 66 5f 73 73 6c  IO_new(BIO_f_ssl
6900: 28 29 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 65  ());..    if (se
6910: 72 76 65 72 29 20 7b 0a 09 73 74 61 74 65 50 74  rver) {..statePt
6920: 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f  r->flags |= TLS_
6930: 54 43 4c 5f 53 45 52 56 45 52 3b 0a 09 53 53 4c  TCL_SERVER;..SSL
6940: 5f 73 65 74 5f 61 63 63 65 70 74 5f 73 74 61 74  _set_accept_stat
6950: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  e(statePtr->ssl)
6960: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
6970: 53 53 4c 5f 73 65 74 5f 63 6f 6e 6e 65 63 74 5f  SSL_set_connect_
6980: 73 74 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e  state(statePtr->
6990: 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ssl);.    }.    
69a0: 53 53 4c 5f 73 65 74 5f 62 69 6f 28 73 74 61 74  SSL_set_bio(stat
69b0: 65 50 74 72 2d 3e 73 73 6c 2c 20 73 74 61 74 65  ePtr->ssl, state
69c0: 50 74 72 2d 3e 70 5f 62 69 6f 2c 20 73 74 61 74  Ptr->p_bio, stat
69d0: 65 50 74 72 2d 3e 70 5f 62 69 6f 29 3b 0a 20 20  ePtr->p_bio);.  
69e0: 20 20 42 49 4f 5f 73 65 74 5f 73 73 6c 28 73 74    BIO_set_ssl(st
69f0: 61 74 65 50 74 72 2d 3e 62 69 6f 2c 20 73 74 61  atePtr->bio, sta
6a00: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 42 49 4f 5f  tePtr->ssl, BIO_
6a10: 4e 4f 43 4c 4f 53 45 29 3b 0a 0a 20 20 20 20 2f  NOCLOSE);..    /
6a20: 2a 0a 20 20 20 20 20 2a 20 45 6e 64 20 6f 66 20  *.     * End of 
6a30: 53 53 4c 20 49 6e 69 74 0a 20 20 20 20 20 2a 2f  SSL Init.     */
6a40: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 65  .    dprintf("Re
6a50: 74 75 72 6e 69 6e 67 20 25 73 22 2c 20 54 63 6c  turning %s", Tcl
6a60: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28  _GetChannelName(
6a70: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 29  statePtr->self))
6a80: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73  ;.    Tcl_SetRes
6a90: 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
6aa0: 72 20 2a 29 20 54 63 6c 5f 47 65 74 43 68 61 6e  r *) Tcl_GetChan
6ab0: 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72  nelName(statePtr
6ac0: 2d 3e 73 65 6c 66 29 2c 20 54 43 4c 5f 56 4f 4c  ->self), TCL_VOL
6ad0: 41 54 49 4c 45 29 3b 0a 20 20 20 20 72 65 74 75  ATILE);.    retu
6ae0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f  rn TCL_OK;.}.../
6af0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
6b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6b30: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 55 6e  -------. *. * Un
6b40: 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a  importObjCmd --.
6b50: 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65   *. *.This proce
6b60: 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20  dure is invoked 
6b70: 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74 6f  to remove the to
6b80: 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 66 69  pmost channel fi
6b90: 6c 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  lter.. *. * Resu
6ba0: 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61  lts:. *.A standa
6bb0: 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20  rd Tcl result.. 
6bc0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
6bd0: 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 69 66 79  s:. *.May modify
6be0: 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66   the behavior of
6bf0: 20 61 6e 20 49 4f 20 63 68 61 6e 6e 65 6c 2e 0a   an IO channel..
6c00: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
6c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c40: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74  --------. */..st
6c50: 61 74 69 63 20 69 6e 74 0a 55 6e 69 6d 70 6f 72  atic int.Unimpor
6c60: 74 4f 62 6a 43 6d 64 28 0a 20 20 20 20 54 43 4c  tObjCmd(.    TCL
6c70: 5f 55 4e 55 53 45 44 28 76 6f 69 64 20 2a 29 2c  _UNUSED(void *),
6c80: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  .    Tcl_Interp 
6c90: 2a 69 6e 74 65 72 70 2c 0a 20 20 20 20 69 6e 74  *interp,.    int
6ca0: 20 6f 62 6a 63 2c 0a 20 20 20 20 54 63 6c 5f 4f   objc,.    Tcl_O
6cb0: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d  bj *const objv[]
6cc0: 29 0a 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e  ).{.    Tcl_Chan
6cd0: 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68  nel chan;../* Th
6ce0: 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74  e channel to set
6cf0: 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 0a   a mode on. */..
6d00: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
6d10: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28  led");..    if (
6d20: 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63  objc != 2) {..Tc
6d30: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
6d40: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
6d50: 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74  "channel");..ret
6d60: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
6d70: 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d     }..    chan =
6d80: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28   Tcl_GetChannel(
6d90: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
6da0: 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
6db0: 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63  NULL);.    if (c
6dc0: 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e  han == (Tcl_Chan
6dd0: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65  nel) NULL) {..re
6de0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
6df0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
6e00: 20 20 20 2a 20 4d 61 6b 65 20 73 75 72 65 20 74     * Make sure t
6e10: 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65  o operate on the
6e20: 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c   topmost channel
6e30: 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 63 68 61  .     */.    cha
6e40: 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68  n = Tcl_GetTopCh
6e50: 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20  annel(chan);..  
6e60: 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61    if (Tcl_GetCha
6e70: 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21  nnelType(chan) !
6e80: 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70  = Tls_ChannelTyp
6e90: 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  e()) {..Tcl_Appe
6ea0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
6eb0: 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22   "bad channel \"
6ec0: 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  ", Tcl_GetChanne
6ed0: 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22  lName(chan),..."
6ee0: 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68  \": not a TLS ch
6ef0: 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a 29  annel", (char *)
6f00: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54  NULL);..return T
6f10: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
6f20: 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 55 6e 73  .    if (Tcl_Uns
6f30: 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65  tackChannel(inte
6f40: 72 70 2c 20 63 68 61 6e 29 20 3d 3d 20 54 43 4c  rp, chan) == TCL
6f50: 5f 45 52 52 4f 52 29 20 7b 0a 09 72 65 74 75 72  _ERROR) {..retur
6f60: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
6f70: 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54   }..    return T
6f80: 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  CL_OK;.}.../*. *
6f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6fd0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 54 58 5f 49 6e  ---. *. * CTX_In
6fe0: 69 74 20 2d 2d 20 63 6f 6e 73 74 72 75 63 74 20  it -- construct 
6ff0: 61 20 53 53 4c 5f 43 54 58 20 69 6e 73 74 61 6e  a SSL_CTX instan
7000: 63 65 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  ce. *. * Results
7010: 3a 0a 20 2a 09 41 20 76 61 6c 69 64 20 53 53 4c  :. *.A valid SSL
7020: 5f 43 54 58 20 69 6e 73 74 61 6e 63 65 20 6f 72  _CTX instance or
7030: 20 4e 55 4c 4c 2e 0a 20 2a 0a 20 2a 20 53 69 64   NULL.. *. * Sid
7040: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 63 6f  e effects:. *.co
7050: 6e 73 74 72 75 63 74 73 20 53 53 4c 20 63 6f 6e  nstructs SSL con
7060: 74 65 78 74 20 28 43 54 58 29 0a 20 2a 0a 20 2a  text (CTX). *. *
7070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
70a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
70b0: 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20  ---. */..static 
70c0: 53 53 4c 5f 43 54 58 20 2a 0a 43 54 58 5f 49 6e  SSL_CTX *.CTX_In
70d0: 69 74 28 0a 20 20 20 20 53 74 61 74 65 20 2a 73  it(.    State *s
70e0: 74 61 74 65 50 74 72 2c 0a 20 20 20 20 54 43 4c  tatePtr,.    TCL
70f0: 5f 55 4e 55 53 45 44 28 69 6e 74 29 20 2f 2a 20  _UNUSED(int) /* 
7100: 69 73 53 65 72 76 65 72 20 2a 2f 2c 0a 20 20 20  isServer */,.   
7110: 20 69 6e 74 20 70 72 6f 74 6f 2c 0a 20 20 20 20   int proto,.    
7120: 63 68 61 72 20 2a 6b 65 79 66 69 6c 65 2c 0a 20  char *keyfile,. 
7130: 20 20 20 63 68 61 72 20 2a 63 65 72 74 66 69 6c     char *certfil
7140: 65 2c 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  e,.    unsigned 
7150: 63 68 61 72 20 2a 6b 65 79 2c 0a 20 20 20 20 75  char *key,.    u
7160: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63 65  nsigned char *ce
7170: 72 74 2c 0a 20 20 20 20 69 6e 74 20 6b 65 79 5f  rt,.    int key_
7180: 6c 65 6e 2c 0a 20 20 20 20 69 6e 74 20 63 65 72  len,.    int cer
7190: 74 5f 6c 65 6e 2c 0a 20 20 20 20 63 68 61 72 20  t_len,.    char 
71a0: 2a 43 41 64 69 72 2c 0a 20 20 20 20 63 68 61 72  *CAdir,.    char
71b0: 20 2a 43 41 66 69 6c 65 2c 0a 20 20 20 20 63 68   *CAfile,.    ch
71c0: 61 72 20 2a 63 69 70 68 65 72 73 2c 0a 20 20 20  ar *ciphers,.   
71d0: 20 63 68 61 72 20 2a 44 48 70 61 72 61 6d 73 29   char *DHparams)
71e0: 0a 7b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72  .{.    Tcl_Inter
71f0: 70 20 2a 69 6e 74 65 72 70 20 3d 20 73 74 61 74  p *interp = stat
7200: 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20  ePtr->interp;.  
7210: 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 20 3d    SSL_CTX *ctx =
7220: 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 44   NULL;.    Tcl_D
7230: 53 74 72 69 6e 67 20 64 73 3b 0a 20 20 20 20 54  String ds;.    T
7240: 63 6c 5f 44 53 74 72 69 6e 67 20 64 73 31 3b 0a  cl_DString ds1;.
7250: 20 20 20 20 69 6e 74 20 6f 66 66 20 3d 20 30 3b      int off = 0;
7260: 0a 20 20 20 20 69 6e 74 20 6c 6f 61 64 5f 70 72  .    int load_pr
7270: 69 76 61 74 65 5f 6b 65 79 3b 0a 20 20 20 20 63  ivate_key;.    c
7280: 6f 6e 73 74 20 53 53 4c 5f 4d 45 54 48 4f 44 20  onst SSL_METHOD 
7290: 2a 6d 65 74 68 6f 64 3b 0a 0a 20 20 20 20 64 70  *method;..    dp
72a0: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
72b0: 0a 0a 20 20 20 20 69 66 20 28 21 70 72 6f 74 6f  ..    if (!proto
72c0: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
72d0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e  esult(interp, "n
72e0: 6f 20 76 61 6c 69 64 20 70 72 6f 74 6f 63 6f 6c  o valid protocol
72f0: 20 73 65 6c 65 63 74 65 64 22 2c 20 28 63 68 61   selected", (cha
7300: 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 75  r *)NULL);..retu
7310: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a  rn NULL;.    }..
7320: 20 20 20 20 2f 2a 20 63 72 65 61 74 65 20 53 53      /* create SS
7330: 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 20  L context */.   
7340: 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f   if (ENABLED(pro
7350: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53  to, TLS_PROTO_SS
7360: 4c 32 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  L2)) {..Tcl_Appe
7370: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
7380: 20 22 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73   "protocol not s
7390: 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72  upported", (char
73a0: 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72   *)NULL);..retur
73b0: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 69  n NULL;.    }.#i
73c0: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c  f defined(NO_SSL
73d0: 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50  3) || defined(OP
73e0: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 7c  ENSSL_NO_SSL3) |
73f0: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  | defined(OPENSS
7400: 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44  L_NO_SSL3_METHOD
7410: 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45  ).    if (ENABLE
7420: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f  D(proto, TLS_PRO
7430: 54 4f 5f 53 53 4c 33 29 29 20 7b 0a 09 54 63 6c  TO_SSL3)) {..Tcl
7440: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
7450: 74 65 72 70 2c 20 22 70 72 6f 74 6f 63 6f 6c 20  terp, "protocol 
7460: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20  not supported", 
7470: 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09  (char *)NULL);..
7480: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20  return NULL;.   
7490: 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65   }.#endif.#if de
74a0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c  fined(NO_TLS1) |
74b0: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  | defined(OPENSS
74c0: 4c 5f 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65  L_NO_TLS1) || de
74d0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
74e0: 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a 20 20  _TLS1_METHOD).  
74f0: 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72    if (ENABLED(pr
7500: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  oto, TLS_PROTO_T
7510: 4c 53 31 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70  LS1)) {..Tcl_App
7520: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
7530: 2c 20 22 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20  , "protocol not 
7540: 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61  supported", (cha
7550: 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 75  r *)NULL);..retu
7560: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23  rn NULL;.    }.#
7570: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
7580: 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20  d(NO_TLS1_1) || 
7590: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
75a0: 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65  NO_TLS1_1) || de
75b0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
75c0: 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a  _TLS1_1_METHOD).
75d0: 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28      if (ENABLED(
75e0: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f  proto, TLS_PROTO
75f0: 5f 54 4c 53 31 5f 31 29 29 20 7b 0a 09 54 63 6c  _TLS1_1)) {..Tcl
7600: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
7610: 74 65 72 70 2c 20 22 70 72 6f 74 6f 63 6f 6c 20  terp, "protocol 
7620: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20  not supported", 
7630: 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09  (char *)NULL);..
7640: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20  return NULL;.   
7650: 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65   }.#endif.#if de
7660: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29  fined(NO_TLS1_2)
7670: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e   || defined(OPEN
7680: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c  SSL_NO_TLS1_2) |
7690: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  | defined(OPENSS
76a0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48  L_NO_TLS1_2_METH
76b0: 4f 44 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42  OD).    if (ENAB
76c0: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50  LED(proto, TLS_P
76d0: 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 29 20 7b 0a  ROTO_TLS1_2)) {.
76e0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
76f0: 74 28 69 6e 74 65 72 70 2c 20 22 70 72 6f 74 6f  t(interp, "proto
7700: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65  col not supporte
7710: 64 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c  d", (char *)NULL
7720: 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b  );..return NULL;
7730: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  .    }.#endif.#i
7740: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53  f defined(NO_TLS
7750: 31 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  1_3) || defined(
7760: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
7770: 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50  3) || defined(OP
7780: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 5f  ENSSL_NO_TLS1_3_
7790: 4d 45 54 48 4f 44 29 0a 20 20 20 20 69 66 20 28  METHOD).    if (
77a0: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54  ENABLED(proto, T
77b0: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29  LS_PROTO_TLS1_3)
77c0: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
77d0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 70  esult(interp, "p
77e0: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70  rotocol not supp
77f0: 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29  orted", (char *)
7800: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e  NULL);..return N
7810: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ULL;.    }.#endi
7820: 66 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28 70  f..    switch (p
7830: 72 6f 74 6f 29 20 7b 0a 23 69 66 20 21 64 65 66  roto) {.#if !def
7840: 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26  ined(NO_SSL3) &&
7850: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
7860: 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64  L_NO_SSL3) && !d
7870: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
7880: 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29 0a 20  O_SSL3_METHOD). 
7890: 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54     case TLS_PROT
78a0: 4f 5f 53 53 4c 33 3a 0a 09 6d 65 74 68 6f 64 20  O_SSL3:..method 
78b0: 3d 20 53 53 4c 76 33 5f 6d 65 74 68 6f 64 20 28  = SSLv3_method (
78c0: 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69  );..break;.#endi
78d0: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  f.#if !defined(N
78e0: 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 69  O_TLS1) && !defi
78f0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
7900: 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64  LS1) && !defined
7910: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
7920: 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73  _METHOD).    cas
7930: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31  e TLS_PROTO_TLS1
7940: 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 54 4c 53 76  :..method = TLSv
7950: 31 5f 6d 65 74 68 6f 64 20 28 29 3b 0a 09 62 72  1_method ();..br
7960: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  eak;.#endif.#if 
7970: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31  !defined(NO_TLS1
7980: 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  _1) && !defined(
7990: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
79a0: 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  1) && !defined(O
79b0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31  PENSSL_NO_TLS1_1
79c0: 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73  _METHOD).    cas
79d0: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31  e TLS_PROTO_TLS1
79e0: 5f 31 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 54 4c  _1:..method = TL
79f0: 53 76 31 5f 31 5f 6d 65 74 68 6f 64 20 28 29 3b  Sv1_1_method ();
7a00: 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a  ..break;.#endif.
7a10: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f  #if !defined(NO_
7a20: 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69  TLS1_2) && !defi
7a30: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
7a40: 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e  LS1_2) && !defin
7a50: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
7a60: 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 20 20 20  S1_2_METHOD).   
7a70: 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f   case TLS_PROTO_
7a80: 54 4c 53 31 5f 32 3a 0a 09 6d 65 74 68 6f 64 20  TLS1_2:..method 
7a90: 3d 20 54 4c 53 76 31 5f 32 5f 6d 65 74 68 6f 64  = TLSv1_2_method
7aa0: 20 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e   ();..break;.#en
7ab0: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64  dif.#if !defined
7ac0: 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21  (NO_TLS1_3) && !
7ad0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
7ae0: 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64  NO_TLS1_3) && !d
7af0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
7b00: 4f 5f 54 4c 53 31 5f 33 5f 4d 45 54 48 4f 44 29  O_TLS1_3_METHOD)
7b10: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52  .    case TLS_PR
7b20: 4f 54 4f 5f 54 4c 53 31 5f 33 3a 0a 09 2f 2a 20  OTO_TLS1_3:../* 
7b30: 55 73 65 20 74 68 65 20 67 65 6e 65 72 69 63 20  Use the generic 
7b40: 6d 65 74 68 6f 64 20 61 6e 64 20 63 6f 6e 73 74  method and const
7b50: 72 61 69 6e 74 20 72 61 6e 67 65 20 61 66 74 65  raint range afte
7b60: 72 20 63 6f 6e 74 65 78 74 20 69 73 20 63 72 65  r context is cre
7b70: 61 74 65 64 20 2a 2f 0a 09 6d 65 74 68 6f 64 20  ated */..method 
7b80: 3d 20 54 4c 53 5f 6d 65 74 68 6f 64 20 28 29 3b  = TLS_method ();
7b90: 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a  ..break;.#endif.
7ba0: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 23 69 66      default:.#if
7bb0: 64 65 66 20 48 41 56 45 5f 54 4c 53 5f 4d 45 54  def HAVE_TLS_MET
7bc0: 48 4f 44 0a 20 20 20 20 20 20 20 20 6d 65 74 68  HOD.        meth
7bd0: 6f 64 20 3d 20 54 4c 53 5f 6d 65 74 68 6f 64 20  od = TLS_method 
7be0: 28 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20  ();.#else.      
7bf0: 20 20 6d 65 74 68 6f 64 20 3d 20 53 53 4c 76 32    method = SSLv2
7c00: 33 5f 6d 65 74 68 6f 64 20 28 29 3b 0a 23 65 6e  3_method ();.#en
7c10: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64  dif.#if !defined
7c20: 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65  (NO_SSL3) && !de
7c30: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
7c40: 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e  _SSL3) && !defin
7c50: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53  ed(OPENSSL_NO_SS
7c60: 4c 33 5f 4d 45 54 48 4f 44 29 0a 09 6f 66 66 20  L3_METHOD)..off 
7c70: 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74  |= (ENABLED(prot
7c80: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c  o, TLS_PROTO_SSL
7c90: 33 29 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f  3)   ? 0 : SSL_O
7ca0: 50 5f 4e 4f 5f 53 53 4c 76 33 29 3b 0a 23 65 6e  P_NO_SSLv3);.#en
7cb0: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64  dif.#if !defined
7cc0: 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65  (NO_TLS1) && !de
7cd0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
7ce0: 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e  _TLS1) && !defin
7cf0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
7d00: 53 31 5f 4d 45 54 48 4f 44 29 0a 09 6f 66 66 20  S1_METHOD)..off 
7d10: 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74  |= (ENABLED(prot
7d20: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53  o, TLS_PROTO_TLS
7d30: 31 29 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f  1)   ? 0 : SSL_O
7d40: 50 5f 4e 4f 5f 54 4c 53 76 31 29 3b 0a 23 65 6e  P_NO_TLSv1);.#en
7d50: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64  dif.#if !defined
7d60: 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21  (NO_TLS1_1) && !
7d70: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
7d80: 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64  NO_TLS1_1) && !d
7d90: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
7da0: 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29  O_TLS1_1_METHOD)
7db0: 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45  ..off |= (ENABLE
7dc0: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f  D(proto, TLS_PRO
7dd0: 54 4f 5f 54 4c 53 31 5f 31 29 20 3f 20 30 20 3a  TO_TLS1_1) ? 0 :
7de0: 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31   SSL_OP_NO_TLSv1
7df0: 5f 31 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  _1);.#endif.#if 
7e00: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31  !defined(NO_TLS1
7e10: 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  _2) && !defined(
7e20: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
7e30: 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  2) && !defined(O
7e40: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32  PENSSL_NO_TLS1_2
7e50: 5f 4d 45 54 48 4f 44 29 0a 09 6f 66 66 20 7c 3d  _METHOD)..off |=
7e60: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c   (ENABLED(proto,
7e70: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f   TLS_PROTO_TLS1_
7e80: 32 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f  2) ? 0 : SSL_OP_
7e90: 4e 4f 5f 54 4c 53 76 31 5f 32 29 3b 0a 23 65 6e  NO_TLSv1_2);.#en
7ea0: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64  dif.#if !defined
7eb0: 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21  (NO_TLS1_3) && !
7ec0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
7ed0: 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64  NO_TLS1_3) && !d
7ee0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
7ef0: 4f 5f 54 4c 53 31 5f 33 5f 4d 45 54 48 4f 44 29  O_TLS1_3_METHOD)
7f00: 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45  ..off |= (ENABLE
7f10: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f  D(proto, TLS_PRO
7f20: 54 4f 5f 54 4c 53 31 5f 33 29 20 3f 20 30 20 3a  TO_TLS1_3) ? 0 :
7f30: 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31   SSL_OP_NO_TLSv1
7f40: 5f 33 29 3b 0a 23 65 6e 64 69 66 0a 09 62 72 65  _3);.#endif..bre
7f50: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63  ak;.    }..    c
7f60: 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77  tx = SSL_CTX_new
7f70: 20 28 6d 65 74 68 6f 64 29 3b 0a 0a 20 20 20 20   (method);..    
7f80: 69 66 20 28 21 63 74 78 29 20 7b 0a 09 72 65 74  if (!ctx) {..ret
7f90: 75 72 6e 28 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d  urn(NULL);.    }
7fa0: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  ..#if !defined(N
7fb0: 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65  O_TLS1_3) && !de
7fc0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
7fd0: 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 69 66 20  _TLS1_3).    if 
7fe0: 28 70 72 6f 74 6f 20 3d 3d 20 54 4c 53 5f 50 52  (proto == TLS_PR
7ff0: 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 7b 0a 09 53  OTO_TLS1_3) {..S
8000: 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70  SL_CTX_set_min_p
8010: 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78  roto_version(ctx
8020: 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e  , TLS1_3_VERSION
8030: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f  );..SSL_CTX_set_
8040: 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f  max_proto_versio
8050: 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45  n(ctx, TLS1_3_VE
8060: 52 53 49 4f 4e 29 3b 0a 20 20 20 20 7d 0a 23 65  RSION);.    }.#e
8070: 6e 64 69 66 0a 0a 20 20 20 20 53 53 4c 5f 43 54  ndif..    SSL_CT
8080: 58 5f 73 65 74 5f 61 70 70 5f 64 61 74 61 28 63  X_set_app_data(c
8090: 74 78 2c 20 69 6e 74 65 72 70 29 3b 09 2f 2a 20  tx, interp);./* 
80a0: 72 65 6d 65 6d 62 65 72 20 74 68 65 20 69 6e 74  remember the int
80b0: 65 72 70 72 65 74 65 72 20 2a 2f 0a 20 20 20 20  erpreter */.    
80c0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69  SSL_CTX_set_opti
80d0: 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f  ons(ctx, SSL_OP_
80e0: 41 4c 4c 29 3b 09 2f 2a 20 61 6c 6c 20 53 53 4c  ALL);./* all SSL
80f0: 20 62 75 67 20 77 6f 72 6b 61 72 6f 75 6e 64 73   bug workarounds
8100: 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f   */.    SSL_CTX_
8110: 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c  set_options(ctx,
8120: 20 6f 66 66 29 3b 09 2f 2a 20 61 6c 6c 20 53 53   off);./* all SS
8130: 4c 20 62 75 67 20 77 6f 72 6b 61 72 6f 75 6e 64  L bug workaround
8140: 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58  s */.    SSL_CTX
8150: 5f 73 65 73 73 5f 73 65 74 5f 63 61 63 68 65 5f  _sess_set_cache_
8160: 73 69 7a 65 28 63 74 78 2c 20 31 32 38 29 3b 0a  size(ctx, 128);.
8170: 0a 20 20 20 20 69 66 20 28 63 69 70 68 65 72 73  .    if (ciphers
8180: 20 21 3d 20 4e 55 4c 4c 29 0a 09 53 53 4c 5f 43   != NULL)..SSL_C
8190: 54 58 5f 73 65 74 5f 63 69 70 68 65 72 5f 6c 69  TX_set_cipher_li
81a0: 73 74 28 63 74 78 2c 20 63 69 70 68 65 72 73 29  st(ctx, ciphers)
81b0: 3b 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 73 6f  ;..    /* set so
81c0: 6d 65 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a  me callbacks */.
81d0: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f      SSL_CTX_set_
81e0: 64 65 66 61 75 6c 74 5f 70 61 73 73 77 64 5f 63  default_passwd_c
81f0: 62 28 63 74 78 2c 20 50 61 73 73 77 6f 72 64 43  b(ctx, PasswordC
8200: 61 6c 6c 62 61 63 6b 29 3b 0a 0a 23 69 66 6e 64  allback);..#ifnd
8210: 65 66 20 42 53 41 46 45 0a 20 20 20 20 53 53 4c  ef BSAFE.    SSL
8220: 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74  _CTX_set_default
8230: 5f 70 61 73 73 77 64 5f 63 62 5f 75 73 65 72 64  _passwd_cb_userd
8240: 61 74 61 28 63 74 78 2c 20 28 76 6f 69 64 20 2a  ata(ctx, (void *
8250: 29 73 74 61 74 65 50 74 72 29 3b 0a 23 65 6e 64  )statePtr);.#end
8260: 69 66 0a 0a 20 20 20 20 2f 2a 20 72 65 61 64 20  if..    /* read 
8270: 61 20 44 69 66 66 69 65 2d 48 65 6c 6c 6d 61 6e  a Diffie-Hellman
8280: 20 70 61 72 61 6d 65 74 65 72 73 20 66 69 6c 65   parameters file
8290: 2c 20 6f 72 20 75 73 65 20 74 68 65 20 62 75 69  , or use the bui
82a0: 6c 74 2d 69 6e 20 6f 6e 65 20 2a 2f 0a 23 69 66  lt-in one */.#if
82b0: 64 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 44  def OPENSSL_NO_D
82c0: 48 0a 20 20 20 20 69 66 20 28 44 48 70 61 72 61  H.    if (DHpara
82d0: 6d 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54  ms != NULL) {..T
82e0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
82f0: 69 6e 74 65 72 70 2c 20 22 44 48 20 70 61 72 61  interp, "DH para
8300: 6d 65 74 65 72 20 73 75 70 70 6f 72 74 20 6e 6f  meter support no
8310: 74 20 61 76 61 69 6c 61 62 6c 65 22 2c 20 28 63  t available", (c
8320: 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 53 53  har *)NULL);..SS
8330: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b  L_CTX_free(ctx);
8340: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20  ..return NULL;. 
8350: 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 7b     }.#else.    {
8360: 0a 09 44 48 2a 20 64 68 3b 0a 09 69 66 20 28 44  ..DH* dh;..if (D
8370: 48 70 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c 29  Hparams != NULL)
8380: 20 7b 0a 09 20 20 20 20 42 49 4f 20 2a 62 69 6f   {..    BIO *bio
8390: 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69  ;..    Tcl_DStri
83a0: 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a 09 20 20  ngInit(&ds);..  
83b0: 20 20 62 69 6f 20 3d 20 42 49 4f 5f 6e 65 77 5f    bio = BIO_new_
83c0: 66 69 6c 65 28 46 32 4e 28 44 48 70 61 72 61 6d  file(F2N(DHparam
83d0: 73 2c 20 26 64 73 29 2c 20 22 72 22 29 3b 0a 09  s, &ds), "r");..
83e0: 20 20 20 20 69 66 20 28 21 62 69 6f 29 20 7b 0a      if (!bio) {.
83f0: 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65  ..Tcl_DStringFre
8400: 65 28 26 64 73 29 3b 0a 09 09 54 63 6c 5f 41 70  e(&ds);...Tcl_Ap
8410: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
8420: 70 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 20 66 69  p, "Could not fi
8430: 6e 64 20 44 48 20 70 61 72 61 6d 65 74 65 72 73  nd DH parameters
8440: 20 66 69 6c 65 22 2c 20 28 63 68 61 72 20 2a 29   file", (char *)
8450: 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58  NULL);...SSL_CTX
8460: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65  _free(ctx);...re
8470: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20  turn NULL;..    
8480: 7d 0a 0a 09 20 20 20 20 64 68 20 3d 20 50 45 4d  }...    dh = PEM
8490: 5f 72 65 61 64 5f 62 69 6f 5f 44 48 70 61 72 61  _read_bio_DHpara
84a0: 6d 73 28 62 69 6f 2c 20 4e 55 4c 4c 2c 20 4e 55  ms(bio, NULL, NU
84b0: 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20  LL, NULL);..    
84c0: 42 49 4f 5f 66 72 65 65 28 62 69 6f 29 3b 0a 09  BIO_free(bio);..
84d0: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46      Tcl_DStringF
84e0: 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20 69  ree(&ds);..    i
84f0: 66 20 28 21 64 68 29 20 7b 0a 09 09 54 63 6c 5f  f (!dh) {...Tcl_
8500: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
8510: 65 72 70 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 20  erp, "Could not 
8520: 72 65 61 64 20 44 48 20 70 61 72 61 6d 65 74 65  read DH paramete
8530: 72 73 20 66 72 6f 6d 20 66 69 6c 65 22 2c 20 28  rs from file", (
8540: 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 09  char *)NULL);...
8550: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78  SSL_CTX_free(ctx
8560: 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c  );...return NULL
8570: 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 53 53  ;..    }..    SS
8580: 4c 5f 43 54 58 5f 73 65 74 5f 74 6d 70 5f 64 68  L_CTX_set_tmp_dh
8590: 28 63 74 78 2c 20 64 68 29 3b 0a 09 20 20 20 20  (ctx, dh);..    
85a0: 44 48 5f 66 72 65 65 28 64 68 29 3b 0a 09 7d 20  DH_free(dh);..} 
85b0: 65 6c 73 65 20 7b 0a 09 20 20 20 20 2f 2a 20 55  else {..    /* U
85c0: 73 65 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 44 48  se well known DH
85d0: 20 70 61 72 61 6d 65 74 65 72 73 20 74 68 61 74   parameters that
85e0: 20 68 61 76 65 20 62 75 69 6c 74 2d 69 6e 20 73   have built-in s
85f0: 75 70 70 6f 72 74 20 69 6e 20 4f 70 65 6e 53 53  upport in OpenSS
8600: 4c 20 2a 2f 0a 09 20 20 20 20 69 66 20 28 21 53  L */..    if (!S
8610: 53 4c 5f 43 54 58 5f 73 65 74 5f 64 68 5f 61 75  SL_CTX_set_dh_au
8620: 74 6f 28 63 74 78 2c 20 31 29 29 20 7b 0a 09 09  to(ctx, 1)) {...
8630: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
8640: 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64 20  (interp, "Could 
8650: 6e 6f 74 20 65 6e 61 62 6c 65 20 73 65 74 20 44  not enable set D
8660: 48 20 61 75 74 6f 3a 20 22 2c 20 52 45 41 53 4f  H auto: ", REASO
8670: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c  N(), (char *)NUL
8680: 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72  L);...SSL_CTX_fr
8690: 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72  ee(ctx);...retur
86a0: 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09  n NULL;..    }..
86b0: 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  }.    }.#endif..
86c0: 20 20 20 20 2f 2a 20 73 65 74 20 6f 75 72 20 63      /* set our c
86d0: 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 20 20  ertificate */.  
86e0: 20 20 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b    load_private_k
86f0: 65 79 20 3d 20 30 3b 0a 20 20 20 20 69 66 20 28  ey = 0;.    if (
8700: 63 65 72 74 66 69 6c 65 20 21 3d 20 4e 55 4c 4c  certfile != NULL
8710: 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 76 61 74  ) {..load_privat
8720: 65 5f 6b 65 79 20 3d 20 31 3b 0a 0a 09 54 63 6c  e_key = 1;...Tcl
8730: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73  _DStringInit(&ds
8740: 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54 58  );...if (SSL_CTX
8750: 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61 74 65  _use_certificate
8760: 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 4e 28 63  _file(ctx, F2N(c
8770: 65 72 74 66 69 6c 65 2c 20 26 64 73 29 2c 20 53  ertfile, &ds), S
8780: 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d 29  SL_FILETYPE_PEM)
8790: 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 63   <= 0) {..    Tc
87a0: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64  l_DStringFree(&d
87b0: 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70  s);..    Tcl_App
87c0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
87d0: 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74  , "unable to set
87e0: 20 63 65 72 74 69 66 69 63 61 74 65 20 66 69 6c   certificate fil
87f0: 65 20 22 2c 20 63 65 72 74 66 69 6c 65 2c 20 22  e ", certfile, "
8800: 3a 20 22 2c 0a 09 09 20 20 20 20 52 45 41 53 4f  : ",...    REASO
8810: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c  N(), (char *)NUL
8820: 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58  L);..    SSL_CTX
8830: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20  _free(ctx);..   
8840: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d   return NULL;..}
8850: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
8860: 63 65 72 74 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  cert != NULL) {.
8870: 09 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65  .load_private_ke
8880: 79 20 3d 20 31 3b 0a 09 69 66 20 28 53 53 4c 5f  y = 1;..if (SSL_
8890: 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63  CTX_use_certific
88a0: 61 74 65 5f 41 53 4e 31 28 63 74 78 2c 20 63 65  ate_ASN1(ctx, ce
88b0: 72 74 5f 6c 65 6e 2c 20 63 65 72 74 29 20 3c 3d  rt_len, cert) <=
88c0: 20 30 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44   0) {..    Tcl_D
88d0: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b  StringFree(&ds);
88e0: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ..    Tcl_Append
88f0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
8900: 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 63 65  unable to set ce
8910: 72 74 69 66 69 63 61 74 65 3a 20 22 2c 0a 09 09  rtificate: ",...
8920: 20 20 20 20 52 45 41 53 4f 4e 28 29 2c 20 28 63      REASON(), (c
8930: 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20  har *)NULL);..  
8940: 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63    SSL_CTX_free(c
8950: 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  tx);..    return
8960: 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20   NULL;..}.    } 
8970: 65 6c 73 65 20 7b 0a 09 63 65 72 74 66 69 6c 65  else {..certfile
8980: 20 3d 20 28 63 68 61 72 2a 29 58 35 30 39 5f 67   = (char*)X509_g
8990: 65 74 5f 64 65 66 61 75 6c 74 5f 63 65 72 74 5f  et_default_cert_
89a0: 66 69 6c 65 28 29 3b 0a 0a 09 69 66 20 28 53 53  file();...if (SS
89b0: 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66  L_CTX_use_certif
89c0: 69 63 61 74 65 5f 66 69 6c 65 28 63 74 78 2c 20  icate_file(ctx, 
89d0: 63 65 72 74 66 69 6c 65 2c 20 53 53 4c 5f 46 49  certfile, SSL_FI
89e0: 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30  LETYPE_PEM) <= 0
89f0: 29 20 7b 0a 23 69 66 20 30 0a 09 20 20 20 20 54  ) {.#if 0..    T
8a00: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
8a10: 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70  ds);..    Tcl_Ap
8a20: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
8a30: 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 75 73  p, "unable to us
8a40: 65 20 64 65 66 61 75 6c 74 20 63 65 72 74 69 66  e default certif
8a50: 69 63 61 74 65 20 66 69 6c 65 20 22 2c 20 63 65  icate file ", ce
8a60: 72 74 66 69 6c 65 2c 20 22 3a 20 22 2c 0a 09 09  rtfile, ": ",...
8a70: 20 20 20 20 52 45 41 53 4f 4e 28 29 2c 20 28 63      REASON(), (c
8a80: 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20  har *)NULL);..  
8a90: 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63    SSL_CTX_free(c
8aa0: 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  tx);..    return
8ab0: 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 09 7d   NULL;.#endif..}
8ac0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 73  .    }..    /* s
8ad0: 65 74 20 6f 75 72 20 70 72 69 76 61 74 65 20 6b  et our private k
8ae0: 65 79 20 2a 2f 0a 20 20 20 20 69 66 20 28 6c 6f  ey */.    if (lo
8af0: 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 29 20  ad_private_key) 
8b00: 7b 0a 09 69 66 20 28 6b 65 79 66 69 6c 65 20 3d  {..if (keyfile =
8b10: 3d 20 4e 55 4c 4c 20 26 26 20 6b 65 79 20 3d 3d  = NULL && key ==
8b20: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 6b 65   NULL) {..    ke
8b30: 79 66 69 6c 65 20 3d 20 63 65 72 74 66 69 6c 65  yfile = certfile
8b40: 3b 0a 09 7d 0a 0a 09 69 66 20 28 6b 65 79 66 69  ;..}...if (keyfi
8b50: 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20  le != NULL) {.. 
8b60: 20 20 20 2f 2a 20 67 65 74 20 74 68 65 20 70 72     /* get the pr
8b70: 69 76 61 74 65 20 6b 65 79 20 61 73 73 6f 63 69  ivate key associ
8b80: 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20 63  ated with this c
8b90: 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 20  ertificate */.. 
8ba0: 20 20 20 69 66 20 28 6b 65 79 66 69 6c 65 20 3d     if (keyfile =
8bb0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 6b 65 79 66  = NULL) {...keyf
8bc0: 69 6c 65 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a  ile = certfile;.
8bd0: 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20  .    }...    if 
8be0: 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69  (SSL_CTX_use_Pri
8bf0: 76 61 74 65 4b 65 79 5f 66 69 6c 65 28 63 74 78  vateKey_file(ctx
8c00: 2c 20 46 32 4e 28 6b 65 79 66 69 6c 65 2c 20 26  , F2N(keyfile, &
8c10: 64 73 29 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50  ds), SSL_FILETYP
8c20: 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09  E_PEM) <= 0) {..
8c30: 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65  .Tcl_DStringFree
8c40: 28 26 64 73 29 3b 0a 09 09 2f 2a 20 66 6c 75 73  (&ds);.../* flus
8c50: 68 20 74 68 65 20 70 61 73 73 70 68 72 61 73 65  h the passphrase
8c60: 20 77 68 69 63 68 20 6d 69 67 68 74 20 62 65 20   which might be 
8c70: 6c 65 66 74 20 69 6e 20 74 68 65 20 72 65 73 75  left in the resu
8c80: 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 52  lt */...Tcl_SetR
8c90: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 4e 55  esult(interp, NU
8ca0: 4c 4c 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b  LL, TCL_STATIC);
8cb0: 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  ...Tcl_AppendRes
8cc0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61  ult(interp, "una
8cd0: 62 6c 65 20 74 6f 20 73 65 74 20 70 75 62 6c 69  ble to set publi
8ce0: 63 20 6b 65 79 20 66 69 6c 65 20 22 2c 20 6b 65  c key file ", ke
8cf0: 79 66 69 6c 65 2c 20 22 20 22 2c 0a 09 09 09 52  yfile, " ",....R
8d00: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a  EASON(), (char *
8d10: 29 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54  )NULL);...SSL_CT
8d20: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72  X_free(ctx);...r
8d30: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20  eturn NULL;..   
8d40: 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72   }..    Tcl_DStr
8d50: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 7d  ingFree(&ds);..}
8d60: 20 65 6c 73 65 20 69 66 20 28 6b 65 79 20 21 3d   else if (key !=
8d70: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 69 66   NULL) {..    if
8d80: 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72   (SSL_CTX_use_Pr
8d90: 69 76 61 74 65 4b 65 79 5f 41 53 4e 31 28 45 56  ivateKey_ASN1(EV
8da0: 50 5f 50 4b 45 59 5f 52 53 41 2c 20 63 74 78 2c  P_PKEY_RSA, ctx,
8db0: 20 6b 65 79 2c 6b 65 79 5f 6c 65 6e 29 20 3c 3d   key,key_len) <=
8dc0: 20 30 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72   0) {...Tcl_DStr
8dd0: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 09  ingFree(&ds);...
8de0: 2f 2a 20 66 6c 75 73 68 20 74 68 65 20 70 61 73  /* flush the pas
8df0: 73 70 68 72 61 73 65 20 77 68 69 63 68 20 6d 69  sphrase which mi
8e00: 67 68 74 20 62 65 20 6c 65 66 74 20 69 6e 20 74  ght be left in t
8e10: 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 09 09 54  he result */...T
8e20: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
8e30: 65 72 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53  erp, NULL, TCL_S
8e40: 54 41 54 49 43 29 3b 0a 09 09 54 63 6c 5f 41 70  TATIC);...Tcl_Ap
8e50: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
8e60: 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65  p, "unable to se
8e70: 74 20 70 75 62 6c 69 63 20 6b 65 79 3a 20 22 2c  t public key: ",
8e80: 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72   REASON(), (char
8e90: 20 2a 29 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f   *)NULL);...SSL_
8ea0: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09  CTX_free(ctx);..
8eb0: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20  .return NULL;.. 
8ec0: 20 20 20 7d 0a 09 7d 0a 09 2f 2a 20 4e 6f 77 20     }..}../* Now 
8ed0: 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 61 20 6b  we know that a k
8ee0: 65 79 20 61 6e 64 20 63 65 72 74 20 68 61 76 65  ey and cert have
8ef0: 20 62 65 65 6e 20 73 65 74 20 61 67 61 69 6e 73   been set agains
8f00: 74 0a 09 20 2a 20 74 68 65 20 53 53 4c 20 63 6f  t.. * the SSL co
8f10: 6e 74 65 78 74 20 2a 2f 0a 09 69 66 20 28 21 53  ntext */..if (!S
8f20: 53 4c 5f 43 54 58 5f 63 68 65 63 6b 5f 70 72 69  SL_CTX_check_pri
8f30: 76 61 74 65 5f 6b 65 79 28 63 74 78 29 29 20 7b  vate_key(ctx)) {
8f40: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ..    Tcl_Append
8f50: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 0a 09  Result(interp,..
8f60: 09 20 20 20 20 22 70 72 69 76 61 74 65 20 6b 65  .    "private ke
8f70: 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  y does not match
8f80: 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65   the certificate
8f90: 20 70 75 62 6c 69 63 20 6b 65 79 22 2c 0a 09 09   public key",...
8fa0: 20 20 20 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c      (char *)NULL
8fb0: 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f  );..    SSL_CTX_
8fc0: 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20  free(ctx);..    
8fd0: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a  return NULL;..}.
8fe0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65      }..    /* Se
8ff0: 74 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 43  t verification C
9000: 41 73 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53  As */.    Tcl_DS
9010: 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a  tringInit(&ds);.
9020: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49      Tcl_DStringI
9030: 6e 69 74 28 26 64 73 31 29 3b 0a 20 20 20 20 69  nit(&ds1);.    i
9040: 66 20 28 21 53 53 4c 5f 43 54 58 5f 6c 6f 61 64  f (!SSL_CTX_load
9050: 5f 76 65 72 69 66 79 5f 6c 6f 63 61 74 69 6f 6e  _verify_location
9060: 73 28 63 74 78 2c 20 46 32 4e 28 43 41 66 69 6c  s(ctx, F2N(CAfil
9070: 65 2c 20 26 64 73 29 2c 20 46 32 4e 28 43 41 64  e, &ds), F2N(CAd
9080: 69 72 2c 20 26 64 73 31 29 29 20 7c 7c 0a 09 21  ir, &ds1)) ||..!
9090: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61  SSL_CTX_set_defa
90a0: 75 6c 74 5f 76 65 72 69 66 79 5f 70 61 74 68 73  ult_verify_paths
90b0: 28 63 74 78 29 29 20 7b 0a 23 69 66 20 30 0a 09  (ctx)) {.#if 0..
90c0: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
90d0: 26 64 73 29 3b 0a 09 54 63 6c 5f 44 53 74 72 69  &ds);..Tcl_DStri
90e0: 6e 67 46 72 65 65 28 26 64 73 31 29 3b 0a 09 2f  ngFree(&ds1);../
90f0: 2a 20 44 6f 6e 27 74 20 63 75 72 72 65 6e 74 6c  * Don't currentl
9100: 79 20 63 61 72 65 20 69 66 20 74 68 69 73 20 66  y care if this f
9110: 61 69 6c 73 20 2a 2f 0a 09 54 63 6c 5f 41 70 70  ails */..Tcl_App
9120: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
9130: 2c 20 22 53 53 4c 20 64 65 66 61 75 6c 74 20 76  , "SSL default v
9140: 65 72 69 66 79 20 70 61 74 68 73 3a 20 22 2c 0a  erify paths: ",.
9150: 09 09 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61  ..REASON(), (cha
9160: 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f  r *)NULL);..SSL_
9170: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09  CTX_free(ctx);..
9180: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 23 65 6e  return NULL;.#en
9190: 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  dif.    }..    /
91a0: 2a 20 68 74 74 70 73 3a 2f 2f 73 6f 75 72 63 65  * https://source
91b0: 66 6f 72 67 65 2e 6e 65 74 2f 70 2f 74 6c 73 2f  forge.net/p/tls/
91c0: 62 75 67 73 2f 35 37 2f 20 2a 2f 0a 20 20 20 20  bugs/57/ */.    
91d0: 2f 2a 20 58 58 58 3a 54 4f 44 4f 3a 20 4c 65 74  /* XXX:TODO: Let
91e0: 20 74 68 65 20 75 73 65 72 20 73 75 70 70 6c 79   the user supply
91f0: 20 76 61 6c 75 65 73 20 68 65 72 65 20 69 6e 73   values here ins
9200: 74 65 61 64 20 6f 66 20 73 6f 6d 65 74 68 69 6e  tead of somethin
9210: 67 20 74 68 61 74 20 65 78 69 73 74 73 20 6f 6e  g that exists on
9220: 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20   the filesystem 
9230: 2a 2f 0a 20 20 20 20 69 66 20 28 43 41 66 69 6c  */.    if (CAfil
9240: 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 20 20 20  e != NULL) {.   
9250: 20 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 58 35       STACK_OF(X5
9260: 30 39 5f 4e 41 4d 45 29 20 2a 63 65 72 74 4e 61  09_NAME) *certNa
9270: 6d 65 73 20 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63  mes = SSL_load_c
9280: 6c 69 65 6e 74 5f 43 41 5f 66 69 6c 65 28 46 32  lient_CA_file(F2
9290: 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29 29 3b  N(CAfile, &ds));
92a0: 0a 09 69 66 20 28 63 65 72 74 4e 61 6d 65 73 20  ..if (certNames 
92b0: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20  != NULL) {..    
92c0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65  SSL_CTX_set_clie
92d0: 6e 74 5f 43 41 5f 6c 69 73 74 28 63 74 78 2c 20  nt_CA_list(ctx, 
92e0: 63 65 72 74 4e 61 6d 65 73 29 3b 0a 09 7d 0a 20  certNames);..}. 
92f0: 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 44 53     }..    Tcl_DS
9300: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a  tringFree(&ds);.
9310: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46      Tcl_DStringF
9320: 72 65 65 28 26 64 73 31 29 3b 0a 20 20 20 20 72  ree(&ds1);.    r
9330: 65 74 75 72 6e 20 63 74 78 3b 0a 7d 0a 0c 0a 2f  eturn ctx;.}.../
9340: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
9350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9380: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 74  -------. *. * St
9390: 61 74 75 73 4f 62 6a 43 6d 64 20 2d 2d 20 72 65  atusObjCmd -- re
93a0: 74 75 72 6e 20 63 65 72 74 69 66 69 63 61 74 65  turn certificate
93b0: 20 66 6f 72 20 63 6f 6e 6e 65 63 74 65 64 20 70   for connected p
93c0: 65 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  eer.. *. * Resul
93d0: 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72  ts:. *.A standar
93e0: 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a  d Tcl result.. *
93f0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
9400: 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a  :. *.None.. *. *
9410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9450: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  ---. */.static i
9460: 6e 74 0a 53 74 61 74 75 73 4f 62 6a 43 6d 64 28  nt.StatusObjCmd(
9470: 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53 45 44 28  .    TCL_UNUSED(
9480: 76 6f 69 64 20 2a 29 2c 0a 20 20 20 20 54 63 6c  void *),.    Tcl
9490: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
94a0: 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  .    int objc,. 
94b0: 20 20 20 54 63 6c 5f 4f 62 6a 09 2a 63 6f 6e 73     Tcl_Obj.*cons
94c0: 74 20 6f 62 6a 76 5b 5d 29 0a 7b 0a 20 20 20 20  t objv[]).{.    
94d0: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b  State *statePtr;
94e0: 0a 20 20 20 20 58 35 30 39 20 2a 70 65 65 72 3b  .    X509 *peer;
94f0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62  .    Tcl_Obj *ob
9500: 6a 50 74 72 3b 0a 20 20 20 20 54 63 6c 5f 43 68  jPtr;.    Tcl_Ch
9510: 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 20 20  annel chan;.    
9520: 63 68 61 72 20 2a 63 68 61 6e 6e 65 6c 4e 61 6d  char *channelNam
9530: 65 2c 20 2a 63 69 70 68 65 72 73 3b 0a 20 20 20  e, *ciphers;.   
9540: 20 69 6e 74 20 6d 6f 64 65 3b 0a 0a 20 20 20 20   int mode;..    
9550: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
9560: 29 3b 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28  );..    switch (
9570: 6f 62 6a 63 29 20 7b 0a 09 63 61 73 65 20 32 3a  objc) {..case 2:
9580: 0a 09 20 20 20 20 63 68 61 6e 6e 65 6c 4e 61 6d  ..    channelNam
9590: 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
95a0: 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 09 20 20 20  g(objv[1]);..   
95b0: 20 62 72 65 61 6b 3b 0a 0a 09 63 61 73 65 20 33   break;...case 3
95c0: 3a 0a 09 20 20 20 20 69 66 20 28 21 73 74 72 63  :..    if (!strc
95d0: 6d 70 20 28 54 63 6c 5f 47 65 74 53 74 72 69 6e  mp (Tcl_GetStrin
95e0: 67 20 28 6f 62 6a 76 5b 31 5d 29 2c 20 22 2d 6c  g (objv[1]), "-l
95f0: 6f 63 61 6c 22 29 29 20 7b 0a 09 09 63 68 61 6e  ocal")) {...chan
9600: 6e 65 6c 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65  nelName = Tcl_Ge
9610: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
9620: 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20  ;...break;..    
9630: 7d 0a 09 20 20 20 20 2f 2a 20 66 61 6c 6c 74 68  }..    /* fallth
9640: 72 6f 75 67 68 20 2a 2f 0a 09 64 65 66 61 75 6c  rough */..defaul
9650: 74 3a 0a 09 20 20 20 20 54 63 6c 5f 57 72 6f 6e  t:..    Tcl_Wron
9660: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
9670: 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 2d 6c 6f 63   1, objv, "?-loc
9680: 61 6c 3f 20 63 68 61 6e 6e 65 6c 22 29 3b 0a 09  al? channel");..
9690: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
96a0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
96b0: 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43   chan = Tcl_GetC
96c0: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63  hannel(interp, c
96d0: 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 26 6d 6f 64  hannelName, &mod
96e0: 65 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e  e);.    if (chan
96f0: 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c   == (Tcl_Channel
9700: 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  ) NULL) {..retur
9710: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
9720: 20 7d 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a   }.    /*.     *
9730: 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70   Make sure to op
9740: 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70  erate on the top
9750: 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 0a 20 20 20  most channel.   
9760: 20 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20    */.    chan = 
9770: 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65  Tcl_GetTopChanne
9780: 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 20  l(chan);.    if 
9790: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54  (Tcl_GetChannelT
97a0: 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73  ype(chan) != Tls
97b0: 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20  _ChannelType()) 
97c0: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
97d0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64  ult(interp, "bad
97e0: 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63   channel \"", Tc
97f0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65  l_GetChannelName
9800: 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e  (chan),..."\": n
9810: 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c  ot a TLS channel
9820: 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29  ", (char *)NULL)
9830: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
9840: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ROR;.    }.    s
9850: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65  tatePtr = (State
9860: 20 2a 29 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e   *) Tcl_GetChann
9870: 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63  elInstanceData(c
9880: 68 61 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65  han);..    /* Ge
9890: 74 20 63 65 72 74 69 66 69 63 61 74 65 20 66 6f  t certificate fo
98a0: 72 20 70 65 65 72 20 6f 72 20 73 65 6c 66 20 2a  r peer or self *
98b0: 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d  /.    if (objc =
98c0: 3d 20 32 29 20 7b 0a 09 70 65 65 72 20 3d 20 53  = 2) {..peer = S
98d0: 53 4c 5f 67 65 74 5f 70 65 65 72 5f 63 65 72 74  SL_get_peer_cert
98e0: 69 66 69 63 61 74 65 28 73 74 61 74 65 50 74 72  ificate(statePtr
98f0: 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c  ->ssl);.    } el
9900: 73 65 20 7b 0a 09 70 65 65 72 20 3d 20 53 53 4c  se {..peer = SSL
9910: 5f 67 65 74 5f 63 65 72 74 69 66 69 63 61 74 65  _get_certificate
9920: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b  (statePtr->ssl);
9930: 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 47 65  .    }.    /* Ge
9940: 74 20 58 35 30 39 20 63 65 72 74 69 66 69 63 61  t X509 certifica
9950: 74 65 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 69  te info */.    i
9960: 66 20 28 70 65 65 72 29 20 7b 0a 09 6f 62 6a 50  f (peer) {..objP
9970: 74 72 20 3d 20 54 6c 73 5f 4e 65 77 58 35 30 39  tr = Tls_NewX509
9980: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 65 65 72  Obj(interp, peer
9990: 29 3b 0a 09 69 66 20 28 6f 62 6a 63 20 3d 3d 20  );..if (objc == 
99a0: 32 29 20 7b 0a 09 20 20 20 20 58 35 30 39 5f 66  2) {..    X509_f
99b0: 72 65 65 28 70 65 65 72 29 3b 0a 09 20 20 20 20  ree(peer);..    
99c0: 70 65 65 72 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a  peer = NULL;..}.
99d0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 6f 62      } else {..ob
99e0: 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69  jPtr = Tcl_NewLi
99f0: 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a  stObj(0, NULL);.
9a00: 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 4c      }..    Tcl_L
9a10: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
9a20: 65 6e 74 20 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ent (interp, obj
9a30: 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65  Ptr,..    Tcl_Ne
9a40: 77 53 74 72 69 6e 67 4f 62 6a 20 28 22 73 62 69  wStringObj ("sbi
9a50: 74 73 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54  ts", -1));.    T
9a60: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
9a70: 45 6c 65 6d 65 6e 74 20 28 69 6e 74 65 72 70 2c  Element (interp,
9a80: 20 6f 62 6a 50 74 72 2c 0a 09 20 20 20 20 54 63   objPtr,..    Tc
9a90: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 20 28 53 53 4c  l_NewIntObj (SSL
9aa0: 5f 67 65 74 5f 63 69 70 68 65 72 5f 62 69 74 73  _get_cipher_bits
9ab0: 20 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c   (statePtr->ssl,
9ac0: 20 4e 55 4c 4c 29 29 29 3b 0a 0a 20 20 20 20 63   NULL)));..    c
9ad0: 69 70 68 65 72 73 20 3d 20 28 63 68 61 72 2a 29  iphers = (char*)
9ae0: 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 28 73  SSL_get_cipher(s
9af0: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20  tatePtr->ssl);. 
9b00: 20 20 20 69 66 20 28 63 69 70 68 65 72 73 20 21     if (ciphers !
9b10: 3d 20 4e 55 4c 4c 20 26 26 20 73 74 72 63 6d 70  = NULL && strcmp
9b20: 28 63 69 70 68 65 72 73 2c 20 22 28 4e 4f 4e 45  (ciphers, "(NONE
9b30: 29 22 29 21 3d 30 29 20 7b 0a 09 54 63 6c 5f 4c  )")!=0) {..Tcl_L
9b40: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
9b50: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
9b60: 74 72 2c 0a 09 09 54 63 6c 5f 4e 65 77 53 74 72  tr,...Tcl_NewStr
9b70: 69 6e 67 4f 62 6a 28 22 63 69 70 68 65 72 22 2c  ingObj("cipher",
9b80: 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74   -1));..Tcl_List
9b90: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
9ba0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
9bb0: 0a 09 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  ...Tcl_NewString
9bc0: 4f 62 6a 28 53 53 4c 5f 67 65 74 5f 63 69 70 68  Obj(SSL_get_ciph
9bd0: 65 72 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  er(statePtr->ssl
9be0: 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 0a  ), -1));.    }..
9bf0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
9c00: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
9c10: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 0a 09 54 63  erp, objPtr,..Tc
9c20: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
9c30: 76 65 72 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a  version", -1));.
9c40: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
9c50: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
9c60: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 0a 09 54 63  erp, objPtr,..Tc
9c70: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53  l_NewStringObj(S
9c80: 53 4c 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 73  SL_get_version(s
9c90: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d  tatePtr->ssl), -
9ca0: 31 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 65  1));..    Tcl_Se
9cb0: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
9cc0: 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20  p, objPtr);.    
9cd0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
9ce0: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
9cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
9d30: 2a 20 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 20  * VersionObjCmd 
9d40: 2d 2d 20 72 65 74 75 72 6e 20 76 65 72 73 69 6f  -- return versio
9d50: 6e 20 73 74 72 69 6e 67 20 66 72 6f 6d 20 4f 70  n string from Op
9d60: 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73  enSSL.. *. * Res
9d70: 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64  ults:. *.A stand
9d80: 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a  ard Tcl result..
9d90: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
9da0: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a  ts:. *.None.. *.
9db0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
9dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9df0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63  -----. */.static
9e00: 20 69 6e 74 0a 56 65 72 73 69 6f 6e 4f 62 6a 43   int.VersionObjC
9e10: 6d 64 28 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53  md(.    TCL_UNUS
9e20: 45 44 28 76 6f 69 64 20 2a 29 2c 0a 20 20 20 20  ED(void *),.    
9e30: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
9e40: 72 70 2c 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53  rp,.    TCL_UNUS
9e50: 45 44 28 69 6e 74 29 20 2f 2a 20 6f 62 6a 63 20  ED(int) /* objc 
9e60: 2a 2f 2c 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53  */,.    TCL_UNUS
9e70: 45 44 28 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73  ED(Tcl_Obj *cons
9e80: 74 20 2a 29 20 2f 2a 20 6f 62 6a 76 20 2a 2f 29  t *) /* objv */)
9e90: 0a 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  .{.    Tcl_Obj *
9ea0: 6f 62 6a 50 74 72 3b 0a 0a 20 20 20 20 64 70 72  objPtr;..    dpr
9eb0: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
9ec0: 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63  .    objPtr = Tc
9ed0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 4f  l_NewStringObj(O
9ee0: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 54  PENSSL_VERSION_T
9ef0: 45 58 54 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 54  EXT, -1);..    T
9f00: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
9f10: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b  interp, objPtr);
9f20: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
9f30: 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  OK;.}.../*. *---
9f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9f80: 0a 20 2a 0a 20 2a 20 4d 69 73 63 4f 62 6a 43 6d  . *. * MiscObjCm
9f90: 64 20 2d 2d 20 6d 69 73 63 20 63 6f 6d 6d 61 6e  d -- misc comman
9fa0: 64 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  ds. *. * Results
9fb0: 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20  :. *.A standard 
9fc0: 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20  Tcl result.. *. 
9fd0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
9fe0: 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d   *.None.. *. *--
9ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a030: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  -. */.static int
a040: 0a 4d 69 73 63 4f 62 6a 43 6d 64 28 0a 20 20 20  .MiscObjCmd(.   
a050: 20 54 43 4c 5f 55 4e 55 53 45 44 28 76 6f 69 64   TCL_UNUSED(void
a060: 20 2a 29 2c 0a 20 20 20 20 54 63 6c 5f 49 6e 74   *),.    Tcl_Int
a070: 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 20  erp *interp,.   
a080: 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 20 20 54   int objc,.    T
a090: 63 6c 5f 4f 62 6a 09 2a 63 6f 6e 73 74 20 6f 62  cl_Obj.*const ob
a0a0: 6a 76 5b 5d 29 0a 7b 0a 20 20 20 20 73 74 61 74  jv[]).{.    stat
a0b0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63  ic const char *c
a0c0: 6f 6d 6d 61 6e 64 73 20 5b 5d 20 3d 20 7b 20 22  ommands [] = { "
a0d0: 72 65 71 22 2c 20 4e 55 4c 4c 20 7d 3b 0a 20 20  req", NULL };.  
a0e0: 20 20 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 20 7b    enum command {
a0f0: 20 43 5f 52 45 51 2c 20 43 5f 44 55 4d 4d 59 20   C_REQ, C_DUMMY 
a100: 7d 3b 0a 20 20 20 20 69 6e 74 20 63 6d 64 3b 0a  };.    int cmd;.
a110: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
a120: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20  lled");..    if 
a130: 28 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63  (objc < 2) {..Tc
a140: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
a150: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
a160: 22 73 75 62 63 6f 6d 6d 61 6e 64 20 3f 61 72 67  "subcommand ?arg
a170: 73 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  s?");..return TC
a180: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
a190: 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e     if (Tcl_GetIn
a1a0: 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  dexFromObj(inter
a1b0: 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 63 6f 6d 6d  p, objv[1], comm
a1c0: 61 6e 64 73 2c 0a 09 20 20 20 20 22 63 6f 6d 6d  ands,..    "comm
a1d0: 61 6e 64 22 2c 20 30 2c 26 63 6d 64 29 20 21 3d  and", 0,&cmd) !=
a1e0: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75   TCL_OK) {..retu
a1f0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
a200: 20 20 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 20    }..    switch 
a210: 28 28 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 29 20  ((enum command) 
a220: 63 6d 64 29 20 7b 0a 09 63 61 73 65 20 43 5f 52  cmd) {..case C_R
a230: 45 51 3a 20 7b 0a 09 20 20 20 20 45 56 50 5f 50  EQ: {..    EVP_P
a240: 4b 45 59 20 2a 70 6b 65 79 3d 4e 55 4c 4c 3b 0a  KEY *pkey=NULL;.
a250: 09 20 20 20 20 58 35 30 39 20 2a 63 65 72 74 3d  .    X509 *cert=
a260: 4e 55 4c 4c 3b 0a 09 20 20 20 20 58 35 30 39 5f  NULL;..    X509_
a270: 4e 41 4d 45 20 2a 6e 61 6d 65 3d 4e 55 4c 4c 3b  NAME *name=NULL;
a280: 0a 09 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a  ..    Tcl_Obj **
a290: 6c 69 73 74 76 3b 0a 09 20 20 20 20 54 63 6c 5f  listv;..    Tcl_
a2a0: 53 69 7a 65 20 6c 69 73 74 63 2c 69 3b 0a 0a 09  Size listc,i;...
a2b0: 20 20 20 20 42 49 4f 20 2a 6f 75 74 3d 4e 55 4c      BIO *out=NUL
a2c0: 4c 3b 0a 0a 09 20 20 20 20 63 6f 6e 73 74 20 63  L;...    const c
a2d0: 68 61 72 20 2a 6b 5f 43 3d 22 22 2c 2a 6b 5f 53  har *k_C="",*k_S
a2e0: 54 3d 22 22 2c 2a 6b 5f 4c 3d 22 22 2c 2a 6b 5f  T="",*k_L="",*k_
a2f0: 4f 3d 22 22 2c 2a 6b 5f 4f 55 3d 22 22 2c 2a 6b  O="",*k_OU="",*k
a300: 5f 43 4e 3d 22 22 2c 2a 6b 5f 45 6d 61 69 6c 3d  _CN="",*k_Email=
a310: 22 22 3b 0a 09 20 20 20 20 63 68 61 72 20 2a 6b  "";..    char *k
a320: 65 79 6f 75 74 2c 2a 70 65 6d 6f 75 74 2c 2a 73  eyout,*pemout,*s
a330: 74 72 3b 0a 09 20 20 20 20 69 6e 74 20 6b 65 79  tr;..    int key
a340: 73 69 7a 65 2c 73 65 72 69 61 6c 3d 30 2c 64 61  size,serial=0,da
a350: 79 73 3d 33 36 35 3b 0a 0a 09 20 20 20 20 69 66  ys=365;...    if
a360: 20 28 28 6f 62 6a 63 3c 35 29 20 7c 7c 20 28 6f   ((objc<5) || (o
a370: 62 6a 63 3e 36 29 29 20 7b 0a 09 09 54 63 6c 5f  bjc>6)) {...Tcl_
a380: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
a390: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 6b  erp, 2, objv, "k
a3a0: 65 79 73 69 7a 65 20 6b 65 79 66 69 6c 65 20 63  eysize keyfile c
a3b0: 65 72 74 66 69 6c 65 20 3f 69 6e 66 6f 3f 22 29  ertfile ?info?")
a3c0: 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  ;...return TCL_E
a3d0: 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 0a 09 20  RROR;..    }... 
a3e0: 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e     if (Tcl_GetIn
a3f0: 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
a400: 20 6f 62 6a 76 5b 32 5d 2c 20 26 6b 65 79 73 69   objv[2], &keysi
a410: 7a 65 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b  ze) != TCL_OK) {
a420: 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ...return TCL_ER
a430: 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20  ROR;..    }..   
a440: 20 6b 65 79 6f 75 74 3d 54 63 6c 5f 47 65 74 53   keyout=Tcl_GetS
a450: 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a  tring(objv[3]);.
a460: 09 20 20 20 20 70 65 6d 6f 75 74 3d 54 63 6c 5f  .    pemout=Tcl_
a470: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 34  GetString(objv[4
a480: 5d 29 3b 0a 0a 09 20 20 20 20 69 66 20 28 6f 62  ]);...    if (ob
a490: 6a 63 3e 3d 36 29 20 7b 0a 09 09 69 66 20 28 54  jc>=6) {...if (T
a4a0: 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65  cl_ListObjGetEle
a4b0: 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c 20 6f 62  ments(interp, ob
a4c0: 6a 76 5b 35 5d 2c 20 26 6c 69 73 74 63 2c 20 26  jv[5], &listc, &
a4d0: 6c 69 73 74 76 29 20 21 3d 20 54 43 4c 5f 4f 4b  listv) != TCL_OK
a4e0: 29 20 7b 0a 09 09 20 20 20 20 72 65 74 75 72 6e  ) {...    return
a4f0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a   TCL_ERROR;...}.
a500: 0a 09 09 69 66 20 28 28 6c 69 73 74 63 25 32 29  ...if ((listc%2)
a510: 20 21 3d 20 30 29 20 7b 0a 09 09 20 20 20 20 54   != 0) {...    T
a520: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
a530: 65 72 70 2c 22 49 6e 66 6f 72 6d 61 74 69 6f 6e  erp,"Information
a540: 20 6c 69 73 74 20 6d 75 73 74 20 68 61 76 65 20   list must have 
a550: 65 76 65 6e 20 6e 75 6d 62 65 72 20 6f 66 20 61  even number of a
a560: 72 67 75 6d 65 6e 74 73 22 2c 4e 55 4c 4c 29 3b  rguments",NULL);
a570: 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ...    return TC
a580: 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 09 09 66  L_ERROR;...}...f
a590: 6f 72 20 28 69 3d 30 3b 20 69 3c 6c 69 73 74 63  or (i=0; i<listc
a5a0: 3b 20 69 2b 3d 32 29 20 7b 0a 09 09 20 20 20 20  ; i+=2) {...    
a5b0: 73 74 72 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e  str=Tcl_GetStrin
a5c0: 67 28 6c 69 73 74 76 5b 69 5d 29 3b 0a 09 09 20  g(listv[i]);... 
a5d0: 20 20 20 69 66 20 28 73 74 72 63 6d 70 28 73 74     if (strcmp(st
a5e0: 72 2c 22 64 61 79 73 22 29 3d 3d 30 29 20 7b 0a  r,"days")==0) {.
a5f0: 09 09 09 69 66 20 28 54 63 6c 5f 47 65 74 49 6e  ...if (Tcl_GetIn
a600: 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
a610: 6c 69 73 74 76 5b 69 2b 31 5d 2c 26 64 61 79 73  listv[i+1],&days
a620: 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 20  )!=TCL_OK)....  
a630: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
a640: 4f 52 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65  OR;...    } else
a650: 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c   if (strcmp(str,
a660: 22 73 65 72 69 61 6c 22 29 3d 3d 30 29 20 7b 0a  "serial")==0) {.
a670: 09 09 09 69 66 20 28 54 63 6c 5f 47 65 74 49 6e  ...if (Tcl_GetIn
a680: 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
a690: 6c 69 73 74 76 5b 69 2b 31 5d 2c 26 73 65 72 69  listv[i+1],&seri
a6a0: 61 6c 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09  al)!=TCL_OK)....
a6b0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
a6c0: 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d 20 65 6c  RROR;...    } el
a6d0: 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74  se if (strcmp(st
a6e0: 72 2c 22 73 65 72 69 61 6c 22 29 3d 3d 30 29 20  r,"serial")==0) 
a6f0: 7b 0a 09 09 09 69 66 20 28 54 63 6c 5f 47 65 74  {....if (Tcl_Get
a700: 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
a710: 70 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c 26 73 65  p,listv[i+1],&se
a720: 72 69 61 6c 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09  rial)!=TCL_OK)..
a730: 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
a740: 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d 20  _ERROR;...    } 
a750: 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28  else if (strcmp(
a760: 73 74 72 2c 22 43 22 29 3d 3d 30 29 20 7b 0a 09  str,"C")==0) {..
a770: 09 09 6b 5f 43 3d 54 63 6c 5f 47 65 74 53 74 72  ..k_C=Tcl_GetStr
a780: 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b  ing(listv[i+1]);
a790: 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66  ...    } else if
a7a0: 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 53 54   (strcmp(str,"ST
a7b0: 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 53 54  ")==0) {....k_ST
a7c0: 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c  =Tcl_GetString(l
a7d0: 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20  istv[i+1]);...  
a7e0: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72    } else if (str
a7f0: 63 6d 70 28 73 74 72 2c 22 4c 22 29 3d 3d 30 29  cmp(str,"L")==0)
a800: 20 7b 0a 09 09 09 6b 5f 4c 3d 54 63 6c 5f 47 65   {....k_L=Tcl_Ge
a810: 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b  tString(listv[i+
a820: 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73  1]);...    } els
a830: 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72  e if (strcmp(str
a840: 2c 22 4f 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b  ,"O")==0) {....k
a850: 5f 4f 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  _O=Tcl_GetString
a860: 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09  (listv[i+1]);...
a870: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73      } else if (s
a880: 74 72 63 6d 70 28 73 74 72 2c 22 4f 55 22 29 3d  trcmp(str,"OU")=
a890: 3d 30 29 20 7b 0a 09 09 09 6b 5f 4f 55 3d 54 63  =0) {....k_OU=Tc
a8a0: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74  l_GetString(list
a8b0: 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d  v[i+1]);...    }
a8c0: 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70   else if (strcmp
a8d0: 28 73 74 72 2c 22 43 4e 22 29 3d 3d 30 29 20 7b  (str,"CN")==0) {
a8e0: 0a 09 09 09 6b 5f 43 4e 3d 54 63 6c 5f 47 65 74  ....k_CN=Tcl_Get
a8f0: 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31  String(listv[i+1
a900: 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65  ]);...    } else
a910: 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c   if (strcmp(str,
a920: 22 45 6d 61 69 6c 22 29 3d 3d 30 29 20 7b 0a 09  "Email")==0) {..
a930: 09 09 6b 5f 45 6d 61 69 6c 3d 54 63 6c 5f 47 65  ..k_Email=Tcl_Ge
a940: 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b  tString(listv[i+
a950: 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73  1]);...    } els
a960: 65 20 7b 0a 09 09 09 54 63 6c 5f 53 65 74 52 65  e {....Tcl_SetRe
a970: 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 55 6e 6b  sult(interp,"Unk
a980: 6e 6f 77 6e 20 70 61 72 61 6d 65 74 65 72 22 2c  nown parameter",
a990: 4e 55 4c 4c 29 3b 0a 09 09 09 72 65 74 75 72 6e  NULL);....return
a9a0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20   TCL_ERROR;...  
a9b0: 20 20 7d 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 09    }...}..    }..
a9c0: 20 20 20 20 69 66 20 28 28 70 6b 65 79 20 3d 20      if ((pkey = 
a9d0: 45 56 50 5f 50 4b 45 59 5f 6e 65 77 28 29 29 20  EVP_PKEY_new()) 
a9e0: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 66 20  != NULL) {...if 
a9f0: 28 21 45 56 50 5f 50 4b 45 59 5f 61 73 73 69 67  (!EVP_PKEY_assig
aa00: 6e 5f 52 53 41 28 70 6b 65 79 2c 0a 09 09 09 52  n_RSA(pkey,....R
aa10: 53 41 5f 67 65 6e 65 72 61 74 65 5f 6b 65 79 28  SA_generate_key(
aa20: 6b 65 79 73 69 7a 65 2c 20 30 78 31 30 30 30 31  keysize, 0x10001
aa30: 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 29 29 20  , NULL, NULL))) 
aa40: 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 52  {...    Tcl_SetR
aa50: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72  esult(interp,"Er
aa60: 72 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 70  ror generating p
aa70: 72 69 76 61 74 65 20 6b 65 79 22 2c 4e 55 4c 4c  rivate key",NULL
aa80: 29 3b 0a 09 09 20 20 20 20 45 56 50 5f 50 4b 45  );...    EVP_PKE
aa90: 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 09 09  Y_free(pkey);...
aaa0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
aab0: 52 52 4f 52 3b 0a 09 09 7d 0a 09 09 6f 75 74 3d  RROR;...}...out=
aac0: 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 69  BIO_new(BIO_s_fi
aad0: 6c 65 28 29 29 3b 0a 09 09 42 49 4f 5f 77 72 69  le());...BIO_wri
aae0: 74 65 5f 66 69 6c 65 6e 61 6d 65 28 6f 75 74 2c  te_filename(out,
aaf0: 6b 65 79 6f 75 74 29 3b 0a 09 09 50 45 4d 5f 77  keyout);...PEM_w
ab00: 72 69 74 65 5f 62 69 6f 5f 50 72 69 76 61 74 65  rite_bio_Private
ab10: 4b 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c  Key(out,pkey,NUL
ab20: 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55  L,NULL,0,NULL,NU
ab30: 4c 4c 29 3b 0a 09 09 42 49 4f 5f 66 72 65 65 5f  LL);...BIO_free_
ab40: 61 6c 6c 28 6f 75 74 29 3b 0a 0a 09 09 69 66 20  all(out);....if 
ab50: 28 28 63 65 72 74 3d 58 35 30 39 5f 6e 65 77 28  ((cert=X509_new(
ab60: 29 29 3d 3d 4e 55 4c 4c 29 20 7b 0a 09 09 20 20  ))==NULL) {...  
ab70: 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
ab80: 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 67 65  interp,"Error ge
ab90: 6e 65 72 61 74 69 6e 67 20 63 65 72 74 69 66 69  nerating certifi
aba0: 63 61 74 65 20 72 65 71 75 65 73 74 22 2c 4e 55  cate request",NU
abb0: 4c 4c 29 3b 0a 09 09 20 20 20 20 45 56 50 5f 50  LL);...    EVP_P
abc0: 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a  KEY_free(pkey);.
abd0: 09 09 20 20 20 20 72 65 74 75 72 6e 28 54 43 4c  ..    return(TCL
abe0: 5f 45 52 52 4f 52 29 3b 0a 09 09 7d 0a 0a 09 09  _ERROR);...}....
abf0: 58 35 30 39 5f 73 65 74 5f 76 65 72 73 69 6f 6e  X509_set_version
ac00: 28 63 65 72 74 2c 32 29 3b 0a 09 09 41 53 4e 31  (cert,2);...ASN1
ac10: 5f 49 4e 54 45 47 45 52 5f 73 65 74 28 58 35 30  _INTEGER_set(X50
ac20: 39 5f 67 65 74 5f 73 65 72 69 61 6c 4e 75 6d 62  9_get_serialNumb
ac30: 65 72 28 63 65 72 74 29 2c 73 65 72 69 61 6c 29  er(cert),serial)
ac40: 3b 0a 09 09 58 35 30 39 5f 67 6d 74 69 6d 65 5f  ;...X509_gmtime_
ac50: 61 64 6a 28 58 35 30 39 5f 67 65 74 5f 6e 6f 74  adj(X509_get_not
ac60: 42 65 66 6f 72 65 28 63 65 72 74 29 2c 30 29 3b  Before(cert),0);
ac70: 0a 09 09 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61  ...X509_gmtime_a
ac80: 64 6a 28 58 35 30 39 5f 67 65 74 5f 6e 6f 74 41  dj(X509_get_notA
ac90: 66 74 65 72 28 63 65 72 74 29 2c 28 6c 6f 6e 67  fter(cert),(long
aca0: 29 36 30 2a 36 30 2a 32 34 2a 64 61 79 73 29 3b  )60*60*24*days);
acb0: 0a 09 09 58 35 30 39 5f 73 65 74 5f 70 75 62 6b  ...X509_set_pubk
acc0: 65 79 28 63 65 72 74 2c 70 6b 65 79 29 3b 0a 0a  ey(cert,pkey);..
acd0: 09 09 6e 61 6d 65 3d 58 35 30 39 5f 67 65 74 5f  ..name=X509_get_
ace0: 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72  subject_name(cer
acf0: 74 29 3b 0a 0a 09 09 58 35 30 39 5f 4e 41 4d 45  t);....X509_NAME
ad00: 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78  _add_entry_by_tx
ad10: 74 28 6e 61 6d 65 2c 22 43 22 2c 20 4d 42 53 54  t(name,"C", MBST
ad20: 52 49 4e 47 5f 41 53 43 2c 20 28 75 6e 73 69 67  RING_ASC, (unsig
ad30: 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 43 2c  ned char *) k_C,
ad40: 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58   -1, -1, 0);...X
ad50: 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74  509_NAME_add_ent
ad60: 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22  ry_by_txt(name,"
ad70: 53 54 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53  ST", MBSTRING_AS
ad80: 43 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61  C, (unsigned cha
ad90: 72 20 2a 29 20 6b 5f 53 54 2c 20 2d 31 2c 20 2d  r *) k_ST, -1, -
ada0: 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41  1, 0);...X509_NA
adb0: 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f  ME_add_entry_by_
adc0: 74 78 74 28 6e 61 6d 65 2c 22 4c 22 2c 20 4d 42  txt(name,"L", MB
add0: 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 75 6e 73  STRING_ASC, (uns
ade0: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f  igned char *) k_
adf0: 4c 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09  L, -1, -1, 0);..
ae00: 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65  .X509_NAME_add_e
ae10: 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65  ntry_by_txt(name
ae20: 2c 22 4f 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41  ,"O", MBSTRING_A
ae30: 53 43 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68  SC, (unsigned ch
ae40: 61 72 20 2a 29 20 6b 5f 4f 2c 20 2d 31 2c 20 2d  ar *) k_O, -1, -
ae50: 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41  1, 0);...X509_NA
ae60: 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f  ME_add_entry_by_
ae70: 74 78 74 28 6e 61 6d 65 2c 22 4f 55 22 2c 20 4d  txt(name,"OU", M
ae80: 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 75 6e  BSTRING_ASC, (un
ae90: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b  signed char *) k
aea0: 5f 4f 55 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b  _OU, -1, -1, 0);
aeb0: 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64  ...X509_NAME_add
aec0: 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61  _entry_by_txt(na
aed0: 6d 65 2c 22 43 4e 22 2c 20 4d 42 53 54 52 49 4e  me,"CN", MBSTRIN
aee0: 47 5f 41 53 43 2c 20 28 75 6e 73 69 67 6e 65 64  G_ASC, (unsigned
aef0: 20 63 68 61 72 20 2a 29 20 6b 5f 43 4e 2c 20 2d   char *) k_CN, -
af00: 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30  1, -1, 0);...X50
af10: 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79  9_NAME_add_entry
af20: 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 45 6d  _by_txt(name,"Em
af30: 61 69 6c 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41  ail", MBSTRING_A
af40: 53 43 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68  SC, (unsigned ch
af50: 61 72 20 2a 29 20 6b 5f 45 6d 61 69 6c 2c 20 2d  ar *) k_Email, -
af60: 31 2c 20 2d 31 2c 20 30 29 3b 0a 0a 09 09 58 35  1, -1, 0);....X5
af70: 30 39 5f 73 65 74 5f 73 75 62 6a 65 63 74 5f 6e  09_set_subject_n
af80: 61 6d 65 28 63 65 72 74 2c 6e 61 6d 65 29 3b 0a  ame(cert,name);.
af90: 0a 09 09 69 66 20 28 21 58 35 30 39 5f 73 69 67  ...if (!X509_sig
afa0: 6e 28 63 65 72 74 2c 70 6b 65 79 2c 45 56 50 5f  n(cert,pkey,EVP_
afb0: 6d 64 35 28 29 29 29 20 7b 0a 09 09 20 20 20 20  md5())) {...    
afc0: 58 35 30 39 5f 66 72 65 65 28 63 65 72 74 29 3b  X509_free(cert);
afd0: 0a 09 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f  ...    EVP_PKEY_
afe0: 66 72 65 65 28 70 6b 65 79 29 3b 0a 09 09 20 20  free(pkey);...  
aff0: 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
b000: 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 73 69  interp,"Error si
b010: 67 6e 69 6e 67 20 63 65 72 74 69 66 69 63 61 74  gning certificat
b020: 65 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20  e",NULL);...    
b030: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
b040: 3b 0a 09 09 7d 0a 0a 09 09 6f 75 74 3d 42 49 4f  ;...}....out=BIO
b050: 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 69 6c 65 28  _new(BIO_s_file(
b060: 29 29 3b 0a 09 09 42 49 4f 5f 77 72 69 74 65 5f  ));...BIO_write_
b070: 66 69 6c 65 6e 61 6d 65 28 6f 75 74 2c 70 65 6d  filename(out,pem
b080: 6f 75 74 29 3b 0a 0a 09 09 50 45 4d 5f 77 72 69  out);....PEM_wri
b090: 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f 75 74 2c  te_bio_X509(out,
b0a0: 63 65 72 74 29 3b 0a 09 09 42 49 4f 5f 66 72 65  cert);...BIO_fre
b0b0: 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a 0a 09 09 58  e_all(out);....X
b0c0: 35 30 39 5f 66 72 65 65 28 63 65 72 74 29 3b 0a  509_free(cert);.
b0d0: 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28  ..EVP_PKEY_free(
b0e0: 70 6b 65 79 29 3b 0a 09 20 20 20 20 7d 20 65 6c  pkey);..    } el
b0f0: 73 65 20 7b 0a 09 09 54 63 6c 5f 53 65 74 52 65  se {...Tcl_SetRe
b100: 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72  sult(interp,"Err
b110: 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 70 72  or generating pr
b120: 69 76 61 74 65 20 6b 65 79 22 2c 4e 55 4c 4c 29  ivate key",NULL)
b130: 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  ;...return TCL_E
b140: 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a  RROR;..    }..}.
b150: 09 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61  .break;.    defa
b160: 75 6c 74 3a 0a 09 62 72 65 61 6b 3b 0a 20 20 20  ult:..break;.   
b170: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43   }.    return TC
b180: 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  L_OK;.}.../*. *-
b190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b1a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b1b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b1c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b1d0: 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 46 72 65  --. *. * Tls_Fre
b1e0: 65 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20  e --. *. *.This 
b1f0: 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73  procedure cleans
b200: 20 75 70 20 77 68 65 6e 20 61 20 53 53 4c 20 73   up when a SSL s
b210: 6f 63 6b 65 74 20 62 61 73 65 64 20 63 68 61 6e  ocket based chan
b220: 6e 65 6c 0a 20 2a 09 69 73 20 63 6c 6f 73 65 64  nel. *.is closed
b230: 20 61 6e 64 20 69 74 73 20 72 65 66 65 72 65 6e   and its referen
b240: 63 65 20 63 6f 75 6e 74 20 66 61 6c 6c 73 20 62  ce count falls b
b250: 65 6c 6f 77 20 31 0a 20 2a 0a 20 2a 20 52 65 73  elow 1. *. * Res
b260: 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a  ults:. *.none. *
b270: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
b280: 3a 0a 20 2a 09 46 72 65 65 73 20 61 6c 6c 20 74  :. *.Frees all t
b290: 68 65 20 73 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d  he state. *. *--
b2a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b2b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b2c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b2d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b2e0: 2d 0a 20 2a 2f 0a 76 6f 69 64 0a 23 69 66 20 54  -. */.void.#if T
b2f0: 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e  CL_MAJOR_VERSION
b300: 20 3e 20 38 0a 54 6c 73 5f 46 72 65 65 28 20 76   > 8.Tls_Free( v
b310: 6f 69 64 20 2a 62 6c 6f 63 6b 50 74 72 20 29 0a  oid *blockPtr ).
b320: 23 65 6c 73 65 0a 54 6c 73 5f 46 72 65 65 28 20  #else.Tls_Free( 
b330: 63 68 61 72 20 2a 62 6c 6f 63 6b 50 74 72 20 29  char *blockPtr )
b340: 0a 23 65 6e 64 69 66 0a 7b 0a 20 20 20 20 53 74  .#endif.{.    St
b350: 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20  ate *statePtr = 
b360: 28 53 74 61 74 65 20 2a 29 62 6c 6f 63 6b 50 74  (State *)blockPt
b370: 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  r;..    dprintf(
b380: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
b390: 54 6c 73 5f 43 6c 65 61 6e 28 73 74 61 74 65 50  Tls_Clean(stateP
b3a0: 74 72 29 3b 0a 20 20 20 20 63 6b 66 72 65 65 28  tr);.    ckfree(
b3b0: 62 6c 6f 63 6b 50 74 72 29 3b 0a 7d 0a 0c 0a 2f  blockPtr);.}.../
b3c0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
b3d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b3e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b3f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b400: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c  -------. *. * Tl
b410: 73 5f 43 6c 65 61 6e 20 2d 2d 0a 20 2a 0a 20 2a  s_Clean --. *. *
b420: 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20  .This procedure 
b430: 63 6c 65 61 6e 73 20 75 70 20 77 68 65 6e 20 61  cleans up when a
b440: 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65   SSL socket base
b450: 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20  d channel. *.is 
b460: 63 6c 6f 73 65 64 20 61 6e 64 20 69 74 73 20 72  closed and its r
b470: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66  eference count f
b480: 61 6c 6c 73 20 62 65 6c 6f 77 20 31 2e 20 20 54  alls below 1.  T
b490: 68 69 73 20 73 68 6f 75 6c 64 0a 20 2a 09 62 65  his should. *.be
b4a0: 20 63 61 6c 6c 65 64 20 73 79 6e 63 68 72 6f 6e   called synchron
b4b0: 6f 75 73 6c 79 20 62 79 20 74 68 65 20 43 6c 6f  ously by the Clo
b4c0: 73 65 50 72 6f 63 2c 20 6e 6f 74 20 69 6e 20 74  seProc, not in t
b4d0: 68 65 0a 20 2a 09 45 76 65 6e 74 75 61 6c 6c 79  he. *.Eventually
b4e0: 46 72 65 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 20  Free callback.. 
b4f0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
b500: 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65  .none. *. * Side
b510: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 46 72 65   effects:. *.Fre
b520: 65 73 20 61 6c 6c 20 74 68 65 20 73 74 61 74 65  es all the state
b530: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
b540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f  ---------. */.vo
b580: 69 64 20 54 6c 73 5f 43 6c 65 61 6e 28 53 74 61  id Tls_Clean(Sta
b590: 74 65 20 2a 73 74 61 74 65 50 74 72 29 20 7b 0a  te *statePtr) {.
b5a0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
b5b0: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20  led");..    /*. 
b5c0: 20 20 20 20 2a 20 77 65 27 72 65 20 61 73 73 75      * we're assu
b5d0: 6d 69 6e 67 20 68 65 72 65 20 74 68 61 74 20 77  ming here that w
b5e0: 65 27 72 65 20 73 69 6e 67 6c 65 2d 74 68 72 65  e're single-thre
b5f0: 61 64 65 64 0a 20 20 20 20 20 2a 2f 0a 20 20 20  aded.     */.   
b600: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 74   if (statePtr->t
b610: 69 6d 65 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d  imer != (Tcl_Tim
b620: 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b  erToken) NULL) {
b630: 0a 09 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65  ..Tcl_DeleteTime
b640: 72 48 61 6e 64 6c 65 72 28 73 74 61 74 65 50 74  rHandler(statePt
b650: 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 73 74 61 74  r->timer);..stat
b660: 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 4e 55  ePtr->timer = NU
b670: 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  LL;.    }..    i
b680: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f  f (statePtr->bio
b690: 29 20 7b 0a 09 2f 2a 20 54 68 69 73 20 77 69 6c  ) {../* This wil
b6a0: 6c 20 63 61 6c 6c 20 53 53 4c 5f 73 68 75 74 64  l call SSL_shutd
b6b0: 6f 77 6e 2e 20 42 75 67 20 31 34 31 34 30 34 35  own. Bug 1414045
b6c0: 20 2a 2f 0a 09 64 70 72 69 6e 74 66 28 22 42 49   */..dprintf("BI
b6d0: 4f 5f 66 72 65 65 5f 61 6c 6c 28 25 70 29 22 2c  O_free_all(%p)",
b6e0: 20 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b   statePtr->bio);
b6f0: 0a 09 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 73  ..BIO_free_all(s
b700: 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09  tatePtr->bio);..
b710: 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 20 3d 20  statePtr->bio = 
b720: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  NULL;.    }.    
b730: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73 73  if (statePtr->ss
b740: 6c 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 53  l) {..dprintf("S
b750: 53 4c 5f 66 72 65 65 28 25 70 29 22 2c 20 73 74  SL_free(%p)", st
b760: 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 53  atePtr->ssl);..S
b770: 53 4c 5f 66 72 65 65 28 73 74 61 74 65 50 74 72  SL_free(statePtr
b780: 2d 3e 73 73 6c 29 3b 0a 09 73 74 61 74 65 50 74  ->ssl);..statePt
b790: 72 2d 3e 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20  r->ssl = NULL;. 
b7a0: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61     }.    if (sta
b7b0: 74 65 50 74 72 2d 3e 63 74 78 29 20 7b 0a 09 53  tePtr->ctx) {..S
b7c0: 53 4c 5f 43 54 58 5f 66 72 65 65 28 73 74 61 74  SL_CTX_free(stat
b7d0: 65 50 74 72 2d 3e 63 74 78 29 3b 0a 09 73 74 61  ePtr->ctx);..sta
b7e0: 74 65 50 74 72 2d 3e 63 74 78 20 3d 20 4e 55 4c  tePtr->ctx = NUL
b7f0: 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  L;.    }.    if 
b800: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62  (statePtr->callb
b810: 61 63 6b 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72  ack) {..Tcl_Decr
b820: 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74  RefCount(statePt
b830: 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 73  r->callback);..s
b840: 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63  tatePtr->callbac
b850: 6b 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  k = NULL;.    }.
b860: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
b870: 2d 3e 70 61 73 73 77 6f 72 64 29 20 7b 0a 09 54  ->password) {..T
b880: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
b890: 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f  statePtr->passwo
b8a0: 72 64 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e  rd);..statePtr->
b8b0: 70 61 73 73 77 6f 72 64 20 3d 20 4e 55 4c 4c 3b  password = NULL;
b8c0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69  .    }..    dpri
b8d0: 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 22 29  ntf("Returning")
b8e0: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ;.}.../*. *-----
b8f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
b930: 2a 0a 20 2a 20 54 6c 73 5f 49 6e 69 74 20 2d 2d  *. * Tls_Init --
b940: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 69 73 20 61  . *. *.This is a
b950: 20 70 61 63 6b 61 67 65 20 69 6e 69 74 69 61 6c   package initial
b960: 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65 64 75 72  ization procedur
b970: 65 2c 20 77 68 69 63 68 20 69 73 20 63 61 6c 6c  e, which is call
b980: 65 64 0a 20 2a 09 62 79 20 54 63 6c 20 77 68 65  ed. *.by Tcl whe
b990: 6e 20 74 68 69 73 20 70 61 63 6b 61 67 65 20 69  n this package i
b9a0: 73 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f  s to be added to
b9b0: 20 61 6e 20 69 6e 74 65 72 70 72 65 74 65 72 2e   an interpreter.
b9c0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 20  . *. * Results: 
b9d0: 20 53 73 6c 20 63 6f 6e 66 69 67 75 72 65 64 20   Ssl configured 
b9e0: 61 6e 64 20 6c 6f 61 64 65 64 0a 20 2a 0a 20 2a  and loaded. *. *
b9f0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
ba00: 2a 09 20 63 72 65 61 74 65 20 74 68 65 20 73 73  *. create the ss
ba10: 6c 20 63 6f 6d 6d 61 6e 64 2c 20 69 6e 69 74 69  l command, initi
ba20: 61 6c 69 73 65 20 73 73 6c 20 63 6f 6e 74 65 78  alise ssl contex
ba30: 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  t. *. *---------
ba40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ba50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ba60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ba70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a  ----------. */..
ba80: 23 69 66 6e 64 65 66 20 53 54 52 49 4e 47 49 46  #ifndef STRINGIF
ba90: 59 0a 23 20 20 64 65 66 69 6e 65 20 53 54 52 49  Y.#  define STRI
baa0: 4e 47 49 46 59 28 78 29 20 53 54 52 49 4e 47 49  NGIFY(x) STRINGI
bab0: 46 59 31 28 78 29 0a 23 20 20 64 65 66 69 6e 65  FY1(x).#  define
bac0: 20 53 54 52 49 4e 47 49 46 59 31 28 78 29 20 23   STRINGIFY1(x) #
bad0: 78 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74 69 63  x.#endif..static
bae0: 20 63 6f 6e 73 74 20 63 68 61 72 20 74 6c 73 54   const char tlsT
baf0: 63 6c 49 6e 69 74 53 63 72 69 70 74 5b 5d 20 3d  clInitScript[] =
bb00: 20 7b 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c 73   {.#include "tls
bb10: 2e 74 63 6c 2e 68 22 0a 20 20 20 20 30 78 30 30  .tcl.h".    0x00
bb20: 0a 7d 3b 0a 0a 44 4c 4c 45 58 50 4f 52 54 20 69  .};..DLLEXPORT i
bb30: 6e 74 20 54 6c 73 5f 49 6e 69 74 28 0a 20 20 20  nt Tls_Init(.   
bb40: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
bb50: 65 72 70 29 0a 7b 0a 20 20 20 20 54 63 6c 5f 43  erp).{.    Tcl_C
bb60: 6d 64 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20  mdInfo info;..  
bb70: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
bb80: 64 22 29 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 57 65  d");.../*.. * We
bb90: 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 54 63   only support Tc
bba0: 6c 20 38 2e 36 20 6f 72 20 6e 65 77 65 72 0a 09  l 8.6 or newer..
bbb0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 54 63 6c 5f   */.    if (Tcl_
bbc0: 49 6e 69 74 53 74 75 62 73 28 69 6e 74 65 72 70  InitStubs(interp
bbd0: 2c 20 22 38 2e 36 2d 22 2c 20 30 29 20 3d 3d 20  , "8.6-", 0) == 
bbe0: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20  NULL) {..return 
bbf0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
bc00: 0a 0a 20 20 20 20 69 66 20 28 54 6c 73 4c 69 62  ..    if (TlsLib
bc10: 49 6e 69 74 28 30 29 20 21 3d 20 54 43 4c 5f 4f  Init(0) != TCL_O
bc20: 4b 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  K) {..Tcl_Append
bc30: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
bc40: 63 6f 75 6c 64 20 6e 6f 74 20 69 6e 69 74 69 61  could not initia
bc50: 6c 69 7a 65 20 53 53 4c 20 6c 69 62 72 61 72 79  lize SSL library
bc60: 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29  ", (char *)NULL)
bc70: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
bc80: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
bc90: 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
bca0: 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c  mand(interp, "tl
bcb0: 73 3a 3a 63 69 70 68 65 72 73 22 2c 20 43 69 70  s::ciphers", Cip
bcc0: 68 65 72 73 4f 62 6a 43 6d 64 2c 20 4e 55 4c 4c  hersObjCmd, NULL
bcd0: 2c 20 30 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72  , 0);.    Tcl_Cr
bce0: 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
bcf0: 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 68 61 6e  nterp, "tls::han
bd00: 64 73 68 61 6b 65 22 2c 20 48 61 6e 64 73 68 61  dshake", Handsha
bd10: 6b 65 4f 62 6a 43 6d 64 2c 20 4e 55 4c 4c 2c 20  keObjCmd, NULL, 
bd20: 30 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61  0);.    Tcl_Crea
bd30: 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
bd40: 65 72 70 2c 20 22 74 6c 73 3a 3a 69 6d 70 6f 72  erp, "tls::impor
bd50: 74 22 2c 20 49 6d 70 6f 72 74 4f 62 6a 43 6d 64  t", ImportObjCmd
bd60: 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20 20 20  , NULL, 0);.    
bd70: 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
bd80: 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c  mand(interp, "tl
bd90: 73 3a 3a 75 6e 69 6d 70 6f 72 74 22 2c 20 55 6e  s::unimport", Un
bda0: 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 4e 55  importObjCmd, NU
bdb0: 4c 4c 2c 20 30 29 3b 0a 20 20 20 20 54 63 6c 5f  LL, 0);.    Tcl_
bdc0: 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
bdd0: 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 73  (interp, "tls::s
bde0: 74 61 74 75 73 22 2c 20 53 74 61 74 75 73 4f 62  tatus", StatusOb
bdf0: 6a 43 6d 64 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a  jCmd, NULL, 0);.
be00: 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62      Tcl_CreateOb
be10: 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
be20: 20 22 74 6c 73 3a 3a 76 65 72 73 69 6f 6e 22 2c   "tls::version",
be30: 20 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 2c 20   VersionObjCmd, 
be40: 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20 20 20 54 63  NULL, 0);.    Tc
be50: 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61  l_CreateObjComma
be60: 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a  nd(interp, "tls:
be70: 3a 6d 69 73 63 22 2c 20 4d 69 73 63 4f 62 6a 43  :misc", MiscObjC
be80: 6d 64 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 0a 20  md, NULL, 0);.. 
be90: 20 20 20 69 66 20 28 69 6e 74 65 72 70 29 20 7b     if (interp) {
bea0: 0a 09 69 66 20 28 54 63 6c 5f 45 76 61 6c 28 69  ..if (Tcl_Eval(i
beb0: 6e 74 65 72 70 2c 20 74 6c 73 54 63 6c 49 6e 69  nterp, tlsTclIni
bec0: 74 53 63 72 69 70 74 29 20 21 3d 20 54 43 4c 5f  tScript) != TCL_
bed0: 4f 4b 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72  OK) {..    retur
bee0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a  n TCL_ERROR;..}.
bef0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 54      }..    if (T
bf00: 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64 49 6e 66  cl_GetCommandInf
bf10: 6f 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 63 6c  o(interp, "::tcl
bf20: 3a 3a 62 75 69 6c 64 2d 69 6e 66 6f 22 2c 20 26  ::build-info", &
bf30: 69 6e 66 6f 29 29 20 7b 0a 09 54 63 6c 5f 43 72  info)) {..Tcl_Cr
bf40: 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
bf50: 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 62  nterp, "::tls::b
bf60: 75 69 6c 64 2d 69 6e 66 6f 22 2c 0a 09 09 69 6e  uild-info",...in
bf70: 66 6f 2e 6f 62 6a 50 72 6f 63 2c 20 28 76 6f 69  fo.objProc, (voi
bf80: 64 20 2a 29 28 0a 09 09 20 20 20 20 50 41 43 4b  d *)(...    PACK
bf90: 41 47 45 5f 56 45 52 53 49 4f 4e 20 22 2b 22 20  AGE_VERSION "+" 
bfa0: 53 54 52 49 4e 47 49 46 59 28 54 4c 53 5f 56 45  STRINGIFY(TLS_VE
bfb0: 52 53 49 4f 4e 5f 55 55 49 44 29 0a 23 69 66 20  RSION_UUID).#if 
bfc0: 64 65 66 69 6e 65 64 28 5f 5f 63 6c 61 6e 67 5f  defined(__clang_
bfd0: 5f 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  _) && defined(__
bfe0: 63 6c 61 6e 67 5f 6d 61 6a 6f 72 5f 5f 29 0a 09  clang_major__)..
bff0: 09 09 20 20 20 20 22 2e 63 6c 61 6e 67 2d 22 20  ..    ".clang-" 
c000: 53 54 52 49 4e 47 49 46 59 28 5f 5f 63 6c 61 6e  STRINGIFY(__clan
c010: 67 5f 6d 61 6a 6f 72 5f 5f 29 0a 23 69 66 20 5f  g_major__).#if _
c020: 5f 63 6c 61 6e 67 5f 6d 69 6e 6f 72 5f 5f 20 3c  _clang_minor__ <
c030: 20 31 30 0a 09 09 09 20 20 20 20 22 30 22 0a 23   10....    "0".#
c040: 65 6e 64 69 66 0a 09 09 09 20 20 20 20 53 54 52  endif....    STR
c050: 49 4e 47 49 46 59 28 5f 5f 63 6c 61 6e 67 5f 6d  INGIFY(__clang_m
c060: 69 6e 6f 72 5f 5f 29 0a 23 65 6e 64 69 66 0a 23  inor__).#endif.#
c070: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 63 70 6c  if defined(__cpl
c080: 75 73 70 6c 75 73 29 20 26 26 20 21 64 65 66 69  usplus) && !defi
c090: 6e 65 64 28 5f 5f 4f 42 4a 43 5f 5f 29 0a 09 09  ned(__OBJC__)...
c0a0: 09 20 20 20 20 22 2e 63 70 6c 75 73 70 6c 75 73  .    ".cplusplus
c0b0: 22 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  ".#endif.#ifndef
c0c0: 20 4e 44 45 42 55 47 0a 09 09 09 20 20 20 20 22   NDEBUG....    "
c0d0: 2e 64 65 62 75 67 22 0a 23 65 6e 64 69 66 0a 23  .debug".#endif.#
c0e0: 69 66 20 21 64 65 66 69 6e 65 64 28 5f 5f 63 6c  if !defined(__cl
c0f0: 61 6e 67 5f 5f 29 20 26 26 20 21 64 65 66 69 6e  ang__) && !defin
c100: 65 64 28 5f 5f 49 4e 54 45 4c 5f 43 4f 4d 50 49  ed(__INTEL_COMPI
c110: 4c 45 52 29 20 26 26 20 64 65 66 69 6e 65 64 28  LER) && defined(
c120: 5f 5f 47 4e 55 43 5f 5f 29 0a 09 09 09 20 20 20  __GNUC__)....   
c130: 20 22 2e 67 63 63 2d 22 20 53 54 52 49 4e 47 49   ".gcc-" STRINGI
c140: 46 59 28 5f 5f 47 4e 55 43 5f 5f 29 0a 23 69 66  FY(__GNUC__).#if
c150: 20 5f 5f 47 4e 55 43 5f 4d 49 4e 4f 52 5f 5f 20   __GNUC_MINOR__ 
c160: 3c 20 31 30 0a 09 09 09 20 20 20 20 22 30 22 0a  < 10....    "0".
c170: 23 65 6e 64 69 66 0a 09 09 09 20 20 20 20 53 54  #endif....    ST
c180: 52 49 4e 47 49 46 59 28 5f 5f 47 4e 55 43 5f 4d  RINGIFY(__GNUC_M
c190: 49 4e 4f 52 5f 5f 29 0a 23 65 6e 64 69 66 0a 23  INOR__).#endif.#
c1a0: 69 66 64 65 66 20 5f 5f 49 4e 54 45 4c 5f 43 4f  ifdef __INTEL_CO
c1b0: 4d 50 49 4c 45 52 0a 09 09 09 20 20 20 20 22 2e  MPILER....    ".
c1c0: 69 63 63 2d 22 20 53 54 52 49 4e 47 49 46 59 28  icc-" STRINGIFY(
c1d0: 5f 5f 49 4e 54 45 4c 5f 43 4f 4d 50 49 4c 45 52  __INTEL_COMPILER
c1e0: 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ).#endif.#ifdef 
c1f0: 54 43 4c 5f 4d 45 4d 5f 44 45 42 55 47 0a 09 09  TCL_MEM_DEBUG...
c200: 09 20 20 20 20 22 2e 6d 65 6d 64 65 62 75 67 22  .    ".memdebug"
c210: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
c220: 6e 65 64 28 5f 4d 53 43 5f 56 45 52 29 0a 09 09  ned(_MSC_VER)...
c230: 09 20 20 20 20 22 2e 6d 73 76 63 2d 22 20 53 54  .    ".msvc-" ST
c240: 52 49 4e 47 49 46 59 28 5f 4d 53 43 5f 56 45 52  RINGIFY(_MSC_VER
c250: 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ).#endif.#ifdef 
c260: 55 53 45 5f 4e 4d 41 4b 45 0a 09 09 09 20 20 20  USE_NMAKE....   
c270: 20 22 2e 6e 6d 61 6b 65 22 0a 23 65 6e 64 69 66   ".nmake".#endif
c280: 0a 23 69 66 6e 64 65 66 20 54 43 4c 5f 43 46 47  .#ifndef TCL_CFG
c290: 5f 4f 50 54 49 4d 49 5a 45 44 0a 09 09 09 20 20  _OPTIMIZED....  
c2a0: 20 20 22 2e 6e 6f 2d 6f 70 74 69 6d 69 7a 65 22    ".no-optimize"
c2b0: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f  .#endif.#ifdef _
c2c0: 5f 4f 42 4a 43 5f 5f 0a 09 09 09 20 20 20 20 22  _OBJC__....    "
c2d0: 2e 6f 62 6a 65 63 74 69 76 65 2d 63 22 0a 23 69  .objective-c".#i
c2e0: 66 20 64 65 66 69 6e 65 64 28 5f 5f 63 70 6c 75  f defined(__cplu
c2f0: 73 70 6c 75 73 29 0a 09 09 09 20 20 20 20 22 70  splus)....    "p
c300: 6c 75 73 70 6c 75 73 22 0a 23 65 6e 64 69 66 0a  lusplus".#endif.
c310: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 54 43  #endif.#ifdef TC
c320: 4c 5f 43 46 47 5f 50 52 4f 46 49 4c 45 44 0a 09  L_CFG_PROFILED..
c330: 09 09 20 20 20 20 22 2e 70 72 6f 66 69 6c 65 22  ..    ".profile"
c340: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 50  .#endif.#ifdef P
c350: 55 52 49 46 59 0a 09 09 09 20 20 20 20 22 2e 70  URIFY....    ".p
c360: 75 72 69 66 79 22 0a 23 65 6e 64 69 66 0a 23 69  urify".#endif.#i
c370: 66 64 65 66 20 53 54 41 54 49 43 5f 42 55 49 4c  fdef STATIC_BUIL
c380: 44 0a 09 09 09 20 20 20 20 22 2e 73 74 61 74 69  D....    ".stati
c390: 63 22 0a 23 65 6e 64 69 66 0a 09 09 29 2c 20 4e  c".#endif...), N
c3a0: 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ULL);.    }..   
c3b0: 20 72 65 74 75 72 6e 20 54 63 6c 5f 50 6b 67 50   return Tcl_PkgP
c3c0: 72 6f 76 69 64 65 45 78 28 69 6e 74 65 72 70 2c  rovideEx(interp,
c3d0: 20 50 41 43 4b 41 47 45 5f 4e 41 4d 45 2c 20 50   PACKAGE_NAME, P
c3e0: 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 2c 20  ACKAGE_VERSION, 
c3f0: 4e 55 4c 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d  NULL);.}../*. *-
c400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c430: 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73  -----*. *. *.Tls
c440: 5f 53 61 66 65 49 6e 69 74 20 2d 2d 0a 20 2a 0a  _SafeInit --. *.
c450: 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *.-------------
c460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c480: 2d 2d 2d 2a 0a 20 2a 09 53 74 61 6e 64 61 72 64  ---*. *.Standard
c490: 20 70 72 6f 63 65 64 75 72 65 20 72 65 71 75 69   procedure requi
c4a0: 72 65 64 20 62 79 20 27 6c 6f 61 64 27 2e 0a 20  red by 'load'.. 
c4b0: 2a 09 49 6e 69 74 69 61 6c 69 7a 65 73 20 74 68  *.Initializes th
c4c0: 69 73 20 65 78 74 65 6e 73 69 6f 6e 20 66 6f 72  is extension for
c4d0: 20 61 20 73 61 66 65 20 69 6e 74 65 72 70 72 65   a safe interpre
c4e0: 74 65 72 2e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d  ter.. *.--------
c4f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c510: 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09  --------*. *. *.
c520: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
c530: 09 09 41 73 20 6f 66 20 27 54 6c 73 5f 49 6e 69  ..As of 'Tls_Ini
c540: 74 27 0a 20 2a 0a 20 2a 09 52 65 73 75 6c 74 3a  t'. *. *.Result:
c550: 0a 20 2a 09 09 41 20 73 74 61 6e 64 61 72 64 20  . *..A standard 
c560: 54 63 6c 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  Tcl error code..
c570: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
c580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c5a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f  -----------*. */
c5b0: 0a 0a 44 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20  ..DLLEXPORT int 
c5c0: 54 6c 73 5f 53 61 66 65 49 6e 69 74 28 54 63 6c  Tls_SafeInit(Tcl
c5d0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29  _Interp *interp)
c5e0: 20 7b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22   {.    dprintf("
c5f0: 43 61 6c 6c 65 64 22 29 3b 0a 20 20 20 20 72 65  Called");.    re
c600: 74 75 72 6e 28 54 6c 73 5f 49 6e 69 74 28 69 6e  turn(Tls_Init(in
c610: 74 65 72 70 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  terp));.}../*. *
c620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c650: 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c  ------*. *. *.Tl
c660: 73 4c 69 62 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20  sLibInit --. *. 
c670: 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *.--------------
c680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c6a0: 2d 2d 2a 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a  --*. *.Initializ
c6b0: 65 73 20 53 53 4c 20 6c 69 62 72 61 72 79 20 6f  es SSL library o
c6c0: 6e 63 65 20 70 65 72 20 61 70 70 6c 69 63 61 74  nce per applicat
c6d0: 69 6f 6e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d  ion. *.---------
c6e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c6f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c700: 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53  -------*. *. *.S
c710: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
c720: 09 69 6e 69 74 69 61 6c 69 7a 65 73 20 53 53 4c  .initializes SSL
c730: 20 6c 69 62 72 61 72 79 0a 20 2a 0a 20 2a 09 52   library. *. *.R
c740: 65 73 75 6c 74 3a 0a 20 2a 09 09 6e 6f 6e 65 0a  esult:. *..none.
c750: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
c760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f  -----------*. */
c790: 0a 73 74 61 74 69 63 20 69 6e 74 20 54 6c 73 4c  .static int TlsL
c7a0: 69 62 49 6e 69 74 28 69 6e 74 20 75 6e 69 6e 69  ibInit(int unini
c7b0: 74 69 61 6c 69 7a 65 29 20 7b 0a 20 20 20 20 73  tialize) {.    s
c7c0: 74 61 74 69 63 20 69 6e 74 20 69 6e 69 74 69 61  tatic int initia
c7d0: 6c 69 7a 65 64 20 3d 20 30 3b 0a 20 20 20 20 69  lized = 0;.    i
c7e0: 6e 74 20 73 74 61 74 75 73 20 3d 20 54 43 4c 5f  nt status = TCL_
c7f0: 4f 4b 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  OK;.#if defined(
c800: 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29  OPENSSL_THREADS)
c810: 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f   && defined(TCL_
c820: 54 48 52 45 41 44 53 29 0a 20 20 20 20 73 69 7a  THREADS).    siz
c830: 65 5f 74 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 23  e_t num_locks;.#
c840: 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 20 28 75  endif..    if (u
c850: 6e 69 6e 69 74 69 61 6c 69 7a 65 29 20 7b 0a 09  ninitialize) {..
c860: 69 66 20 28 21 69 6e 69 74 69 61 6c 69 7a 65 64  if (!initialized
c870: 29 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66  ) {..    dprintf
c880: 28 22 41 73 6b 65 64 20 74 6f 20 75 6e 69 6e 69  ("Asked to unini
c890: 74 69 61 6c 69 7a 65 2c 20 62 75 74 20 77 65 20  tialize, but we 
c8a0: 61 72 65 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69  are not initiali
c8b0: 7a 65 64 22 29 3b 0a 0a 09 20 20 20 20 72 65 74  zed");...    ret
c8c0: 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 09 7d 0a  urn(TCL_OK);..}.
c8d0: 0a 09 64 70 72 69 6e 74 66 28 22 41 73 6b 65 64  ..dprintf("Asked
c8e0: 20 74 6f 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65   to uninitialize
c8f0: 22 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  ");..#if defined
c900: 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53  (OPENSSL_THREADS
c910: 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c  ) && defined(TCL
c920: 5f 54 48 52 45 41 44 53 29 0a 09 54 63 6c 5f 4d  _THREADS)..Tcl_M
c930: 75 74 65 78 4c 6f 63 6b 28 26 69 6e 69 74 5f 6d  utexLock(&init_m
c940: 78 29 3b 0a 0a 09 43 52 59 50 54 4f 5f 73 65 74  x);...CRYPTO_set
c950: 5f 6c 6f 63 6b 69 6e 67 5f 63 61 6c 6c 62 61 63  _locking_callbac
c960: 6b 28 4e 55 4c 4c 29 3b 0a 09 43 52 59 50 54 4f  k(NULL);..CRYPTO
c970: 5f 73 65 74 5f 69 64 5f 63 61 6c 6c 62 61 63 6b  _set_id_callback
c980: 28 4e 55 4c 4c 29 3b 0a 0a 09 69 66 20 28 6c 6f  (NULL);...if (lo
c990: 63 6b 73 29 20 7b 0a 09 20 20 20 20 66 72 65 65  cks) {..    free
c9a0: 28 6c 6f 63 6b 73 29 3b 0a 09 20 20 20 20 6c 6f  (locks);..    lo
c9b0: 63 6b 73 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20 20  cks = NULL;..   
c9c0: 20 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 30 3b   locksCount = 0;
c9d0: 0a 09 7d 0a 23 65 6e 64 69 66 0a 09 69 6e 69 74  ..}.#endif..init
c9e0: 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 0a 23 69  ialized = 0;..#i
c9f0: 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  f defined(OPENSS
ca00: 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65  L_THREADS) && de
ca10: 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44  fined(TCL_THREAD
ca20: 53 29 0a 09 54 63 6c 5f 4d 75 74 65 78 55 6e 6c  S)..Tcl_MutexUnl
ca30: 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23  ock(&init_mx);.#
ca40: 65 6e 64 69 66 0a 0a 09 72 65 74 75 72 6e 28 54  endif...return(T
ca50: 43 4c 5f 4f 4b 29 3b 0a 20 20 20 20 7d 0a 0a 20  CL_OK);.    }.. 
ca60: 20 20 20 69 66 20 28 69 6e 69 74 69 61 6c 69 7a     if (initializ
ca70: 65 64 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22  ed) {..dprintf("
ca80: 43 61 6c 6c 65 64 2c 20 62 75 74 20 75 73 69 6e  Called, but usin
ca90: 67 20 63 61 63 68 65 64 20 76 61 6c 75 65 22 29  g cached value")
caa0: 3b 0a 09 72 65 74 75 72 6e 28 73 74 61 74 75 73  ;..return(status
cab0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70  );.    }..    dp
cac0: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
cad0: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50  ..#if defined(OP
cae0: 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26  ENSSL_THREADS) &
caf0: 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48  & defined(TCL_TH
cb00: 52 45 41 44 53 29 0a 20 20 20 20 54 63 6c 5f 4d  READS).    Tcl_M
cb10: 75 74 65 78 4c 6f 63 6b 28 26 69 6e 69 74 5f 6d  utexLock(&init_m
cb20: 78 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  x);.#endif.    i
cb30: 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 31 3b 0a  nitialized = 1;.
cb40: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45  .#if defined(OPE
cb50: 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26  NSSL_THREADS) &&
cb60: 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52   defined(TCL_THR
cb70: 45 41 44 53 29 0a 20 20 20 20 6e 75 6d 5f 6c 6f  EADS).    num_lo
cb80: 63 6b 73 20 3d 20 43 52 59 50 54 4f 5f 6e 75 6d  cks = CRYPTO_num
cb90: 5f 6c 6f 63 6b 73 28 29 3b 0a 20 20 20 20 6c 6f  _locks();.    lo
cba0: 63 6b 73 43 6f 75 6e 74 20 3d 20 6e 75 6d 5f 6c  cksCount = num_l
cbb0: 6f 63 6b 73 3b 0a 20 20 20 20 6c 6f 63 6b 73 20  ocks;.    locks 
cbc0: 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  = malloc(sizeof(
cbd0: 2a 6c 6f 63 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f  *locks) * num_lo
cbe0: 63 6b 73 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74  cks);.    memset
cbf0: 28 6c 6f 63 6b 73 2c 20 30 2c 20 73 69 7a 65 6f  (locks, 0, sizeo
cc00: 66 28 2a 6c 6f 63 6b 73 29 20 2a 20 6e 75 6d 5f  f(*locks) * num_
cc10: 6c 6f 63 6b 73 29 3b 0a 0a 20 20 20 20 43 52 59  locks);..    CRY
cc20: 50 54 4f 5f 73 65 74 5f 6c 6f 63 6b 69 6e 67 5f  PTO_set_locking_
cc30: 63 61 6c 6c 62 61 63 6b 28 43 72 79 70 74 6f 54  callback(CryptoT
cc40: 68 72 65 61 64 4c 6f 63 6b 43 61 6c 6c 62 61 63  hreadLockCallbac
cc50: 6b 29 3b 0a 20 20 20 20 43 52 59 50 54 4f 5f 73  k);.    CRYPTO_s
cc60: 65 74 5f 69 64 5f 63 61 6c 6c 62 61 63 6b 28 43  et_id_callback(C
cc70: 72 79 70 74 6f 54 68 72 65 61 64 49 64 43 61 6c  ryptoThreadIdCal
cc80: 6c 62 61 63 6b 29 3b 0a 23 65 6e 64 69 66 0a 0a  lback);.#endif..
cc90: 20 20 20 20 69 66 20 28 53 53 4c 5f 6c 69 62 72      if (SSL_libr
cca0: 61 72 79 5f 69 6e 69 74 28 29 20 21 3d 20 31 29  ary_init() != 1)
ccb0: 20 7b 0a 09 73 74 61 74 75 73 20 3d 20 54 43 4c   {..status = TCL
ccc0: 5f 45 52 52 4f 52 3b 0a 09 67 6f 74 6f 20 64 6f  _ERROR;..goto do
ccd0: 6e 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 53  ne;.    }..    S
cce0: 53 4c 5f 6c 6f 61 64 5f 65 72 72 6f 72 5f 73 74  SL_load_error_st
ccf0: 72 69 6e 67 73 28 29 3b 0a 20 20 20 20 45 52 52  rings();.    ERR
cd00: 5f 6c 6f 61 64 5f 63 72 79 70 74 6f 5f 73 74 72  _load_crypto_str
cd10: 69 6e 67 73 28 29 3b 0a 0a 20 20 20 20 42 49 4f  ings();..    BIO
cd20: 5f 6e 65 77 5f 74 63 6c 28 4e 55 4c 4c 2c 20 30  _new_tcl(NULL, 0
cd30: 29 3b 0a 0a 64 6f 6e 65 3a 0a 23 69 66 20 64 65  );..done:.#if de
cd40: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48  fined(OPENSSL_TH
cd50: 52 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65  READS) && define
cd60: 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 20  d(TCL_THREADS). 
cd70: 20 20 20 54 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f     Tcl_MutexUnlo
cd80: 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65  ck(&init_mx);.#e
cd90: 6e 64 69 66 0a 0a 20 20 20 20 72 65 74 75 72 6e  ndif..    return
cda0: 28 73 74 61 74 75 73 29 3b 0a 7d 0a              (status);.}.