-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathCorpsModulaire_pointSepc256k1.wdc
203 lines (188 loc) · 7.52 KB
/
CorpsModulaire_pointSepc256k1.wdc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
#To edit and compare internal_properties, use WINDEV integrated tools.
#Internal properties refer to the properties of controls in windows, reports, etc.
info :
name : CorpsModulaire_pointSepc256k1
major_version : 26
minor_version : 0
type : 4
description : ""
subtype : 0
class :
identifier : 0x1e37073f0090859a
internal_properties : BgAAAAYAAAB2/vstTMCJbS/hlxjFxirSqKvCUuv8YxgpWyl7S3iA
code_elements :
internal_properties : BgAAAAYAAAA2Yk9BMaXoR8fdqlmBQ7vBXb2OosP4OvD+fwWradR8HclM6Ux6gPwHj+ac2ZQPokLcTePZlE/Q84t7dz2lefl6
type_code : 10
p_codes :
-
code : |1+
// corps avec comme modulo 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F
// Utilisé pour de calcul de (x,y) addition de 2 points la courbe elliptique sepc256k1
CorpsModulaire_pointSepc256k1 est une Classe
hérite de CorpsModulaire
// constante pour accélérer les calcul
// 2^256 mod P = 2^256-P
//_2P256_MoinsP est Entier256
// (P+1)/4 : pour racine carrée
_Pplus1Sur4 est Entier256 // ="0x3fffffffffffffffffffffffffffffffffffffffffffffffffffffffbfffff0c"
// adresse de procédures en assembleur pour optimisation des calculs :
// opération spécialisées modulo 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F
addrprocMult256x256Modulo est entier système
addrprocSoustractionModulo est entier système
addrprocMult256x64Modulo est entier système // null en 32 bits
addrprocMult256x32Modulo est entier système // null en 64 bits
FIN
type : 131072
procedures :
-
name : Constructeur
procedure_id : 2177216912030795162
type_code : 27
code : |1+
PROCEDURE Constructeur()
Constructeur CorpsModulaire("0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F")
//Constructeur _2P256_MoinsP( "0x1000003d1F")
Constructeur _Pplus1Sur4( "0x3fffffffffffffffffffffffffffffffffffffffffffffffffffffffbfffff0c")
// 256x256 mod P :
:addrprocMult256x256Modulo = pCompileAsm("mult256x256_Modulo_CoordCourbeSepc256k", "multiplication_256x256_512", arithmetique.addrprocMult256x256_512_ASM)
// 256-256 mod P :
:addrprocSoustractionModulo = pCompileAsm("sub256x256_Modulo_CoordCourbeSepc256k")
// 256x32/65 mod P :
si EnMode64bits() alors
:addrprocMult256x64Modulo = pCompileAsm("mult256x64_Modulo_CoordCourbeSepc256k")
sinon
:addrprocMult256x32Modulo = pCompileAsm("mult256x32_Modulo_CoordCourbeSepc256k","multiplication_256x32_512")
fin
type : 589824
-
name : Destructeur
procedure_id : 2177216912030860698
type_code : 28
code : |1+
PROCEDURE Destructeur()
type : 655360
-
name : multiplication_255x255x8_Modulo
procedure_id : 2177216912030926234
type_code : 12
code : |1+
// renvoie A*B*C modulo P
// <nombreC> doit être entre 1 et 8
procédure multiplication_255x255x8_Modulo( nombreA Entier256, nombreB Entier256, nombreC entier sur 8) : Entier256
// résultat R
resultat est Entier256
API(addrprocMult256x256Modulo, &nombreA, &nombreB, &resultat )
API(addrprocMult256x64Modulo, &resultat, nombreC, &resultat )
RENVOYER resultat
type : 458752
-
name : carré_255x255x8_Modulo
procedure_id : 2177216912030991770
type_code : 12
code : |1-
// renvoie A*A*C modulo P
// <nombreC> doit être entre 1 et 8
procédure carré_255x255x8_Modulo( nombreA Entier256, nombreC entier sur 8) : Entier256
resultat est Entier256
API(addrprocMult256x256Modulo, &nombreA, &nombreA, &resultat )
API(addrprocMult256x64Modulo, &resultat, nombreC, &resultat )
RENVOYER resultat
type : 458752
-
name : multiplicationModulo
procedure_id : 2177216912031057306
type_code : 12
code : |1+
// version plus rapide de La multiplication modulaire si le modulo est 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F
PROCÉDURE virtuelle multiplicationModulo( nombreA Entier256, nombreB Entier256) : Entier256
// résultat R = A * B modulo N
resultat est Entier256
// utilise une routine en assembleur optimisée
API(addrprocMult256x256Modulo, &nombreA, &nombreB, &resultat )
RENVOYER resultat
type : 458752
-
name : multiplication_255x8_Modulo
procedure_id : 2186318720826782590
type_code : 12
code : |1+
// petitnombreB doit entre compris entre 1 et 8
// fonction pour les tester que la version ADM utilisée dans les formules est correcte
procédure multiplication_255x8_Modulo( nombreA entier256, petitnombreB entier ) : entier256
resultat est Entier256
si EnMode64bits() ALORS
nombre64 est un entier sur 8 octets = petitnombreB
API( addrprocMult256x64Modulo, &nombreA, nombre64, &resultat )
sinon
nombre32 est un entier sur 4 octets = petitnombreB
API( addrprocMult256x32Modulo, &nombreA, nombre32, &resultat )
fin
renvoyer resultat
type : 458752
-
name : multiplicationPar2Modulo
procedure_id : 2177216912031188378
type_code : 12
code : |1+
PROCÉDURE multiplicationPar2Modulo( nombre Entier256) : Entier256
RENVOYER multiplication_255x8_Modulo( nombre, 2 )
type : 458752
-
name : MultiplicationPar3Modulo
procedure_id : 2177216912031253914
type_code : 12
code : |1-
Procédure MultiplicationPar3Modulo( nombre Entier256 ) : entier256
RENVOYER multiplication_255x8_Modulo( nombre, 3 )
type : 458752
-
name : multiplicationPar4Modulo
procedure_id : 2177216912031319450
type_code : 12
code : |1-
PROCÉDURE multiplicationPar4Modulo( nombre Entier256 ) : entier256
RENVOYER multiplication_255x8_Modulo( nombre, 4 )
type : 458752
-
name : multiplicationPar8Modulo
procedure_id : 2177216912031384986
type_code : 12
code : |1+
PROCÉDURE multiplicationPar8Modulo( nombre Entier256 ) : Entier256
RENVOYER multiplication_255x8_Modulo( nombre, 8 )
type : 458752
-
name : soustractionModulo
procedure_id : 2177216912031450522
type_code : 12
code : |1+
// renvoie A - B ( mod P )
PROCÉDURE soustractionModulo( nombreA Entier256, nombreB Entier256) : Entier256
resultat est entier256
API( addrprocSoustractionModulo, &nombreA, &nombreB, &resultat )
RENVOYER resultat
type : 458752
-
name : racineCarréeModulo
procedure_id : 2177216912031516058
type_code : 12
code : |1+
// renvoie une racine carré modulaire de <nombre>. si <nombre> est bien un carré.
// (il en existe 2, on en renvoie une des 2)
procédure racineCarréeModulo( nombre est Entier256 ) : Entier256
// comme P = 3 (mod 4) :
// racine(x) = x^((P+1)/4)
racineCarrée est un Entier256 = puissanceModulo(nombre, :_Pplus1Sur4)
renvoyer racineCarrée
type : 458752
procedure_templates : []
property_templates : []
code_parameters :
internal_properties : BgAAAAYAAAA6ih3UbgNXHwTtiPSFUEj+2fi/m7v4QV2rqidAupM=
original_name : Classe1
resources :
string_res :
identifier : 0x1bba2a8405baebf4
internal_properties : BgAAAAYAAAAnMYFQ1bL/vz9ehh7L22SNNSlIzGTOI8h5F/WtgDNP
custom_note :
internal_properties : BgAAAAYAAABtB9HWVzrXO2+4NDRVK0vmzaNKrCKqH1DBX30lMmGZ