clear

? "生成一个长度"
begin:
dec_indent

total_len       random2 )
total_len       and$total_len01ff )
if $total_len <= 30
    
goto begin
endif

? "生成一个数据"
data            hrandom$total_len )
icv8            hrandom08 )
icv16           hrandom10 )
key8            hrandom08 )
key16           hrandom10 )
key24           hrandom18 )
key32           hrandom20 )

? "计算原始结果"
ori_des_res     des_cmac$icv8$data$key8 )
ori_3des_res    3des_cmac$icv8$data$key16 )
ori_3des24_res  3des24_cmac$icv8$data$key24 )
ori_sm4_res     sm4_cmac$icv16$data$key16 )
ori_aes128_res  aes128_cmac$icv16$data$key16 )
ori_aes192_res  aes192_cmac$icv16$data$key24 )
ori_aes256_res  aes256_cmac$icv16$data$key32 )

? "使用循环,将data分成两段,做接力cmac计算"
off             00
prompt off
while $off < $total_len
    
clear

    
data1   hleft$data$off )
    
data2   hmid$data$off )

    
call des_test

    
call 3des_test

    
call 3des24_test

    
call sm4_test

    
call aes128_test

    
call aes192_test

    
call aes256_test

    
off     add$off01 )
loop
prompt on

end

des_test:
    
? "分两包分别update"
    
x           des_cmac_init$key8$icv8 )
    
x           des_cmac_update$data1 )
    
x           des_cmac_update$data2 )
    
x           des_cmac_final()
    
if $x != $ori_des_res
        
?
        
pause
    
endif

    
? "分两包,最后一包在final中update"
    
x           des_cmac_init$key8$icv8 )
    
x           des_cmac_update$data1 )
    
x           des_cmac_final$data2 )
    
if $x != $ori_des_res
        
?
        
pause
    
endif

    
? "分两包,使用中间值"
    
x           des_cmac_init$key8$icv8 )
    
tmp_icv     des_cmac_update$data1 )
    
整包长度    big_div$off08 )
    
整包长度    big_mul$整包长度08 )
    
缓存长度    big_mod$off08 )
    
if $缓存长度 == 00
        
// 这是因为最后一包只缓存,还没有参与计算
        
缓存长度    08
    
endif
    
缓存数据    hright$data1$缓存长度 )
    
? "重新初始化"
    
x           des_cmac_init$key8$icv8 )
    
x           des_cmac_final$data2$tmp_icv$整包长度$缓存数据 )
    
if $x != $ori_des_res
        
?
        
pause
    
endif
    
? "重新初始化"
    
x           des_cmac_init$key8$icv8 )
    
x           des_cmac_update( , $tmp_icv$整包长度$缓存数据 )
    
x           des_cmac_final$data2 )
    
if $x != $ori_des_res
        
?
        
pause
    
endif
return

3des_test:
    
? "分两包分别update"
    
x           3des_cmac_init$key16$icv8 )
    
x           3des_cmac_update$data1 )
    
x           3des_cmac_update$data2 )
    
x           3des_cmac_final()
    
if $x != $ori_3des_res
        
?
        
pause
    
endif

    
? "分两包,最后一包在final中update"
    
x           3des_cmac_init$key16$icv8 )
    
x           3des_cmac_update$data1 )
    
x           3des_cmac_final$data2 )
    
if $x != $ori_3des_res
        
?
        
pause
    
endif

    
? "分两包,使用中间值"
    
x           3des_cmac_init$key16$icv8 )
    
tmp_icv     3des_cmac_update$data1 )
    
整包长度    big_div$off08 )
    
整包长度    big_mul$整包长度08 )
    
缓存长度    big_mod$off08 )
    
if $缓存长度 == 00
        
// 这是因为最后一包只缓存,还没有参与计算
        
缓存长度    08
    
endif
    
缓存数据    hright$data1$缓存长度 )
    
? "重新初始化"
    
x           3des_cmac_init$key16$icv8 )
    
x           3des_cmac_final$data2$tmp_icv$整包长度$缓存数据 )
    
if $x != $ori_3des_res
        
?
        
pause
    
endif
    
? "重新初始化"
    
x           3des_cmac_init$key16$icv8 )
    
x           3des_cmac_update( , $tmp_icv$整包长度$缓存数据 )
    
x           3des_cmac_final$data2 )
    
if $x != $ori_3des_res
        
?
        
pause
    
endif
return

3des24_test:
    
? "分两包分别update"
    
x           3des24_cmac_init$key24$icv8 )
    
x           3des24_cmac_update$data1 )
    
x           3des24_cmac_update$data2 )
    
x           3des24_cmac_final()
    
if $x != $ori_3des24_res
        
?
        
pause
    
endif

    
? "分两包,最后一包在final中update"
    
x           3des24_cmac_init$key24$icv8 )
    
x           3des24_cmac_update$data1 )
    
x           3des24_cmac_final$data2 )
    
if $x != $ori_3des24_res
        
?
        
pause
    
endif

    
? "分两包,使用中间值"
    
x           3des24_cmac_init$key24$icv8 )
    
tmp_icv     3des24_cmac_update$data1 )
    
整包长度    big_div$off08 )
    
整包长度    big_mul$整包长度08 )
    
缓存长度    big_mod$off08 )
    
if $缓存长度 == 00
        
// 这是因为最后一包只缓存,还没有参与计算
        
缓存长度    08
    
endif
    
缓存数据    hright$data1$缓存长度 )
    
? "重新初始化"
    
x           3des24_cmac_init$key24$icv8 )
    
x           3des24_cmac_final$data2$tmp_icv$整包长度$缓存数据 )
    
if $x != $ori_3des24_res
        
?
        
pause
    
endif
    
? "重新初始化"
    
x           3des24_cmac_init$key24$icv8 )
    
x           3des24_cmac_update( , $tmp_icv$整包长度$缓存数据 )
    
x           3des24_cmac_final$data2 )
    
if $x != $ori_3des24_res
        
?
        
pause
    
endif
return

aes128_test:
    
? "分两包分别update"
    
x           aes128_cmac_init$key16$icv16 )
    
x           aes128_cmac_update$data1 )
    
x           aes128_cmac_update$data2 )
    
x           aes128_cmac_final()
    
if $x != $ori_aes128_res
        
?
        
pause
    
endif

    
? "分两包,最后一包在final中update"
    
x           aes128_cmac_init$key16$icv16 )
    
x           aes128_cmac_update$data1 )
    
x           aes128_cmac_final$data2 )
    
if $x != $ori_aes128_res
        
?
        
pause
    
endif

    
? "分两包,使用中间值"
    
x           aes128_cmac_init$key16$icv16 )
    
tmp_icv     aes128_cmac_update$data1 )
    
整包长度    big_div$off10 )
    
整包长度    big_mul$整包长度10 )
    
缓存长度    big_mod$off10 )
    
if $缓存长度 == 00
        
// 这是因为最后一包只缓存,还没有参与计算
        
缓存长度    10
    
endif
    
缓存数据    hright$data1$缓存长度 )
    
? "重新初始化"
    
x           aes128_cmac_init$key16$icv16 )
    
x           aes128_cmac_final$data2$tmp_icv$整包长度$缓存数据 )
    
if $x != $ori_aes128_res
        
?
        
pause
    
endif
    
? "重新初始化"
    
x           aes128_cmac_init$key16$icv16 )
    
x           aes128_cmac_update( , $tmp_icv$整包长度$缓存数据 )
    
x           aes128_cmac_final$data2 )
    
if $x != $ori_aes128_res
        
?
        
pause
    
endif
return

aes192_test:
    
? "分两包分别update"
    
x           aes192_cmac_init$key24$icv16 )
    
x           aes192_cmac_update$data1 )
    
x           aes192_cmac_update$data2 )
    
x           aes192_cmac_final()
    
if $x != $ori_aes192_res
        
?
        
pause
    
endif

    
? "分两包,最后一包在final中update"
    
x           aes192_cmac_init$key24$icv16 )
    
x           aes192_cmac_update$data1 )
    
x           aes192_cmac_final$data2 )
    
if $x != $ori_aes192_res
        
?
        
pause
    
endif

    
? "分两包,使用中间值"
    
x           aes192_cmac_init$key24$icv16 )
    
tmp_icv     aes192_cmac_update$data1 )
    
整包长度    big_div$off10 )
    
整包长度    big_mul$整包长度10 )
    
缓存长度    big_mod$off10 )
    
if $缓存长度 == 00
        
// 这是因为最后一包只缓存,还没有参与计算
        
缓存长度    10
    
endif
    
缓存数据    hright$data1$缓存长度 )
    
? "重新初始化"
    
x           aes192_cmac_init$key24$icv16 )
    
x           aes192_cmac_final$data2$tmp_icv$整包长度$缓存数据 )
    
if $x != $ori_aes192_res
        
?
        
pause
    
endif
    
? "重新初始化"
    
x           aes192_cmac_init$key24$icv16 )
    
x           aes192_cmac_update( , $tmp_icv$整包长度$缓存数据 )
    
x           aes192_cmac_final$data2 )
    
if $x != $ori_aes192_res
        
?
        
pause
    
endif
return

aes256_test:
    
? "分两包分别update"
    
x           aes256_cmac_init$key32$icv16 )
    
x           aes256_cmac_update$data1 )
    
x           aes256_cmac_update$data2 )
    
x           aes256_cmac_final()
    
if $x != $ori_aes256_res
        
?
        
pause
    
endif

    
? "分两包,最后一包在final中update"
    
x           aes256_cmac_init$key32$icv16 )
    
x           aes256_cmac_update$data1 )
    
x           aes256_cmac_final$data2 )
    
if $x != $ori_aes256_res
        
?
        
pause
    
endif

    
? "分两包,使用中间值"
    
x           aes256_cmac_init$key32$icv16 )
    
tmp_icv     aes256_cmac_update$data1 )
    
整包长度    big_div$off10 )
    
整包长度    big_mul$整包长度10 )
    
缓存长度    big_mod$off10 )
    
if $缓存长度 == 00
        
// 这是因为最后一包只缓存,还没有参与计算
        
缓存长度    10
    
endif
    
缓存数据    hright$data1$缓存长度 )
    
? "重新初始化"
    
x           aes256_cmac_init$key32$icv16 )
    
x           aes256_cmac_final$data2$tmp_icv$整包长度$缓存数据 )
    
if $x != $ori_aes256_res
        
?
        
pause
    
endif
    
? "重新初始化"
    
x           aes256_cmac_init$key32$icv16 )
    
x           aes256_cmac_update( , $tmp_icv$整包长度$缓存数据 )
    
x           aes256_cmac_final$data2 )
    
if $x != $ori_aes256_res
        
?
        
pause
    
endif
return

sm4_test:
    
? "分两包分别update"
    
x           sm4_cmac_init$key16$icv16 )
    
x           sm4_cmac_update$data1 )
    
x           sm4_cmac_update$data2 )
    
x           sm4_cmac_final()
    
if $x != $ori_sm4_res
        
?
        
pause
    
endif

    
? "分两包,最后一包在final中update"
    
x           sm4_cmac_init$key16$icv16 )
    
x           sm4_cmac_update$data1 )
    
x           sm4_cmac_final$data2 )
    
if $x != $ori_sm4_res
        
?
        
pause
    
endif

    
? "分两包,使用中间值"
    
x           sm4_cmac_init$key16$icv16 )
    
tmp_icv     sm4_cmac_update$data1 )
    
整包长度    big_div$off10 )
    
整包长度    big_mul$整包长度10 )
    
缓存长度    big_mod$off10 )
    
if $缓存长度 == 00
        
// 这是因为最后一包只缓存,还没有参与计算
        
缓存长度    10
    
endif
    
缓存数据    hright$data1$缓存长度 )
    
? "重新初始化"
    
x           sm4_cmac_init$key16$icv16 )
    
x           sm4_cmac_final$data2$tmp_icv$整包长度$缓存数据 )
    
if $x != $ori_sm4_res
        
?
        
pause
    
endif
    
? "重新初始化"
    
x           sm4_cmac_init$key16$icv16 )
    
x           sm4_cmac_update( , $tmp_icv$整包长度$缓存数据 )
    
x           sm4_cmac_final$data2 )
    
if $x != $ori_sm4_res
        
?
        
pause
    
endif
return