clear

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

//  /* copy out the hash */
//  memcpy(hash, sig + i, shadigestlen);
//  /* x += hLen; */
hash    = mid( $r, int( 256 - 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( $hash, hex( 256 - 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 hex( 0x$len - 1 )
    
x   = hmid( $db, $i, 01 )
    
if $x != 00
        
off = $i
        
exit hfor
    
endif
hnext i

msghash = sha512_hash( 11 )
mask    = 0000000000000000
dbi     = hmid( $db, hex( 0x$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( $counter, 01 )
        
counter = leftpack( $counter, 4 )

        
mask    = $mask $x
    
hnext i

    
mask    = hmid( $mask, 00, $masklen )

return $mask