;*******************************************; ; Use this function to open a file that has to be encoded ; to be sent as an e-mail attachment. Pass a pointer to ; the name of the file (ASCIIZ) as parameter. ; Returns true/false according whether the file has been ; opened or not. ;*******************************************; FFBase64Open PROC PARM_1:DWORD ;===========================================; PUSH ESI ; PUSH EDI ; PUSH EBP ; PUSH EBX ; ;===========================================; PUSH PARM_1 ; POP B64pFileName ; ;===========================================; INVOKE CreateFile, B64pFileName, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0 CMP EAX,0FFFFFFFFH JZ FFB64OPEN_NOK MOV B64Handle,EAX JMP FFB64OPEN_OK ;*******************************************; FFB64OPEN_NOK: MOV EAX,0 JMP FFB64OPEN_00 FFB64OPEN_OK: MOV EAX,1 ; FFB64OPEN_00: POP EBX ; POP EBP ; POP EDI ; POP ESI ; RET FFBase64Open ENDP ;*******************************************; ; Each time you call this function you will get 512 bytes of ; encoded data from the file that you opened with the previous ; function. When you get less than 512 bytes the file is ; terminated and this function should be no more called again. ; Pass a pointer to a string to receive 512 bytes. The string ; should be 513 bytes (to accomodate the final ASCIIZ zero). ; This function returns the number of bytes that have been ; returned in the coded string. ; The coded string is, obviously, an ASCIIZ string. ; (Note: this function reads the file 384 bytes each time, and ; returns 512 bytes because, you know, Base64 encoding expands ; the stream by a factor of 4/3). ;*******************************************; FFBase64Get512Bytes PROC PARM_1:DWORD ;===========================================; PUSH ESI ; PUSH EDI ; PUSH EBP ; PUSH EBX ; ;===========================================; PUSH PARM_1 ; POP EDI ;===========================================;mette 513 zeri PUSH EDI MOV ECX,513 MOV AL,0 B64_LOOP: MOV [EDI],AL INC EDI LOOP B64_LOOP POP EDI ;...........................................;azzera il contatore MOV B64retBytes,0 ;===========================================;legge 384 bytes INVOKE ReadFile, B64Handle, OFFSET B64Buffer, 384, OFFSET B64BytesRead, 0 CMP B64BytesRead,0 JZ FFB64GET_NOK ;dati finiti, restituisce FALSE ;===========================================; MOV PAD_FLAG,0 LEA ESI,B64Buffer ;===========================================; ; i tre bytes sono messi in AH, AL e BH ;===========================================; B64_NEXT_3: CMP B64BytesRead,0 JZ END_PADDING ;...........................................; MOV AH,[ESI] INC ESI DEC B64BytesRead CMP B64BytesRead,0 JNZ B64_CONT1 MOV AL,0 MOV BH,0 MOV PAD_FLAG,2 JMP B64_DIVIDI ;...........................................; B64_CONT1: MOV AL,[ESI] INC ESI DEC B64BytesRead CMP B64BytesRead,0 JNZ B64_CONT2 MOV BH,0 MOV PAD_FLAG,1 JMP B64_DIVIDI ;...........................................; B64_CONT2: MOV BH,[ESI] INC ESI DEC B64BytesRead ; JMP B64_DIVIDI ;===========================================; ; i 4 bytes sono preparati in CH, CL, DH e DL ;...........................................; B64_DIVIDI: MOV CH,0 SHL AH,1 ;AH1 RCL CH,1 SHL AH,1 ;AH2 RCL CH,1 SHL AH,1 ;AH3 RCL CH,1 SHL AH,1 ;AH4 RCL CH,1 SHL AH,1 ;AH5 RCL CH,1 SHL AH,1 ;AH6 RCL CH,1 ;...........................................; MOV CL,0 SHL AH,1 ;AH7 RCL CL,1 SHL AH,1 ;AH8 RCL CL,1 SHL AL,1 ;AL1 RCL CL,1 SHL AL,1 ;AL2 RCL CL,1 SHL AL,1 ;AL3 RCL CL,1 SHL AL,1 ;AL4 RCL CL,1 ;...........................................; MOV DH,0 SHL AL,1 ;AL5 RCL DH,1 SHL AL,1 ;AL6 RCL DH,1 SHL AL,1 ;AL7 RCL DH,1 SHL AL,1 ;AL8 RCL DH,1 SHL BH,1 ;BH1 RCL DH,1 SHL BH,1 ;BH2 RCL DH,1 ;...........................................; MOV DL,0 SHL BH,1 ;BH3 RCL DL,1 SHL BH,1 ;BH4 RCL DL,1 SHL BH,1 ;BH5 RCL DL,1 SHL BH,1 ;BH6 RCL DL,1 SHL BH,1 ;BH7 RCL DL,1 SHL BH,1 ;BH8 RCL DL,1 ;===========================================; ; codifica comunque tutti e 4 ibytes, salvo poi a fare il padding ;...........................................; MOV EAX,0 ;...........................................; PUSH ESI ;salva ESI ;...........................................; MOV AL,CH LEA ESI,B64Table ADD ESI,EAX MOV AL,[ESI] MOV [EDI],AL INC EDI INC B64retBytes ;...........................................; MOV AL,CL LEA ESI,B64Table ADD ESI,EAX MOV AL,[ESI] MOV [EDI],AL INC EDI INC B64retBytes ;...........................................; MOV AL,DH LEA ESI,B64Table ADD ESI,EAX MOV AL,[ESI] MOV [EDI],AL INC EDI INC B64retBytes ;...........................................; MOV AL,DL LEA ESI,B64Table ADD ESI,EAX MOV AL,[ESI] MOV [EDI],AL INC EDI INC B64retBytes ;...........................................; POP ESI ;ripristina ESI ;...........................................; JMP B64_NEXT_3 ;===========================================; END_PADDING: CMP PAD_FLAG,0 JZ FFB64GET_OK MOV AL,"=" DEC EDI MOV [EDI],AL DEC PAD_FLAG JMP END_PADDING ;===========================================; FFB64GET_NOK: MOV EAX,0 ; JMP FFB64GET_00 ; FFB64GET_OK: MOV EAX,B64retBytes; FFB64GET_00: POP EBX ; POP EBP ; POP EDI ; POP ESI ; RET FFBase64Get512Bytes ENDP ;*******************************************; ; Use this function to close the file opened for Base64 coding. ;*******************************************; FFBase64Close PROC ;===========================================; PUSH ESI ; PUSH EDI ; PUSH EBP ; PUSH EBX ; ;===========================================; INVOKE CloseHandle, B64Handle ;===========================================; MOV EAX,0 POP EBX ; POP EBP ; POP EDI ; POP ESI ; RET FFBase64Close ENDP ;*******************************************; ; Use this function to code a string with the Base64 algorhytm. ; Useful to code username and password when authenticating with ; the AUTH=LOGIN method of an ESMPT server. ; Pass the pointer to the string to be coded. The string should ; be max 384 bytes long, but it must have been dimensioned for ; 513 bytes because of the expansion that Base64 encoding apports ; to the original string. ; This function returns the number of coded bytes. ;*******************************************; FFBase64Encode PROC PARM_1:DWORD ;===========================================; PUSH ESI ; PUSH EDI ; PUSH EBP ; PUSH EBX ; ;===========================================;riceve fino a 384 caratteri MOV B64BytesRead,0 ;...........................................; PUSH PARM_1 POP ESI LEA EDI,B64Buffer MOV ECX,385 B64_LOOP2: MOV AL,[ESI] INC ESI CMP AL,0 ;ASCIIZ, fine parametro JZ START_ENCODING INC B64BytesRead MOV [EDI],AL INC EDI LOOP B64_LOOP2 ;===========================================;inizio START_ENCODING: PUSH PARM_1 POP EDI MOV B64retBytes,0 ;===========================================;stringa nulla, esce subito CMP B64BytesRead,0 JZ FFB64ENC_NOK ;dati finiti, restituisce FALSE ;===========================================; MOV PAD_FLAG,0 LEA ESI,B64Buffer ;===========================================; ; i tre bytes sono messi in AH, AL e BH ;===========================================; B64__NEXT_3: CMP B64BytesRead,0 JZ END__PADDING ;...........................................; MOV AH,[ESI] INC ESI DEC B64BytesRead CMP B64BytesRead,0 JNZ B64__CONT1 MOV AL,0 MOV BH,0 MOV PAD_FLAG,2 JMP B64__DIVIDI ;...........................................; B64__CONT1: MOV AL,[ESI] INC ESI DEC B64BytesRead CMP B64BytesRead,0 JNZ B64__CONT2 MOV BH,0 MOV PAD_FLAG,1 JMP B64__DIVIDI ;...........................................; B64__CONT2: MOV BH,[ESI] INC ESI DEC B64BytesRead ; JMP B64__DIVIDI ;===========================================; ; i 4 bytes sono preparati in CH, CL, DH e DL ;...........................................; B64__DIVIDI: MOV CH,0 SHL AH,1 ;AH1 RCL CH,1 SHL AH,1 ;AH2 RCL CH,1 SHL AH,1 ;AH3 RCL CH,1 SHL AH,1 ;AH4 RCL CH,1 SHL AH,1 ;AH5 RCL CH,1 SHL AH,1 ;AH6 RCL CH,1 ;...........................................; MOV CL,0 SHL AH,1 ;AH7 RCL CL,1 SHL AH,1 ;AH8 RCL CL,1 SHL AL,1 ;AL1 RCL CL,1 SHL AL,1 ;AL2 RCL CL,1 SHL AL,1 ;AL3 RCL CL,1 SHL AL,1 ;AL4 RCL CL,1 ;...........................................; MOV DH,0 SHL AL,1 ;AL5 RCL DH,1 SHL AL,1 ;AL6 RCL DH,1 SHL AL,1 ;AL7 RCL DH,1 SHL AL,1 ;AL8 RCL DH,1 SHL BH,1 ;BH1 RCL DH,1 SHL BH,1 ;BH2 RCL DH,1 ;...........................................; MOV DL,0 SHL BH,1 ;BH3 RCL DL,1 SHL BH,1 ;BH4 RCL DL,1 SHL BH,1 ;BH5 RCL DL,1 SHL BH,1 ;BH6 RCL DL,1 SHL BH,1 ;BH7 RCL DL,1 SHL BH,1 ;BH8 RCL DL,1 ;===========================================; ; codifica comunque tutti e 4 ibytes, salvo poi a fare il padding ;...........................................; MOV EAX,0 ;...........................................; PUSH ESI ;salva ESI ;...........................................; MOV AL,CH LEA ESI,B64Table ADD ESI,EAX MOV AL,[ESI] MOV [EDI],AL INC EDI INC B64retBytes ;...........................................; MOV AL,CL LEA ESI,B64Table ADD ESI,EAX MOV AL,[ESI] MOV [EDI],AL INC EDI INC B64retBytes ;...........................................; MOV AL,DH LEA ESI,B64Table ADD ESI,EAX MOV AL,[ESI] MOV [EDI],AL INC EDI INC B64retBytes ;...........................................; MOV AL,DL LEA ESI,B64Table ADD ESI,EAX MOV AL,[ESI] MOV [EDI],AL INC EDI INC B64retBytes ;...........................................; POP ESI ;ripristina ESI ;...........................................; JMP B64__NEXT_3 ;===========================================; END__PADDING: CMP PAD_FLAG,0 JZ FFB64ENC_OK MOV AL,"=" DEC EDI MOV [EDI],AL DEC PAD_FLAG JMP END__PADDING ;===========================================; FFB64ENC_NOK: MOV EAX,0 ; JMP FFB64ENC_00 ; FFB64ENC_OK: MOV EAX,B64retBytes; FFB64ENC_00: POP EBX ; POP EBP ; POP EDI ; POP ESI ; RET FFBase64Encode ENDP ;*******************************************;