clear

r       5B4E6D8A16CA2BC877C6B0CD434866CFDE5C553C759E88B353ABFE8EC2B4A6FC2F7E286B6023DDFB1FB6B6DCFFB6872912160A1514E250BAC22F73A4BD70C1BB080B1BFD9E91FA0BB9F8B2FF5D63E967DEC5462BD9A103365703DCAE6B155A490AE403DC7B1E401D972570AD4CB0FC6FD7CB33F194F5EC9828B5E2F2640429F3B987672F997BC2D870219C011953A93AC3B914B38B2AB7F2296B110532195550A17F78965C01C254C051E323904A83828557B6B2DACE8270D53ED7E66B39A7A6F810D47C526D8B13F95C158483137F0D71B491B5C8FE9A37FE10F7F469CBD7F8E15DDC6DE286D40A13C8BA061352B849B7C7C74936698EBA0F1C5F3BEE4EAEBC
//  /* copy out the DB */
//  i = 0;
//  memcpy(DB, sig + i, modulus_len - shadigestlen - 1);
//  i += modulus_len - shadigestlen - 1;
db      mid$r0int256 - 64 - 1 ) )

//  /* copy out the hash */
//  memcpy(hash, sig + i, shadigestlen);
//  /* x += hLen; */
hash    mid$rint256 - 64 - 1 ), 64 )

//  /* generate mask of length modulus_len - hLen - 1 from hash */
//  pkcs_1_mgf1( digest_algo, hash, shadigestlen, mask, modulus_len - shadigestlen - 1);

mask    call pkcs_1_mgf1$hashhex256 - 64 - 1 ) )

//  /* xor against DB */

db      xor$db$mask )

//  /* now clear the first byte [make sure smaller than modulus] */
//  DB[0] &= 0xFF >> ((modulus_len<<3) - (modulus_bitlen));
// 此处略

len     datalen$db )
hfor i = 00 to hex0x$len - 1 )
    
x   hmid$db$i01 )
    
if $x != 00
        
off $i
        
exit hfor
    
endif
hnext i

msghash sha512_hash11 )
mask    0000000000000000
dbi     hmid$dbhex0x$off + 1 ) )
x       sha512_hash_init()
x       sha512_hash_update$mask )
x       sha512_hash_update$msghash )
x       sha512_hash_update$dbi )
x       sha512_hash_dofinal()

if $x != $hash
    
? "验签失败"
    
?
    
pause
endif

? "验签成功"

end

pkcs_1_mgf1:
    
local seed
    
local masklen
    
local mask
    
local counter
    
local mask
    
local x
    
local times;

    
seed    getpara
    
masklen getpara


    
mask    ""
    
times   hex( ( 0x$masklen + 63 ) / 64 )

    
counter 00000000

    
hfor i = 01 to $times

        
x       sha512_hash_init()
        
x       sha512_hash_update$seed )
        
x       sha512_hash_update$counter )
        
x       sha512_hash_dofinal()
        
counter big_add$counter01 )
        
counter leftpack$counter4 )

        
mask    $mask $x
    
hnext i

    
mask    hmid$mask00$masklen )

return $mask