clear

// 公私钥
pubkey  56BA358422010FFE1A1CAAD441DA153255CBD6655A1B745F5D22657A9C4DD355382C4BCE3E32ED1E94C6DA715F19310CB0B5E3DF627301B56C4EAD123F214B03
prikey  8B3B10A1CEC30677F43C0CC44632F27CE937BE77E3B8BE06C395CC8B51FD4A51

plain   dup25699 )
cipher  call ecies_enc$plain$pubkey )

plain2  call ecies_dec$cipher$prikey )

// test kdf
first   hdup3040 )
second  hdup5080 )

// result 1, counter + first + second
x1      sha1_hash00000001 $first $second )
x2      kdf_sha1( , $first $second14 )
if $x1 != $x2
    
?
    
pause
endif

// result 2, first + counter + second
x1      sha1_hash$first 00000001 $second )
x2      kdf_sha1$first$second14 )
if $x1 != $x2
    
?
    
pause
endif

// result 3, first + second + counter
x1      sha1_hash$first $second 00000001 )
x2      kdf_sha1$first $second, , 14 )
if $x1 != $x2
    
?
    
pause
endif

end

ecies_enc:
    
prompt off

    
local len
    
local p
    
local a
    
local b
    
local gx
    
local gy
    
local n
    
local h
    
local input
    
local k
    
local key
    
local mackey
    
local tmp1
    
local tmp2
    
local tmp
    
local output

    
input   getpara
    
ecc_pub getpara

    
len     02 56
    
P       FF FF FF FF 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF
    
A       FF FF FF FF 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FC
    
B       5A C6 35 D8 AA 3A 93 E7 B3 EB BD 55 76 98 86 BC 65 1D 06 B0 CC 53 B0 F6 3B CE 3C 3E 27 D2 60 4B
    
GX      6B 17 D1 F2 E1 2C 42 47 F8 BC E6 E5 63 A4 40 F2 77 03 7D 81 2D EB 33 A0 F4 A1 39 45 D8 98 C2 96
    
GY      4F E3 42 E2 FE 1A 7F 9B 8E E7 EB 4A 7C 0F 9E 16 2B CE 33 57 6B 31 5E CE CB B6 40 68 37 BF 51 F5
    
N       FF FF FF FF 00 00 00 00 FF FF FF FF FF FF FF FF BC E6 FA AD A7 17 9E 84 F3 B9 CA C2 FC 63 25 51
    
H       01

    
tmp     new_ecc_initialize$p$a$b$gx$gy$n$hhex256 /8 ) )
    
if $tmp != 00
        
?
        
pause
    
endif

    
? "A1:用随机数发生器产生随机数 k = 1 , n-1;"
    
//  k       = 59276E27,D506861A,16680F3A,D9C02DCC,EF3CC1FA,3CDBE4CE,6D54B80D,EAC1BC21
    
k       random32 )

    
? "A2:计算椭圆曲线点 R = k*G;"
    
tmp1    new_ecc_kp$k$gx $gy )

    
? "A3:计算椭圆曲线点 K*Pub"
    
tmp2    new_ecc_kp$k$ecc_pub )

    
? "A4:计算 kdf( tmp2, tmp1 );"
    
tmp     mid$tmp2032 )

    
xx      kdf_sha256$tmp$tmp130 )
    
key     mid$xx016 )
    
mackey  mid$xx1632 )

    
? "A5:计算c = enc(m)且t = mac(c)"

    
output  aes128_encode_cbc00$input$key )

    
tmp     hmac_sha256$output$mackey )

    
prompt on
return $tmp1 $output $tmp

ecies_dec:
    
prompt off

    
local len
    
local p
    
local a
    
local b
    
local gx
    
local gy
    
local n
    
local h
    
local input
    
local k
    
local key
    
local mackey
    
local tmp1
    
local tmp2
    
local tmp
    
local output

    
input   getpara
    
ecc_pri getpara

    
len     02 56
    
P       FF FF FF FF 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FF
    
A       FF FF FF FF 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 FF FF FF FF FF FF FF FF FF FF FF FC
    
B       5A C6 35 D8 AA 3A 93 E7 B3 EB BD 55 76 98 86 BC 65 1D 06 B0 CC 53 B0 F6 3B CE 3C 3E 27 D2 60 4B
    
GX      6B 17 D1 F2 E1 2C 42 47 F8 BC E6 E5 63 A4 40 F2 77 03 7D 81 2D EB 33 A0 F4 A1 39 45 D8 98 C2 96
    
GY      4F E3 42 E2 FE 1A 7F 9B 8E E7 EB 4A 7C 0F 9E 16 2B CE 33 57 6B 31 5E CE CB B6 40 68 37 BF 51 F5
    
N       FF FF FF FF 00 00 00 00 FF FF FF FF FF FF FF FF BC E6 FA AD A7 17 9E 84 F3 B9 CA C2 FC 63 25 51
    
H       01

    
tmp     new_ecc_initialize$p$a$b$gx$gy$n$hhex256 /8 ) )
    
if $tmp != 00
        
?
        
pause
    
endif

    
tmp     mid$input064 )
    
tmp     new_ecc_check_point$tmp )
    
if $tmp != 00
        
?
        
pause
    
endif

    
tmp     mid$input064 )
    
tmp     new_ecc_kp$ecc_pri$tmp )
    
tmp     mid$tmp032 )

    
tmp1    mid$input064 )

    
tmp     kdf_sha256$tmp$tmp130 )
    
key     mid$tmp016 )
    
mackey  mid$tmp1632 )

    
len     datalen$input )
    
len     sub$len40 )
    
len     sub$len20 )
    
len     hex2int$len )
    
tmp     mid$input64$len )
    
tt      hmac_sha256$tmp$mackey )
    
tmp     mid$inputint64 + $len ), 32 )
    
if $tt != $tmp
        
?
        
pause
    
endif

    
tmp     mid$input64$len )
    
tmp     aes128_decode_cbc00$tmp$key )

    
prompt on
return $tmp