|
|
1.1 root 1: /*
2: **
3: ** 80386 assembly primitives for RSA library
4: ** GNU gas syntax, tested with gcc v1.39
5: **
6: ** Compile with UNIT32 defined, MULTUNIT must be unsigned long
7: ** assemble this file with gcc -c (file should have .S suffix)
8: **
9: ** Written by Branko Lankester ([email protected]) 11/18/91
10: ** Last revised: 03/04/91
11: **
12: */
13:
14: #if defined(__GNUC__) || defined(__ASSEMBLER__)
15: #ifdef __STDC__
16: #define ENTRY(name) .align 4 ; .globl _##name ; _##name:
17: #else
18: #define ENTRY(name) .align 4 ; .globl _/**/name ; _/**/name:
19: #endif
20: #else /* !__GNUC__ */
21: #define ENTRY(name) .align 4 ; .globl name ; name:
22: #endif
23:
24: .text
25:
26: /*
27: ********************* set precision ********************
28: */
29: ENTRY (P_SETP)
30: pushl %ebp
31: movl %esp,%ebp
32: pushl %ebx
33: pushl %ecx
34: pushl %edx
35: movl 8(%ebp),%eax
36: addl $0x1f,%eax
37: shrl $5,%eax
38: movl %eax,%ebx
39: shrl $3,%eax
40: movl %eax,prec8
41: andl $7,%ebx
42:
43: movl $add_ref,%eax
44: movl %eax,%ecx
45: subl $add_1ref,%eax
46: mul %ebx
47: subl %eax,%ecx
48: movl %ecx,addp
49: movl $sub_ref,%ecx
50: subl %eax,%ecx
51: movl %ecx,subp
52:
53: movl $rot_ref,%eax
54: movl %eax,%ecx
55: subl $rot_1ref,%eax
56: mul %ebx
57: subl %eax,%ecx
58: movl %ecx,rotp
59:
60: movl $mul_ref,%eax
61: movl %eax,%ecx
62: subl $mul_1ref,%eax
63: mul %ebx
64: subl %eax,%ecx
65: movl %ecx,mulp
66:
67: popl %edx
68: popl %ecx
69: popl %ebx
70: leave
71: ret
72:
73:
74:
75: /*
76: ********************* mpi add with carry ********************
77: */
78:
79: #define ADDU lodsl ; adcl %eax,(%ebx,%esi)
80:
81: ENTRY (P_ADDC)
82: pushl %ebp
83: movl %esp,%ebp
84: pushl %ebx
85: pushl %ecx
86: pushl %esi
87: pushl %edi
88: movl 12(%ebp),%esi
89: movl 8(%ebp),%ebx
90: subl %esi,%ebx
91: subl $4,%ebx
92: cld
93: movl 16(%ebp),%eax
94: movl prec8,%ecx
95: orl %ecx,%ecx
96: rcrl $1,%eax /* set the carry flag */
97: jz add_units /* z-flag set by orl %ecx,%ecx */
98: add_8u:
99: ADDU ; ADDU ; ADDU ; ADDU ; ADDU ; ADDU ; ADDU ; ADDU
100: loop add_8u
101: add_units:
102: jmp *addp
103: ADDU ; ADDU ; ADDU ; ADDU ; ADDU ; ADDU
104: add_1ref: /* label to compute size of codes */
105: ADDU
106: add_ref:
107: rcll $1,%eax
108: andl $1,%eax
109:
110: popl %edi
111: popl %esi
112: popl %ecx
113: popl %ebx
114: leave
115: ret
116:
117:
118: /*
119: ********************* mpi subtract with borrow ********************
120: */
121:
122: #define SUBU lodsl ; sbbl %eax,(%ebx,%esi)
123:
124: ENTRY (P_SUBB)
125: pushl %ebp
126: movl %esp,%ebp
127: pushl %ebx
128: pushl %ecx
129: pushl %esi
130: pushl %edi
131: movl 12(%ebp),%esi
132: movl 8(%ebp),%ebx
133: subl %esi,%ebx
134: subl $4,%ebx
135: cld
136: movl 16(%ebp),%eax
137: movl prec8,%ecx
138: orl %ecx,%ecx
139: rcrl $1,%eax
140: jz sub_units
141: sub_8u:
142: SUBU ; SUBU ; SUBU ; SUBU ; SUBU ; SUBU ; SUBU ; SUBU
143: loop sub_8u
144: sub_units:
145: jmp *subp
146: SUBU ; SUBU ; SUBU ; SUBU ; SUBU ; SUBU ; SUBU
147: sub_ref:
148: rcll $1,%eax
149: andl $1,%eax
150:
151: popl %edi
152: popl %esi
153: popl %ecx
154: popl %ebx
155: leave
156: ret
157:
158:
159:
160: /*
161: ********************* mpi rotate left ********************
162: */
163:
164: #define ROTU rcll $1,(%ebx,%esi,4) ; incl %esi
165:
166: ENTRY (P_ROTL)
167: pushl %ebp
168: movl %esp,%ebp
169: pushl %ebx
170: pushl %ecx
171: pushl %esi
172: movl 8(%ebp),%ebx
173: movl 12(%ebp),%eax
174: xorl %esi,%esi
175: movl prec8,%ecx
176: orl %ecx,%ecx
177: rcrl $1,%eax /* set the carry flag */
178: jz rot_units /* z-flag set by orl %ecx,%ecx */
179: rot_8u:
180: rcll $1,(%ebx)
181: rcll $1,4(%ebx)
182: rcll $1,8(%ebx)
183: rcll $1,12(%ebx)
184: rcll $1,16(%ebx)
185: rcll $1,20(%ebx)
186: rcll $1,24(%ebx)
187: rcll $1,28(%ebx)
188: leal 32(%ebx),%ebx
189: loop rot_8u
190: rot_units:
191: jmp *rotp
192: ROTU ; ROTU ; ROTU ; ROTU ; ROTU ; ROTU ; ROTU
193: rot_1ref:
194: ROTU
195: rot_ref:
196: rcll $1,%eax
197: andl $1,%eax
198:
199: popl %esi
200: popl %ecx
201: popl %ebx
202: leave
203: ret
204:
205: /*
206: ********************* mpi multiply ********************
207: */
208: #define MULU \
209: lodsl ; \
210: mull %ebp ; \
211: addl %ebx,%eax ; \
212: adcl $0,%edx ; \
213: addl (%edi),%eax ; \
214: adcl $0,%edx ; \
215: movl %edx,%ebx ; \
216: stosl
217:
218: ENTRY (P_SMUL)
219: pushl %ebp
220: movl %esp,%ebp
221: pushl %ebx
222: pushl %ecx
223: pushl %edx
224: pushl %esi
225: pushl %edi
226:
227: xorl %ebx,%ebx
228: movl prec8,%ecx
229: movl 8(%ebp),%edi
230: movl 12(%ebp),%esi
231: movl 16(%ebp),%ebp
232: cld
233: orl %ecx,%ecx
234: jz mul_units
235: mul_8u:
236: MULU ; MULU ; MULU ; MULU ; MULU ; MULU ; MULU ; MULU
237: decl %ecx
238: jnz mul_8u /* offset too big for loop */
239: mul_units:
240: jmp *mulp
241: MULU ; MULU ; MULU ; MULU ; MULU ; MULU
242: mul_1ref:
243: MULU
244: mul_ref:
245: movl %ebx,(%edi)
246:
247: popl %edi
248: popl %esi
249: popl %edx
250: popl %ecx
251: popl %ebx
252: popl %ebp
253: ret
254:
255: .lcomm prec8,4
256: .lcomm addp,4
257: .lcomm subp,4
258: .lcomm rotp,4
259: .lcomm mulp,4
260:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.