Hello all,

I am currently looking into possibly adding FiSH encryption support to mIRC.

FiSH has been discussed on the forums before, however I have never used it myself, so it is somewhat new to me.

As a first step, I used the source code for FiSH 10 by flakes at https://github.com/flakes/mirc_fish_10 to compile a .lib for use by mIRC to see how that would work out.

Note: If anyone knows how I can contact flakes, please let me know, as I could not find contact details.

FiSH 10 integration notes:

1) While the FiSH 10 source code is freely usable, some functions are GPL. I initially tested everything with the GPL code in place to make sure it was working correctly. The GPL functions have now been replaced with non-GPL code.

2) Some of the FiSH 10 code uses APIs deprecated in OpenSSL 3.x. I tested these as-is to make sure FiSH was working correctly. I then updated all code to use non-deprecated APIs, which took a fair bit of work and testing.

3) Blowfish is no longer supported by default in OpenSSL 3.x. so OpenSSL had to be recompiled with support for weak ciphers. It would make sense to move to AES256CBC/GCM but this would break compatibility.

4) Removed the injection/hook-related code.

5) Added the calls _OnIncomingIRCLine() and _OnOutgoingIRCLine() to the incoming and outgoing line parsing functions in mIRC, allowing them to work more or less in the same place as the FiSH 10 injection code, ie. just before/after the send()/recv() calls are made.

For testing purposes, made changes to allow the beta to work with the fish_10.mrc script without requiring changes to the script:

6) /dll and $dll now check if fish_inject.dll or fish_10.dll are being called and simulate / redirect them to the equivalent FiSH 10 functions in mIRC, including calls to LoadDLL and UnloadDLL.

Having confirmed it is all working, this raises a few questions:

7) The main issue holding me back from adding support for this is that it needs to be usable by non-techies. This means that once DH keys are exchanged, the user must be guided/reminded/required, in the same way as eg. Pidgin, to confirm that they have authenticated before continuing to chat, since MITM on an IRC server would be trivial. On most platforms, authentication is through manual verification of a shared secret/password/safety number/etc. On IRC, users will need to make direct contact to do this, possibly confirmed in-client, eg. socialist millionare protocol, in the same way that Pidgin visually marks a chat window as "unverified", until users manually authenticate, and then marks the window as "private".

8) If I decide not to add support for it, I could add various plugin APIs that eg. enable a FiSH DLL to parse incoming and outgoing lines, so it would no longer need to inject or hook into mIRC.

9) The FiSH key exchange currently uses DH 1080 bits. This is not good enough nowadays and should probably be changed to DH X25519. Increasing the key size would break backward compatibility. There are FiSH implementations that use X25519 and ChaCha20-Poly1305 (instead of AESGCM) for authenticated encryption.

As I have not used FiSH before, I'd be happy to receive feedback and suggestions from existing users. Can FiSH 10 be improved? What changes have you made to your FiSH 10 script to enhance it? Perhaps these can be integrated.

In any case, this is just experimental for now and there are no definitive plans. I may release a beta with the above changes at some point.

Last edited by Khaled; 11/03/26 07:05 AM.