.BitchX/operchallenge/ 0042755 0001750 0001750 00000000000 07572044611 013227 5 ustar dan dan .BitchX/operchallenge/Makefile 0100600 0001750 0001750 00000000262 07571322607 014655 0 ustar dan dan # $Id: Makefile,v 1.7 2001/10/25 05:21:13 wcampbel Exp $ all: respond respond: respond.c gcc -g -O2 -Wall -o respond respond.c -lcrypto -ggdb clean: rm -f respond *.core *~ .BitchX/operchallenge/challenge.txt 0100600 0001750 0001750 00000032003 07571322700 015670 0 ustar dan dan Oper Challenge and Response System $Id: challenge.txt,v 1.9 2002/07/17 23:31:11 leeh Exp $ Copyright (c) 2001 by ircd-hybrid team ---------------------------------------------------------------------- ircd-hybrid In an effort to reduce the damage caused to a network by a hacked O-line, Hybrid supports an OpenSSL based challenge-response system. This new system allows the admin to remove all oper block passwords from the conf file. Authentication is done through a public/private key. ---------------------------------------------------------------------- Requirements The ircd must be compiled with the --enable-openssl option to configure . If configure detects a working openssl library, --enable-openssl is implicitly enabled. oper {} blocks should not have normal passwords, but should contain the the name of the private key file. However it is possible for the user to use both challenge and normal passwords, but this would defeat the purpose of the challenge system. m_challenge.so must be loaded. The oper has their private key file and an implementation of the RSA Respond tool available to be run. ---------------------------------------------------------------------- Process Each oper should have a private key file and a public key file. The keys can be generated with the mkkeypair utility provided in tools/. The keys are compatible with cryptlink keys. The oper keeps their private key file in a safe place, and gives their public key file to their admin(s). The admin will place an entry for the public key file into a field called rsa_public_key_file of each oper's oper {} block in the conf file. The oper wishes to obtain their operator status, and issues the CHALLENGE command. The server will print out a long hexadecimal string, that needs to be fed to the respond utility provided in tools/rsa_respond. The respond program will generate an answer that is fed back to the CHALLENGE command. ---------------------------------------------------------------------- Generating the Key Files The keys can be generated with the openssl command as follows: openssl genrsa -des3(1) -out rsa.key 1024(2) openssl rsa -in rsa.key -pubout -out rsa.pub (1) The -des3 must be included in order to create a key with a passphrase. Omitting this option will create a non protected key. (2) The key size must be 1024 or below. The challenge sent for a longer keysize will be too long to fit into the ircd's 512 byte line constraint. It is highly recommended that you set a password on your private key. The tools/mkkeypair utility cannot be used to create a key suitable for use in CHALLENGE. ---------------------------------------------------------------------- Using CHALLENGE and respond Note: All examples assume the use of the stock respond client included with the Hybrid 7 source, run on a UNIX(c) platform. The administrator of the server you oper on should remove the password in your oper {} block and replace it with an entry for your public key, so that /oper will be disabled. Note: The public key is a VERY long string. The oper will issue /challenge oper_nick, and see something like below: *** 56F1FDAE4C590C524CF758917E62C2A2A1376CB9C4C2E7D411BB0AD9C4A 605A2D05A94E7254197E9D71438B5FB565B6FD35465E462305F35F4A2D45311 F983B3E062F635912FA155B4B1E18EAA782CC107F4C9DA83092658D16A2E88A 6BCF9820F5A044A29CDD4C062F05BF509CA3B561375CBC4179BD1CF6026BDE9 60E52C6B Note: The challenge is all on one line. Note: With some clients, the oper will have to issue /quote CHALLENGE instead of /challenge. The oper will then have to feed that challenge to the respond program. +------------------------------------------------------------------+ | The respond utility's syntax is: | | | |$ ./respond private_key_file challenge_from_server | | | | | | Example: | | | |wcampbel@botbay (rsa_respond): ./respond hwy.key \ | |56F1FDAE4C590C524CF758917E62C2A2A1376CB9C4C2E7D411BB0AD9C4A605A2D0| |5A94E7254197E9D71438B5FB565B6FD35465E462305F35F4A2D45311F983B3E062| |F635912FA155B4B1E18EAA782CC107F4C9DA83092658D16A2E88A6BCF9820F5A04| |4A29CDD4C062F05BF509CA3B561375CBC4179BD1CF6026BDE960E52C6B | |Keyphrase: | |6B882932DD00F86123869E401F7334B9B0D0018A60F1DE244E90E47246AA87C7 | | | | Note: The challenge parameter must be on one line. | +------------------------------------------------------------------+ The keyphrase must be entered properly to get the response. The bottom line is the response that must be sent back to the server. The oper will issue the following command in order to obtain operator status: /challenge +6B882932DD00F86123869E401F7334B9B0D0018A60F1DE244E90E47246AA87C7 Note: The '+' is needed If successful, the oper will obtain operator status on the server. +------------------------------------------------------------------------+ | Warning | |------------------------------------------------------------------------| | If the CHALLENGE fails, and you use ircII, EPIC, or BX, you may get | | disconnected with the client asking for the server password. This is a | | client bug, not an ircd bug. | +------------------------------------------------------------------------+ ---------------------------------------------------------------------- RSA Respond Tool The RSA Respond tool is a vital part of challenge/response system. In order to function, the operator must have must have a way to quickly issue the respond command, and to copy and paste data to and from the IRC client. The respond source code is included with the Hybrid 7 source, in the tools/rsa_respond directory. A distributable tar file can easily be created by issuing make rsa_respond in the root of the source tree. The file rsa_respond.tar.gz will be created in the root of the source tree. rsa_respond.tar.gz should compile with little or no modifications[1] on most UNIX(c) and UNIX-like platforms[2]. The README in the tar archive gives more information. A copy of the source tar file is available on http://ircd.botbay.net/pub/hybrid/rsa/rsa_respond.tar.gz. For Windows platforms, there are two available RSA Respond tools. One is a text only port of the stock tool. The binary is available from http://ircd.botbay.net/pub/hybrid/rsa/rsa_respond-bin.tar.gz. The other tool is a GUI enabled version[3]. The source tree[4] is available from http://ircd.botbay.net/pub/hybrid/rsa/winrespond-src.tar.gz. A binary distribution is available from http://ircd.botbay.net/pub/hybrid/rsa/winrespond-bin.tar.gz. With the appropriate version of the RSA Respond tool, any operator can protect their privileged access to the server, with little additional effort over using standard operator passwords. ---------------------------------------------------------------------- Benefits The greatest benefit of using the challenge/response system is that there are no passwords sent over the network in plaintext. There are also no credentials left on the server side, as only public keys are kept in the conf. The use of public/private key encryption provides far greater security over having a single password, and may (if the key is kept secure, and has a good passphrase) virtually eliminate hacked O-lines. ---------------------------------------------------------------------- A. Numerics :server 381 user :You have entered... the Twilight Zone!. :server 386 user :challenge-text :server 464 user :Password Incorrect :server 491 user :Only few of mere mortals may try to enter the twilight zone Note: The text used can be changed by the server administrator. ---------------------------------------------------------------------- B. Scripting The following script is for EPIC 4 only. It was written by Greg Prosser, xyst <[email protected]>. Please note that passphrase protected keys cannot be used in conjunction with this script. BEGIN challenge.irc # challenge.irc -- authenticate to a hybrid-7 server with challenge response # oper authentication. --gnp (xyst) # note: this is almost gauranteed to not work if your key needs a passphrase # # credit goes to hop for pipe from the default script archive, which doesn't # work, but gave me a framework for execing stuff and getting the response. # For Hybrid's cvs... # $Id: challenge.txt,v 1.9 2002/07/17 23:31:11 leeh Exp $ xecho ... Loading challenge.irc by xyst, feer. # you might want to change these.. @challenge.path=[~/.irc/respond] @challenge.key=[~/.irc/challenge.identity] @challenge.num=0 @challenge.response=[] @challenge.savepath=[~/.irc/challenge.config] alias rsaconfig { if ([$0]) { switch ($tolower($0)) { (resppath) { if ([$1]) { @challenge.resp=[$1] xecho $G Challenge -- resppath is now: $1 } { xecho $G Challenge -- resppath: $challenge.path } } (keypath) { if ([$1]) { @challenge.key=[$1] xecho $G Challenge -- keypath is now: $1 } { xecho $G Challenge -- keypath: $challenge.key } } (save) { @unlink($challenge.savepath) @fd=open($challenge.savepath W) @write($fd @challenge.path=[$challenge.path]) @write($fd @challenge.key=[$challenge.key]) @close($fd) xecho $G Challenge -- saved settings. } (*) { xecho $G Usage: /rsaconfig <resppath|keypath> [value] } } } { xecho $G Current settings for challenge.irc: rsaconfig resppath rsaconfig keypath xecho $G Type /rsaconfig <resppath|keypath> <value> to change these, /rsaconfig save saves them. } } alias challenge { if ([$0]) { ^quote challenge $0 } { xecho $G Usage: /challenge <username> } } on ^386 * { xecho $G Got oper-challenge from server, sending response.. @challenge.num++ ^on ^exec "chall$challenge.num *" { @challenge.response=[$1] } ^exec -name chall$challenge.num $challenge.path $challenge.key $1 ^wait %chall$challenge.num ^on exec -"chall$challenge.num *" ^stack push on raw_irc ^stack push on 381 ^on ^raw_irc "$S 464 *" { xecho $G Challenge incorrect. Check your key.;^stack pop on raw_irc;^stack pop on 381 } ^on -381 * { ^stack pop on 381;^stack pop on raw_irc } ^quote challenge +$challenge.response } if ([$fexist($challenge.savepath)] > 0) { xecho $G Loading settings from $challenge.savepath .. ^load $challenge.savepath } { xecho $G Config file not found, try /rsaconfig save\; using defaults. } rsaconfig Notes [1] Some platforms may require Makefile changes in order to link in the OpenSSL library. This may change in the future. [2] Platforms known to function include: Linux, FreeBSD, Solaris, and Cygwin. [3] A screenshot of the program is available on http://kabel.pp.ru/sgml/winrespond.png . [4] The winrespond source depends on a working, up to date, Cygwin installation. .BitchX/operchallenge/ChangeLog 0100644 0001750 0001750 00000001271 07572044611 014775 0 ustar dan dan version 1.3 - moved "on exec chalresponse" to outside of the "on 386" routine. - cleaned up operchallenge-nocolor.bx to remove unneeded variables relating to color output. version 1.2 - cleaned up more code suggested by BlackJac (thanks!) - created an operchallenge-nocolor.bx script if you want to use it without the colors version 1.1 - cleaned up some of the code - added client_information - added another exec hook to catch decryption errors version 1.0 - Thu Nov 28 05:43:13 EST 2002 - Inital release for BitchX ONLY - Requires you are running a version ov BitchX which supports /exec -inquiet As of the above date, this is only the most current CVS release of 1.0c20cvs .BitchX/operchallenge/respond-README 0100600 0001750 0001750 00000001457 07571322615 015553 0 ustar dan dan rsa_respond respond: respond takes the challenge from the server and creates a valid response to pass back to the server. Syntax: $ ./respond <private key> <challenge> Notes: The private key file is protected by a passphrase, entered when the key is created. The passphrase is prompted for whenever respond is called. Compiling: Untar the distribution Read this document Run 'make' libcrypto from OpenSSL must be available in order to use this program. Note that you may have to explicitly add -L/usr/local/lib if OpenSSL was installed there, instead of one of the system library paths. System support: genkey and respond compile properly, and have been tested on FreeBSD 4.x, Linux glibc, and Cygwin 1.2 or higher. # $Id: README,v 1.6 2001/10/25 05:21:13 wcampbel Exp $ .BitchX/operchallenge/respond.c 0100600 0001750 0001750 00000006161 07571322627 015041 0 ustar dan dan /* * tools/rsa_respond/respond.c * A simple RSA authentification challenge response generator for the * ircd-hybrid CHALLENGE command. * This code is Copyright(C)2001 by the past and present ircd-hybrid * developers. * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * $Id: respond.c,v 1.6 2001/10/24 05:26:07 androsyn Exp $ */ #include <stdio.h> #include <openssl/err.h> #include <openssl/rsa.h> #include <openssl/pem.h> #include <openssl/md5.h> #include <unistd.h> static int pass_cb(char *buf, int size, int rwflag, void *u) { int len; char *tmp; tmp = getpass("Enter passphrase for challenge: "); len = strlen(tmp); if (len <= 0) return 0; if (len > size) len = size; memcpy(buf, tmp, len); return len; } static void binary_to_hex( unsigned char * bin, char * hex, int length ) { char * trans = "0123456789ABCDEF"; int i; for( i = 0; i < length; i++ ) { hex[i<<1] = trans[bin[i] >> 4]; hex[(i<<1)+1] = trans[bin[i] & 0xf]; } hex[i<<1] = '\0'; } static int hex_to_binary(const char *from, char *to, int len) { char a, b=1; int p=0; const char *ptr = from; while (-1) { a = *ptr++; if (!a) break; b = *ptr++; /* If this happens, we got bad input. */ if (!b) break; if (p >= len) break; if (!((a >= '0' && a <= '9') || (a >= 'A' && a <= 'F'))) break; if (!((b >= '0' && b <= '9') || (b >= 'A' && b <= 'F'))) break; to[p++] = ((a <= '9') ? (a - '0') : (a - 'A' + 0xA))<<4 | ((b <= '9') ? (b - '0') : (b - 'A' + 0xA)); } return p; } int main(int argc, char **argv) { FILE *kfile; RSA *rsa = NULL; char ndata[257], ddata[257]; /* respond privatefile challenge */ if (argc < 3) { puts("Usage: respond privatefile challenge"); return 0; } if (!(kfile = fopen(argv[1], "r"))) { puts("Could not open the private keyfile."); return 0; } SSLeay_add_all_ciphers(); rsa = PEM_read_RSAPrivateKey(kfile, NULL,pass_cb, NULL); if(!rsa) { puts("Unable to read your private key, is the passphrase wrong?\n"); return 0; } fclose(kfile); if (hex_to_binary(argv[2], ndata, 128) != 128) { puts("Bad challenge."); return -1; } if (RSA_private_decrypt(128, (unsigned char*)ndata, (unsigned char*)ddata, rsa, RSA_PKCS1_PADDING) == -1) { puts("Decryption error."); return -1; } binary_to_hex((unsigned char*)ddata, ndata, 32); puts(ndata); return 0; } .BitchX/operchallenge/operchallenge.bx 0100600 0001750 0001750 00000010532 07572043461 016360 0 ustar dan dan /* * oper_challenge.bx for BitchX by powuh@EFNet * * This script requires the `respond` binary included with ircd-hybrid7+ * and ircd-ratbox1.0+. I have included the respond.c source and Makefile * in the tarball for this script. * * Any questions/comments/ideas/thankyou's -> powuh@EFNet (#BitchX, #efnet.org) */ if (bitchx() && V > 20020324) { @ bx.operchallengever = 1.3 @ bx.operchallengeconfig = [~/.BitchX/operchallenge/operchallenge.cfg] alias _opercecho { xecho -c $cparse("%K\[%bbX%K/%Roper%rchallenge%K\]%n $*") } if (fexist($bx.operchallengeconfig) == -1) { _opercecho %rConfig file%K, %R$bx.operchallengeconfig%K,%R not found%K!!! %rType %R/operconf %rand %R/opersave%n } else { ^load $bx.operchallengeconfig } alias challenge { @ bx.challenge.srv = [%K(%c$S%K)] if (!bx.operchallengenick) { _opercecho %BYour OPER nick is not set%K. %bType %B/operconf %bto set%K.%n } else { _opercecho $bx.challenge.srv %BSending %boper challenge request for %B$bx.operchallengenick%K.%n quote CHALLENGE $bx.operchallengenick } } alias operconf { @ :conftext = [$1] switch ($0) { (a) {@ bx.operchallenge = ([$1]==[yes])?1:0} (b) {@ bx.operchallengebin = [$conftext]} (c) {@ bx.operchallengekeyfile = [$conftext]} (d) {@ bx.operchallengenick = [$conftext]} } _opercecho %BCurrent Configuration%K:%n _opercecho %K(%ra%K) %bRespond to challenge requests?%K(yes/no).... %K[%B${bx.operchallenge?[yes]:[no]}%K]%n _opercecho %K(%rb%K) %bChallenge respond binary%K.................. %K[%B${bx.operchallengebin?[$bx.operchallengebin]:[N/A]}%K]%n _opercecho %K(%rc%K) %bYour SSL private keyfile%K.................. %K[%B${bx.operchallengekeyfile?[$bx.operchallengekeyfile]:[N/A]}%K]%n _opercecho %K(%rd%K) %bYour OPER nick%K............................ %K[%B${bx.operchallengenick?[$bx.operchallengenick]:[N/A]}%K]%n _opercecho %KInternal script version: $bx.operchallengever by powuh%n _opercecho %bType %B/operconf %K<%Bletter%K> <%Bvalue%K> %bto change a setting%K.%n _opercecho %bType %B/opersave %bto save settings%K.%n } alias opersave { @ rename($bx.operchallengeconfig $bx.operchallengeconfig~) @ operconf = open($bx.operchallengeconfig W T) @ write($operconf # operchallenge config file - saved $strftime($time() %D %T)) @ write($operconf @ bx.operchallenge = [$bx.operchallenge]) @ write($operconf @ bx.operchallengebin = [$bx.operchallengebin]) @ write($operconf @ bx.operchallengekeyfile = [$bx.operchallengekeyfile]) @ write($operconf @ bx.operchallengenick = [$bx.operchallengenick]) @ close($operconf) _opercecho %BSaved Config %K-%b $bx.operchallengeconfig%n } /* Server numeric 386 is the response to a valid oper /challenge <nick> request */ on ^386 * { @ bx.challenge.str = [$1] $sar(r/://bx.challenge.str) _opercecho $bx.challenge.srv %BReceived%b SSL Oper Challenge Response%K.%n if (!bx.operchallenge) { _opercecho $bx.challenge.srv %rReceived challange response, but I'm not configured to respond%K.%n _opercecho $bx.challenge.srv %rType %R/operconf a yes %rto enable challenge responses%K.%n return } if (fexist($bx.operchallengebin) == -1) { _opercecho %rSpecified respond binary doesn't exist%K. %rType %R/operconf%r to set path/filename%K.%n return } if (fexist($bx.operchallengekeyfile) == -1) { _opercecho %rSpecified SSL private keyfile doesn't exist%K. %rType %R/operconf%r to set path/filename%K.%n return } exec -name chalrespond $bx.operchallengebin $bx.operchallengekeyfile $bx.challenge.str input -noecho "Oper SSL Passphrase:" { exec -inquiet %chalrespond $0- } } ^on ^exec "chalrespond *" { switch ($1-) { (Bad challenge.) {_opercecho $bx.challenge.srv %RReceived invalid challenge string from the server%K.%n;return} (Unable to read your private key, is the passphrase wrong?) {_opercecho %RThe Passphrase you entered was incorrect!%n;return} (Decryption error.) {_opercecho %RDecryption error!%n;return} } _opercecho $bx.challenge.srv %BPassphrase OK%K. %BSending SSL Challenge Response to server%K.%n do quote CHALLENGE +$1- } _opercecho %bversion %B$bx.operchallengever %bby %Bpowuh %bloaded%K. %bType %B/operconf%b to configure%K.%n }{ echo bX/operchallenge will only work on BitchX1.0c20 or above, for now - not loaded. } /* EOF */ .BitchX/operchallenge/README.NOW 0100644 0001750 0001750 00000001611 07571600631 014542 0 ustar dan dan !!!IMPORTANT!!! This script requires you are running a version of BitchX that supports /exec -inquiet As of Thu Nov 28 05:48:23 EST 2002, the only version of BitchX that supports this command is the latest version of 1.0c20cvs, available via CVS: (CVS can be obtained from ftp://ftp.cvshome.org/pub) export CVSROOT=:pserver:[email protected]:/cvs/bitchx cvs login (password is blank, just hit <enter>) cvs co BitchX All future versions of BitchX after 1.0c20 will support this command. ----- INSTALLATION ----- This script should have extracted to ~/.BitchX/operchallenge/ Type 'make' to compile the respond binary. libcrypto from OpenSSL must be available in order to compile this! To load in BitchX: /load operchallenge/operchallenge.bx or /load operchallenge/operchallenge-nocolor.bx Type /operconf to configure settings and /opersave to save settings. Cheers, powuh .BitchX/operchallenge/TODO 0100644 0001750 0001750 00000000247 07571372655 013730 0 ustar dan dan Nothing I can think of at the moment. If you have an idea, suggestion, comment, etc you can catch me on EFNet. Or you can email me at [email protected] Cheers, powuh .BitchX/operchallenge/operchallenge-nocolor.bx 0100600 0001750 0001750 00000007714 07572044451 020041 0 ustar dan dan /* * oper_challenge.bx for BitchX by powuh@EFNet * * This script requires the `respond` binary included with ircd-hybrid7+ * and ircd-ratbox1.0+. I have included the respond.c source and Makefile * in the tarball for this script. * * Any questions/comments/ideas/thankyou's -> powuh@EFNet (#BitchX, #efnet.org) */ if (bitchx() && V > 20020324) { @ bx.operchallengever = 1.3 @ bx.operchallengeconfig = [~/.BitchX/operchallenge/operchallenge.cfg] alias _opercecho { xecho -c [bX/operchallenge] $* } if (fexist($bx.operchallengeconfig) == -1) { _opercecho Config file, $bx.operchallengeconfig, not found!!! Type /operconf and /opersave } else { ^load $bx.operchallengeconfig } alias challenge { if (!bx.operchallengenick) { _opercecho Your OPER nick is not set. Type /operconf to set. } else { _opercecho \($S\) Sending oper challenge request for $bx.operchallengenick. quote CHALLENGE $bx.operchallengenick } } alias operconf { @ :conftext = [$1] switch ($0) { (a) {@ bx.operchallenge = ([$1]==[yes])?1:0} (b) {@ bx.operchallengebin = [$conftext]} (c) {@ bx.operchallengekeyfile = [$conftext]} (d) {@ bx.operchallengenick = [$conftext]} } _opercecho Current Configuration: _opercecho (a) Respond to challenge requests?(yes/no).... [${bx.operchallenge?[yes]:[no]}] _opercecho (b) Challenge respond binary.................. [${bx.operchallengebin?[$bx.operchallengebin]:[N/A]}] _opercecho (c) Your SSL private keyfile.................. [${bx.operchallengekeyfile?[$bx.operchallengekeyfile]:[N/A]}] _opercecho (d) Your OPER nick............................ [${bx.operchallengenick?[$bx.operchallengenick]:[N/A]}] _opercecho Internal script version: $bx.operchallengever by powuh _opercecho Type /operconf <letter> <value> to change a setting. _opercecho Type /opersave to save settings. } alias opersave { @ rename($bx.operchallengeconfig $bx.operchallengeconfig~) @ operconf = open($bx.operchallengeconfig W T) @ write($operconf # operchallenge config file - saved $strftime($time() )) @ write($operconf @ bx.operchallenge = [$bx.operchallenge]) @ write($operconf @ bx.operchallengebin = [$bx.operchallengebin]) @ write($operconf @ bx.operchallengekeyfile = [$bx.operchallengekeyfile]) @ write($operconf @ bx.operchallengenick = [$bx.operchallengenick]) @ close($operconf) _opercecho Saved Config - $bx.operchallengeconfig } /* Server numeric 386 is the response to a valid oper /challenge <nick> request */ on ^386 * { @ bx.challenge.str = [$1] $sar(r/://bx.challenge.str) _opercecho \($S\) Received SSL Oper Challenge Response. if (!bx.operchallenge) { _opercecho \($S\) Received challange response, but I'm not configured to respond. _opercecho \($S\) Type /operconf a yes to enable challenge responses. return } if (fexist($bx.operchallengebin) == -1) { _opercecho Specified respond binary doesn't exist. Type /operconf to set path/filename. return } if (fexist($bx.operchallengekeyfile) == -1) { _opercecho Specified SSL private keyfile doesn't exist. Type /operconf to set path/filename. return } exec -name chalrespond $bx.operchallengebin $bx.operchallengekeyfile $bx.challenge.str input -noecho "Oper SSL Passphrase:" { exec -inquiet %chalrespond $0- } } ^on ^exec "chalrespond *" { switch ($1-) { (Bad challenge.) {_opercecho \($S\) Received invalid challenge string from the server.;return} (Unable to read your private key, is the passphrase wrong?) {_opercecho The Passphrase you entered was incorrect!;return} (Decryption error.) {_opercecho Decryption error!;return} } _opercecho \($S\) Passphrase OK. Sending SSL Challenge Response to server. do quote CHALLENGE +$1- } _opercecho version $bx.operchallengever by powuh loaded. Type /operconf to configure. }{ echo bX/operchallenge will only work on BitchX1.0c20 or above, for now - not loaded. } /* EOF */