@Joseg, para no reinventar la rueda, vamos a optar por soluciones estándar, como es el caso de OpenSSL:
https://es.dll-files.com/libcrypto.dll.html
Con esta solución generamos un HASH, en el caso concreto, el
SHA256:
Código COBOL:
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 strInput PIC X(3000).
01 LK-HASH-RAW PIC X(32).
01 hLib PIC S9(9) COMP-5.
01 ptrSHA256 PROCEDURE-POINTER.
01 ptrINPUT POINTER.
01 nPtrINPUT REDEFINES ptrINPUT PIC S9(9) COMP-5.
01 strLen PIC S9(9) COMP-5.
*-----------------------------------
01 LNK-LEN PIC 9(4) COMP.
01 LNK-INPUT.
05 FILLER PIC X OCCURS 1 TO 1000 DEPENDING ON LNK-LEN.
01 LNK-OUTPUT.
05 LNK-HEX1.
10 LNK-H1 PIC X OCCURS 1 TO 1000 DEPENDING ON LNK-LEN.
05 LNK-HEX2.
10 LNK-H2 PIC X OCCURS 1 TO 1000 DEPENDING ON LNK-LEN.
PROCEDURE DIVISION.
MOVE POW-TEXT OF CmText1 TO strInput
CALL "LoadLibraryA" WITH STDCALL USING BY CONTENT "libcrypto.dll" RETURNING hLib
CALL "GetProcAddress" WITH STDCALL USING BY VALUE hLib, BY CONTENT "SHA256" & X"00" RETURNING ptrSHA256
MOVE FUNCTION ADDR(strInput) TO ptrINPUT
COMPUTE strLen = FUNCTION STORED-CHAR-LENGTH(strInput)
CALL ptrSHA256 WITH STDCALL USING
BY VALUE nPtrINPUT
BY VALUE strLen
BY REFERENCE LK-HASH-RAW
COMPUTE LNK-LEN = FUNCTION STORED-CHAR-LENGTH(LK-HASH-RAW)
MOVE LK-HASH-RAW TO LNK-INPUT
CALL "HEX" USING LNK-LEN, LNK-INPUT, LNK-OUTPUT
MOVE LNK-OUTPUT TO POW-TEXT OF CmText3
Tienes que crear una nueva PROCEDURE y llamarla
HEX, su contenido es el siguiente:
Código COBOL:
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 IDX-1 PIC S9(4) COMP-5.
01 IDX-S PIC S9(4) COMP-5.
01 TBL-HEX PIC X(16) VALUE "0123456789ABCDEF".
01 WS-HEX-1 PIC S9(4) COMP-5.
01 WS-HEX-2 PIC S9(4) COMP-5.
01 WS-BIN PIC X.
01 WS-BIN-2 REDEFINES WS-BIN PIC 9(2) COMP-5.
******************************************************************
* LINKAGE SECTION *
******************************************************************
LINKAGE SECTION.
01 LNK-LEN PIC 9(4) COMP.
01 LNK-INPUT.
05 FILLER PIC X OCCURS 1 TO 1000 DEPENDING ON LNK-LEN.
01 LNK-OUTPUT PIC X(2000).
******************************************************************
* PROCEDURE DIVISION
******************************************************************
PROCEDURE DIVISION USING LNK-LEN, LNK-INPUT, LNK-OUTPUT.
MOVE 1 TO IDX-1, IDX-S
PERFORM UNTIL IDX-1 > LNK-LEN
MOVE LNK-INPUT(IDX-1:1) TO WS-BIN
DIVIDE WS-BIN-2 BY 16
GIVING WS-HEX-1 REMAINDER WS-HEX-2
ADD 1 TO WS-HEX-1, WS-HEX-2
MOVE TBL-HEX(WS-HEX-1:1) TO LNK-OUTPUT(IDX-S:1)
ADD 1 TO IDX-S
MOVE TBL-HEX(WS-HEX-2:1) TO LNK-OUTPUT(IDX-S:1)
ADD 1 TO IDX-1, IDX-S
END-PERFORM
GOBACK
.
No olvides lo de
ALPHAL(WORD) e incluir la
KERNEL32.LIB.
Resultados:
| Valor | sha256
|
| 105.02.11 | 45A5AC763720497A3054E1A5C1C24DB458CE0C30 79F9AD2AB9496EAF9EAC087B
|
| 115.01.11 | 2B83108827E847A74B0886AB2E532E3F79988131 A61546499C3B08F32E4DB9F5
|
| 207.99.99 | 8189CCD84246547FD968902606574828E03D332D 2A9D65D9FCA11868303CA8B9
|
| 247.97.99 | D9DCC2614B2499CCEEF96484C65855258D7CD2AF 8DEA2E5079C7F13860D9C323
|
¡¡¡Esto ya NO PUEDE fallar!!!
