]> git.saurik.com Git - apple/security.git/blame - libsecurity_cryptkit/lib/CurveParamDocs/FEEDsansY.nb
Security-55471.14.18.tar.gz
[apple/security.git] / libsecurity_cryptkit / lib / CurveParamDocs / FEEDsansY.nb
CommitLineData
b1ab9ed8
A
1(***********************************************************************
2
3 Mathematica-Compatible Notebook
4
5This notebook can be used on any computer system with Mathematica 3.0,
6MathReader 3.0, or any compatible application. The data for the notebook
7starts with the line of stars above.
8
9To get the notebook into a Mathematica-compatible application, do one of
10the following:
11
12* Save the data starting with the line of stars above into a file
13 with a name ending in .nb, then open the file inside the application;
14
15* Copy the data starting with the line of stars above to the
16 clipboard, then use the Paste menu command inside the application.
17
18Data for notebooks contains only printable 7-bit ASCII and can be
19sent directly in email or through ftp in text mode. Newlines can be
20CR, LF or CRLF (Unix, Macintosh or MS-DOS style).
21
22NOTE: If you modify the data for this notebook not in a Mathematica-
23compatible application, you must delete the line below containing the
24word CacheID, otherwise Mathematica-compatible applications may try to
25use invalid cache data.
26
27For more information on notebooks and Mathematica-compatible
28applications, contact Wolfram Research:
29 web: http://www.wolfram.com
30 email: info@wolfram.com
31 phone: +1-217-398-0700 (U.S.)
32
33Notebook reader applications are available free of charge from
34Wolfram Research.
35***********************************************************************)
36
37(*CacheID: 232*)
38
39
40(*NotebookFileLineBreakTest
41NotebookFileLineBreakTest*)
42(*NotebookOptionsPosition[ 12180, 264]*)
43(*NotebookOutlinePosition[ 12859, 289]*)
44(* CellTagsIndexPosition[ 12815, 285]*)
45(*WindowFrame->Normal*)
46
47
48
49Notebook[{
50Cell[BoxData[
51 \(\( (*\n\tNo - Y - coordinate\ version\ of\ Algorithm\ 8.1 .10; \n\t
52 see\ program\ 8.1 .10 . directembed . nb\n\t\t\t\n\n\ Support\ code\
53 for\n\ R . \ Crandall\ and\ C . \ Pomerance, \n\
54 "\<Prime Numbers: a Computational Perspective,\>"\n\ Springer -
55 Verlag\ 2001. \n\ c . \ 2000\ Perfectly\ Scientific, \
56 Inc . \n\ All\ Rights\ Reserved . \n\t\n\t20\ Apr\ 2001\ RC\
57 \((revamped\ for\ simplicity)\)\n\ 10\ Dec\ 2000\ AH\
58 \((Formatting)\)\n\t14\ Sep\ 2000\ RT\ \((Creation)\)\n*) \n\)\)],
59 "Input"],
60
61Cell[CellGroupData[{
62
63Cell[BoxData[
64 \(\( (*\ CODE\ *) \n
65 \n (*\ First, \ a\ function\ for\ inverting\ n\ mod\ \(p . \)\ *) \n
66 ellinv[n_]\ := \ If[n == 0, 0, PowerMod[n, \(-1\), p]]; \n
67 \n (*\ Next, \
68 a\ function\ for\ normalizing\ the\ x\ \(coordinate . \)\ *) \n
69 ex[pt_]\ := \ Mod[pt[\([1]\)]\ *\ ellinv[pt[\([2]\)]], \ p]; \n
70 \n (*\ Next, \
71 the\ doubleh \(()\)\ function\ for\ doubling\ a\ \(point . \)\ *) \n
72 elleven[pt_]\ := \ \n\t
73 Block[{x1\ = \ pt[\([1]\)], \ z1\ = \ pt[\([2]\)], \ e, \ f\ }, \n
74 \ \ \t\te\ = \
75 Mod[\((x1^2\ - \ a\ z1^2)\)^2\ - \
76 4\ b\ \((2\ x1\ + \ c\ z1)\)\ z1^3, \ p]; \n\ \ \t\t
77 f\ = \ Mod[
78 4\ z1\ \((x1^3\ + \ c\ x1^2\ z1\ + \ a\ x1\ z1^2\ + \ b\ z1^3)
79 \), \ p]; \n\ \ \t\t{e, f}\n\t]; \n
80 \n (*\ Next, \
81 the\ addh \(()\)\ function\ for\ adding\ pt\ and\ pu\ with\ pv\ = \
82 pt - pu\ known\ \n
83 \(\((x\ and\ z\ coordinates\ only\ of\ course)\) . \)\ *) \n
84 ellodd[pt_, \ pu_, \ pv_]\ := \ \n\t
85 Block[\n\t\t{x1\ = \ pt[\([1]\)], \ z1\ = \ pt[\([2]\)], \n\t\t\
86 x2\ = \ pu[\([1]\)], \ z2\ = \ pu[\([2]\)], \n\t\t\
87 xx\ = \ pv[\([1]\)], \ zz\ = \ pv[\([2]\)], \ i, \ j\n\t\t\ }, \n
88 \ \ \t\ \ \ \ \
89 i\ = \ Mod[
90 zz\ \((\((x1\ x2\ - \ a\ z1\ z2)\)^2\ - \n
91 \ \ \t\ \ \ \ \ \ \ \ \ \ \t
92 4\ b \((x1\ z2\ + \ x2\ z1\ + \ c\ z1\ z2)\)\ z1\ z2)\),
93 \ \n\ \ \t\ \ \ \ \ \ \ \ \ \ \tp\n\ \ \t\ \ \ \ \ \ \ \ \ ]; \n
94 \ \ \t\ \ \ \ \ j\ = \ Mod[xx\ \((x1\ z2\ - \ x2\ z1)\)^2, \ p]; \n
95 \ \ \t\t\ {i, j}\n\t]; \n
96 \n (*\ Now, \ the\ main\ routine, \ elliptic\ multiply\ [k] \(pt . \)\ *)
97 \nelliptic[pt_, \ k_]\ := \ \n\t
98 Block[{porg, \ ps, \ pp, \ q}, \n\t\tIf[k\ == 1, \ Return[pt]]; \n\t\t
99 If[k\ == 2, \ Return[elleven[pt]]]; \n\t\tporg\ = \ pt; \n\t\t
100 ps\ = \ elleven[pt]; \n\t\tpp\ = \ pt; \n\t\t
101 bitlist\ = \ Reverse[IntegerDigits[k, 2]]; \n\t\t
102 Do[\t\ \ \ \n\t\ \ \ \t\t
103 If[bitlist[\([q]\)]\ == \ 1, \n\t\ \ \ \t\ \ \ \t\t
104 pp\ = \ ellodd[ps, \ pp, \ porg]; \n\t\ \ \ \t\ \ \ \t\t
105 ps\ = \ elleven[ps]\n\t\ \ \ \t\ \ \ \t\t, \n
106 \t\ \ \ \t\ \ \ \ \ \ \tps\ = \ ellodd[pp, \ ps, \ porg]; \n
107 \t\t\ \ \ \ \ \tpp\ = \ elleven[pp]\n\t\ \ \ \t\t]\n
108 \t\ \ \ \t\t, \n
109 \t\ \ \ \t\t{q, \ Length[bitlist] - 1, \ 1, \ \(-1\)}\n\ \ \ \ \t];
110 \n\ \ \ \ \tReturn[Mod[pp, p]]\n\t]; \n
111 \n (*\ Next, \
112 we\ include\ algorithm\ 2.3 .8\ for\ finding\ square\ roots\ \nmodulo\
113 a\ prime\ \(p . \)\ *) \n\n
114 sqrtmod[b_, p_] := \ \n\t
115 Module[{a, x, c, d, cd, m, t, tst}, \n\ \ \ \t\ta\ = \ Mod[b, p]; \n
116 \ \ \ \t\tIf[p\ == \ 2, \ Return[a]]; \n\ \ \ \ \t
117 If[MemberQ[{3, 7}, Mod[p, 8]], \n\ \ \ \ \ \ \t\t
118 Return[PowerMod[a, \((p + 1)\)/4, p]]\n\ \ \ \ \ \ \t]; \n\ \ \ \ \t
119 If[Mod[p, 8]\ == \ 5, \n\ \ \ \ \ \ \t\t
120 x\ = \ PowerMod[a, \((p + 3)\)/8, p]; \n\ \ \ \ \ \ \t\t
121 c\ = \ Mod[x^2, p]; \n\ \ \ \ \ \ \t\t
122 If[Not[c\ == \ a], \n\ \ \ \ \ \ \ \ \t\t
123 Return[Mod[x\ PowerMod[2, \((p - 1)\)/4, p], \ p]]\n
124 \ \ \ \ \ \ \ \ \t]; \n\ \ \ \ \ \ \t]; \n\ \ \ \ \t\n
125 \ \ \ \ \t (*\ Here, \ p\ = \ 1\ \(\((mod\ 8)\) . \)\ *) \n
126 \ \ \ \ \ \ \ttst\ = \ 1; \n\ \ \ \ \ \ \t
127 While[Not[tst\ == \ \(-1\)], \n\ \ \ \ \ \ \ \ \t
128 d\ = \ Random[Integer, {1, p}]; \n\ \ \ \ \ \ \ \ \t
129 tst\ = \ JacobiSymbol[d, p]\n\ \ \ \ \ \ \ \ ]; \n\ \ \ \ \ \ \t
130 t\ = \ \((p - 1)\)/2; \ s\ = \ 1; \n\ \ \ \ \ \ \t
131 While[EvenQ[t], \ t\ = \ t/2; \ \(++s\)]; \n\ \ \ \ \ \ \t
132 ca\ = \ PowerMod[a, t, p]; \n\ \ \ \ \ \ \t
133 cd\ = \ PowerMod[d, t, p]; \n\ \ \ \ \ \ \tm\ = \ 0; \n
134 \ \ \ \ \ \ \t
135 Do[\n\ \ \ \ \ \ \t\ \ \
136 If[PowerMod[Mod[ca\ PowerMod[cd, \ m, \ p], p], \
137 2^\((s - 1 - i)\), \ p]\n\ \ \ \ \ \ \t\ \ \ \t\t == \ p - 1,
138 \ m\ += \ 2^i]\n\ \ \ \ \ \ \t\ \ \ , {i, 0, s - 1}\n
139 \ \ \ \ \ \ \t]; \ \ \ \ \ \ \t\ \ \ \ \n\ \ \ \ \ \ \t
140 Return[Mod[PowerMod[a, \ \((t + 1)\)/2, p]\ PowerMod[cd, \ m/2, p],
141 p]]; \ \n\t]; \n
142 \n (*\ Next, \ a\ function\ relevant\ to\ Algorithm\ 7.2 \( .8 . \)\ *) \n
143 \nellXadd[x1_, x2_] := \n\t
144 Module[{u2, v, g}, \[IndentingNewLine]\t\tg = x1 - x2;
145 \[IndentingNewLine]\t\tden = PowerMod[g, \(-2\), p];
146 \[IndentingNewLine]\t\t
147 alpha = Mod[
148 \((\((x1\ x2 + a)\) \((x1 + x2)\) + 2 c\ x1\ x2 + 2 b)\), p];
149 \[IndentingNewLine]\t\t
150 beta = Mod[\((\((x1\ x2 - a)\)^2 - 4 b \((x1 + x2 + c)\))\), p];
151 \[IndentingNewLine]\t\tdisc = Mod[alpha^2 - beta\ g^2, p];
152 \[IndentingNewLine]\t\t{\ \
153 Mod[\ den*\((alpha + sqrtmod[disc, p])\), p], \ \n\t\t\ \ \ \
154 Mod[den*\((alpha - sqrtmod[disc, p])\), p]\n\t\t}
155 \[IndentingNewLine]\t]; \n
156 \n (*\ Now, \
157 the\ main\ routine . \ Parameters\ are\ given\ for\ 161 -
158 bit\ prime\ field\n\t\t\tand\ specific\ curve; \n\t\ \
159 direct\ embedding\ proceeds\ on\ "\<plaintext\>"\ integers\ x\
160 \((mod\ p)\) . \ \n\ \ \ We\ start\ with\ relevant\ global\
161 \((and\ public, \ except\ for\ kb)\)\n\ \ \ \(parameters . \)\n\ *) \n
162 \[IndentingNewLine]p\ = \
163 1654338658923174831024422729553880293604080853451; \na\ = \ \(-152\);
164 \nb = \ 722; \nc\ = \ 0; \ \ (*\ Montgomery\ \(parameter . \)\ *) \n
165 \n (*\ Next, \
166 create\ public\ point\ P\ of\ prime\ order\ on\ main\ \(curve . \)\ *)
167 \npubpoint\ =
168 \ {124590448755381588517063157600522073397838354227, \ 1}; \ \ \n
169 pubpointtwist\ =
170 \ {1173563507729187954550227059395955904200719019884, 1}; \n\n
171 kb\ = \ 968525826201321079923232842886222248;
172 \ \ (*\ Private\ key\ \(K_B . \)\ *) \n\n
173 pubkey\ = \ \ \ elliptic[pubpoint, \ kb];
174 \ \ \ \ \ \ \ \ (*\ Public\ key\ \(P_B . \)\ *) \n
175 pubkeytwist\ = \ \telliptic[pubpointtwist, \ kb];
176 \ \ \ \ \ (*\ Public\ key\ \(P_B' . \)\ *) \n\ \n\t\t\n
177 encryptEmbed[x_] := \
178 Module[{cubic, \ curve, \ X\ = \ x, \ pbk, \ pbp, \ clueX, \ X2, \ uX,
179 \n\t\t\ \ piece, \ try, \ sign},
180 \[IndentingNewLine] (*\ First, \
181 let\ us\ determine\ which\ curve . \ \n\t\t\ \ \ EITHER\ X\ lies\ in
182 \ the\ curve\ y^2\ = \ X^3\ + \ c\ X^2\ + \ a\ X\ + \ b, \n
183 \t\t\ \ \
184 or\ on\ g\ y^2\ = \ X^3\ + \ c\ X^2\ + \ a\ X\ + \ b\ *) \n
185 \t\t\ cubic\ = \ Mod[X\ Mod[X^2\ + c\ X\ + \ \ a, p]\ + \ b, p];
186 \n\t\t\ If[JacobiSymbol[cubic, \ p]\ > \ \(-1\), \ \n
187 \t\t\t\ \ \ \ \ \ curve\ = \ 1; \ pbk\ = \ pubkey; \
188 pbp\ = \ pubpoint, \t\t\t\ \ \ \ \ \ \n\t\t\t\t\ \ \ \ \
189 curve\ = \ \(-1\)\ ; \ pbk\ = \ pubkeytwist; \
190 pbp\ = \ pubpointtwist; \ \n\t\t\ \ ]; \n\t\t\n\t\t\t
191 r\ = \ Random[Integer, \ {2, p - 2}]; \t\t\ \ \n\t\t\t
192 clueX\ = \ ex[elliptic[pbp, \ r]]; \n\t\t\ \
193 X2\ = \ ex[elliptic[pbk, \ r]];
194 \ (*\ We\ shall\ be\ adding\ the\ points\ having\ X, \ X2, \
195 and\n\t\t\t\t\t\ \ \ there\ is\ a\ sign\ ambiguity\ a\ la\ Algorithm
196 \ 7.2 .8\ because\ Y -
197 coordinates\n\t\t\t\t\t\t\ \ are\ being\ \(avoided . \)\ *) \ \n
198 \t\t\ \ \ uX\ = \ \(ellXadd[X, \ X2]\)[\([1]\)]; \n\t\t\n
199 \t\t (*\ Next, \
200 feedback\ loop\ to\ determine\ which\ value\ of\ sign\ recovers\
201 \(plaintext . \)\ *) \n\t\t\n\t\t\ \ \
202 piece\ = \ ex[elliptic[{clueX, 1}, \ kb]]; \t\t\ \n\t\t\ \ \
203 try\ = \ ellXadd[uX, \ piece]; \n\n\t\t\t\
204 If[\ttry[\([1]\)]\ == \ X, \ sign\ = \ 1, \n
205 \t\t\t\ \ \ \ \ \ \ \ \ \ \ \ \ \ \
206 If[try[\([2]\)]\ == \ X, \ sign\ = \ \(-1\), \ Print["\<TILT!\>"]]
207 \n\t\t\t]; \t\t\t\t\ \ \ \ \ \ \ \ \n
208 \t\t\ \ {uX, \ clueX, \ curve, \ sign}\[IndentingNewLine]];
209 \[IndentingNewLine]\n
210 decryptEmbed[cipherList_] := \
211 Module[{uX\ = \ cipherList[\([1]\)], \
212 clueX\ = \ cipherList[\([2]\)], \ curve\ = \ cipherList[\([3]\)],
213 \ sign\ = \ cipherList[\([4]\)]}, \n\t\t\ \ \
214 piece\ = \ ex[elliptic[{clueX, 1}, \ kb]]; \t\t\ \n\t\t\ \ \
215 try\ = \ ellXadd[uX, \ piece]; \n\t\t\ \ \
216 X\ = \ try[\([\((3 - sign)\)/2]\)]; \n\t\t\tX\[IndentingNewLine]];
217 \[IndentingNewLine]\n\)\)], "Input"],
218
219Cell[BoxData[
220 \(General::"spell1" \( : \ \)
221 "Possible spelling error: new symbol name \"\!\(beta\)\" is similar to \
222existing symbol \"\!\(Beta\)\"."\)], "Message"],
223
224Cell[BoxData[
225 \(General::"spell1" \( : \ \)
226 "Possible spelling error: new symbol name \"\!\(sign\)\" is similar to \
227existing symbol \"\!\(Sign\)\"."\)], "Message"]
228}, Open ]],
229
230Cell[CellGroupData[{
231
232Cell[BoxData[
233 \(\( (*\ EXAMPLE\ *) \ \n\n
234 ciph\ = \ encryptEmbed[plain\ = \ Random[Integer, p - 1]]; \n
235 If[decryptEmbed[ciph]\ != \ plain, \ Print["\<TILT!\>"]], {ct, 1, 10}]
236 \)\)], "Input"],
237
238Cell[BoxData[
239 \(General::"spell1" \( : \ \)
240 "Possible spelling error: new symbol name \"\!\(plain\)\" is similar to \
241existing symbol \"\!\(Plain\)\"."\)], "Message"]
242}, Open ]],
243
244Cell[CellGroupData[{
245
246Cell[BoxData[
247 \(p\)], "Input"],
248
249Cell[BoxData[
250 \(1654338658923174831024422729553880293604080853451\)], "Output"]
251}, Open ]],
252
253Cell[CellGroupData[{
254
255Cell[BoxData[
256 \(CC\)], "Input"],
257
258Cell[BoxData[
259 \(CC\)], "Output"]
260}, Open ]],
261
262Cell[BoxData[
263 \(6277101735386680763835789423207666416083908700390324961279\)], "Input"]
264},
265FrontEndVersion->"NeXT 3.0",
266ScreenRectangle->{{0, 957}, {0, 768}},
267WindowToolbars->{},
268WindowSize->{762, 676},
269WindowMargins->{{Automatic, 11}, {Automatic, 24}},
270ShowCellLabel->False
271]
272
273
274(***********************************************************************
275Cached data follows. If you edit this Notebook file directly, not using
276Mathematica, you must remove the line containing CacheID at the top of
277the file. The cache data will then be recreated when you save this file
278from within Mathematica.
279***********************************************************************)
280
281(*CellTagsOutline
282CellTagsIndex->{}
283*)
284
285(*CellTagsIndex
286CellTagsIndex->{}
287*)
288
289(*NotebookFileOutline
290Notebook[{
291Cell[1709, 49, 576, 9, 242, "Input"],
292
293Cell[CellGroupData[{
294Cell[2310, 62, 8704, 154, 2269, "Input"],
295Cell[11017, 218, 175, 3, 33, "Message"],
296Cell[11195, 223, 175, 3, 33, "Message"]
297}, Open ]],
298
299Cell[CellGroupData[{
300Cell[11407, 231, 215, 4, 65, "Input"],
301Cell[11625, 237, 177, 3, 33, "Message"]
302}, Open ]],
303
304Cell[CellGroupData[{
305Cell[11839, 245, 34, 1, 25, "Input"],
306Cell[11876, 248, 83, 1, 24, "Output"]
307}, Open ]],
308
309Cell[CellGroupData[{
310Cell[11996, 254, 35, 1, 24, "Input"],
311Cell[12034, 257, 36, 1, 24, "Output"]
312}, Open ]],
313Cell[12085, 261, 91, 1, 24, "Input"]
314}
315]
316*)
317
318
319
320
321(***********************************************************************
322End of Mathematica Notebook file.
323***********************************************************************)
324