|
|
1.1.1.2 ! 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: 12/01/92 ! 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_SMULA) ! 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: addl %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: ! 256: .lcomm _reciph,4 ! 257: .lcomm _recipl,4 ! 258: .lcomm _mshift,4 ! 259: ! 260: ENTRY (p_setrecip) ! 261: movl 4(%esp),%eax ! 262: movl %eax,_reciph ! 263: movl 8(%esp),%eax ! 264: movl %eax,_recipl ! 265: movl 12(%esp),%eax ! 266: movl %eax,_mshift ! 267: ret ! 268: ! 269: ! 270: ENTRY (p_quo_digit) ! 271: pushl %ebp ! 272: pushl %ebx ! 273: pushl %esi ! 274: pushl %edi ! 275: ! 276: movl 20(%esp),%esi /* dividend */ ! 277: movl -8(%esi),%eax /* dividend[-2] */ ! 278: notl %eax ! 279: mull _reciph ! 280: addl _reciph,%eax ! 281: adcl $0,%edx ! 282: movl %eax,%ebx ! 283: movl %edx,%edi /* di:bx = q1 */ ! 284: ! 285: movl -4(%esi),%eax /* dividend[-1] */ ! 286: notl %eax ! 287: mull _recipl ! 288: incl %edx /* dx:ax = q2 */ ! 289: ! 290: movl %edx,%ebp ! 291: andl %edi,%ebp ! 292: andl $1,%ebp /* bp = lsb_factor */ ! 293: ! 294: addl %ebx,%eax ! 295: adcl %edx,%edi ! 296: rcrl $1,%edi /* di = MS word of q0 */ ! 297: ! 298: movl -4(%esi),%eax /* dividend [-1] */ ! 299: notl %eax ! 300: mull _reciph ! 301: movl %eax,%ebx ! 302: movl %edx,%ecx /* cx:bx = q1 */ ! 303: ! 304: movl (%esi),%eax /* dividend[0] */ ! 305: notl %eax ! 306: mull _recipl /* dx:ax = q2 */ ! 307: xorl %ebx,%eax ! 308: andl %eax,%ebp /* lsb correction */ ! 309: xorl %ebx,%eax /* restore ax */ ! 310: ! 311: addl %ebx,%eax ! 312: adcl %ecx,%edx ! 313: rcrl $1,%edx ! 314: rcrl $1,%eax /* dx:ax = q */ ! 315: ! 316: addl %edi,%eax /* + scaled q0 */ ! 317: adcl $0,%edx ! 318: addl %ebp,%eax /* + lsb correction */ ! 319: adcl $0,%edx /* q */ ! 320: ! 321: shll $1,%eax ! 322: rcll $1,%edx ! 323: rcll $1,%eax ! 324: rcll $1,%edx ! 325: rcll $1,%eax ! 326: andl $3,%eax ! 327: movl %eax,%ecx ! 328: movl %edx,%ebx /* bx:cx = q >> 14 */ ! 329: ! 330: movl (%esi),%eax /* dividend[0] */ ! 331: notl %eax ! 332: mull _reciph ! 333: shll $1,%eax ! 334: rcll $1,%edx ! 335: addl %ebx,%eax ! 336: adcl %ecx,%edx /* q */ ! 337: ! 338: movl _mshift,%ecx ! 339: cmpl $32,_mshift ! 340: je 2f ! 341: shrdl %cl,%edx,%eax ! 342: shrl %cl,%edx ! 343: ! 344: orl %edx,%edx ! 345: je 1f ! 346: movl $-1,%eax ! 347: jmp 1f ! 348: 2: ! 349: xchgl %edx,%eax ! 350: 1: ! 351: popl %edi ! 352: popl %esi ! 353: popl %ebx ! 354: popl %ebp ! 355: ret ! 356: ! 357: .lcomm prec8,4 ! 358: .lcomm addp,4 ! 359: .lcomm subp,4 ! 360: .lcomm rotp,4 ! 361: .lcomm mulp,4 ! 362:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.