$î …: î … ‡: ñ ö$;" at line ";ž:à   0token$="020426:fluffybunny:e8a644c737517e33" $ô enter token to be checked here    .ptr%=§token$,":",13):ô locate second colon challenge$=Àtoken$,ptr%-1)  òassemble   1Þ workblock% 64 :ô 512 bits - 16 32-bit words Þ W% 80*4 :ô 80 words Þ digest1% 24, digest2% 24 Þ hex% 17,block% 255 $hex%="0123456789abcdef"   òhash(challenge$,digest1%)  òhash(token$,digest2%)  !ñ "Target",¤char(20,digest1%) #ñ "Achieved",¤char(20,digest2%) ñ ¤bitmatch;"-bit match"  à  Ý ¤char(bytes%,ptr%) ! ê r%,n% " bytes%-=4 # r%=block% $ã n% = 0 ¸ bytes% ˆ 4 %/ ô SYS"OS_ConvertHex8",ptr%!n%,r%,16 TO ,r% & òhexstr(ptr%!n%,r%) ' r%+=8 (í n% ) ?r%=13 *5ô overwrite terminator with BASIC terminator char + =$block% ,Bô returns bytes% bytes read from address ptr% in string format - .2Ý òhexstr(num%,block%):ô produce lowercase hex / ê Q%,ptr% 0õ 1" Q%=num% € 15:num%=num% >>> 4 2 block%?(7-ptr%)=hex%?Q% 3 ptr%+=1 4 ý ptr%=8 5á 6 79Ý ¤bitmatch:ô test matching bits *up to 32 bits only* 8ê word1$,word2$,n%,test% 9word1$=¤binary(!digest1%) :word2$=¤binary(!digest2%) ;õ < n%=n%+1 =) test%=(Áword1$,n%,1)=Áword2$,n%,1)) >ý test%=£ „ n%=32 ? =n%-1 @: A@Ý ¤binary(number%):ô another more 'official' way of doing it B ê end%,a$ C4È™"OS_ConvertBinary4",number%,block%,255 ¸ ,end% D5ô needs predimensioned block% of 33 bytes minimum E ?end%=13 F =$block% G HÝ òhash(input$,output%) Ioffset%=©(input$) JK1%=&5A827999 KK2%=&6ED9EBA1 LK3%=&8F1BBCDC MK4%=&CA62C1D6 N OH0%=&67452301 PH1%=&EFCDAB89 QH2%=&98BADCFE RH3%=&10325476 SH4%=&C3D2E1F0 T U Vòzero(workblock%,64) Wòzero(W%,80*4) X Yô zero blocks Z [ $W%=input$:ô poke into block \>W%?offset%=%10000000:ô append 1 bit (and overwrite CHR$13) ] ^W%!60=¤endian(offset%*8) _<ô poke length of string in bits into final word of block ` aEô we are assuming that the string is of fewer than &FF characters b.ô (and, indeed, fewer than 56 characters!) c dã t%= 64 ¸ 316 ˆ 4 eu W%!t%=¤endian(¤shift(¤endian(W%!(t%-12)) ‚ ¤endian(W%!(t%-32)) ‚ ¤endian( W%!(t%-56)) ‚ ¤endian(W%!(t%-64)),1 )) fí gHô step b (with all the values multiplied by 4 to access whole words) h i&a%=H0%:B%=H1%:C%=H2%:D%=H3%:E%=H4% j ô step c k l mã t%=0 ¸ 76 ˆ 4 nC TEMP%=¤shift(a%,5) + ¤f1(B%,C%,D%) + E% + ¤endian(W%!t%) + K1% o0 E%=D%:D%=C%:C%=¤shift(B%,30):B%=a%:a%=TEMP% pí qã t%=80 ¸ 156 ˆ 4 rC TEMP%=¤shift(a%,5) + ¤f2(B%,C%,D%) + E% + ¤endian(W%!t%) + K2% s0 E%=D%:D%=C%:C%=¤shift(B%,30):B%=a%:a%=TEMP% tí uã t%=160 ¸ 236 ˆ 4 vC TEMP%=¤shift(a%,5) + ¤f3(B%,C%,D%) + E% + ¤endian(W%!t%) + K3% w0 E%=D%:D%=C%:C%=¤shift(B%,30):B%=a%:a%=TEMP% xí yã t%=240 ¸ 316 ˆ 4 zC TEMP%=¤shift(a%,5) + ¤f4(B%,C%,D%) + E% + ¤endian(W%!t%) + K4% {0 E%=D%:D%=C%:C%=¤shift(B%,30):B%=a%:a%=TEMP% |í } ~ H0%+=a%:output%!0=H0% €H1%+=B%:output%!4=H1% H2%+=C%:output%!8=H2% ‚H3%+=D%:output%!12=H3% ƒH4%+=E%:output%!16=H4% „á … †Ý òzero(block%,len%) ‡ê n% ˆã n%=0 ¸ len% ˆ 4 ‰ block%!n%=0 Ší n% ‹á Œ: Ý ¤f1(b%,c%,d%) Ž=(b% € c%) „ ((¬ b%) € d%) : Ý ¤f2(b%,c%,d%) ‘=(b% ‚ c% ‚ d%) ’: “Ý ¤f3(b%,c%,d%) ”&=(b% € c%) „ (b% € d%) „ (c% € d%) •: –Ý ¤f4(b%,c%,d%) —=(b% ‚ c% ‚ d%) ˜: ™Ý ¤shift(X%,n%) š =(X%<>> (32-n%)) ›!ô rotate X% left by n% places œ0ô >>> is logical shift right (insert zeroes)  žÝ òassemble Ÿ ê pass%  Þ code% 256 ¡ã pass%=8 ¸ 10 ˆ 2 ¢ P%=code% £ L%=P%+256 ¤ [OPT pass% ¥* ; data should be in R0, output in R0 ¦C ‚ r1,r0,r0,ROR #16 ; (aEORc)(bEORd)(aEORc)(bEORd) §E BIC r1,r1,#&FF0000 ; (aEORc) 0 (aEORc)(bEORd) ¨B MOV r0,r0,ROR #8 ; d a b c ©@ ‚ r0,r0,r1,LSR #8 ; d c b a ª6 MOV pc,r14 ; exit routine « ] ¬- ô switch between little- and big-endian ­ í pass% ®á ¯: °Ý ¤endian(int%) ± A%=int% ² =º(code%) ÿ