📄 des_enc.m4
字号:
$7.0: call .+8 sll $2, 2, $6 add %o7,$7.jmp.table-$7.0,$5 add $5, $6, $5 ld [$5], $5 jmp %o7+$5 nop$7.7: srl $3, 16, $5 and $5, 0xff, $5 stub $5, [$1+6]$7.6: srl $3, 8, $5 and $5, 0xff, $5 stub $5, [$1+5]$7.5: and $3, 0xff, $5 stub $5, [$1+4]$7.4: srl $4, 24, $5 stub $5, [$1+3]$7.3: srl $4, 16, $5 and $5, 0xff, $5 stub $5, [$1+2]$7.2: srl $4, 8, $5 and $5, 0xff, $5 stub $5, [$1+1]$7.1: and $4, 0xff, $5 ba $8 stub $5, [$1] .align 4$7.jmp.table: .word 0 .word $7.1-$7.0 .word $7.2-$7.0 .word $7.3-$7.0 .word $7.4-$7.0 .word $7.5-$7.0 .word $7.6-$7.0 .word $7.7-$7.0})define(testvalue,{1})define(register_init, {! For test purposes: sethi %hi(testvalue), local0 or local0, %lo(testvalue), local0 ifelse($1,{},{}, {mov local0, $1}) ifelse($2,{},{}, {mov local0, $2}) ifelse($3,{},{}, {mov local0, $3}) ifelse($4,{},{}, {mov local0, $4}) ifelse($5,{},{}, {mov local0, $5}) ifelse($6,{},{}, {mov local0, $6}) ifelse($7,{},{}, {mov local0, $7}) ifelse($8,{},{}, {mov local0, $8}) mov local0, local1 mov local0, local2 mov local0, local3 mov local0, local4 mov local0, local5 mov local0, local7 mov local0, local6 mov local0, out0 mov local0, out1 mov local0, out2 mov local0, out3 mov local0, out4 mov local0, out5 mov local0, global1 mov local0, global2 mov local0, global3 mov local0, global4 mov local0, global5}).section ".text" .align 32.des_enc: ! key address in3 ! loads key next encryption/decryption first round from [in4] rounds_macro(in5, out5, 1, .des_enc.1, in3, in4, retl) .align 32.des_dec: ! implemented with out5 as first parameter to avoid ! register exchange in ede modes ! key address in4 ! loads key next encryption/decryption first round from [in3] rounds_macro(out5, in5, -1, .des_dec.1, in4, in3, retl)! void DES_encrypt1(data, ks, enc)! ******************************* .align 32 .global DES_encrypt1 .type DES_encrypt1,#functionDES_encrypt1: save %sp, FRAME, %sp sethi %hi(.PIC.DES_SPtrans-1f),global1 or global1,%lo(.PIC.DES_SPtrans-1f),global11: call .+8 add %o7,global1,global1 sub global1,.PIC.DES_SPtrans-.des_and,out2 ld [in0], in5 ! left cmp in2, 0 ! enc#ifdef OPENSSL_SYSNAME_ULTRASPARC be,pn %icc, .encrypt.dec ! enc/dec#else be .encrypt.dec#endif ld [in0+4], out5 ! right ! parameter 6 1/2 for include encryption/decryption ! parameter 7 1 for move in1 to in3 ! parameter 8 1 for move in3 to in4, 2 for move in4 to in3 ip_macro(in5, out5, in5, out5, in3, 0, 1, 1) rounds_macro(in5, out5, 1, .des_encrypt1.1, in3, in4) ! in4 not used fp_macro(in5, out5, 1) ! 1 for store to [in0] ret restore.encrypt.dec: add in1, 120, in3 ! use last subkey for first round ! parameter 6 1/2 for include encryption/decryption ! parameter 7 1 for move in1 to in3 ! parameter 8 1 for move in3 to in4, 2 for move in4 to in3 ip_macro(in5, out5, out5, in5, in4, 2, 0, 1) ! include dec, ks in4 fp_macro(out5, in5, 1) ! 1 for store to [in0] ret restore.DES_encrypt1.end: .size DES_encrypt1,.DES_encrypt1.end-DES_encrypt1! void DES_encrypt2(data, ks, enc)!********************************* ! encrypts/decrypts without initial/final permutation .align 32 .global DES_encrypt2 .type DES_encrypt2,#functionDES_encrypt2: save %sp, FRAME, %sp sethi %hi(.PIC.DES_SPtrans-1f),global1 or global1,%lo(.PIC.DES_SPtrans-1f),global11: call .+8 add %o7,global1,global1 sub global1,.PIC.DES_SPtrans-.des_and,out2 ! Set sbox address 1 to 6 and rotate halfs 3 left ! Errors caught by destest? Yes. Still? *NO* !sethi %hi(DES_SPtrans), global1 ! address sbox 1 !or global1, %lo(DES_SPtrans), global1 ! sbox 1 add global1, 256, global2 ! sbox 2 add global1, 512, global3 ! sbox 3 ld [in0], out5 ! right add global1, 768, global4 ! sbox 4 add global1, 1024, global5 ! sbox 5 ld [in0+4], in5 ! left add global1, 1280, local6 ! sbox 6 add global1, 1792, out3 ! sbox 8 ! rotate sll in5, 3, local5 mov in1, in3 ! key address to in3 sll out5, 3, local7 srl in5, 29, in5 srl out5, 29, out5 add in5, local5, in5 add out5, local7, out5 cmp in2, 0 ! we use our own stackframe#ifdef OPENSSL_SYSNAME_ULTRASPARC be,pn %icc, .encrypt2.dec ! decryption#else be .encrypt2.dec#endif STPTR in0, [%sp+BIAS+ARG0+0*ARGSZ] ld [in3], out0 ! key 7531 first round mov LOOPS, out4 ! loop counter ld [in3+4], out1 ! key 8642 first round sethi %hi(0x0000FC00), local5 call .des_enc mov in3, in4 ! rotate sll in5, 29, in0 srl in5, 3, in5 sll out5, 29, in1 add in5, in0, in5 srl out5, 3, out5 LDPTR [%sp+BIAS+ARG0+0*ARGSZ], in0 add out5, in1, out5 st in5, [in0] st out5, [in0+4] ret restore.encrypt2.dec: add in3, 120, in4 ld [in4], out0 ! key 7531 first round mov LOOPS, out4 ! loop counter ld [in4+4], out1 ! key 8642 first round sethi %hi(0x0000FC00), local5 mov in5, local1 ! left expected in out5 mov out5, in5 call .des_dec mov local1, out5.encrypt2.finish: ! rotate sll in5, 29, in0 srl in5, 3, in5 sll out5, 29, in1 add in5, in0, in5 srl out5, 3, out5 LDPTR [%sp+BIAS+ARG0+0*ARGSZ], in0 add out5, in1, out5 st out5, [in0] st in5, [in0+4] ret restore.DES_encrypt2.end: .size DES_encrypt2, .DES_encrypt2.end-DES_encrypt2! void DES_encrypt3(data, ks1, ks2, ks3)! ************************************** .align 32 .global DES_encrypt3 .type DES_encrypt3,#functionDES_encrypt3: save %sp, FRAME, %sp sethi %hi(.PIC.DES_SPtrans-1f),global1 or global1,%lo(.PIC.DES_SPtrans-1f),global11: call .+8 add %o7,global1,global1 sub global1,.PIC.DES_SPtrans-.des_and,out2 ld [in0], in5 ! left add in2, 120, in4 ! ks2 ld [in0+4], out5 ! right mov in3, in2 ! save ks3 ! parameter 6 1/2 for include encryption/decryption ! parameter 7 1 for mov in1 to in3 ! parameter 8 1 for mov in3 to in4 ! parameter 9 1 for load ks3 and ks2 to in4 and in3 ip_macro(in5, out5, in5, out5, in3, 1, 1, 0, 0) call .des_dec mov in2, in3 ! preload ks3 call .des_enc nop fp_macro(in5, out5, 1) ret restore.DES_encrypt3.end: .size DES_encrypt3,.DES_encrypt3.end-DES_encrypt3! void DES_decrypt3(data, ks1, ks2, ks3)! ************************************** .align 32 .global DES_decrypt3 .type DES_decrypt3,#functionDES_decrypt3: save %sp, FRAME, %sp sethi %hi(.PIC.DES_SPtrans-1f),global1 or global1,%lo(.PIC.DES_SPtrans-1f),global11: call .+8 add %o7,global1,global1 sub global1,.PIC.DES_SPtrans-.des_and,out2 ld [in0], in5 ! left add in3, 120, in4 ! ks3 ld [in0+4], out5 ! right mov in2, in3 ! ks2 ! parameter 6 1/2 for include encryption/decryption ! parameter 7 1 for mov in1 to in3 ! parameter 8 1 for mov in3 to in4 ! parameter 9 1 for load ks3 and ks2 to in4 and in3 ip_macro(in5, out5, out5, in5, in4, 2, 0, 0, 0) call .des_enc add in1, 120, in4 ! preload ks1 call .des_dec nop fp_macro(out5, in5, 1) ret restore.DES_decrypt3.end: .size DES_decrypt3,.DES_decrypt3.end-DES_decrypt3! void DES_ncbc_encrypt(input, output, length, schedule, ivec, enc)! ***************************************************************** .align 32 .global DES_ncbc_encrypt .type DES_ncbc_encrypt,#functionDES_ncbc_encrypt: save %sp, FRAME, %sp define({INPUT}, { [%sp+BIAS+ARG0+0*ARGSZ] }) define({OUTPUT}, { [%sp+BIAS+ARG0+1*ARGSZ] }) define({IVEC}, { [%sp+BIAS+ARG0+4*ARGSZ] }) sethi %hi(.PIC.DES_SPtrans-1f),global1 or global1,%lo(.PIC.DES_SPtrans-1f),global11: call .+8 add %o7,global1,global1 sub global1,.PIC.DES_SPtrans-.des_and,out2 cmp in5, 0 ! enc #ifdef OPENSSL_SYSNAME_ULTRASPARC be,pn %icc, .ncbc.dec#else be .ncbc.dec#endif STPTR in4, IVEC ! addr left right temp label load_little_endian(in4, in5, out5, local3, .LLE1) ! iv addcc in2, -8, in2 ! bytes missing when first block done#ifdef OPENSSL_SYSNAME_ULTRASPARC bl,pn %icc, .ncbc.enc.seven.or.less#else bl .ncbc.enc.seven.or.less#endif mov in3, in4 ! schedule.ncbc.enc.next.block: load_little_endian(in0, out4, global4, local3, .LLE2) ! block.ncbc.enc.next.block_1: xor in5, out4, in5 ! iv xor xor out5, global4, out5 ! iv xor ! parameter 8 1 for move in3 to in4, 2 for move in4 to in3 ip_macro(in5, out5, in5, out5, in3, 0, 0, 2).ncbc.enc.next.block_2:!// call .des_enc ! compares in2 to 8! rounds inlined for alignment purposes add global1, 768, global4 ! address sbox 4 since register used below rounds_macro(in5, out5, 1, .ncbc.enc.1, in3, in4) ! include encryption ks in3#ifdef OPENSSL_SYSNAME_ULTRASPARC bl,pn %icc, .ncbc.enc.next.block_fp#else bl .ncbc.enc.next.block_fp#endif add in0, 8, in0 ! input address ! If 8 or more bytes are to be encrypted after this block, ! we combine final permutation for this block with initial ! permutation for next block. Load next block: load_little_endian(in0, global3, global4, local5, .LLE12) ! parameter 1 original left ! parameter 2 original right ! parameter 3 left ip ! parameter 4 right ip ! parameter 5 1: load ks1/ks2 to in3/in4, add 120 to in4 ! 2: mov in4 to in3 ! ! also adds -8 to length in2 and loads loop counter to out4 fp_ip_macro(out0, out1, global3, global4, 2) store_little_endian(in1, out0, out1, local3, .SLE10) ! block ld [in3], out0 ! key 7531 first round next block mov in5, local1 xor global3, out5, in5 ! iv xor next block ld [in3+4], out1 ! key 8642 add global1, 512, global3 ! address sbox 3 since register used xor global4, local1, out5 ! iv xor next block ba .ncbc.enc.next.block_2 add in1, 8, in1 ! output adress.ncbc.enc.next.block_fp: fp_macro(in5, out5) store_little_endian(in1, in5, out5, local3, .SLE1) ! block addcc in2, -8, in2 ! bytes missing when next block done#ifdef OPENSSL_SYSNAME_ULTRASPARC bpos,pt %icc, .ncbc.enc.next.block ! also jumps if 0#else bpos .ncbc.enc.next.block#endif add in1, 8, in1.ncbc.enc.seven.or.less: cmp in2, -8#ifdef OPENSSL_SYSNAME_ULTRASPARC ble,pt %icc, .ncbc.enc.finish#else ble .ncbc.enc.finish#endif nop add in2, 8, local1 ! bytes to load ! addr, length, dest left, dest right, temp, temp2, label, ret label load_n_bytes(in0, local1, global4, out4, local2, local3, .LNB1, .ncbc.enc.next.block_1) ! Loads 1 to 7 bytes little endian to global4, out4.ncbc.enc.finish:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -