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
|
{
"$schema": "http://json-schema.org/schema#",
"definitions": {
"Number": {
"type": "string",
"pattern": "^(0x[0-9a-fA-F]+|[0-9]+)?$"
},
"Polynomial": {
"type": "array",
"items": {
"type": "object",
"properties": {
"power": {"type": "integer"},
"coeff": {"$ref": "#/definitions/Number"}
},
"required": ["power", "coeff"]
}
},
"Element": {
"anyOf": [
{
"type": "object",
"properties": {
"raw": {"$ref": "#/definitions/Number"}
},
"required": ["raw"]
},
{
"type": "object",
"properties": {
"poly": {"$ref": "#/definitions/Polynomial"}
},
"required": ["poly"]
}
]
},
"Weierstrass": {
"type": "object",
"properties": {
"a": {"$ref": "#/definitions/Element"},
"b": {"$ref": "#/definitions/Element"}
},
"required": ["a", "b"]
},
"Edwards": {
"type": "object",
"properties": {
"c": {"$ref": "#/definitions/Element"},
"d": {"$ref": "#/definitions/Element"}
},
"required": ["c", "d"]
},
"TwistedEdwards": {
"type": "object",
"properties": {
"a": {"$ref": "#/definitions/Element"},
"d": {"$ref": "#/definitions/Element"}
},
"required": ["a", "d"]
},
"Montgomery": {
"type": "object",
"properties": {
"a": {"$ref": "#/definitions/Element"},
"b": {"$ref": "#/definitions/Element"}
},
"required": ["a", "b"]
},
"PrimeField": {
"type": "object",
"properties": {
"type": {"const": "Prime"},
"p": {"$ref": "#/definitions/Number"},
"bits": {"type": "integer"}
},
"required": ["p", "bits"]
},
"BinaryField": {
"type": "object",
"properties": {
"type": {"const": "Binary"},
"base": {"const": "0x02"},
"degree": {"type": "integer"},
"poly": {"$ref": "#/definitions/Polynomial"},
"bits": {"type": "integer"},
"basis": {
"anyOf": [
{"const": "poly"},
{"const": "normal"}
]
}
},
"required": ["degree", "poly", "bits", "basis"]
},
"ExtenstionField": {
"type": "object",
"properties": {
"type": {"const": "Extension"},
"base": {"$ref": "#/definitions/Number"},
"degree": {"type": "integer"},
"poly": {"$ref": "#/definitions/Polynomial"},
"bits": {"type": "integer"}
},
"required": ["base", "degree", "poly", "bits"]
},
"Point": {
"type": "object",
"properties": {
"x": {"$ref": "#/definitions/Element"},
"y": {"$ref": "#/definitions/Element"}
},
"required": ["x", "y"]
},
"Curve": {
"type": "object",
"properties": {
"name": {"type": "string"},
"category": {"type": "string"},
"desc": {"type": "string"},
"oid": {"type": "string"},
"field": {
"oneOf": [
{"$ref": "#/definitions/PrimeField"},
{"$ref": "#/definitions/BinaryField"},
{"$ref": "#/definitions/ExtenstionField"}
]
},
"form": {
"type": "string",
"enum": ["Weierstrass", "Edwards", "TwistedEdwards", "Montgomery"]
},
"generator": {"$ref": "#/definitions/Point"},
"order": {"$ref": "#/definitions/Number"},
"cofactor": {"$ref": "#/definitions/Number"},
"aliases": {
"type": "array",
"items": {
"type": "string"
}
}
},
"allOf": [
{
"if": {
"properties": {"form": {"const": "Weierstrass"}}
},
"then": {
"properties": {
"params": {"$ref": "#/definitions/Weierstrass"}
}
}
},
{
"if": {
"properties": {"form": {"const": "Edwards"}}
},
"then": {
"properties": {
"params": {"$ref": "#/definitions/Edwards"}
}
}
},
{
"if": {
"properties": {"form": {"const": "TwistedEdwards"}}
},
"then": {
"properties": {
"params": {"$ref": "#/definitions/TwistedEdwards"}
}
}
},
{
"if": {
"properties": {"form": {"const": "Montgomery"}}
},
"then": {
"properties": {
"params": {"$ref": "#/definitions/Montgomery"}
}
}
}
],
"required": ["name", "category", "desc", "field", "form", "generator", "order", "cofactor"]
},
"Category": {
"type": "object",
"properties": {
"name": {"type": "string"},
"desc": {"type": "string"},
"curves": {"type": "array", "items": {"$ref": "#/definitions/Curve"}}
},
"required": ["name", "desc", "curves"]
}
},
"oneOf": [
{"$ref": "#/definitions/Category"},
{"$ref": "#/definitions/Curve"}
]
}
|