408 lines
12 KiB
Plaintext
408 lines
12 KiB
Plaintext
note
|
|
description : "Tests basic Elliptical Curve library functionality"
|
|
author : "Colin LeMahieu"
|
|
date: "$Date$"
|
|
revision: "$Revision$"
|
|
quote: "Giving money and power to government is like giving whiskey and car keys to teenage boys. - P.J. O'Rourke"
|
|
|
|
class
|
|
EC_TEST
|
|
|
|
inherit
|
|
EQA_TEST_SET
|
|
|
|
feature -- Polynomial math
|
|
test_sec_multiply
|
|
local
|
|
curve: EC_CURVE_FP
|
|
g: EC_POINT_FP
|
|
d: INTEGER_X
|
|
q: EC_POINT_FP
|
|
q_x_solution: INTEGER_X
|
|
q_y_solution: INTEGER_X
|
|
q_solution: EC_POINT_FP
|
|
correct: BOOLEAN
|
|
do
|
|
create curve.make_sec_p160r1
|
|
create g.make_sec_p160r1
|
|
create d.make_from_hex_string ("AA374FFC 3CE144E6 B0733079 72CB6D57 B2A4E982")
|
|
q := g.product_value (d, curve)
|
|
create q_x_solution.make_from_string ("466448783855397898016055842232266600516272889280")
|
|
create q_y_solution.make_from_string ("1110706324081757720403272427311003102474457754220")
|
|
create q_solution.make_curve_x_y (create {EC_FIELD_ELEMENT_FP}.make_p_x (q_x_solution), create {EC_FIELD_ELEMENT_FP}.make_p_x (q_y_solution))
|
|
correct := q ~ q_solution
|
|
assert ("test sec multiply", correct)
|
|
end
|
|
|
|
test_sec_sign
|
|
local
|
|
h: INTEGER_X
|
|
e: INTEGER_X
|
|
k: INTEGER_X
|
|
g: EC_POINT_FP
|
|
r: EC_POINT_FP
|
|
r_x_solution: INTEGER_X
|
|
r_y_solution: INTEGER_X
|
|
r_solution: EC_POINT_FP
|
|
curve: EC_CURVE_FP
|
|
correct: BOOLEAN
|
|
s: INTEGER_X
|
|
d: INTEGER_X
|
|
s_solution: INTEGER_X
|
|
n: INTEGER_X
|
|
do
|
|
create n.make_from_hex_string ("01 00000000 00000000 0001F4C8 F927AED3 CA752257")
|
|
create d.make_from_hex_string ("AA374FFC 3CE144E6 B0733079 72CB6D57 B2A4E982")
|
|
create h.make_from_hex_string ("A9993E36 4706816A BA3E2571 7850C26C 9CD0D89D")
|
|
create curve.make_sec_p160r1
|
|
create g.make_sec_p160r1
|
|
create k.make_from_string ("702232148019446860144825009548118511996283736794")
|
|
r := g.product_value (k, curve)
|
|
create r_x_solution.make_from_string ("1176954224688105769566774212902092897866168635793")
|
|
create r_y_solution.make_from_string ("1130322298812061698910820170565981471918861336822")
|
|
create r_solution.make_curve_x_y (create {EC_FIELD_ELEMENT_FP}.make_p_x (r_x_solution), create {EC_FIELD_ELEMENT_FP}.make_p_x (r_y_solution))
|
|
correct := r_solution ~ r
|
|
assert ("test sec sign 1", correct)
|
|
e := h
|
|
s := (k.inverse_value (n) * (e + d * r.x.x)) \\ n
|
|
create s_solution.make_from_string ("299742580584132926933316745664091704165278518100")
|
|
correct := s ~ s_solution
|
|
assert ("test sec sign 2", correct)
|
|
end
|
|
|
|
test_set_verify
|
|
local
|
|
h: INTEGER_X
|
|
e: INTEGER_X
|
|
s: INTEGER_X
|
|
r: INTEGER_X
|
|
n: INTEGER_X
|
|
u1: INTEGER_X
|
|
u2: INTEGER_X
|
|
g: EC_POINT_FP
|
|
q: EC_POINT_FP
|
|
q_x: INTEGER_X
|
|
q_y: INTEGER_X
|
|
curve: EC_CURVE_FP
|
|
r_point: EC_POINT_FP
|
|
r_x_solution: INTEGER_X
|
|
r_y_solution: INTEGER_X
|
|
gu: EC_POINT_FP
|
|
gu_x_solution: INTEGER_X
|
|
gu_y_solution: INTEGER_X
|
|
qu: EC_POINT_FP
|
|
qu_x_solution: INTEGER_X
|
|
qu_y_solution: INTEGER_X
|
|
correct: BOOLEAN
|
|
v: INTEGER_X
|
|
u1_solution: INTEGER_X
|
|
u2_solution: INTEGER_X
|
|
do
|
|
create h.make_from_hex_string ("A9993E36 4706816A BA3E2571 7850C26C 9CD0D89D")
|
|
create n.make_from_hex_string ("01 00000000 00000000 0001F4C8 F927AED3 CA752257")
|
|
create g.make_sec_p160r1
|
|
create r.make_from_string ("1176954224688105769566774212902092897866168635793")
|
|
create s.make_from_string ("299742580584132926933316745664091704165278518100")
|
|
create curve.make_sec_p160r1
|
|
create q_x.make_from_string ("466448783855397898016055842232266600516272889280")
|
|
create q_y.make_from_string ("1110706324081757720403272427311003102474457754220")
|
|
create q.make_curve_x_y (create {EC_FIELD_ELEMENT_FP}.make_p_x (q_x), create {EC_FIELD_ELEMENT_FP}.make_p_x (q_y))
|
|
create gu_x_solution.make_from_string ("559637225459801172484164154368876326912482639549")
|
|
create gu_y_solution.make_from_string ("1427364757892877133166464896740210315153233662312")
|
|
create qu_x_solution.make_from_string ("1096326382299378890940501642113021093797486469420")
|
|
create qu_y_solution.make_from_string ("1361206527591198621565826173236094337930170472426")
|
|
create r_x_solution.make_from_string ("1176954224688105769566774212902092897866168635793")
|
|
create r_y_solution.make_from_string ("1130322298812061698910820170565981471918861336822")
|
|
create u1_solution.make_from_string ("126492345237556041805390442445971246551226394866")
|
|
create u2_solution.make_from_string ("642136937233451268764953375477669732399252982122")
|
|
e := h
|
|
u1 := e * s.inverse_value (n) \\ n
|
|
correct := u1 ~ u1_solution
|
|
assert ("test set verify 1", correct)
|
|
u2 := r * s.inverse_value (n) \\ n
|
|
correct := u2 ~ u2_solution
|
|
assert ("test set verify 2", correct)
|
|
gu := g.product_value (u1, curve)
|
|
correct := gu.x.x ~ gu_x_solution
|
|
assert ("test set verify 3", correct)
|
|
correct := gu.y.x ~ gu_y_solution
|
|
assert ("test set verify 4", correct)
|
|
qu := q.product_value (u2, curve)
|
|
correct := qu.x.x ~ qu_x_solution
|
|
assert ("test set verify 5", correct)
|
|
correct := qu.y.x ~ qu_y_solution
|
|
assert ("test set verify 6", correct)
|
|
r_point := gu.plus_value (qu, curve)
|
|
correct := r_x_solution ~ r_point.x.x
|
|
assert ("test set verify 7", correct)
|
|
correct := r_y_solution ~ r_point.y.x
|
|
assert ("test set verify 8", correct)
|
|
v := r_point.x.x \\ n
|
|
correct := v ~ r
|
|
assert ("test set verify 9", correct)
|
|
end
|
|
|
|
feature -- Prime reflexive tests
|
|
test_reflexive_2
|
|
local
|
|
key: EC_KEY_PAIR
|
|
message: INTEGER_X
|
|
signature: TUPLE [r: INTEGER_X s: INTEGER_X]
|
|
correct: BOOLEAN
|
|
i: INTEGER
|
|
do
|
|
from
|
|
i := 0
|
|
until
|
|
i > 10
|
|
loop
|
|
create key.make_sec_p112r1
|
|
create message.make_random_max (key.private.params.n)
|
|
signature := key.private.sign (message)
|
|
correct := key.public.verify (message, signature)
|
|
assert ("test reflexive 2 iteration: " + i.out, correct)
|
|
i := i + 1
|
|
end
|
|
end
|
|
|
|
test_reflexive
|
|
local
|
|
key1: EC_KEY_PAIR
|
|
message: INTEGER_X
|
|
signature: TUPLE [r: INTEGER_X s: INTEGER_X]
|
|
correct: BOOLEAN
|
|
do
|
|
create message.make_from_string ("968236873715988614170569073515315707566766479517")
|
|
create key1.make_p521
|
|
signature := key1.private.sign (message)
|
|
correct := key1.public.verify (message, signature)
|
|
assert ("test reflexive", correct)
|
|
end
|
|
|
|
test_sec_p112r1_reflexive
|
|
local
|
|
key: EC_KEY_PAIR
|
|
message: INTEGER_X
|
|
signature: TUPLE [r: INTEGER_X s: INTEGER_X]
|
|
correct: BOOLEAN
|
|
do
|
|
create key.make_sec_p112r1
|
|
create message.make_random_max (key.private.params.n)
|
|
signature := key.private.sign (message)
|
|
correct := key.public.verify (message, signature)
|
|
assert ("test sec p112r1 reflexive", correct)
|
|
end
|
|
|
|
test_sec_p112r2_reflexive
|
|
local
|
|
key: EC_KEY_PAIR
|
|
message: INTEGER_X
|
|
signature: TUPLE [r: INTEGER_X s: INTEGER_X]
|
|
correct: BOOLEAN
|
|
do
|
|
create key.make_sec_p112r2
|
|
create message.make_random_max (key.private.params.n)
|
|
signature := key.private.sign (message)
|
|
correct := key.public.verify (message, signature)
|
|
assert ("test sec p112r2 reflexive", correct)
|
|
end
|
|
|
|
test_sec_p128r1_reflexive
|
|
local
|
|
key: EC_KEY_PAIR
|
|
message: INTEGER_X
|
|
signature: TUPLE [r: INTEGER_X s: INTEGER_X]
|
|
correct: BOOLEAN
|
|
do
|
|
create key.make_sec_p128r1
|
|
create message.make_random_max (key.private.params.n)
|
|
signature := key.private.sign (message)
|
|
correct := key.public.verify (message, signature)
|
|
assert ("test sec p128r1 reflexive", correct)
|
|
end
|
|
|
|
test_sec_p128r2_reflexive
|
|
local
|
|
key: EC_KEY_PAIR
|
|
message: INTEGER_X
|
|
signature: TUPLE [r: INTEGER_X s: INTEGER_X]
|
|
correct: BOOLEAN
|
|
do
|
|
create key.make_sec_p128r2
|
|
create message.make_random_max (key.private.params.n)
|
|
signature := key.private.sign (message)
|
|
correct := key.public.verify (message, signature)
|
|
assert ("test sec p128r2 reflexive", correct)
|
|
end
|
|
|
|
test_sec_p160k1_reflexive
|
|
local
|
|
key: EC_KEY_PAIR
|
|
message: INTEGER_X
|
|
signature: TUPLE [r: INTEGER_X s: INTEGER_X]
|
|
correct: BOOLEAN
|
|
do
|
|
create key.make_sec_p160k1
|
|
create message.make_random_max (key.private.params.n)
|
|
signature := key.private.sign (message)
|
|
correct := key.public.verify (message, signature)
|
|
assert ("test sec p160k1 reflexive", correct)
|
|
end
|
|
|
|
test_sec_p160r1_reflexive
|
|
local
|
|
key: EC_KEY_PAIR
|
|
message: INTEGER_X
|
|
signature: TUPLE [r: INTEGER_X s: INTEGER_X]
|
|
correct: BOOLEAN
|
|
do
|
|
create key.make_sec_p160r1
|
|
create message.make_random_max (key.private.params.n)
|
|
signature := key.private.sign (message)
|
|
correct := key.public.verify (message, signature)
|
|
assert ("test sec p160r1 reflexive", correct)
|
|
end
|
|
|
|
test_sec_p160r2_reflexive
|
|
local
|
|
key: EC_KEY_PAIR
|
|
message: INTEGER_X
|
|
signature: TUPLE [r: INTEGER_X s: INTEGER_X]
|
|
correct: BOOLEAN
|
|
do
|
|
create key.make_sec_p160r2
|
|
create message.make_random_max (key.private.params.n)
|
|
signature := key.private.sign (message)
|
|
correct := key.public.verify (message, signature)
|
|
assert ("test sec p160r2 reflexive", correct)
|
|
end
|
|
|
|
test_sec_p192k1_reflexive
|
|
local
|
|
key: EC_KEY_PAIR
|
|
message: INTEGER_X
|
|
signature: TUPLE [r: INTEGER_X s: INTEGER_X]
|
|
correct: BOOLEAN
|
|
do
|
|
create key.make_sec_p192k1
|
|
create message.make_random_max (key.private.params.n)
|
|
signature := key.private.sign (message)
|
|
correct := key.public.verify (message, signature)
|
|
assert ("test sec p192k1 reflexive", correct)
|
|
end
|
|
|
|
test_sec_p192r1_reflexive
|
|
local
|
|
key: EC_KEY_PAIR
|
|
message: INTEGER_X
|
|
signature: TUPLE [r: INTEGER_X s: INTEGER_X]
|
|
correct: BOOLEAN
|
|
do
|
|
create key.make_sec_p192r1
|
|
create message.make_random_max (key.private.params.n)
|
|
signature := key.private.sign (message)
|
|
correct := key.public.verify (message, signature)
|
|
assert ("test sec p192r1 reflexive", correct)
|
|
end
|
|
|
|
test_sec_p224k1_reflexive
|
|
local
|
|
key: EC_KEY_PAIR
|
|
message: INTEGER_X
|
|
signature: TUPLE [r: INTEGER_X s: INTEGER_X]
|
|
correct: BOOLEAN
|
|
do
|
|
create key.make_sec_p224k1
|
|
create message.make_random_max (key.private.params.n)
|
|
signature := key.private.sign (message)
|
|
correct := key.public.verify (message, signature)
|
|
assert ("test sec p224k1 reflexive", correct)
|
|
end
|
|
|
|
test_sec_p224r1_reflexive
|
|
local
|
|
key: EC_KEY_PAIR
|
|
message: INTEGER_X
|
|
signature: TUPLE [r: INTEGER_X s: INTEGER_X]
|
|
correct: BOOLEAN
|
|
do
|
|
create key.make_sec_p224r1
|
|
create message.make_random_max (key.private.params.n)
|
|
signature := key.private.sign (message)
|
|
correct := key.public.verify (message, signature)
|
|
assert ("test sec p224r1 reflexive", correct)
|
|
end
|
|
|
|
test_sec_p256k1_reflexive
|
|
local
|
|
key: EC_KEY_PAIR
|
|
message: INTEGER_X
|
|
signature: TUPLE [r: INTEGER_X s: INTEGER_X]
|
|
correct: BOOLEAN
|
|
do
|
|
create key.make_sec_p256k1
|
|
create message.make_random_max (key.private.params.n)
|
|
signature := key.private.sign (message)
|
|
correct := key.public.verify (message, signature)
|
|
assert ("test sec p256k1 reflexive", correct)
|
|
end
|
|
|
|
test_sec_p256r1_reflexive
|
|
local
|
|
key: EC_KEY_PAIR
|
|
message: INTEGER_X
|
|
signature: TUPLE [r: INTEGER_X s: INTEGER_X]
|
|
correct: BOOLEAN
|
|
do
|
|
create key.make_sec_p256r1
|
|
create message.make_random_max (key.private.params.n)
|
|
signature := key.private.sign (message)
|
|
correct := key.public.verify (message, signature)
|
|
assert ("test sec p256r1 reflexive", correct)
|
|
end
|
|
|
|
test_sec_p384r1_reflexive
|
|
local
|
|
key: EC_KEY_PAIR
|
|
message: INTEGER_X
|
|
signature: TUPLE [r: INTEGER_X s: INTEGER_X]
|
|
correct: BOOLEAN
|
|
do
|
|
create key.make_sec_p384r1
|
|
create message.make_random_max (key.private.params.n)
|
|
signature := key.private.sign (message)
|
|
correct := key.public.verify (message, signature)
|
|
assert ("test sec p384r1 reflexive", correct)
|
|
end
|
|
|
|
test_sec_p521r1_reflexive
|
|
local
|
|
key: EC_KEY_PAIR
|
|
message: INTEGER_X
|
|
signature: TUPLE [r: INTEGER_X s: INTEGER_X]
|
|
correct: BOOLEAN
|
|
do
|
|
create key.make_sec_p521r1
|
|
create message.make_random_max (key.private.params.n)
|
|
signature := key.private.sign (message)
|
|
correct := key.public.verify (message, signature)
|
|
assert ("test sec p521r1 relfexive", correct)
|
|
end
|
|
|
|
test_agreement
|
|
local
|
|
key1: EC_KEY_PAIR
|
|
key2: EC_KEY_PAIR
|
|
e1_agreement: INTEGER_X
|
|
e2_agreement: INTEGER_X
|
|
correct: BOOLEAN
|
|
do
|
|
create key1.make_p521
|
|
create key2.make_p521
|
|
e1_agreement := key1.private.agreement (key2.public)
|
|
e2_agreement := key2.private.agreement (key1.public)
|
|
correct := e1_agreement ~ e2_agreement
|
|
assert ("test agreement", correct)
|
|
end
|
|
end
|