Foro de elhacker.net

Seguridad Informática => Criptografía => Mensaje iniciado por: xv0 en 14 Mayo 2014, 13:11 pm



Título: AES 128 bits Encrypt [ASM Bit slice]
Publicado por: xv0 en 14 Mayo 2014, 13:11 pm
Hola

Bueno al principio no tenia ganas de compartir el code, ya que es para un proyecto personal, pero como algunos usuarios querian verlo, y este sub-foro esta casi muerto aqui les traigo esta implmentacion, a ver si alguien la sabe apreciar.

El code esta copiado directamente de mi editor, funciona bien, pero no es ensamblar y funcionar tienes que modificar algunas cosas.

Seria una ronda de cifrado, si quieres las 8 serian hacer loops, y las 2 ultimas que son con SubBytes, Shifrows y AddRounkey pues modificar algo.

Tambien algunas funciones como AddRounkey y SubBytes no son bit slice, creo que asi ya estaban bien.

Bueno si alguien lo copia espero que se respete el primer autor, yo.

Código
  1. [code=asm].section .data
  2.  
  3. sbx_: .quad 0xc56f6bf27b777c63,0x76abd7fe2b670130
  4.      .quad 0xf04759fa7dc982ca,0xc072a49cafa2d4ad
  5.      .quad 0xccf73f362693fdb7,0x1531d871f1e5a534
  6.      .quad 0x9a059618c323c704,0x75b227ebe2801207
  7.      .quad 0xa05a6e1b1a2c8309,0x842fe329b3d63b52
  8.      .quad 0x5bb1fc20ed00d153,0xcf584c4a39becb6a
  9.      .quad 0x85334d43fbaaefd0,0xa89f3c507f02f945
  10.      .quad 0xf5389d928f40a351,0xd2f3ff1021dab6bc
  11.      .quad 0x1744975fec130ccd,0x73195d643d7ea7c4
  12.      .quad 0x88902a22dc4f8160,0xdb0b5ede14b8ee46
  13.      .quad 0x5c2406490a3a32e0,0x79e4959162acd3c2
  14.      .quad 0xa94ed58d6d37c8e7,0x08ae7a65eaf4566c
  15.      .quad 0xc6b4a61c2e2578ba,0x8a8bbd4b1f74dde8
  16.      .quad 0x0ef6034866b53e70,0x9e1dc186b9573561
  17.      .quad 0x948ed9691198f8e1,0xdf2855cee9871e9b
  18.      .quad 0x6842e6bf0d89a18c,0x16bb54b00f2d9941
  19. sq0_: .quad 0x000000ff000000ff,0x000000ff000000ff
  20. sq1_: .quad 0x0000ff000000ff00,0x0000ff000000ff00
  21. sq2_: .quad 0x00ff000000ff0000,0x00ff000000ff0000
  22. sq3_: .quad 0xff000000ff000000,0xff000000ff000000
  23. bts_: .quad 0x8080808080808080,0x8080808080808080
  24. dlb_: .quad 0x7f7f7f7f7f7f7f7f,0x7f7f7f7f7f7f7f7f
  25. xrb_: .quad 0x1b1b1b1b1b1b1b1b,0x1b1b1b1b1b1b1b1b
  26. rcn_: .quad 0x0000000200000001,0x0000000800000004
  27.      .quad 0x0000002000000010,0x0000008000000040
  28.      .quad 0x000000360000001b
  29.  
  30. .section .text
  31. .globl _start
  32.  
  33. _start:
  34.  
  35. pushq %r11
  36. pushq %r12
  37. pushq %r13
  38. pushq %r14
  39. pushq %r15
  40. pushq %r8
  41. pushq %r9
  42. pushq %rax
  43.  
  44.  
  45. ###movq $key_, %r11
  46. ###movq $inp_, %r10
  47.  
  48. movq $rcn_, %r12
  49.  
  50. prefetch sbx_
  51. prefetch sq0_
  52.  
  53. movq $-160, %r13
  54. movdqu (%r11), %xmm0
  55. movdqu %xmm0, -16(%rsp, %r13, 1)
  56. movl 12(%r11), %r11d
  57. movnti %r11d, (%rsp, %r13, 1)
  58.  
  59. _KeyExpansion:
  60.  
  61. rorl $8, (%rsp, %r13, 1)
  62.  
  63. movzx (%rsp, %r13, 1), %r14
  64. movzx 1(%rsp, %r13, 1), %r15
  65. movzx 2(%rsp, %r13, 1), %r8
  66. movzx 3(%rsp, %r13, 1), %r9
  67. movzx sbx_(, %r14, 1), %r14
  68. movzx sbx_(, %r15, 1), %r15
  69. movzx sbx_(, %r8, 1), %r8
  70. movzx sbx_(, %r9, 1), %r9
  71. movnti %r14d, (%rsp, %r13, 1)
  72. movnti %r15d, 1(%rsp, %r13, 1)
  73. movnti %r8d, 2(%rsp, %r13, 1)
  74. movnti %r9d, 3(%rsp, %r13, 1)
  75.  
  76. movl (%rsp, %r13, 1), %eax
  77. xorl (%r12), %eax
  78. addq $4, %r12
  79.  
  80. xorl -16(%rsp, %r13, 1), %eax
  81. movnti %eax, (%rsp, %r13, 1)
  82. xorl -12(%rsp, %r13, 1), %eax
  83. movnti %eax, 4(%rsp, %r13, 1)
  84. xorl -8(%rsp, %r13, 1), %eax
  85. movnti %eax, 8(%rsp, %r13, 1)
  86. xorl -4(%rsp, %r13, 1), %eax
  87. movnti %eax, 12(%rsp, %r13, 1)
  88.  
  89. movnti %eax, 16(%rsp, %r13, 1)
  90. addq $16, %r13
  91. jnz _KeyExpansion
  92.  
  93. _Cipher:
  94.  
  95. movdqu (%r10), %xmm0
  96. pxor  -176(%rsp), %xmm0
  97. movdqu %xmm0, -208(%rsp)
  98. movq $-16, %r13
  99.  
  100. _SubBytes:
  101.  
  102. movzx -192(%rsp, %r13, 1), %r14
  103. movzx -191(%rsp, %r13, 1), %r15
  104. movzx -190(%rsp, %r13, 1), %r8
  105. movzx -189(%rsp, %r13, 1), %r9
  106. movzx sbx_(, %r14, 1), %r14
  107. movzx sbx_(, %r15, 1), %r15
  108. movzx sbx_(, %r8, 1), %r8
  109. movzx sbx_(, %r9, 1), %r9
  110. movnti %r14d, -224(%rsp, %r13, 1)
  111. movnti %r15d, -223(%rsp, %r13, 1)
  112. movnti %r8d, -222(%rsp, %r13, 1)
  113. movnti %r9d, -221(%rsp, %r13, 1)
  114. addq $4, %r13
  115. jnz _SubBytes
  116.  
  117. _Shiftows:
  118.  
  119. movdqu -240(%rsp), %xmm0
  120. pshufd $0x39, %xmm0, %xmm1
  121. pshufd $0x4e, %xmm0, %xmm2
  122. pshufd $0x93, %xmm0, %xmm3
  123. pand sq1_, %xmm1
  124. pand sq2_, %xmm2
  125. pand sq3_, %xmm3
  126. pand sq0_, %xmm0
  127. pxor %xmm1, %xmm0
  128. pxor %xmm2, %xmm0
  129. pxor %xmm3, %xmm0
  130.  
  131. _Mixcolumns:
  132.  
  133. movdqa %xmm0, %xmm1
  134. movdqa %xmm1, %xmm2
  135. movdqa %xmm2, %xmm3
  136. movdqa %xmm3, %xmm4
  137.  
  138. pand bts_, %xmm0
  139. pcmpeqb bts_, %xmm0
  140. movdqa %xmm0, %xmm5
  141. pand %xmm0, %xmm1
  142. pandn %xmm2, %xmm0
  143. pand dlb_, %xmm1
  144. pslld $1, %xmm0
  145. pslld $1, %xmm1
  146. pxor xrb_, %xmm1
  147. pand %xmm5, %xmm1
  148. pxor %xmm1, %xmm0
  149. pxor %xmm0, %xmm2
  150. movdqa %xmm2, %xmm6
  151. psrld $8, %xmm2
  152. pxor %xmm2, %xmm0
  153. pslld $8, %xmm3
  154. pxor %xmm3, %xmm0
  155. pslld $8, %xmm3
  156. pxor %xmm3, %xmm0
  157. psrld $16, %xmm4
  158. pxor %xmm4, %xmm0
  159. psrld $8, %xmm4
  160. pxor %xmm4, %xmm0
  161. pslld $24, %xmm6
  162. pxor %xmm6, %xmm0
  163.  
  164. _AddRoundkey:
  165.  
  166. pxor -160(%rsp), %xmm0
[/code]

Cualquier pregunta ya saben.

Un saludo.

P.D: La instruccion prefetch no se si esta bien puesta, la intencion es copiar las tablas "lookup table" en la cache L1 para asi minimizar las frecuencias, ya que SubBytes utiliza mucho las tablas.

P.D.2: Si alguien entendido en el tema lee esto, me gustaria ver su critica.

Edito:


Corregido el error de Subbytes y el de Shiftrows.


Título: Re: AES 128 bits Encrypt [ASM Bit slice]
Publicado por: Vaagish en 14 Mayo 2014, 19:15 pm
Lo publicaste nomas! Te pasaste! Yo no entiendo la mayoría de esas instrucciones, y lo que vi del cifrado AES es poco, así que te imaginas que no entiendo nada de lo que veo ahí.. Pero te felicito nuevamente! Se que a veces no es fácil desprenderse de un code.. esperemos se respete el autor.

Pregunta.. cual seria el punto de entrada ahí? Como le indicarías que cifrar?

Saludos!! Felicidades!


Título: Re: AES 128 bits Encrypt [ASM Bit slice]
Publicado por: xv0 en 14 Mayo 2014, 19:35 pm
El registro r10 seria el puntero a los datos a cifrar, r11 seria el puntero con el key.

Haria falta otro registro o puntero para determinar la longitud de r10, pero eso es muy simple de hacer.

Un saludo.


Título: Re: AES 128 bits Encrypt [ASM Bit slice]
Publicado por: Karcrack en 17 Mayo 2014, 01:42 am
Muy buen código a pesar de AT&T :rolleyes:, gracias por compartir :-*


Título: Re: AES 128 bits Encrypt [ASM Bit slice]
Publicado por: xv0 en 16 Junio 2014, 17:06 pm
Aqui les dejo el code traducido a la sintaxis de intel, por el usuario @x64Core.

El code es algo raro, ya que no tiene conversion de llamada ni nada por el estilo, no puede testearlo gracias a OpenBSD que siempre me da problemas con algunos offset's, pero tendria que funcionar. Lo que hacia para comprobar la salida es traceando el kernel.

Código
  1. .data
  2.  
  3. sbx_:
  4.    dq 0c56f6bf27b777c63h,076abd7fe2b670130h
  5.    dq 0f04759fa7dc982cah,0c072a49cafa2d4adh
  6.    dq 0ccf73f362693fdb7h,01531d871f1e5a534h
  7.    dq 09a059618c323c704h,075b227ebe2801207h
  8.    dq 0a05a6e1b1a2c8309h,0842fe329b3d63b52h
  9.    dq 05bb1fc20ed00d153h,0cf584c4a39becb6ah
  10.    dq 085334d43fbaaefd0h,0a89f3c507f02f945h
  11.    dq 0f5389d928f40a351h,0d2f3ff1021dab6bch
  12.    dq 01744975fec130ccdh,073195d643d7ea7c4h
  13.    dq 088902a22dc4f8160h,0db0b5ede14b8ee46h
  14.    dq 05c2406490a3a32e0h,079e4959162acd3c2h
  15.    dq 0a94ed58d6d37c8e7h,008ae7a65eaf4566ch
  16.    dq 0c6b4a61c2e2578bah,08a8bbd4b1f74dde8h
  17.    dq 00ef6034866b53e70h,09e1dc186b9573561h
  18.    dq 0948ed9691198f8e1h,0df2855cee9871e9bh
  19.    dq 06842e6bf0d89a18ch,016bb54b00f2d9941h
  20. sq0_:
  21.    dq 0000000ff000000ffh,0000000ff000000ffh
  22. sq1_:
  23.    dq 00000ff000000ff00h,00000ff000000ff00h
  24. sq2_:
  25.    dq 000ff000000ff0000h,000ff000000ff0000h
  26. sq3_:
  27.    dq 0ff000000ff000000h,0ff000000ff000000h
  28. bts_:
  29.    dq 08080808080808080h,08080808080808080h
  30. dlb_:
  31.    dq 07f7f7f7f7f7f7f7fh,07f7f7f7f7f7f7f7fh
  32. xrb_:
  33.    dq 01b1b1b1b1b1b1b1bh,01b1b1b1b1b1b1b1bh
  34. rcn_:
  35.    dq 01b1b1b1b1b1b1b1bh,01b1b1b1b1b1b1b1bh
  36.    dq 00000002000000010h,00000008000000040h
  37.    dq 0000000360000001bh
  38. ptr_:    
  39.    dq 00706050403020100h,00f0e0d0c0b0a0908h
  40.    dq 07766554433221100h,0ffeeddccbbaa9988h
  41.  
  42.  
  43. .code
  44. _start:
  45.    lea r11,ptr_
  46.    prefetch sbx_
  47.    prefetch [sbx_+40h]
  48.    prefetch [sbx_+80h]
  49.    prefetch [sbx_+0c0h]
  50.    prefetch [sq0_]
  51.    prefetch [sq0_+40h]
  52.    prefetch [sq0_+80h]
  53.    mov r13,0ffffffffffffff60h
  54.    movdqu xmm0,xmmword [r11]
  55.    movdqu xmmword[rsp+r13-10h],xmm0
  56.    mov r11d,dword [r11+0ch]
  57.    movnti dword [rsp+r13],r11d
  58.    lea r12,rcn_
  59.    lea r11,ptr_
  60.  
  61. _exk:    
  62.    ror dword [rsp+r13],08h
  63.    movzx r14,byte [rsp+r13]
  64.    movzx r15,byte [rsp+r13+1]
  65.    movzx r8,byte [rsp+r13+2]
  66.    movzx r9,byte [rsp+r13+3]
  67.    movzx r14,byte [r14+sbx_]
  68.    movzx r15,byte [r15+sbx_]
  69.    movzx r8,byte [r8+sbx_]
  70.    movzx r9,byte [r9+sbx_]
  71.    movnti dword [rsp+r13],r14d
  72.    movnti dword [rsp+r13+01h],r15d
  73.    movnti dword [rsp+r13+02h],r8d
  74.    movnti dword [rsp+r13+03h],r9d
  75.    mov eax,[rsp+r13]
  76.    xor eax,[r12]
  77.    add r12,04h
  78.    xor eax,[rsp+r13-10h]
  79.    movnti dword [rsp+r13],eax
  80.    xor eax,[rsp+r13-0ch]
  81.    movnti dword [rsp+r13+04h],eax
  82.    xor eax,[rsp+r13-08h]
  83.    movnti dword [rsp+r13+08h],eax
  84.    xor eax,[rsp+r13-04h]
  85.    movnti dword [rsp+r13+0ch],eax
  86.    movnti dword [rsp+r13+10h],eax
  87.    add r13,10h
  88.    jnz _exk
  89.  
  90. _ak1:    
  91.    movdqu xmm0,dqword [r11+10h]
  92.    pxor xmm0,dqword [rsp-0b0h]
  93.    mov r11,0ffffffffffffff60h
  94.    mov rbx,09h
  95.  
  96. _x0:    
  97.    mov r13,0fffffffffffffff0h
  98.    movdqu dqword [rsp-0d0h],xmm0
  99.  
  100. _sxm:    
  101.    movzx r14,byte [rsp+r13-0c0h]
  102.    movzx r15,byte [rsp+r13-0bfh]
  103.    movzx r8,byte [rsp+r13-0beh]
  104.    movzx r9,byte [rsp+r13-0bdh]
  105.    movzx r14,byte [r14+sbx_]
  106.    movzx r15,byte [r15+sbx_]
  107.    movzx r8,byte [r8+sbx_]
  108.    movzx r9,byte [r9+sbx_]
  109.    movnti dword [rsp+r13-0e0h],r14d
  110.    movnti dword [rsp+r13-0dfh],r15d
  111.    movnti dword [rsp+r13-0deh],r8d
  112.    movnti dword [rsp+r13-0ddh],r9d
  113.    add r13,04h
  114.    jnz _sxm
  115. _shw:    
  116.    movdqu xmm0,dqword [rsp-0f0h]
  117.    pshufd xmm1,dqword [rsp-0f0h],39h
  118.    pshufd xmm2,dqword [rsp-0f0h],4eh
  119.    pshufd xmm3,dqword [rsp-0f0h],93h
  120.    pand xmm1,dqword [sq1_]
  121.    pand xmm2,dqword [sq2_]
  122.    pand xmm3,dqword [sq3_]
  123.    pand xmm0,dqword [sq0_]
  124.    pxor xmm0,xmm1
  125.    pxor xmm0,xmm2
  126.    pxor xmm0,xmm3
  127. _mxm:    
  128.    movdqa xmm1,xmm0
  129.    movdqa xmm2,xmm1
  130.    movdqa xmm3,xmm2
  131.    movdqa xmm4,xmm3
  132.    pand xmm0,dqword [bts_]
  133.    pcmpeqb xmm0,dqword [bts_]
  134.    movdqa xmm5,xmm0
  135.    pand xmm1,xmm0
  136.    pandn xmm0,xmm2
  137.    pand xmm1,dqword [dlb_]
  138.    pslld xmm0,01h
  139.    pslld xmm1,01h
  140.    pxor xmm1, dqword [xrb_]
  141.    pand xmm1,xmm5
  142.    pxor xmm0,xmm1
  143.    pxor xmm2,xmm0
  144.    movdqa xmm6,xmm2
  145.    psrld xmm2,08h
  146.    pxor xmm0,xmm2
  147.    pslld xmm3,08h
  148.    pxor xmm0,xmm3
  149.    pslld xmm3,08h
  150.    pxor xmm0,xmm3
  151.    psrld xmm4,10h
  152.    pxor xmm0,xmm4
  153.    psrld xmm4,08h
  154.    pxor xmm0,xmm4
  155.    pslld xmm6,18h
  156.    pxor xmm0,xmm6
  157.    pxor xmm0,dqword [rsp+r11]
  158.  
  159. _ark:    
  160.    add r11,10h
  161.    dec rbx
  162.    jnz _x0
  163.    movdqu dqword [rsp-0d0h],xmm0
  164.    mov r13,0fffffffffffffff0h
  165.  
  166. _ltn:    
  167.    movzx r14,byte [rsp+r13-0c0h]
  168.    movzx r15,byte [rsp+r13-0bfh]
  169.    movzx r8,byte [rsp+r13-0beh]
  170.    movzx r9,byte [rsp+r13-0bdh]
  171.    movzx r14,byte [r14+sbx_]
  172.    movzx r15,byte [r15+sbx_]
  173.    movzx r8,byte [r8+sbx_]
  174.    movzx r9,byte [r9+sbx_]
  175.    movnti dword [rsp+r13-0e0h],r14d
  176.    movnti dword [rsp+r13-0dfh],r15d
  177.    movnti dword [rsp+r13-0deh],r8d
  178.    movnti dword [rsp+r13-0ddh],r9d
  179.    add r13,04h
  180.    jnz _ltn
  181.    movdqu xmm0,dqword [rsp-0f0h]
  182.    pshufd xmm1,dqword [rsp-0f0h],39h
  183.    pshufd xmm2,dqword [rsp-0f0h],4eh
  184.    pshufd xmm3,dqword [rsp-0f0h],93h
  185.    pand xmm1,dqword [sq1_]
  186.    pand xmm2,dqword [sq2_]
  187.    pand xmm3,dqword [sq3_]
  188.    pand xmm0,dqword [sq0_]
  189.    pxor xmm0,xmm1
  190.    pxor xmm0,xmm2
  191.    pxor xmm0,xmm3
  192.    pxor xmm0,dqword [rsp+r11]
  193.    movdqu dqword [rsp-0f0h],xmm0

El resultado seria.

Código:
0x69c4e0d86a7bb0430d8cdb78070b4c55a

Un saludo.