test_secp_521r1:
    
// secp 521 r1

    
P               = 01 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
    
A               = 01 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FC
    
B               = 00 51 95 3E B9 61 8E 1C 9A 1F 92 9A 21 A0 B6 85 40 EE A2 DA 72 5B 99 B3 15 F3 B8 B4 89 91 8E F1 09 E1 56 19 39 51 EC 7E 93 7B 16 52 C0 BD 3B B1 BF 07 35 73 DF 88 3D 2C 34 F1 EF 45 1F D4 6B 50 3F 00
    
GX              = 00 C6 85 8E 06 B7 04 04 E9 CD 9E 3E CB 66 23 95 B4 42 9C 64 81 39 05 3F B5 21 F8 28 AF 60 6B 4D 3D BA A1 4B 5E 77 EF E7 59 28 FE 1D C1 27 A2 FF A8 DE 33 48 B3 C1 85 6A 42 9B F9 7E 7E 31 C2 E5 BD 66
    
GY              = 01 18 39 29 6A 78 9A 3B C0 04 5C 8A 5F B4 2C 7D 1B D9 98 F5 44 49 57 9B 44 68 17 AF BD 17 27 3E 66 2C 97 EE 72 99 5E F4 26 40 C5 50 B9 01 3F AD 07 61 35 3C 70 86 A2 72 C2 40 88 BE 94 76 9F D1 66 50
    
N               = 01 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FA 51 86 87 83 BF 2F 96 6B 7F CC 01 48 F7 09 A5 D0 3B B5 C9 B8 89 9C 47 AE BB 6F B7 1E 91 38 64 09

    
h               = 01
    
hex_len_in_byte = datalen( $p )

    
r               = new_ecc_initialize( $p, $a, $b, $gx, $gy, $n, $h, $hex_len_in_byte )
    
if $r != 00
        
?
        
pause
    
endif

    
keypair         = new_ecc_generate_keypair()
    
len             = datalen( $keypair )
    
prilen          = big_div( $len, 03 )
    
if $len > 00
        
pri = hmid( $keypair, 00, $prilen )
        
pub = hmid( $keypair, $prilen )
    
else
        
// error
        pause
    
endif

    
r               = new_ecc_check_pubkey( $pub )
    
if $r != 00
        
?
        
pause
    
endif

    
pri             = 00E5039272164B644F6D723911F051E322DE136079C1495C426D0EC92AAF5DF61A9457A810926B1F2EFB0F1A4A80512509AA3BE4739A4613386F736F18185DCD248B
    
pub             = 01C231297EFC65D63D287A101B1B8F8E9A9580DBA30BF7F08FB610CA7BBC89EF601EB226344B51A53ACB400D10D0DAC1FD851A9A582FE145A374B5F742FAD828F49B01423E8B4A22085299AD3605829D0175359CA5F6CE992A75E5C6C1BC888BBF88E15597146DAAC1FE8042F05989A7B966039A08A5DDC51ACDCB6556EEF5751CA7CB05
    
x               = new_ecc_get_pubkey( $pri )
    
if $x != $pub
        
?
        
pause
    
endif

    
r               = new_ecc_check_pubkey( $pub )
    
if $r != 00
        
?
        
pause
    
endif

    
pri1            = hrandom( $prilen )
    
pri2            = hrandom( $prilen )
    
pub1            = new_ecc_get_pubkey( $pri1 )
    
pub2            = new_ecc_get_pubkey( $pri2 )

    
x               = new_ecc_ecdh_agreement( $pri1, $pub2 )
    
y               = new_ecc_ecdh_agreement( $pri2, $pub1 )
    
if $x != $y
        
?
        
pause
    
endif

    
pri1            = E4C14B390163BE1AED31E14EBDBA967B90750C681F02ED6296B4D9DEA34D145FCC087B9A05DDBDD88200C79DCAAB80870D1DB778B7E359F84556E8D45765280B0794
    
pri2            = 1CEB7A453078B436B80DB14C9946B18F461CD375EF52E563F5117B71A0CF3E6E1475872481C02DDC9BE79B254A7F25D2A29C9C42153A1FE4E7DB35F9E371199C4D7D
    
pub1            = 00F2DE1DAD55C80E364DD9ED91B5D38CB4DBCB43BD939452305E947A99DB20F2134B3F98C078734DDDBA2E284A5C61BF96BE8E2A754EB556C8D924C670602DBAEB9F014D16C8D0608E2C7E395778B1C3E1BB9D1BEDD5EA10704839DA6D7DB472CF36CBC47547C33EB4A98EB9A4930ACD69595A00358CFF51D4ADF087CBFE06DF5D92C22A
    
pub2            = 0075A95D42D899B93F50AF9C8172726ED2A295A8E84DFDFA6056A6AB6D82082C564BCB11E795BA2DE23385D1F42DEFBA1ABCC50B0A466388387E4DF2400BADC9FB61014B20988CF1363B7C04BDFC2654B8BAB547EC2F5093440A0B79F9377FA2971BD5348FCFC9D9DA0029631989EF542F20816ACC07AB226B7388CDEA399A39AF999027
    
stx             = 0024679764CD489EA8B163B2E7639A65E2B614DECF7139F49772E866A46B2FA42501371B73A5C25FA6B35DE123613855CA30ED3311DD9CD7091D0BF2A209CA5104A900DDDD9300716165861C07052B40848FDAEBB937B2074F73C60AC40F63A4A79651443A132A90CA68836BCAAC42CED3E0F4AEE75076BD49791C5755453C9C5E8053FD
    
x               = new_ecc_ecdh_agreement( $pri1, $pub2 )
    
y               = new_ecc_ecdh_agreement( $pri2, $pub1 )
    
if $x != $stx
        
?
        
pause
    
endif
    
if $y != $stx
        
?
        
pause
    
endif

    
hash            = hrandom( $prilen )
    
r_s             = new_ecc_sign( $pri1, $hash )

    
kk              = new_ecc_verify( $pub1, $hash, $r_s )
    
if $kk != 00
        
?
        
pause
    
endif

    
pub1            = 00F2DE1DAD55C80E364DD9ED91B5D38CB4DBCB43BD939452305E947A99DB20F2134B3F98C078734DDDBA2E284A5C61BF96BE8E2A754EB556C8D924C670602DBAEB9F014D16C8D0608E2C7E395778B1C3E1BB9D1BEDD5EA10704839DA6D7DB472CF36CBC47547C33EB4A98EB9A4930ACD69595A00358CFF51D4ADF087CBFE06DF5D92C22A
    
hash            = 730B9C90ACA34F44643797A1F4D41D37FAAB1FDC436474A1EFB4CA05CF3233681266E0C221232B94C717DB1F95A1A4D585E2EE0DDD17D8FA56267BDE7E76737B5B04
    
r_s             = 004024AE0A69CFCFF2F1B0D3D6C2EC16C7E0F96B4A11AB8C1C57AD876D45306E93B677CFB31046F2DA879B331D5C7F4DBD087D983C00D26463FAD64DCAFF30B08F320178D9909EF925E767FD23AC6E890C069740F18BF8A4E5222976892136ABEBBE5DA2AA972252D706F303D60715F4038D62E4A7D9753FA24889D493C747790EC7F659

    
kk              = new_ecc_verify( $pub1, $hash, $r_s )
    
if $kk != 00
        
?
        
pause
    
endif

    
// 计算y值功能
    keypair         = new_ecc_generate_keypair()
    
len             = datalen( $keypair )
    
prilen          = big_div( $len, 03 )
    
if $len > 00
        
pri = hmid( $keypair, 00, $prilen )
        
pub = hmid( $keypair, $prilen )
    
else
        
// error
        pause
    
endif
    
yflag           = new_ecc_get_yflag( $pub )

    
pointy          = new_ecc_computer_y( $yflag, $pub )
    
pub_y           = hmid( $pub, $prilen )
    
if $pub_y != $pointy
        
?
        
pause
    
endif

    
pri             = 006C74E62E9464CD6F30661A333A0D802A10380F6DF801B7643473DF38AC195D4D8E59375A811BF910355F7F34710B7F2000254722FA7B58656419F3311F5FAE7F91
    
pub             = 01CD63D72C8C380E61C32CCF0CC7147A8DE44F0B945E0CECD85006D6274E69425E62754A10C989FB9FB594BD9A70A6D3845A0FB96CE02B3556872CAC125DC5BF0F2001DD778F8C1F0CD2F12320A4B320196698CC27D960E20A50F4FD759DAF180EE994D1609609D0C2CB9EC4F7A48F4BC37F91A12FD2326F9E1DAD7752A3DCA8F25F3E72
    
yflag           = 02

    
pointy          = new_ecc_computer_y( $yflag, $pub )
    
pub_y           = hmid( $pub, $prilen )
    
if $pub_y != $pointy
        
?
        
pause
    
endif

    
yflag           = new_ecc_get_yflag( $pub )

    
pointy          = new_ecc_computer_y( $yflag, $pub )
    
pub_y           = hmid( $pub, $prilen )
    
if $pub_y != $pointy
        
?
        
pause
    
endif

    
ecc_P1          = 01929B9AA9EDAB63359EE3D773E5679D2462C16A453E9D4A1BE66D18616D6043BADA278CB1221A7AE45EFAA04A08CE7D28DBA0711AD9AF947EAA157774D3DC6EAA2B00883F23885AD9468A27A75FD433D2FB15078870EA0235E82FACC71558C68F1A8A6FFF58C4750F96ED2746585F3E2E9B3A89BD1B48565D716CEFE1125F589A58CDB7
    
r               = new_ecc_check_point( $ecc_p1 )
    
if $r != 00
        
?
        
pause
    
endif

    
ecc_P2          = 01808B7904F6C8BF951339285B1B784D652D24F9725C75DD00785150F18ECFD13E343E7F49D4733BEA8CF0D7C2959E0A5BD601FF4421BC940086A67142080E64F00B00A1F9C0C2E0B14A3F516D5F5BC6DDF55188222C9AA39E3B7FB7744562C2441DA15B2A12A3A4F9E77E4AC93405E77132561D39E5A01F6BCE0C47EF1B13B5BE1BFA3C
    
r               = new_ecc_check_point( $ecc_p2 )
    
if $r != 00
        
?
        
pause
    
endif


    
ecc_P1_ADD_P2   = 00157A54FFDAC7F7725993A5777A4776793599389EB38BA890119CBCA5C76823AD7F177C309D99F79AA4EBC67F51596EE40D563DA733E1651E6C793F90BD061DA78300300164BAE716086A091685EE952EED37886857417D6CAF0C67EDD1545492DB66A182843C7FEB018C8FB8272F5F34D5432B3D6866FCE322EE5E3C00C72F10C7AB9E
    
a               = new_ecc_point_add( $ecc_p1, $ecc_p2 )
    
if $a != $ecc_p1_add_p2
        
?
        
pause
    
endif
    
r               = new_ecc_check_point( $ecc_P1_ADD_P2 )
    
if $r != 00
        
?
        
pause
    
endif


    
ecc_p1_double   = 0008D4CC812DA3E15CFE4AA2F311DA6DCF0EE3FC5DFE8243B4564BEC3DF16D76EBBFCB393E706CFBCEC5F2D571408CD241B31A396A49AAE9FEBDB42A929F4FF2CF20002D2D27CAC065F1B085E0886FCDBD7982B9770526664F6D05D88D54427FC6C98E47DDE9C069F4ACDE15C09E0F27E56CB13287240D7DC94566A2E7D2ED9902E84B04
    
a               = new_ecc_point_double( $ecc_p1 )
    
if $a != $ecc_p1_double
        
?
        
pause
    
endif

    
x               = new_ecc_check_pubkey( $a )
    
if $x != 00
        
?
        
pause
    
endif

    
a               = new_ecc_point_double( $pub1 )
    
if $a != 01168EAE3C6477471C8B2331A5478DA0F7DAF998FE87D7419ACEC9A3E45342E1AB613524CAAF7E95706C871D156CE69FA02DD5E920AA0627E88F404FA4C5E9C56D0B001A96C4D26E74355EC07DFD3D1A5269DC831F0131B3B375F4BAEBDD390E2F96B88656D0E37C2815B1108B267BDE6FB531D391C5C77E5814B7B10AB4BA06E57E0111
        
?
        
pause
    
endif

    
x               = new_ecc_check_pubkey( $a )
    
if $x != 00
        
?
        
pause
    
endif


    
x               = hrandom( $prilen )
    
a               = new_ecc_kp( $x, $pub1 )
    
x               = new_ecc_check_pubkey( $a )
    
if $x != 00
        
?
        
pause
    
endif

    
l               = hrandom( $prilen )
    
k               = hrandom( $prilen )
    
a               = new_ecc_kp_add_lq( $k, $pub1, $l, $pub2 )
    
a1              = new_ecc_kp( $k, $pub1 )
    
a2              = new_ecc_kp( $l, $pub2 )
    
a3              = new_ecc_point_add( $a1, $a2 )
    
if $a3 != $a
        
?
        
pause
    
endif
    
x               = new_ecc_check_point( $a )
    
if $x != 00
        
?
        
pause
    
endif


    
k               = 5B4ECF30963493BCA1450C8DB9988412A4AC115A44A8C6796BE72A2CF1B3E9C00451CA2FC03FE18DFFB906A2738186D9F2E0185910E81271F3FDDC396394A5762139
    
h               = 01E50AEAE7BF7C0FEFDC9B3A25291101C7318EF0B35E66DFE45939EEE919DF24B8C794864FDF262787FEFDEA7BA6107A253D1A761D63B4D8A872B3ACD8C12FB9316F010580D716B45ECFA52A3E2701E79AEBFFA181C33FAF666E62DAE8D3213E1809FFEFE73A528A4BDA6C291C5C42A346248EADFE31DB013994008547470835F609F675
    
z               = 00D214D009D20B1637CB4338F854F2F50672CE82C48705D8F369281E2CCB9B3A02D86C6598D181B0A2EE81AC117ECD4D7D9A130F09538045DFAFF74A558667F244870034A84CD255D52421003125C8967ECA36693C0212ACE4D8B3BEABBECF8F68F29D27C080ADDFAF68ECC6BAFEDA355BF29F7D27407E769DEFBACD041F7065E5C9DD53
    
t               = new_ecc_ecdh_gm_map( $k, $h )
    
if $z != $t
        
?
        
pause
    
endif


    
k               = FFF3A31F73D09FAC889D4DA2EBE9521D15D29F5F15BF50219051D42706964F17
    
h               = 3334C5922D7F14F3C29C52BC0F88014F2E65A52B1BC8C73A38254D99CE1B7B4FE38B126B602E41B11357DC96758C4B465CFF95CA25B2C25BDF26B7300A43AF7A
    
z               = 9F84D746A33BF6ACAEAA9157D95161332AFBD00C5847001A49E00B72534CECF9B0EB79B512474B0B638AFE5C96F54C801679999814DB0071B0AB9DF5FA988E14
    
t               = new_sm2_ecdh_gm_map( $k, $h )
    
if $z != $t
        
?
        
pause
    
endif

return