;;; blowfish.scm - blowfish encrypt and decrypt ;;; ;;; Copyright (c) 2012 Johan Ceuppens ;;; ;;; All rights reserved. ;;; ;;; Redistribution and use in source and binary forms, with or without ;;; modification, are permitted provided that the following conditions ;;; are met: ;;; 1. Redistributions of source code must retain the above copyright ;;; notice, this list of conditions and the following disclaimer. ;;; 2. Redistributions in binary form must reproduce the above copyright ;;; notice, this list of conditions and the following disclaimer in the ;;; documentation and/or other materials provided with the distribution. ;;; 3. The name of the authors may not be used to endorse or promote products ;;; derived from this software without specific prior written permission. ;;; ;;; THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR ;;; IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES ;;; OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ;;; IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, ;;; INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT ;;; NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ;;; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ;;; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ;;; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF ;;; THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. (load "dictionary.scm") (define BIG-ENDIAN-HOST (if (getenv BIG_ENDIAN_HOST) (getenv BIG_ENDIAN_HOST) #t) ;; NOTE : Do not forget to set this ! (define blowfish-ks0 (make-dictionary)) (dictionary-add! blowfish-ks0 'D1310BA6) (dictionary-add! blowfish-ks0 '98DFB5AC) (dictionary-add! blowfish-ks0 '2FFD72DB) (dictionary-add! blowfish-ks0 'D01ADFB7) (dictionary-add! blowfish-ks0 'B8E1AFED) (dictionary-add! blowfish-ks0 '6A267E96) (dictionary-add! blowfish-ks0 'BA7C9045) (dictionary-add! blowfish-ks0 'F12C7F99) (dictionary-add! blowfish-ks0 '24A19947) (dictionary-add! blowfish-ks0 'B3916CF7) (dictionary-add! blowfish-ks0 '0801F2E2) (dictionary-add! blowfish-ks0 '858EFC16) (dictionary-add! blowfish-ks0 '636920D8) (dictionary-add! blowfish-ks0 '71574E69) (dictionary-add! blowfish-ks0 'A458FEA3) (dictionary-add! blowfish-ks0 'F4933D7E) (dictionary-add! blowfish-ks0 '0D95748F) (dictionary-add! blowfish-ks0 '728EB658) (dictionary-add! blowfish-ks0 '718BCD58) (dictionary-add! blowfish-ks0 '82154AEE) (dictionary-add! blowfish-ks0 '7B54A41D) (dictionary-add! blowfish-ks0 'C25A59B5) (dictionary-add! blowfish-ks0 '9C30D539) (dictionary-add! blowfish-ks0 '2AF26013) (dictionary-add! blowfish-ks0 'C5D1B023) (dictionary-add! blowfish-ks0 '286085F0) (dictionary-add! blowfish-ks0 'CA417918) (dictionary-add! blowfish-ks0 'B8DB38EF) (dictionary-add! blowfish-ks0 '8E79DCB0) (dictionary-add! blowfish-ks0 '603A180E) (dictionary-add! blowfish-ks0 '6C9E0E8B) (dictionary-add! blowfish-ks0 'B01E8A3E) (dictionary-add! blowfish-ks0 'D71577C1) (dictionary-add! blowfish-ks0 'BD314B27) (dictionary-add! blowfish-ks0 '78AF2FDA) (dictionary-add! blowfish-ks0 '55605C60) (dictionary-add! blowfish-ks0 'E65525F3) (dictionary-add! blowfish-ks0 'AA55AB94) (dictionary-add! blowfish-ks0 '57489862) (dictionary-add! blowfish-ks0 '63E81440) (dictionary-add! blowfish-ks0 '55CA396A) (dictionary-add! blowfish-ks0 '2AAB10B6) (dictionary-add! blowfish-ks0 'B4CC5C34) (dictionary-add! blowfish-ks0 '1141E8CE) (dictionary-add! blowfish-ks0 'A15486AF) (dictionary-add! blowfish-ks0 '7C72E993) (dictionary-add! blowfish-ks0 'B3EE1411) (dictionary-add! blowfish-ks0 '636FBC2A) (dictionary-add! blowfish-ks0 '2BA9C55D) (dictionary-add! blowfish-ks0 '741831F6) (dictionary-add! blowfish-ks0 'CE5C3E16) (dictionary-add! blowfish-ks0 '9B87931E) (dictionary-add! blowfish-ks0 'AFD6BA33) (dictionary-add! blowfish-ks0 '6C24CF5C) (dictionary-add! blowfish-ks0 '7A325381) (dictionary-add! blowfish-ks0 '28958677) (dictionary-add! blowfish-ks0 '3B8F4898) (dictionary-add! blowfish-ks0 '6B4BB9AF) (dictionary-add! blowfish-ks0 'C4BFE81B) (dictionary-add! blowfish-ks0 '66282193) (dictionary-add! blowfish-ks0 '61D809CC) (dictionary-add! blowfish-ks0 'FB21A991) (dictionary-add! blowfish-ks0 '487CAC60) (dictionary-add! blowfish-ks0 '5DEC8032) (dictionary-add! blowfish-ks0 'EF845D5D) (dictionary-add! blowfish-ks0 'E98575B1) (dictionary-add! blowfish-ks0 'DC262302) (dictionary-add! blowfish-ks0 'EB651B88) (dictionary-add! blowfish-ks0 '23893E81) (dictionary-add! blowfish-ks0 'D396ACC5) (dictionary-add! blowfish-ks0 '0F6D6FF3) (dictionary-add! blowfish-ks0 '83F44239) (dictionary-add! blowfish-ks0 '2E0B4482) (dictionary-add! blowfish-ks0 'A4842004) (dictionary-add! blowfish-ks0 '69C8F04A) (dictionary-add! blowfish-ks0 '9E1F9B5E) (dictionary-add! blowfish-ks0 '21C66842) (dictionary-add! blowfish-ks0 'F6E96C9A) (dictionary-add! blowfish-ks0 '670C9C61) (dictionary-add! blowfish-ks0 'ABD388F0) (dictionary-add! blowfish-ks0 '6A51A0D2) (dictionary-add! blowfish-ks0 'D8542F68) (dictionary-add! blowfish-ks0 '960FA728) (dictionary-add! blowfish-ks0 'AB5133A3) (dictionary-add! blowfish-ks0 '6EEF0B6C) (dictionary-add! blowfish-ks0 '137A3BE4) (dictionary-add! blowfish-ks0 'BA3BF050) (dictionary-add! blowfish-ks0 '7EFB2A98) (dictionary-add! blowfish-ks0 'A1F1651D) (dictionary-add! blowfish-ks0 '39AF0176) (dictionary-add! blowfish-ks0 '66CA593E) (dictionary-add! blowfish-ks0 '82430E88) (dictionary-add! blowfish-ks0 '8CEE8619) (dictionary-add! blowfish-ks0 '456F9FB4) (dictionary-add! blowfish-ks0 '7D84A5C3) (dictionary-add! blowfish-ks0 '3B8B5EBE) (dictionary-add! blowfish-ks0 'E06F75D8) (dictionary-add! blowfish-ks0 '85C12073) (dictionary-add! blowfish-ks0 '401A449F) (dictionary-add! blowfish-ks0 '56C16AA6) (dictionary-add! blowfish-ks0 '4ED3AA62) (dictionary-add! blowfish-ks0 '363F7706) (dictionary-add! blowfish-ks0 '1BFEDF72) (dictionary-add! blowfish-ks0 '429B023D) (dictionary-add! blowfish-ks0 '37D0D724) (dictionary-add! blowfish-ks0 'D00A1248) (dictionary-add! blowfish-ks0 'DB0FEAD3) (dictionary-add! blowfish-ks0 '49F1C09B) (dictionary-add! blowfish-ks0 '075372C9) (dictionary-add! blowfish-ks0 '80991B7B) (dictionary-add! blowfish-ks0 '25D479D8) (dictionary-add! blowfish-ks0 'F6E8DEF7) (dictionary-add! blowfish-ks0 'E3FE501A) (dictionary-add! blowfish-ks0 'B6794C3B) (dictionary-add! blowfish-ks0 '976CE0BD) (dictionary-add! blowfish-ks0 '04C006BA) (dictionary-add! blowfish-ks0 'C1A94FB6) (dictionary-add! blowfish-ks0 '409F60C4) (dictionary-add! blowfish-ks0 '5E5C9EC2) (dictionary-add! blowfish-ks0 '196A2463) (dictionary-add! blowfish-ks0 '68FB6FAF) (dictionary-add! blowfish-ks0 '3E6C53B5) (dictionary-add! blowfish-ks0 '1339B2EB) (dictionary-add! blowfish-ks0 '3B52EC6F) (dictionary-add! blowfish-ks0 '6DFC511F) (dictionary-add! blowfish-ks0 '9B30952C) (dictionary-add! blowfish-ks0 'CC814544) (dictionary-add! blowfish-ks0 'AF5EBD09) (dictionary-add! blowfish-ks0 'BEE3D004) (dictionary-add! blowfish-ks0 'DE334AFD) (dictionary-add! blowfish-ks0 '660F2807) (dictionary-add! blowfish-ks0 '192E4BB3) (dictionary-add! blowfish-ks0 'C0CBA857) (dictionary-add! blowfish-ks0 '45C8740F) (dictionary-add! blowfish-ks0 'D20B5F39) (dictionary-add! blowfish-ks0 'B9D3FBDB) (dictionary-add! blowfish-ks0 '5579C0BD) (dictionary-add! blowfish-ks0 '1A60320A) (dictionary-add! blowfish-ks0 'D6A100C6) (dictionary-add! blowfish-ks0 '402C7279) (dictionary-add! blowfish-ks0 '679F25FE) (dictionary-add! blowfish-ks0 'FB1FA3CC) (dictionary-add! blowfish-ks0 '8EA5E9F8) (dictionary-add! blowfish-ks0 'DB3222F8) (dictionary-add! blowfish-ks0 '3C7516DF) (dictionary-add! blowfish-ks0 'FD616B15) (dictionary-add! blowfish-ks0 '2F501EC8) (dictionary-add! blowfish-ks0 'AD0552AB) (dictionary-add! blowfish-ks0 '323DB5FA) (dictionary-add! blowfish-ks0 'FD238760) (dictionary-add! blowfish-ks0 '53317B48) (dictionary-add! blowfish-ks0 '3E00DF82) (dictionary-add! blowfish-ks0 '9E5C57BB) (dictionary-add! blowfish-ks0 'CA6F8CA0) (dictionary-add! blowfish-ks0 '1A87562E) (dictionary-add! blowfish-ks0 'DF1769DB) (dictionary-add! blowfish-ks0 'D542A8F6) (dictionary-add! blowfish-ks0 '287EFFC3) (dictionary-add! blowfish-ks0 'AC6732C6) (dictionary-add! blowfish-ks0 '8C4F5573) (dictionary-add! blowfish-ks0 '695B27B0) (dictionary-add! blowfish-ks0 'BBCA58C8) (dictionary-add! blowfish-ks0 'E1FFA35D) (dictionary-add! blowfish-ks0 'B8F011A0) (dictionary-add! blowfish-ks0 '10FA3D98) (dictionary-add! blowfish-ks0 'FD2183B8) (dictionary-add! blowfish-ks0 '4AFCB56C) (dictionary-add! blowfish-ks0 '2DD1D35B) (dictionary-add! blowfish-ks0 '9A53E479) (dictionary-add! blowfish-ks0 'B6F84565) (dictionary-add! blowfish-ks0 'D28E49BC) (dictionary-add! blowfish-ks0 '4BFB9790) (dictionary-add! blowfish-ks0 'E1DDF2DA) (dictionary-add! blowfish-ks0 'A4CB7E33) (dictionary-add! blowfish-ks0 '62FB1341) (dictionary-add! blowfish-ks0 'CEE4C6E8) (dictionary-add! blowfish-ks0 'EF20CADA) (dictionary-add! blowfish-ks0 '36774C01) (dictionary-add! blowfish-ks0 'D07E9EFE) (dictionary-add! blowfish-ks0 '2BF11FB4) (dictionary-add! blowfish-ks0 '95DBDA4D) (dictionary-add! blowfish-ks0 'AE909198) (dictionary-add! blowfish-ks0 'EAAD8E71) (dictionary-add! blowfish-ks0 '6B93D5A0) (dictionary-add! blowfish-ks0 'D08ED1D0) (dictionary-add! blowfish-ks0 'AFC725E0) (dictionary-add! blowfish-ks0 '8E3C5B2F) (dictionary-add! blowfish-ks0 '8E7594B7) (dictionary-add! blowfish-ks0 '8FF6E2FB) (dictionary-add! blowfish-ks0 'F2122B64) (dictionary-add! blowfish-ks0 '8888B812) (dictionary-add! blowfish-ks0 '900DF01C) (dictionary-add! blowfish-ks0 '4FAD5EA0) (dictionary-add! blowfish-ks0 '688FC31C) (dictionary-add! blowfish-ks0 'D1CFF191) (dictionary-add! blowfish-ks0 'B3A8C1AD) (dictionary-add! blowfish-ks0 '2F2F2218) (dictionary-add! blowfish-ks0 'BE0E1777) (dictionary-add! blowfish-ks0 'EA752DFE) (dictionary-add! blowfish-ks0 '8B021FA1) (dictionary-add! blowfish-ks0 'E5A0CC0F) (dictionary-add! blowfish-ks0 'B56F74E8) (dictionary-add! blowfish-ks0 '18ACF3D6) (dictionary-add! blowfish-ks0 'CE89E299) (dictionary-add! blowfish-ks0 'B4A84FE0) (dictionary-add! blowfish-ks0 'FD13E0B7) (dictionary-add! blowfish-ks0 '7CC43B81) (dictionary-add! blowfish-ks0 'D2ADA8D9) (dictionary-add! blowfish-ks0 '165FA266) (dictionary-add! blowfish-ks0 '80957705) (dictionary-add! blowfish-ks0 '93CC7314) (dictionary-add! blowfish-ks0 '211A1477) (dictionary-add! blowfish-ks0 'E6AD2065) (dictionary-add! blowfish-ks0 '77B5FA86) (dictionary-add! blowfish-ks0 'C75442F5) (dictionary-add! blowfish-ks0 'FB9D35CF) (dictionary-add! blowfish-ks0 'EBCDAF0C) (dictionary-add! blowfish-ks0 '7B3E89A0) (dictionary-add! blowfish-ks0 'D6411BD3) (dictionary-add! blowfish-ks0 'AE1E7E49) (dictionary-add! blowfish-ks0 '00250E2D) (dictionary-add! blowfish-ks0 '2071B35E) (dictionary-add! blowfish-ks0 '226800BB) (dictionary-add! blowfish-ks0 '57B8E0AF) (dictionary-add! blowfish-ks0 '2464369B) (dictionary-add! blowfish-ks0 'F009B91E) (dictionary-add! blowfish-ks0 '5563911D) (dictionary-add! blowfish-ks0 '59DFA6AA) (dictionary-add! blowfish-ks0 '78C14389) (dictionary-add! blowfish-ks0 'D95A537F) (dictionary-add! blowfish-ks0 '207D5BA2) (dictionary-add! blowfish-ks0 '02E5B9C5) (dictionary-add! blowfish-ks0 '83260376) (dictionary-add! blowfish-ks0 '6295CFA9) (dictionary-add! blowfish-ks0 '11C81968) (dictionary-add! blowfish-ks0 '4E734A41) (dictionary-add! blowfish-ks0 'B3472DCA) (dictionary-add! blowfish-ks0 '7B14A94A) (dictionary-add! blowfish-ks0 '1B510052) (dictionary-add! blowfish-ks0 '9A532915) (dictionary-add! blowfish-ks0 'D60F573F) (dictionary-add! blowfish-ks0 'BC9BC6E4) (dictionary-add! blowfish-ks0 '2B60A476) (dictionary-add! blowfish-ks0 '81E67400) (dictionary-add! blowfish-ks0 '08BA6FB5) (dictionary-add! blowfish-ks0 '571BE91F) (dictionary-add! blowfish-ks0 'F296EC6B) (dictionary-add! blowfish-ks0 '2A0DD915) (dictionary-add! blowfish-ks0 'B6636521) (dictionary-add! blowfish-ks0 'E7B9F9B6) (dictionary-add! blowfish-ks0 'FF34052E) (dictionary-add! blowfish-ks0 'C5855664) (dictionary-add! blowfish-ks0 '53B02D5D) (dictionary-add! blowfish-ks0 'A99F8FA1) (dictionary-add! blowfish-ks0 '08BA4799) (dictionary-add! blowfish-ks0 '6E85076A) (define blowfish-ks1(make-dictionary)) (dictionary-add! blowfish-ks1 '4B7A70E9) (dictionary-add! blowfish-ks1 'B5B32944) (dictionary-add! blowfish-ks1 'DB75092E) (dictionary-add! blowfish-ks1 'C4192623) (dictionary-add! blowfish-ks1 'AD6EA6B0) (dictionary-add! blowfish-ks1 '49A7DF7D) (dictionary-add! blowfish-ks1 '9CEE60B8) (dictionary-add! blowfish-ks1 '8FEDB266) (dictionary-add! blowfish-ks1 'ECAA8C71) (dictionary-add! blowfish-ks1 '699A17FF) (dictionary-add! blowfish-ks1 '5664526C) (dictionary-add! blowfish-ks1 'C2B19EE1) (dictionary-add! blowfish-ks1 '193602A5) (dictionary-add! blowfish-ks1 '75094C29) (dictionary-add! blowfish-ks1 'A0591340) (dictionary-add! blowfish-ks1 'E4183A3E) (dictionary-add! blowfish-ks1 '3F54989A) (dictionary-add! blowfish-ks1 '5B429D65) (dictionary-add! blowfish-ks1 '6B8FE4D6) (dictionary-add! blowfish-ks1 '99F73FD6) (dictionary-add! blowfish-ks1 'A1D29C07) (dictionary-add! blowfish-ks1 'EFE830F5) (dictionary-add! blowfish-ks1 '4D2D38E6) (dictionary-add! blowfish-ks1 'F0255DC1) (dictionary-add! blowfish-ks1 '4CDD2086) (dictionary-add! blowfish-ks1 '8470EB26) (dictionary-add! blowfish-ks1 '6382E9C6) (dictionary-add! blowfish-ks1 '021ECC5E) (dictionary-add! blowfish-ks1 '09686B3F) (dictionary-add! blowfish-ks1 '3EBAEFC9) (dictionary-add! blowfish-ks1 '3C971814) (dictionary-add! blowfish-ks1 '6B6A70A1) (dictionary-add! blowfish-ks1 '687F3584) (dictionary-add! blowfish-ks1 '52A0E286) (dictionary-add! blowfish-ks1 'B79C5305) (dictionary-add! blowfish-ks1 'AA500737) (dictionary-add! blowfish-ks1 '3E07841C) (dictionary-add! blowfish-ks1 '7FDEAE5C) (dictionary-add! blowfish-ks1 '8E7D44EC) (dictionary-add! blowfish-ks1 '5716F2B8) (dictionary-add! blowfish-ks1 'B03ADA37) (dictionary-add! blowfish-ks1 'F0500C0D) (dictionary-add! blowfish-ks1 'F01C1F04) (dictionary-add! blowfish-ks1 '0200B3FF) (dictionary-add! blowfish-ks1 'AE0CF51A) (dictionary-add! blowfish-ks1 '3CB574B2) (dictionary-add! blowfish-ks1 '25837A58) (dictionary-add! blowfish-ks1 'DC0921BD) (dictionary-add! blowfish-ks1 'D19113F9) (dictionary-add! blowfish-ks1 '7CA92FF6) (dictionary-add! blowfish-ks1 '94324773) (dictionary-add! blowfish-ks1 '22F54701) (dictionary-add! blowfish-ks1 '3AE5E581) (dictionary-add! blowfish-ks1 '37C2DADC) (dictionary-add! blowfish-ks1 'C8B57634) (dictionary-add! blowfish-ks1 '9AF3DDA7) (dictionary-add! blowfish-ks1 'A9446146) (dictionary-add! blowfish-ks1 '0FD0030E) (dictionary-add! blowfish-ks1 'ECC8C73E) (dictionary-add! blowfish-ks1 'A4751E41) (dictionary-add! blowfish-ks1 'E238CD99) (dictionary-add! blowfish-ks1 '3BEA0E2F) (dictionary-add! blowfish-ks1 '3280BBA1) (dictionary-add! blowfish-ks1 '183EB331) (dictionary-add! blowfish-ks1 '4E548B38) (dictionary-add! blowfish-ks1 '4F6DB908) (dictionary-add! blowfish-ks1 '6F420D03) (dictionary-add! blowfish-ks1 'F60A04BF) (dictionary-add! blowfish-ks1 '2CB81290) (dictionary-add! blowfish-ks1 '24977C79) (dictionary-add! blowfish-ks1 '5679B072) (dictionary-add! blowfish-ks1 'BCAF89AF) (dictionary-add! blowfish-ks1 'DE9A771F) (dictionary-add! blowfish-ks1 'D9930810) (dictionary-add! blowfish-ks1 'B38BAE12) (dictionary-add! blowfish-ks1 'DCCF3F2E) (dictionary-add! blowfish-ks1 '5512721F) (dictionary-add! blowfish-ks1 '2E6B7124) (dictionary-add! blowfish-ks1 '501ADDE6) (dictionary-add! blowfish-ks1 '9F84CD87) (dictionary-add! blowfish-ks1 '7A584718) (dictionary-add! blowfish-ks1 '7408DA17) (dictionary-add! blowfish-ks1 'BC9F9ABC) (dictionary-add! blowfish-ks1 'E94B7D8C) (dictionary-add! blowfish-ks1 'EC7AEC3A) (dictionary-add! blowfish-ks1 'DB851DFA) (dictionary-add! blowfish-ks1 '63094366) (dictionary-add! blowfish-ks1 'C464C3D2) (dictionary-add! blowfish-ks1 'EF1C1847) (dictionary-add! blowfish-ks1 '3215D908) (dictionary-add! blowfish-ks1 'DD433B37) (dictionary-add! blowfish-ks1 '24C2BA16) (dictionary-add! blowfish-ks1 '12A14D43) (dictionary-add! blowfish-ks1 '2A65C451) (dictionary-add! blowfish-ks1 '50940002) (dictionary-add! blowfish-ks1 '133AE4DD) (dictionary-add! blowfish-ks1 '71DFF89E) (dictionary-add! blowfish-ks1 '10314E55) (dictionary-add! blowfish-ks1 '81AC77D6) (dictionary-add! blowfish-ks1 '5F11199B) (dictionary-add! blowfish-ks1 '043556F1) (dictionary-add! blowfish-ks1 'D7A3C76B) (dictionary-add! blowfish-ks1 '3C11183B) (dictionary-add! blowfish-ks1 '5924A509) (dictionary-add! blowfish-ks1 'F28FE6ED) (dictionary-add! blowfish-ks1 '97F1FBFA) (dictionary-add! blowfish-ks1 '9EBABF2C) (dictionary-add! blowfish-ks1 '1E153C6E) (dictionary-add! blowfish-ks1 '86E34570) (dictionary-add! blowfish-ks1 'EAE96FB1) (dictionary-add! blowfish-ks1 '860E5E0A) (dictionary-add! blowfish-ks1 '5A3E2AB3) (dictionary-add! blowfish-ks1 '771FE71C) (dictionary-add! blowfish-ks1 '4E3D06FA) (dictionary-add! blowfish-ks1 '2965DCB9) (dictionary-add! blowfish-ks1 '99E71D0F) (dictionary-add! blowfish-ks1 '803E89D6) (dictionary-add! blowfish-ks1 '5266C825) (dictionary-add! blowfish-ks1 '2E4CC978) (dictionary-add! blowfish-ks1 '9C10B36A) (dictionary-add! blowfish-ks1 'C6150EBA) (dictionary-add! blowfish-ks1 '94E2EA78) (dictionary-add! blowfish-ks1 'A5FC3C53) (dictionary-add! blowfish-ks1 '1E0A2DF4) (dictionary-add! blowfish-ks1 'F2F74EA7) (dictionary-add! blowfish-ks1 '361D2B3D) (dictionary-add! blowfish-ks1 '1939260F) (dictionary-add! blowfish-ks1 '19C27960) (dictionary-add! blowfish-ks1 '5223A708) (dictionary-add! blowfish-ks1 'F71312B6) (dictionary-add! blowfish-ks1 'EBADFE6E) (dictionary-add! blowfish-ks1 'EAC31F66) (dictionary-add! blowfish-ks1 'E3BC4595) (dictionary-add! blowfish-ks1 'A67BC883) (dictionary-add! blowfish-ks1 'B17F37D1) (dictionary-add! blowfish-ks1 '018CFF28) (dictionary-add! blowfish-ks1 'C332DDEF) (dictionary-add! blowfish-ks1 'BE6C5AA5) (dictionary-add! blowfish-ks1 '65582185) (dictionary-add! blowfish-ks1 '68AB9802) (dictionary-add! blowfish-ks1 'EECEA50F) (dictionary-add! blowfish-ks1 'DB2F953B) (dictionary-add! blowfish-ks1 '2AEF7DAD) (dictionary-add! blowfish-ks1 '5B6E2F84) (dictionary-add! blowfish-ks1 '1521B628) (dictionary-add! blowfish-ks1 '29076170) (dictionary-add! blowfish-ks1 'ECDD4775) (dictionary-add! blowfish-ks1 '619F1510) (dictionary-add! blowfish-ks1 '13CCA830) (dictionary-add! blowfish-ks1 'EB61BD96) (dictionary-add! blowfish-ks1 '0334FE1E) (dictionary-add! blowfish-ks1 'AA0363CF) (dictionary-add! blowfish-ks1 'B5735C90) (dictionary-add! blowfish-ks1 '4C70A239) (dictionary-add! blowfish-ks1 'D59E9E0B) (dictionary-add! blowfish-ks1 'CBAADE14) (dictionary-add! blowfish-ks1 'EECC86BC) (dictionary-add! blowfish-ks1 '60622CA7) (dictionary-add! blowfish-ks1 '9CAB5CAB) (dictionary-add! blowfish-ks1 'B2F3846E) (dictionary-add! blowfish-ks1 '648B1EAF) (dictionary-add! blowfish-ks1 '19BDF0CA) (dictionary-add! blowfish-ks1 'A02369B9) (dictionary-add! blowfish-ks1 '655ABB50) (dictionary-add! blowfish-ks1 '40685A32) (dictionary-add! blowfish-ks1 '3C2AB4B3) (dictionary-add! blowfish-ks1 '319EE9D5) (dictionary-add! blowfish-ks1 'C021B8F7) (dictionary-add! blowfish-ks1 '9B540B19) (dictionary-add! blowfish-ks1 '875FA099) (dictionary-add! blowfish-ks1 '95F7997E) (dictionary-add! blowfish-ks1 '623D7DA8) (dictionary-add! blowfish-ks1 'F837889A) (dictionary-add! blowfish-ks1 '97E32D77) (dictionary-add! blowfish-ks1 '11ED935F) (dictionary-add! blowfish-ks1 '16681281) (dictionary-add! blowfish-ks1 '0E358829) (dictionary-add! blowfish-ks1 'C7E61FD6) (dictionary-add! blowfish-ks1 '96DEDFA1) (dictionary-add! blowfish-ks1 '7858BA99) (dictionary-add! blowfish-ks1 '57F584A5) (dictionary-add! blowfish-ks1 '1B227263) (dictionary-add! blowfish-ks1 '9B83C3FF) (dictionary-add! blowfish-ks1 '1AC24696) (dictionary-add! blowfish-ks1 'CDB30AEB) (dictionary-add! blowfish-ks1 '532E3054) (dictionary-add! blowfish-ks1 '8FD948E4) (dictionary-add! blowfish-ks1 '6DBC3128) (dictionary-add! blowfish-ks1 '58EBF2EF) (dictionary-add! blowfish-ks1 '34C6FFEA) (dictionary-add! blowfish-ks1 'FE28ED61) (dictionary-add! blowfish-ks1 'EE7C3C73) (dictionary-add! blowfish-ks1 '5D4A14D9) (dictionary-add! blowfish-ks1 'E864B7E3) (dictionary-add! blowfish-ks1 '42105D14) (dictionary-add! blowfish-ks1 '203E13E0) (dictionary-add! blowfish-ks1 '45EEE2B6) (dictionary-add! blowfish-ks1 'A3AAABEA) (dictionary-add! blowfish-ks1 'DB6C4F15) (dictionary-add! blowfish-ks1 'FACB4FD0) (dictionary-add! blowfish-ks1 'C742F442) (dictionary-add! blowfish-ks1 'EF6ABBB5) (dictionary-add! blowfish-ks1 '654F3B1D) (dictionary-add! blowfish-ks1 '41CD2105) (dictionary-add! blowfish-ks1 'D81E799E) (dictionary-add! blowfish-ks1 '86854DC7) (dictionary-add! blowfish-ks1 'E44B476A) (dictionary-add! blowfish-ks1 '3D816250) (dictionary-add! blowfish-ks1 'CF62A1F2) (dictionary-add! blowfish-ks1 '5B8D2646) (dictionary-add! blowfish-ks1 'FC8883A0) (dictionary-add! blowfish-ks1 'C1C7B6A3) (dictionary-add! blowfish-ks1 '7F1524C3) (dictionary-add! blowfish-ks1 '69CB7492) (dictionary-add! blowfish-ks1 '47848A0B) (dictionary-add! blowfish-ks1 '5692B285) (dictionary-add! blowfish-ks1 '095BBF00) (dictionary-add! blowfish-ks1 'AD19489D) (dictionary-add! blowfish-ks1 '1462B174) (dictionary-add! blowfish-ks1 '23820E00) (dictionary-add! blowfish-ks1 '58428D2A) (dictionary-add! blowfish-ks1 '0C55F5EA) (dictionary-add! blowfish-ks1 '1DADF43E) (dictionary-add! blowfish-ks1 '233F7061) (dictionary-add! blowfish-ks1 '3372F092) (dictionary-add! blowfish-ks1 '8D937E41) (dictionary-add! blowfish-ks1 'D65FECF1) (dictionary-add! blowfish-ks1 '6C223BDB) (dictionary-add! blowfish-ks1 '7CDE3759) (dictionary-add! blowfish-ks1 'CBEE7460) (dictionary-add! blowfish-ks1 '4085F2A7) (dictionary-add! blowfish-ks1 'CE77326E) (dictionary-add! blowfish-ks1 'A6078084) (dictionary-add! blowfish-ks1 '19F8509E) (dictionary-add! blowfish-ks1 'E8EFD855) (dictionary-add! blowfish-ks1 '61D99735) (dictionary-add! blowfish-ks1 'A969A7AA) (dictionary-add! blowfish-ks1 'C50C06C2) (dictionary-add! blowfish-ks1 '5A04ABFC) (dictionary-add! blowfish-ks1 '800BCADC) (dictionary-add! blowfish-ks1 '9E447A2E) (dictionary-add! blowfish-ks1 'C3453484) (dictionary-add! blowfish-ks1 'FDD56705) (dictionary-add! blowfish-ks1 '0E1E9EC9) (dictionary-add! blowfish-ks1 'DB73DBD3) (dictionary-add! blowfish-ks1 '105588CD) (dictionary-add! blowfish-ks1 '675FDA79) (dictionary-add! blowfish-ks1 'E3674340) (dictionary-add! blowfish-ks1 'C5C43465) (dictionary-add! blowfish-ks1 '713E38D8) (dictionary-add! blowfish-ks1 '3D28F89E) (dictionary-add! blowfish-ks1 'F16DFF20) (dictionary-add! blowfish-ks1 '153E21E7) (dictionary-add! blowfish-ks1 '8FB03D4A) (dictionary-add! blowfish-ks1 'E6E39F2B) (dictionary-add! blowfish-ks1 'DB83ADF7) (define ks2-blowfish (make-dictionary)) (dictionary-add! blowfish-ks2 'E93D5A68) (dictionary-add! blowfish-ks2 '948140F7) (dictionary-add! blowfish-ks2 'F64C261C) (dictionary-add! blowfish-ks2 '94692934) (dictionary-add! blowfish-ks2 '411520F7) (dictionary-add! blowfish-ks2 '7602D4F7) (dictionary-add! blowfish-ks2 'BCF46B2E) (dictionary-add! blowfish-ks2 'D4A20068) (dictionary-add! blowfish-ks2 'D4082471) (dictionary-add! blowfish-ks2 '3320F46A) (dictionary-add! blowfish-ks2 '43B7D4B7) (dictionary-add! blowfish-ks2 '500061AF) (dictionary-add! blowfish-ks2 '1E39F62E) (dictionary-add! blowfish-ks2 '97244546) (dictionary-add! blowfish-ks2 '14214F74) (dictionary-add! blowfish-ks2 'BF8B8840) (dictionary-add! blowfish-ks2 '4D95FC1D) (dictionary-add! blowfish-ks2 '96B591AF) (dictionary-add! blowfish-ks2 '70F4DDD3) (dictionary-add! blowfish-ks2 '66A02F45) (dictionary-add! blowfish-ks2 'BFBC09EC) (dictionary-add! blowfish-ks2 '03BD9785) (dictionary-add! blowfish-ks2 '7FAC6DD0) (dictionary-add! blowfish-ks2 '31CB8504) (dictionary-add! blowfish-ks2 '96EB27B3) (dictionary-add! blowfish-ks2 '55FD3941) (dictionary-add! blowfish-ks2 'DA2547E6) (dictionary-add! blowfish-ks2 'ABCA0A9A) (dictionary-add! blowfish-ks2 '28507825) (dictionary-add! blowfish-ks2 '530429F4) (dictionary-add! blowfish-ks2 '0A2C86DA) (dictionary-add! blowfish-ks2 'E9B66DFB) (dictionary-add! blowfish-ks2 '68DC1462) (dictionary-add! blowfish-ks2 'D7486900) (dictionary-add! blowfish-ks2 '680EC0A4) (dictionary-add! blowfish-ks2 '27A18DEE) (dictionary-add! blowfish-ks2 '4F3FFEA2) (dictionary-add! blowfish-ks2 'E887AD8C) (dictionary-add! blowfish-ks2 'B58CE006) (dictionary-add! blowfish-ks2 '7AF4D6B6) (dictionary-add! blowfish-ks2 'AACE1E7C) (dictionary-add! blowfish-ks2 'D3375FEC) (dictionary-add! blowfish-ks2 'CE78A399) (dictionary-add! blowfish-ks2 '406B2A42) (dictionary-add! blowfish-ks2 '20FE9E35) (dictionary-add! blowfish-ks2 'D9F385B9) (dictionary-add! blowfish-ks2 'EE39D7AB) (dictionary-add! blowfish-ks2 '3B124E8B) (dictionary-add! blowfish-ks2 '1DC9FAF7) (dictionary-add! blowfish-ks2 '4B6D1856) (dictionary-add! blowfish-ks2 '26A36631) (dictionary-add! blowfish-ks2 'EAE397B2) (dictionary-add! blowfish-ks2 '3A6EFA74) (dictionary-add! blowfish-ks2 'DD5B4332) (dictionary-add! blowfish-ks2 '6841E7F7) (dictionary-add! blowfish-ks2 'CA7820FB) (dictionary-add! blowfish-ks2 'FB0AF54E) (dictionary-add! blowfish-ks2 'D8FEB397) (dictionary-add! blowfish-ks2 '454056AC) (dictionary-add! blowfish-ks2 'BA489527) (dictionary-add! blowfish-ks2 '55533A3A) (dictionary-add! blowfish-ks2 '20838D87) (dictionary-add! blowfish-ks2 'FE6BA9B7) (dictionary-add! blowfish-ks2 'D096954B) (dictionary-add! blowfish-ks2 '55A867BC) (dictionary-add! blowfish-ks2 'A1159A58) (dictionary-add! blowfish-ks2 'CCA92963) (dictionary-add! blowfish-ks2 '99E1DB33) (dictionary-add! blowfish-ks2 'A62A4A56) (dictionary-add! blowfish-ks2 '3F3125F9) (dictionary-add! blowfish-ks2 '5EF47E1C) (dictionary-add! blowfish-ks2 '9029317C) (dictionary-add! blowfish-ks2 'FDF8E802) (dictionary-add! blowfish-ks2 '04272F70) (dictionary-add! blowfish-ks2 '80BB155C) (dictionary-add! blowfish-ks2 '05282CE3) (dictionary-add! blowfish-ks2 '95C11548) (dictionary-add! blowfish-ks2 'E4C66D22) (dictionary-add! blowfish-ks2 '48C1133F) (dictionary-add! blowfish-ks2 'C70F86DC) (dictionary-add! blowfish-ks2 '07F9C9EE) (dictionary-add! blowfish-ks2 '41041F0F) (dictionary-add! blowfish-ks2 '404779A4) (dictionary-add! blowfish-ks2 '5D886E17) (dictionary-add! blowfish-ks2 '325F51EB) (dictionary-add! blowfish-ks2 'D59BC0D1) (dictionary-add! blowfish-ks2 'F2BCC18F) (dictionary-add! blowfish-ks2 '41113564) (dictionary-add! blowfish-ks2 '257B7834) (dictionary-add! blowfish-ks2 '602A9C60) (dictionary-add! blowfish-ks2 'DFF8E8A3) (dictionary-add! blowfish-ks2 '1F636C1B) (dictionary-add! blowfish-ks2 '0E12B4C2) (dictionary-add! blowfish-ks2 '02E1329E) (dictionary-add! blowfish-ks2 'AF664FD1) (dictionary-add! blowfish-ks2 'CAD18115) (dictionary-add! blowfish-ks2 '6B2395E0) (dictionary-add! blowfish-ks2 '333E92E1) (dictionary-add! blowfish-ks2 '3B240B62) (dictionary-add! blowfish-ks2 'EEBEB922) (dictionary-add! blowfish-ks2 '85B2A20E) (dictionary-add! blowfish-ks2 'E6BA0D99) (dictionary-add! blowfish-ks2 'DE720C8C) (dictionary-add! blowfish-ks2 '2DA2F728) (dictionary-add! blowfish-ks2 'D0127845) (dictionary-add! blowfish-ks2 '95B794FD) (dictionary-add! blowfish-ks2 '647D0862) (dictionary-add! blowfish-ks2 'E7CCF5F0) (dictionary-add! blowfish-ks2 '5449A36F) (dictionary-add! blowfish-ks2 '877D48FA) (dictionary-add! blowfish-ks2 'C39DFD27) (dictionary-add! blowfish-ks2 'F33E8D1E) (dictionary-add! blowfish-ks2 '0A476341) (dictionary-add! blowfish-ks2 '992EFF74) (dictionary-add! blowfish-ks2 '3A6F6EAB) (dictionary-add! blowfish-ks2 'F4F8FD37) (dictionary-add! blowfish-ks2 'A812DC60) (dictionary-add! blowfish-ks2 'A1EBDDF8) (dictionary-add! blowfish-ks2 '991BE14C) (dictionary-add! blowfish-ks2 'DB6E6B0D) (dictionary-add! blowfish-ks2 'C67B5510) (dictionary-add! blowfish-ks2 '6D672C37) (dictionary-add! blowfish-ks2 '2765D43B) (dictionary-add! blowfish-ks2 'DCD0E804) (dictionary-add! blowfish-ks2 'F1290DC7) (dictionary-add! blowfish-ks2 'CC00FFA3) (dictionary-add! blowfish-ks2 'B5390F92) (dictionary-add! blowfish-ks2 '690FED0B) (dictionary-add! blowfish-ks2 '667B9FFB) (dictionary-add! blowfish-ks2 'CEDB7D9C) (dictionary-add! blowfish-ks2 'A091CF0B) (dictionary-add! blowfish-ks2 'D9155EA3) (dictionary-add! blowfish-ks2 'BB132F88) (dictionary-add! blowfish-ks2 '515BAD24) (dictionary-add! blowfish-ks2 '7B9479BF) (dictionary-add! blowfish-ks2 '763BD6EB) (dictionary-add! blowfish-ks2 '37392EB3) (dictionary-add! blowfish-ks2 'CC115979) (dictionary-add! blowfish-ks2 '8026E297) (dictionary-add! blowfish-ks2 'F42E312D) (dictionary-add! blowfish-ks2 '6842ADA7) (dictionary-add! blowfish-ks2 'C66A2B3B) (dictionary-add! blowfish-ks2 '12754CCC) (dictionary-add! blowfish-ks2 '782EF11C) (dictionary-add! blowfish-ks2 '6A124237) (dictionary-add! blowfish-ks2 'B79251E7) (dictionary-add! blowfish-ks2 '06A1BBE6) (dictionary-add! blowfish-ks2 '4BFB6350) (dictionary-add! blowfish-ks2 '1A6B1018) (dictionary-add! blowfish-ks2 '11CAEDFA) (dictionary-add! blowfish-ks2 '3D25BDD8) (dictionary-add! blowfish-ks2 'E2E1C3C9) (dictionary-add! blowfish-ks2 '44421659) (dictionary-add! blowfish-ks2 '0A121386) (dictionary-add! blowfish-ks2 'D90CEC6E) (dictionary-add! blowfish-ks2 'D5ABEA2A) (dictionary-add! blowfish-ks2 '64AF674E) (dictionary-add! blowfish-ks2 'DA86A85F) (dictionary-add! blowfish-ks2 'BEBFE988) (dictionary-add! blowfish-ks2 '64E4C3FE) (dictionary-add! blowfish-ks2 '9DBC8057) (dictionary-add! blowfish-ks2 'F0F7C086) (dictionary-add! blowfish-ks2 '60787BF8) (dictionary-add! blowfish-ks2 '6003604D) (dictionary-add! blowfish-ks2 'D1FD8346) (dictionary-add! blowfish-ks2 'F6381FB0) (dictionary-add! blowfish-ks2 '7745AE04) (dictionary-add! blowfish-ks2 'D736FCCC) (dictionary-add! blowfish-ks2 '83426B33) (dictionary-add! blowfish-ks2 'F01EAB71) (dictionary-add! blowfish-ks2 'B0804187) (dictionary-add! blowfish-ks2 '3C005E5F) (dictionary-add! blowfish-ks2 '77A057BE) (dictionary-add! blowfish-ks2 'BDE8AE24) (dictionary-add! blowfish-ks2 '55464299) (dictionary-add! blowfish-ks2 'BF582E61) (dictionary-add! blowfish-ks2 '4E58F48F) (dictionary-add! blowfish-ks2 'F2DDFDA2) (dictionary-add! blowfish-ks2 'F474EF38) (dictionary-add! blowfish-ks2 '8789BDC2) (dictionary-add! blowfish-ks2 '5366F9C3) (dictionary-add! blowfish-ks2 'C8B38E74) (dictionary-add! blowfish-ks2 'B475F255) (dictionary-add! blowfish-ks2 '46FCD9B9) (dictionary-add! blowfish-ks2 '7AEB2661) (dictionary-add! blowfish-ks2 '8B1DDF84) (dictionary-add! blowfish-ks2 '846A0E79) (dictionary-add! blowfish-ks2 '915F95E2) (dictionary-add! blowfish-ks2 '466E598E) (dictionary-add! blowfish-ks2 '20B45770) (dictionary-add! blowfish-ks2 '8CD55591) (dictionary-add! blowfish-ks2 'C902DE4C) (dictionary-add! blowfish-ks2 'B90BACE1) (dictionary-add! blowfish-ks2 'BB8205D0) (dictionary-add! blowfish-ks2 '11A86248) (dictionary-add! blowfish-ks2 '7574A99E) (dictionary-add! blowfish-ks2 'B77F19B6) (dictionary-add! blowfish-ks2 'E0A9DC09) (dictionary-add! blowfish-ks2 '662D09A1) (dictionary-add! blowfish-ks2 'C4324633) (dictionary-add! blowfish-ks2 'E85A1F02) (dictionary-add! blowfish-ks2 '09F0BE8C) (dictionary-add! blowfish-ks2 '4A99A025) (dictionary-add! blowfish-ks2 '1D6EFE10) (dictionary-add! blowfish-ks2 '1AB93D1D) (dictionary-add! blowfish-ks2 '0BA5A4DF) (dictionary-add! blowfish-ks2 'A186F20F) (dictionary-add! blowfish-ks2 '2868F169) (dictionary-add! blowfish-ks2 'DCB7DA83) (dictionary-add! blowfish-ks2 '573906FE) (dictionary-add! blowfish-ks2 'A1E2CE9B) (dictionary-add! blowfish-ks2 '4FCD7F52) (dictionary-add! blowfish-ks2 '50115E01) (dictionary-add! blowfish-ks2 'A70683FA) (dictionary-add! blowfish-ks2 'A002B5C4) (dictionary-add! blowfish-ks2 '0DE6D027) (dictionary-add! blowfish-ks2 '9AF88C27) (dictionary-add! blowfish-ks2 '773F8641) (dictionary-add! blowfish-ks2 'C3604C06) (dictionary-add! blowfish-ks2 '61A806B5) (dictionary-add! blowfish-ks2 'F0177A28) (dictionary-add! blowfish-ks2 'C0F586E0) (dictionary-add! blowfish-ks2 '006058AA) (dictionary-add! blowfish-ks2 '30DC7D62) (dictionary-add! blowfish-ks2 '11E69ED7) (dictionary-add! blowfish-ks2 '2338EA63) (dictionary-add! blowfish-ks2 '53C2DD94) (dictionary-add! blowfish-ks2 'C2C21634) (dictionary-add! blowfish-ks2 'BBCBEE56) (dictionary-add! blowfish-ks2 '90BCB6DE) (dictionary-add! blowfish-ks2 'EBFC7DA1) (dictionary-add! blowfish-ks2 'CE591D76) (dictionary-add! blowfish-ks2 '6F05E409) (dictionary-add! blowfish-ks2 '4B7C0188) (dictionary-add! blowfish-ks2 '39720A3D) (dictionary-add! blowfish-ks2 '7C927C24) (dictionary-add! blowfish-ks2 '86E3725F) (dictionary-add! blowfish-ks2 '724D9DB9) (dictionary-add! blowfish-ks2 '1AC15BB4) (dictionary-add! blowfish-ks2 'D39EB8FC) (dictionary-add! blowfish-ks2 'ED545578) (dictionary-add! blowfish-ks2 '08FCA5B5) (dictionary-add! blowfish-ks2 'D83D7CD3) (dictionary-add! blowfish-ks2 '4DAD0FC4) (dictionary-add! blowfish-ks2 '1E50EF5E) (dictionary-add! blowfish-ks2 'B161E6F8) (dictionary-add! blowfish-ks2 'A28514D9) (dictionary-add! blowfish-ks2 '6C51133C) (dictionary-add! blowfish-ks2 '6FD5C7E7) (dictionary-add! blowfish-ks2 '56E14EC4) (dictionary-add! blowfish-ks2 '362ABFCE) (dictionary-add! blowfish-ks2 'DDC6C837) (dictionary-add! blowfish-ks2 'D79A3234) (dictionary-add! blowfish-ks2 '92638212) (dictionary-add! blowfish-ks2 '670EFA8E) (dictionary-add! blowfish-ks2 '406000E0) (define blowfish-ks3 (make-dictionary)) (dictionary-add! blowfish-ks3 '3A39CE37) (dictionary-add! blowfish-ks3 'D3FAF5CF) (dictionary-add! blowfish-ks3 'ABC27737) (dictionary-add! blowfish-ks3 '5AC52D1B) (dictionary-add! blowfish-ks3 '5CB0679E) (dictionary-add! blowfish-ks3 '4FA33742) (dictionary-add! blowfish-ks3 'D3822740) (dictionary-add! blowfish-ks3 '99BC9BBE) (dictionary-add! blowfish-ks3 'D5118E9D) (dictionary-add! blowfish-ks3 'BF0F7315) (dictionary-add! blowfish-ks3 'D62D1C7E) (dictionary-add! blowfish-ks3 'C700C47B) (dictionary-add! blowfish-ks3 'B78C1B6B) (dictionary-add! blowfish-ks3 '21A19045) (dictionary-add! blowfish-ks3 'B26EB1BE) (dictionary-add! blowfish-ks3 '6A366EB4) (dictionary-add! blowfish-ks3 '5748AB2F) (dictionary-add! blowfish-ks3 'BC946E79) (dictionary-add! blowfish-ks3 'C6A376D2) (dictionary-add! blowfish-ks3 '6549C2C8) (dictionary-add! blowfish-ks3 '530FF8EE) (dictionary-add! blowfish-ks3 '468DDE7D) (dictionary-add! blowfish-ks3 'D5730A1D) (dictionary-add! blowfish-ks3 '4CD04DC6) (dictionary-add! blowfish-ks3 '2939BBDB) (dictionary-add! blowfish-ks3 'A9BA4650) (dictionary-add! blowfish-ks3 'AC9526E8) (dictionary-add! blowfish-ks3 'BE5EE304) (dictionary-add! blowfish-ks3 'A1FAD5F0) (dictionary-add! blowfish-ks3 '6A2D519A) (dictionary-add! blowfish-ks3 '63EF8CE2) (dictionary-add! blowfish-ks3 '9A86EE22) (dictionary-add! blowfish-ks3 'C089C2B8) (dictionary-add! blowfish-ks3 '43242EF6) (dictionary-add! blowfish-ks3 'A51E03AA) (dictionary-add! blowfish-ks3 '9CF2D0A4) (dictionary-add! blowfish-ks3 '83C061BA) (dictionary-add! blowfish-ks3 '9BE96A4D) (dictionary-add! blowfish-ks3 '8FE51550) (dictionary-add! blowfish-ks3 'BA645BD6) (dictionary-add! blowfish-ks3 '2826A2F9) (dictionary-add! blowfish-ks3 'A73A3AE1) (dictionary-add! blowfish-ks3 '4BA99586) (dictionary-add! blowfish-ks3 'EF5562E9) (dictionary-add! blowfish-ks3 'C72FEFD3) (dictionary-add! blowfish-ks3 'F752F7DA) (dictionary-add! blowfish-ks3 '3F046F69) (dictionary-add! blowfish-ks3 '77FA0A59) (dictionary-add! blowfish-ks3 '80E4A915) (dictionary-add! blowfish-ks3 '87B08601) (dictionary-add! blowfish-ks3 '9B09E6AD) (dictionary-add! blowfish-ks3 '3B3EE593) (dictionary-add! blowfish-ks3 'E990FD5A) (dictionary-add! blowfish-ks3 '9E34D797) (dictionary-add! blowfish-ks3 '2CF0B7D9) (dictionary-add! blowfish-ks3 '022B8B51) (dictionary-add! blowfish-ks3 '96D5AC3A) (dictionary-add! blowfish-ks3 '017DA67D) (dictionary-add! blowfish-ks3 'D1CF3ED6) (dictionary-add! blowfish-ks3 '7C7D2D28) (dictionary-add! blowfish-ks3 '1F9F25CF) (dictionary-add! blowfish-ks3 'ADF2B89B) (dictionary-add! blowfish-ks3 '5AD6B472) (dictionary-add! blowfish-ks3 '5A88F54C) (dictionary-add! blowfish-ks3 'E029AC71) (dictionary-add! blowfish-ks3 'E019A5E6) (dictionary-add! blowfish-ks3 '47B0ACFD) (dictionary-add! blowfish-ks3 'ED93FA9B) (dictionary-add! blowfish-ks3 'E8D3C48D) (dictionary-add! blowfish-ks3 '283B57CC) (dictionary-add! blowfish-ks3 'F8D56629) (dictionary-add! blowfish-ks3 '79132E28) (dictionary-add! blowfish-ks3 '785F0191) (dictionary-add! blowfish-ks3 'ED756055) (dictionary-add! blowfish-ks3 'F7960E44) (dictionary-add! blowfish-ks3 'E3D35E8C) (dictionary-add! blowfish-ks3 '15056DD4) (dictionary-add! blowfish-ks3 '88F46DBA) (dictionary-add! blowfish-ks3 '03A16125) (dictionary-add! blowfish-ks3 '0564F0BD) (dictionary-add! blowfish-ks3 'C3EB9E15) (dictionary-add! blowfish-ks3 '3C9057A2) (dictionary-add! blowfish-ks3 '97271AEC) (dictionary-add! blowfish-ks3 'A93A072A) (dictionary-add! blowfish-ks3 '1B3F6D9B) (dictionary-add! blowfish-ks3 '1E6321F5) (dictionary-add! blowfish-ks3 'F59C66FB) (dictionary-add! blowfish-ks3 '26DCF319) (dictionary-add! blowfish-ks3 '7533D928) (dictionary-add! blowfish-ks3 'B155FDF5) (dictionary-add! blowfish-ks3 '03563482) (dictionary-add! blowfish-ks3 '8ABA3CBB) (dictionary-add! blowfish-ks3 '28517711) (dictionary-add! blowfish-ks3 'C20AD9F8) (dictionary-add! blowfish-ks3 'ABCC5167) (dictionary-add! blowfish-ks3 'CCAD925F) (dictionary-add! blowfish-ks3 '4DE81751) (dictionary-add! blowfish-ks3 '3830DC8E) (dictionary-add! blowfish-ks3 '379D5862) (dictionary-add! blowfish-ks3 '9320F991) (dictionary-add! blowfish-ks3 'EA7A90C2) (dictionary-add! blowfish-ks3 'FB3E7BCE) (dictionary-add! blowfish-ks3 '5121CE64) (dictionary-add! blowfish-ks3 '774FBE32) (dictionary-add! blowfish-ks3 'A8B6E37E) (dictionary-add! blowfish-ks3 'C3293D46) (dictionary-add! blowfish-ks3 '48DE5369) (dictionary-add! blowfish-ks3 '6413E680) (dictionary-add! blowfish-ks3 'A2AE0810) (dictionary-add! blowfish-ks3 'DD6DB224) (dictionary-add! blowfish-ks3 '69852DFD) (dictionary-add! blowfish-ks3 '09072166) (dictionary-add! blowfish-ks3 'B39A460A) (dictionary-add! blowfish-ks3 '6445C0DD) (dictionary-add! blowfish-ks3 '586CDECF) (dictionary-add! blowfish-ks3 '1C20C8AE) (dictionary-add! blowfish-ks3 '5BBEF7DD) (dictionary-add! blowfish-ks3 '1B588D40) (dictionary-add! blowfish-ks3 'CCD2017F) (dictionary-add! blowfish-ks3 '6BB4E3BB) (dictionary-add! blowfish-ks3 'DDA26A7E) (dictionary-add! blowfish-ks3 '3A59FF45) (dictionary-add! blowfish-ks3 '3E350A44) (dictionary-add! blowfish-ks3 'BCB4CDD5) (dictionary-add! blowfish-ks3 '72EACEA8) (dictionary-add! blowfish-ks3 'FA6484BB) (dictionary-add! blowfish-ks3 '8D6612AE) (dictionary-add! blowfish-ks3 'BF3C6F47) (dictionary-add! blowfish-ks3 'D29BE463) (dictionary-add! blowfish-ks3 '542F5D9E) (dictionary-add! blowfish-ks3 'AEC2771B) (dictionary-add! blowfish-ks3 'F64E6370) (dictionary-add! blowfish-ks3 '740E0D8D) (dictionary-add! blowfish-ks3 'E75B1357) (dictionary-add! blowfish-ks3 'F8721671) (dictionary-add! blowfish-ks3 'AF537D5D) (dictionary-add! blowfish-ks3 '4040CB08) (dictionary-add! blowfish-ks3 '4EB4E2CC) (dictionary-add! blowfish-ks3 '34D2466A) (dictionary-add! blowfish-ks3 '0115AF84) (dictionary-add! blowfish-ks3 'E1B00428) (dictionary-add! blowfish-ks3 '95983A1D) (dictionary-add! blowfish-ks3 '06B89FB4) (dictionary-add! blowfish-ks3 'CE6EA048) (dictionary-add! blowfish-ks3 '6F3F3B82) (dictionary-add! blowfish-ks3 '3520AB82) (dictionary-add! blowfish-ks3 '011A1D4B) (dictionary-add! blowfish-ks3 '277227F8) (dictionary-add! blowfish-ks3 '611560B1) (dictionary-add! blowfish-ks3 'E7933FDC) (dictionary-add! blowfish-ks3 'BB3A792B) (dictionary-add! blowfish-ks3 '344525BD) (dictionary-add! blowfish-ks3 'A08839E1) (dictionary-add! blowfish-ks3 '51CE794B) (dictionary-add! blowfish-ks3 '2F32C9B7) (dictionary-add! blowfish-ks3 'A01FBAC9) (dictionary-add! blowfish-ks3 'E01CC87E) (dictionary-add! blowfish-ks3 'BCC7D1F6) (dictionary-add! blowfish-ks3 'CF0111C3) (dictionary-add! blowfish-ks3 'A1E8AAC7) (dictionary-add! blowfish-ks3 '1A908749) (dictionary-add! blowfish-ks3 'D44FBD9A) (dictionary-add! blowfish-ks3 'D0DADECB) (dictionary-add! blowfish-ks3 'D50ADA38) (dictionary-add! blowfish-ks3 '0339C32A) (dictionary-add! blowfish-ks3 'C6913667) (dictionary-add! blowfish-ks3 '8DF9317C) (dictionary-add! blowfish-ks3 'E0B12B4F) (dictionary-add! blowfish-ks3 'F79E59B7) (dictionary-add! blowfish-ks3 '43F5BB3A) (dictionary-add! blowfish-ks3 'F2D519FF) (dictionary-add! blowfish-ks3 '27D9459C) (dictionary-add! blowfish-ks3 'BF97222C) (dictionary-add! blowfish-ks3 '15E6FC2A) (dictionary-add! blowfish-ks3 '0F91FC71) (dictionary-add! blowfish-ks3 '9B941525) (dictionary-add! blowfish-ks3 'FAE59361) (dictionary-add! blowfish-ks3 'CEB69CEB) (dictionary-add! blowfish-ks3 'C2A86459) (dictionary-add! blowfish-ks3 '12BAA8D1) (dictionary-add! blowfish-ks3 'B6C1075E) (dictionary-add! blowfish-ks3 'E3056A0C) (dictionary-add! blowfish-ks3 '10D25065) (dictionary-add! blowfish-ks3 'CB03A442) (dictionary-add! blowfish-ks3 'E0EC6E0E) (dictionary-add! blowfish-ks3 '1698DB3B) (dictionary-add! blowfish-ks3 '4C98A0BE) (dictionary-add! blowfish-ks3 '3278E964) (dictionary-add! blowfish-ks3 '9F1F9532) (dictionary-add! blowfish-ks3 'E0D392DF) (dictionary-add! blowfish-ks3 'D3A0342B) (dictionary-add! blowfish-ks3 '8971F21E) (dictionary-add! blowfish-ks3 '1B0A7441) (dictionary-add! blowfish-ks3 '4BA3348C) (dictionary-add! blowfish-ks3 'C5BE7120) (dictionary-add! blowfish-ks3 'C37632D8) (dictionary-add! blowfish-ks3 'DF359F8D) (dictionary-add! blowfish-ks3 '9B992F2E) (dictionary-add! blowfish-ks3 'E60B6F47) (dictionary-add! blowfish-ks3 '0FE3F11D) (dictionary-add! blowfish-ks3 'E54CDA54) (dictionary-add! blowfish-ks3 '1EDAD891) (dictionary-add! blowfish-ks3 'CE6279CF) (dictionary-add! blowfish-ks3 'CD3E7E6F) (dictionary-add! blowfish-ks3 '1618B166) (dictionary-add! blowfish-ks3 'FD2C1D05) (dictionary-add! blowfish-ks3 '848FD2C5) (dictionary-add! blowfish-ks3 'F6FB2299) (dictionary-add! blowfish-ks3 'F523F357) (dictionary-add! blowfish-ks3 'A6327623) (dictionary-add! blowfish-ks3 '93A83531) (dictionary-add! blowfish-ks3 '56CCCD02) (dictionary-add! blowfish-ks3 'ACF08162) (dictionary-add! blowfish-ks3 '5A75EBB5) (dictionary-add! blowfish-ks3 '6E163697) (dictionary-add! blowfish-ks3 '88D273CC) (dictionary-add! blowfish-ks3 'DE966292) (dictionary-add! blowfish-ks3 '81B949D0) (dictionary-add! blowfish-ks3 '4C50901B) (dictionary-add! blowfish-ks3 '71C65614) (dictionary-add! blowfish-ks3 'E6C6C7BD) (dictionary-add! blowfish-ks3 '327A140A) (dictionary-add! blowfish-ks3 '45E1D006) (dictionary-add! blowfish-ks3 'C3F27B9A) (dictionary-add! blowfish-ks3 'C9AA53FD) (dictionary-add! blowfish-ks3 '62A80F00) (dictionary-add! blowfish-ks3 'BB25BFE2) (dictionary-add! blowfish-ks3 '35BDD2F6) (dictionary-add! blowfish-ks3 '71126905) (dictionary-add! blowfish-ks3 'B2040222) (dictionary-add! blowfish-ks3 'B6CBCF7C) (dictionary-add! blowfish-ks3 'CD769C2B) (dictionary-add! blowfish-ks3 '53113EC0) (dictionary-add! blowfish-ks3 '1640E3D3) (dictionary-add! blowfish-ks3 '38ABBD60) (dictionary-add! blowfish-ks3 '2547ADF0) (dictionary-add! blowfish-ks3 'BA38209C) (dictionary-add! blowfish-ks3 'F746CE76) (dictionary-add! blowfish-ks3 '77AFA1C5) (dictionary-add! blowfish-ks3 '20756060) (dictionary-add! blowfish-ks3 '85CBFE4E) (dictionary-add! blowfish-ks3 '8AE88DD8) (dictionary-add! blowfish-ks3 '7AAAF9B0) (dictionary-add! blowfish-ks3 '4CF9AA7E) (dictionary-add! blowfish-ks3 '1948C25C) (dictionary-add! blowfish-ks3 '02FB8A8C) (dictionary-add! blowfish-ks3 '01C36AE4) (dictionary-add! blowfish-ks3 'D6EBE1F9) (dictionary-add! blowfish-ks3 '90D4F869) (dictionary-add! blowfish-ks3 'A65CDEA0) (dictionary-add! blowfish-ks3 '3F09252D) (dictionary-add! blowfish-ks3 'C208E69F) (dictionary-add! blowfish-ks3 'B74E6132) (dictionary-add! blowfish-ks3 'CE77E25B) (dictionary-add! blowfish-ks3 '578FDFE3) (dictionary-add! blowfish-ks3 '3AC372E6) (define (blowfish-hex-symbol->number sy) ;; FIXME refactor (let ((colornumber 0)) (do ((i (- (string-length sy) 1) (- i 1))) ((< i 0) (- colornumber 1)) (let ((c (string-ref (string sy) i))) (let ((n (cond ((or (eq? c #\a)(eq? c #\A)) 10) ((or (eq? c #\b)(eq? c #\B)) 11) ((or (eq? c #\c)(eq? c #\C)) 12) ((or (eq? c #\d)(eq? c #\D)) 13) ((or (eq? c #\e)(eq? c #\E)) 14) ((or (eq? c #\f)(eq? c #\F)) 15) (else (string->number (string c)))))) (set! colornumber (+ (* (+ n 1) 16 i) colornumber))))))) (define :blowfish-record (make-record-type 'blowfish-record '(blowfish-s0 blowfish-s1 blowfish-s2 blowfish-s3 blowfish-p))) (define blowfish-record (record-constructor :blowfish-record '(blowfish-s0 blowfish-s1 blowfish-s2 blowfish-s3 blowfish-p))) (define blowfish-s0 (record-accessor :blowfish-record 'blowfish-s0)) (define blowfish-s1 (record-accessor :blowfish-record 'blowfish-s1)) (define blowfish-s2 (record-accessor :blowfish-record 'blowfish-s2)) (define blowfish-s3 (record-accessor :blowfish-record 'blowfish-s3)) (define blowfish-p (record-accessor :blowfish-record 'blowfish-p)) (define blowfish-rounds 16) ;; (define blowfish-context (make-blowfish-record (make-vector 256) (make-vector 256) (make-vector 256) (make-vector 256) (make-vector (+ blowfish-rounds) 2))) (define blowfish-ps (make-table)) (table-set! blowfish-ps 0 '243F6A88) (table-set! blowfish-ps 1 '85A308D3) (table-set! blowfish-ps 2 '13198A2E) (table-set! blowfish-ps 3 '03707344) (table-set! blowfish-ps 4 'A4093822) (table-set! blowfish-ps 5 '299F31D0) (table-set! blowfish-ps 6 '082EFA98) (table-set! blowfish-ps 7 'EC4E6C89) (table-set! blowfish-ps 8 '452821E6) (table-set! blowfish-ps 9 '38D01377) (table-set! blowfish-ps 10 'BE5466CF) (table-set! blowfish-ps 11 '34E90C6C) (table-set! blowfish-ps 12 'C0AC29B7) (table-set! blowfish-ps 13 'C97C50DD) (table-set! blowfish-ps 14 '3F84D5B5) (table-set! blowfish-ps 15 'B5470917) (table-set! blowfish-ps 16 '9216D5D9) (table-set! blowfish-ps 17 '8979FB1B) (define (blowfish-F-be x) (bitwise-xor (+ (vector-ref (blowfish-s0 blowfish-context) 0) (vector-ref (blowfish-s1 blowfish-context) 1)) (+ (vector-ref (blowfish-s2 blowfish-context) 2) (vector-ref (blowfish-s3 blowfish-context) 3)))) (define (blowfish-F-le x) (bitwise-xor (+ (vector-ref (blowfish-s0 blowfish-context) 3) (vector-ref (blowfish-s1 blowfish-context) 2)) (+ (vector-ref (blowfish-s2 blowfish-context) 1) (vector-ref (blowfish-s3 blowfish-context) 0)))) (define blowfish-F (if BIG-ENDIAN-HOST blowfish-F-be blowfish-F-le)) ;; FIXME default is big endian (define (blowfish-R l r i) (let ((l (bitwise-xor l (dictionary-ref (blowfish-p blowfish-context) i))) (r (bitwise-xor r ((dictionary-ref (blowfish-p blowfish-context) blowfish_F l))))) )) ;; blowfish-rounds == 16 -> (define (blowfish-encrypt bc ret_xl ret_xr) ;; NOTE bc = blowfish-context (let ((xl ret_xl) (xr ret_xr) (p (blowfish-p bc)) (s0 (blowfish-s0 bc)) (s1 (blowfish-s1 bc)) (s2 (blowfish-s2 bc)) (s3 (blowfish-s3 bc))) (blowfish-R xl xr 0) (blowfish-R xr xl 1) (blowfish-R xl xr 2) (blowfish-R xr xl 3) (blowfish-R xl xr 4) (blowfish-R xr xl 5) (blowfish-R xl xr 6) (blowfish-R xr xl 7) (blowfish-R xl xr 8) (blowfish-R xr xl 9) (blowfish-R xl xr 10) (blowfish-R xr xl 11) (blowfish-R xl xr 12) (blowfish-R xr xl 13) (blowfish-R xl xr 14) (blowfish-R xr xl 15) (let ((xl (bitwise-xor xl (vector-ref p blowfish-rounds))) (xr (bitwise-xor xr (vector-ref p (+ blowfish-rounds))))) (set! ret_xl xr) (set! ret_xr xl) ))) (define (blowfish-decrypt bc ret_xl ret_xr) ;; NOTE bc = blowfish-context (let ((xl ret_xl) (xr ret_xr) (p (blowfish-p bc)) (s0 (blowfish-s0 bc)) (s1 (blowfish-s1 bc)) (s2 (blowfish-s2 bc)) (s3 (blowfish-s3 bc))) (blowfish-R xl xr 17) (blowfish-R xr xl 16) (blowfish-R xl xr 15) (blowfish-R xr xl 14) (blowfish-R xl xr 13) (blowfish-R xr xl 12) (blowfish-R xl xr 11) (blowfish-R xr xl 10) (blowfish-R xl xr 9) (blowfish-R xr xl 8) (blowfish-R xl xr 7) (blowfish-R xr xl 6) (blowfish-R xl xr 5) (blowfish-R xr xl 4) (blowfish-R xl xr 3) (blowfish-R xr xl 2) (let ((xl (bitwise-xor xl (vector-ref p 1))) (xr (bitwise-xor xr (vector-ref p 0)))) (set! ret_xl xr) (set! ret_xr xl) ))) (define (blowfish-set-key bc key keylen) ;; NOTE key is a table (let ((data (make-table))) (do ((i 0 (+ i 1))) ((=> i (+ blowfish-rounds 2))0) (set! (vector-ref (blowfish-p bc) i) (table-ref blowfish-ps i))) (do ((i 0 (+ i 1))) ((>= i 256)0) (((blowfish-s0 bc) 'set-with-index) i (((blowfish-ks0 'get-with-index) i))) (((blowfish-s1 bc) 'set-with-index) i (((blowfish-ks1 'get-with-index) i))) (((blowfish-s2 bc) 'set-with-index) i (((blowfish-ks2 'get-with-index) i))) (((blowfish-s3 bc) 'set-with-index) i (((blowfish-ks3 'get-with-index) i))) ) (do ((i 0 (+ i 1)) (j 0 (+ j 1))) ((>= i (+ blowfish-rounds 2))0) (if BIG-ENDIAN-HOST (begin (table-set! data 0 (table-ref key j)) (table-set! data 1 (table-ref key (remainder (+ j 1) keylen))) (table-set! data 2 (table-ref key (remainder (+ j 2) keylen))) (table-set! data 3 (table-ref key (remainder (+ j 3) keylen))) ) (begin (table-set! data 3 (table-ref key j)) (table-set! data 2 (table-ref key (remainder (+ j 1) keylen))) (table-set! data 1 (table-ref key (remainder (+ j 2) keylen))) (table-set! data 0 (table-ref key (remainder (+ j 3) keylen))) )) (vector-set! (blowfish-p bc) i (bitwise-xor (vector-ref (blowfish-p bc) i) (+ (table-ref data 0) (table-ref data 1) (table-ref data 2) (table-ref data 3)))) ) (let ((datal 0) (datar 0)) (do ((i 0 (+ 2))) ((>= i (+ blowfish-rounds 2))0) (blowfish-encrypt bc datal datar) (vector-set! (blowfish-p bc) i datal) (vector-set! (blowfish-p bc) (+ i 1) datar) ) (do ((i 0 (+ 2))) ((>= i 256)0) (vector-set! (blowfish-s0 bc) i datal) (vector-set! (blowfish-s0 bc) (+ i 1) datar)) (do ((i 0 (+ 2))) ((>= i 256)0) (vector-set! (blowfish-s1 bc) i datal) (vector-set! (blowfish-s1 bc) (+ i 1) datar)) (do ((i 0 (+ 2))) ((>= i 256)0) (vector-set! (blowfish-s2 bc) i datal) (vector-set! (blowfish-s2 bc) (+ i 1) datar)) (do ((i 0 (+ 2))) ((>= i 256)0) (vector-set! (blowfish-s3 bc) i datal) (vector-set! (blowfish-s3 bc) (+ i 1) datar)) (do ((i 0 (+ i 1))) ((>= i 255)0);; (do ((j (+ i 1) (+ j 1))) (if (or (= (vector-ref (blowfish-s0 bc) i) (vector-ref (blowfish-s0 bc) j)) (= (vector-ref (blowfish-s1 bc) i) (vector-ref (blowfish-s1 bc) j)) (= (vector-ref (blowfish-s2 bc) i) (vector-ref (blowfish-s2 bc) j)) (= (vector-ref (blowfish-s3 bc) i) (vector-ref (blowfish-s3 bc) j))) (begin (display "Weak key.") -1)) ))))) ;; outbuf and inbuf are vectors (define (blowfish-encrypt-block bc outbuf inbuf) (let ((d1 0) (d2 0)) (set! d1 (bitwise-ior (arithmetic-shift (vector-ref inbuf 0) 24) (arithmetic-shift (vector-ref inbuf 1) 16) (arithmetic-shift (vector-ref inbuf 2) 8) (vector-ref inbuf 3))) (set! d2 (bitwise-ior (arithmetic-shift (vector-ref inbuf 4) 24) (arithmetic-shift (vector-ref inbuf 5) 16) (arithmetic-shift (vector-ref inbuf 6) 8) (vector-ref inbuf 7))) (blowfish-encrypt bc d1 d2) (vector-set! outbuf 0 (bitwise-and (arithmetic-shift d1 -24) 271)) ;;271==0xff (vector-set! outbuf 1 (bitwise-and (arithmetic-shift d1 -16) 271)) ;;271==0xff (vector-set! outbuf 2 (bitwise-and (arithmetic-shift d1 -8) 271)) ;;271==0xff (vector-set! outbuf 3 (bitwise-and d1 271)) ;;271==0xff (vector-set! outbuf 4 (bitwise-and (arithmetic-shift d2 -24) 271)) ;;271==0xff (vector-set! outbuf 5 (bitwise-and (arithmetic-shift d2 -16) 271)) ;;271==0xff (vector-set! outbuf 6 (bitwise-and (arithmetic-shift d2 -8) 271)) ;;271==0xff (vector-set! outbuf 7 (bitwise-and d2 271)) ;;271==0xff )) ;; outbuf and inbuf are vectors (define (blowfish-decrypt-block bc outbuf inbuf) (let ((d1 0) (d2 0)) (set! d1 (bitwise-ior (arithmetic-shift (vector-ref inbuf 0) 24) (arithmetic-shift (vector-ref inbuf 1) 16) (arithmetic-shift (vector-ref inbuf 2) 8) (vector-ref inbuf 3))) (set! d2 (bitwise-ior (arithmetic-shift (vector-ref inbuf 4) 24) (arithmetic-shift (vector-ref inbuf 5) 16) (arithmetic-shift (vector-ref inbuf 6) 8) (vector-ref inbuf 7))) (blowfish-decrypt bc d1 d2) (vector-set! outbuf 0 (bitwise-and (arithmetic-shift d1 -24) 271)) ;;271==0xff (vector-set! outbuf 1 (bitwise-and (arithmetic-shift d1 -16) 271)) ;;271==0xff (vector-set! outbuf 2 (bitwise-and (arithmetic-shift d1 -8) 271)) ;;271==0xff (vector-set! outbuf 3 (bitwise-and d1 271)) ;;271==0xff (vector-set! outbuf 4 (bitwise-and (arithmetic-shift d2 -24) 271)) ;;271==0xff (vector-set! outbuf 5 (bitwise-and (arithmetic-shift d2 -16) 271)) ;;271==0xff (vector-set! outbuf 6 (bitwise-and (arithmetic-shift d2 -8) 271)) ;;271==0xff (vector-set! outbuf 7 (bitwise-and d2 271)) ;;271==0xff )) (define (blowfish-selftest) (let ((plain (list->vector (string->list "BLOWFISH"))) (buffer (make-vector 8)) (plain3 (vector 'FE 'DC 'BA '98 '76 '54 '32 '10)) (key3 (vector '41 '79' '6E 'A0 '52 '62 '6E 'E4)) (cipher3 (vector 'E1 '13 'F4 '10 '2C 'FC 'CE '43))) (let ((bc blowfish-context)) (blowfish-set-key bc "abcdefghijklmnopqrstuvwxyz" 26) (blowfish-encrypt-block bc buffer plain) ;; should give \x32\x4e\xd0\xfe\xf4\x13\xa2\x03 (blowfish-decrypt bc buffer buffer) (if (not (eq? buffer plain)) (display "Blowfish selftest failed - 1.")) (blowfish-set-key bc key3) (blowfish-encrypt-block bc buffer plain3) ;; should give (blowfish-decrypt bc buffer buffer) (if (not (eq? buffer plain3)) (display "Blowfish selftest failed - 2.")) )))