Foro de elhacker.net

Seguridad Informática => Criptografía => Mensaje iniciado por: xv0 en 11 Mayo 2020, 03:23 am



Título: GCM tablas M
Publicado por: xv0 en 11 Mayo 2020, 03:23 am
Hola

La duda que tengo esta en este paper, punto 4.1 Software:

https://luca-giuzzi.unibs.it/corsi/Support/papers-cryptography/gcm-spec.pdf (https://luca-giuzzi.unibs.it/corsi/Support/papers-cryptography/gcm-spec.pdf)

Segun lo que puedo entender la variable P es una representacion de un elemento primitivo en gf(2), el modulo f es la variable R.

La x es un byte, tiene unas 256 conbinaciones, las tablas M son de 256 elementos.

Mas o menos todo esto lo llevo bien, si vamos a la pag 9, en (3) se puede observar la variable P que es el polinomio α.

En la pag 14 tenemos el algoritmo numero 3, con este podriamos computar las tablas M, los 65,535 bytes/key si no me equivoco. Doy por sentado de que con el algortimo 3, ya podria crear todas las tablas, cifrando la cadena de de 128 bits de 0s con el codigo.

Pero no acabo de entender del todo la variable P del algritmo 3.

Perdon si no se me entiende bien, estoy algo liado.

Saludos.


Título: Re: GCM tablas M
Publicado por: kub0x en 11 Mayo 2020, 14:35 pm
La representacion del finite field GF(p^n) se puede realizar mediante el quotient ring de F_p(x)/f(x) donde f(x) es un polinomio irreducible sobre (over) GF(2) de grado n. Pero resulta, que la definición se puede realizar mediante un elemento primitivo, que es a su vez un cero de un polinomio irreducible.

Y te preguntarás, ¿cómo que un cero de un polinomio irreducible? ¿si un polinomio es irreducible no tiene ceros verdad? Bueno f(x) está over GF(2) y no tiene ceros ahí, cierto, pero y sobre una extensión, es decir, la x que entra a f(x) en vez de estar over GF(2) esté over GF(2^2) si su grado es 2. Puede que tenga un cero llamado alpha, y alpha sería un polinomio over GF(2) en vez de ser un elemento in GF(2). El over y el in lían mucho, over es que los coeficientes del polinomio estan definidos sobre GF e in GF significa que el polinomio esta en GF y sus  coeficientes en la base.

Por lo tanto podemos realizar tablas de multiplicación, exponenciales, aditivas, negativas, bases polinomiales en espacios vectoriales, vamos, muchisimas cosas.

Matemáticamente, digamos que tenemos una extensíon E sobre el campo F, puede ser GF(2^2) sobre GF(2) imaginate. Si yo te doy un poly irred sobre GF(2) que obviamente no tiene ceros en GF(2), encuentro un polinomio alpha en la extensión E tal que f(alpha)=0 entonces decimos que alpha es algebraica sobre el campo F.

Ahora mismo, creo que lo que te diría sobre el algoritmo te liaría aún más. Te recomiendo que cojas lo más parecido al RFC, compares, y postees de nuevo por aquí a ver si lo puedo simplificar para que se entienda desde el punto de vista de la computación. Resumiendo, leyendo las descripciones, por ejemplo V.P, V.P^2 etc quizá haga referencia a que P es un poly en alpha sobre GF(2) y que va tomando los coeficientes alpha^i y multiplicandolos por V (lo que es un shifteo como se ve arriba en el paper).

Si tengo (a^5+a^4+a^2).(a^3+a^2) sería (a^5+a^4+a^2).a^3 + (a^5+a^4+a^2).a^2. La a es alpha. Creo que entiendo eso, por lo que te digo que si me pasas algo más estandar mejor. Esto sería aprovechar la propiedad distributiva tomando alpha como la "x" (con el valor primitivo). Recuerda que estamos en F[ a ]/f(a) en vez de F[ x ]/f(x) debido a las relaciones anteriormente dichas.

Fíjate en este ejemplo utilizando Zech's Logarithms:

https://en.wikipedia.org/wiki/Zech%27s_logarithm#Examples

Métodos generales para aritmética en finite fields:

https://en.wikipedia.org/wiki/Finite_field_arithmetic

En este PDF situate en la página 19 y verás como también referencian el uso de las tablas logaritmicas para computar multiplicaciones, entre otras.

https://web.stanford.edu/class/ee392d/Chap7.pdf

EDIT=Una pena que el foro no tenga mathjax, sería mas fácil de escribir y leer notación.

Saludos.


Título: Re: GCM tablas M
Publicado por: xv0 en 11 Mayo 2020, 19:03 pm
Hola

El de metodos generales, me recuerdo que ya lo lei en su dia, por el tema de AES. Voy a leer con calma los dos restantes.

Creo que ya cada vez lo tengo mas claro, tambien me preocupa mucho el peso de 64K que tienen las tablas, y cada vez que quiera cambiar el codigo volver a calcular y el espacio en memoria, pero eso ya es otra historia.

He visto que se pueden hacer tablas de 4-bit, y ocuparia unos 8,192 bytes, y solo consumiria un pelin mas de recursos, pero el espacio baja mucho.

Pero ya tengo bastante lio de momento, gracias por el apoyo.

Saludos.


Título: Re: GCM tablas M
Publicado por: kub0x en 12 Mayo 2020, 13:14 pm
Pero ya tengo bastante lio de momento, gracias por el apoyo.

Realmente lo que estás haciendo es díficil, ya que entender un proyecto entero, por fases y algoritmos lleva semanas, pues tienes que entender bien cada parte. No te fustres, sigue el camino. Las dudas estarían bien acumularlas y cuando no puedas avanzar más, estudiar y responder tus propias preguntas. Te puedo decir que hace un año me inicié en una rama de la crypto de la cual no tenía ni idea, y a día de hoy, me veo con un nivel fuertísimo y leyendo lo que los expertos suben sin problema. Si lo tienes por hobby y te gusta, en poco tiempo veras grandes resultados.

En mi rutina utilizo Sage y Wolfram Mathematica. Traen métodos para reducir modulo f(x) y un sinfín más. Si no en C++ utilizo NTL que es una librería que es un All in 1. Trae lo básico de number theory y aritmética en GL(n,p), GL(n,p^e), GF(p), GF(p^n), creo que es incluso mejor utilizar éstas que rollear tus propios métodos aritméticos para la crypto.

Cuando no tengo ordenador, o el ejercicio que me planteo a mi mismo es pequeñito para encontrar contradiciones o simplemente curiosidades para investigar, utilizo las siguientes técnicas para realizar multiplicaciones en finite fields:

Si la función módulo es x^n-1 over F_q entonces dicho finite field es isomorfo al grupo de matrices circulantes over F_q denotado por C_n y multiplicando la matriz del poly p(x) por la 1º columna de la matriz del poly q(x) nos dan p(x).q(x). En este caso C_n  es un group algebra, y su representación como ves nos deja computar en una estructura u otra, al final es lo mismo.

Si la función módulo no es x^n-1 entonces podemos linearizar un polinomio, esto es, coger su representación lineal. Esto es un tema que he descubierto digamos, si quieres hacer muchos productos de p(x), digamos una tupla de  r productos { p(x).q_1(x), ..., p(x).q_r(x) } en vez de invocar el algoritmo convencional r veces, capturamos la transformación lineal de p(x) el cual tendría coeficientes enteros, claro. Entonces nos queda una matriz que representa el producto de p(x) por cualquier polinomio q(x). Sólo tenemos que introducir q(x) como vector (no como polinomio), y multiplicar M_p(x).v_q(x). Es un trucazo, pues calcularía la inversa de p(x) también si haces M^(-1)_p(x). No lo he visto en literatura, pero es algo que cualquiera que conozca los teoremas de representacion lineal de grupos puede llegar a saber.

Otro método típico es el descrito arriba con la propiedad distributiva, cojo p(x)=(a^5+a^4+a^2+1) y q(x)=(a^3+a+1) y p(x).q(x)= p(x)*a^3 + p(x)*a + p(x)*1. ¿Por qué? Bueno, digamos que q(x) es un polinomio, donde a su vez, cada coeficiente se puede tomar como polinomio. Claro está, que nos faltaría reducir dicho producto mod f(x).

Seguramente esto lo encontreís aburrido y/o tedioso de primeras, pero bueno, siempre podeís pedir un ejemplo por aquí.

Saludos.


Título: Re: GCM tablas M
Publicado por: xv0 en 15 Mayo 2020, 08:55 am
Realmente lo que estás haciendo es díficil, ya que entender un proyecto entero, por fases y algoritmos lleva semanas, pues tienes que entender bien cada parte. No te fustres, sigue el camino. Las dudas estarían bien acumularlas y cuando no puedas avanzar más, estudiar y responder tus propias preguntas. Te puedo decir que hace un año me inicié en una rama de la crypto de la cual no tenía ni idea, y a día de hoy, me veo con un nivel fuertísimo y leyendo lo que los expertos suben sin problema. Si lo tienes por hobby y te gusta, en poco tiempo veras grandes resultados.

Tengo que hacer lo que me acabas de decir, una recopilacion de todos los problemas que veo, y de hay sacar una conclusion, ya que no he avanzado mucho desde mi anterior mensaje, he buscado mas informacion tampoco es que haya mucha...

https://crypto.stackexchange.com/questions/57785/gcm-cipher-m0-tables-semantic-questions-on-how-to-implement-gcm?rq=1 (https://crypto.stackexchange.com/questions/57785/gcm-cipher-m0-tables-semantic-questions-on-how-to-implement-gcm?rq=1)

https://crypto.stackexchange.com/questions/67642/gcm-optimisation-using-m-0-and-r-tables-calculation-of-r?rq=1 (https://crypto.stackexchange.com/questions/67642/gcm-optimisation-using-m-0-and-r-tables-calculation-of-r?rq=1)

Ya veo que no soy el unico con problemas xD.

Si, todo lo que ago es por hobby pero con un proposito, tengo mas cosas por hacer, cosas que ni siquiera he planteado, y ahora mismo lo que siento es una perdida de tiempo, ya que no puedo estar profundizando tanto en las cosas, cuando te topas con este tipo de problemas te das cuenta de que no sabes nada...

En mi rutina utilizo Sage y Wolfram Mathematica. Traen métodos para reducir modulo f(x) y un sinfín más. Si no en C++ utilizo NTL que es una librería que es un All in 1. Trae lo básico de number theory y aritmética en GL(n,p), GL(n,p^e), GF(p), GF(p^n), creo que es incluso mejor utilizar éstas que rollear tus propios métodos aritméticos para la crypto.

Si, depende de como se mire estoy inventando la rueda de nuevo, seria mucho mas facil usar la libreria de openssl o cualquier otra, y hacer llamadas, pero no me gusta programar de esa forma me gusta crear mis propias funciones (no me gusta que mis programas solo haya call call call call xD), todos sabemos pasar parametros a funciones y llamarlas (no quiero ofender a nadie) a parte para el proposito que tengo es mejor asi.

Ahora mismo tengo esta rutina para hacer las multiplicaciones:

Código
  1. section .data
  2.  
  3. _R: .quad 0x0000000000000000,0xe100000000000000
  4.  
  5. section .text
  6. globl _mulbl
  7.  
  8. _mulbl:
  9.  
  10.  
  11. pushq %rax
  12. movdqa $-127, %rax         ; rax  == i
  13. pxor %xmm0, %xmm0          ; xmm0 == Z
  14.  
  15.  
  16. _C.0:
  17.  
  18. andq $1, 127(%rax,%r10)    ; %r10 == x
  19. jz _C.1
  20. pxor (%r11), %xmm0         ; %r11 == V
  21.  
  22. _C.1:
  23.  
  24. movdqa (%r11), %xmm1
  25. andq $1, 127(%r11)
  26. jz _C.2
  27.  
  28. psrldq $1, %xmm1
  29. pxor _R, %xmm1
  30. movdqa %xmm1, (%r11)
  31. jmp _C.3
  32.  
  33. _C.2:
  34.  
  35. psrldq $1, %xmm1
  36. movdqa %xmm1, (%r11)
  37.  
  38. _C.3:
  39.  
  40. incq %rax
  41. js _C.0
  42.  
  43. popq %rax
  44. retq
  45.  

Bueno haciendo mis calculos a base de los del paper, sale mas o menos a unos 80-90 OPS por byte, sin tablas. En la pag 12 del documento sale la tabla, 119 OPS en la implementacion del paper.

Si miramos la tabla, con el metodo Shoup’s, mejora notablemente el rendimiento, comparando mi funcion con el Shoup’s de 4-bit, hay mas o menos un 30% de rendimiento superior a la mia.
Pero dudo que mi funcion cause overhead no?

Lo dicho dicho, voy a leer un pelin mas.

Saludos.


Título: Re: GCM tablas M
Publicado por: xv0 en 18 Mayo 2020, 02:47 am
Hola

Parace que voy entendiendo mas el paper, voy a explicarlo:

Cuando tengo que multiplicar por la variable P no es mas que un shift a los indices (creo que eso ya me lo has explicado @kub0x). Arriba de la pag 10 tengo el ejemplo de la multiplicacion por X · P y supongo que le de abajo es para multiplicar dos elementos.

Citar
Z ← 0, V ← X
for i =0 to 127 do
if Yi =1 then
Z ← Z ⊕ V
end if
V ← V · P
end for
return Z

Practicamente es lo mismo que el algoritmo 1, que explique en mi anterior duda de la sintaxis, si no me equivoco:

Citar
Z ← 0, V ← X
 for i =0 to 127 do
if Yi =1 then Z ← Z ⊕ V
end if
if V127 =0
then V ← rightshift(V )
else
V ← rightshift(V ) ⊕ R
end if
end for return Z

Por lo que entiendo:

Citar
V ← V · P

Es igual a

if V127 =0 then
V ← rightshift(V )
else
V ← rightshift(V ) ⊕ R

Segun los ejemplos de la pag 9 en las formulas (3) (5), serian lo mismo no?

Bien ya en la pag 11 en el ejemplo de la desconposicion de X (7), xi hace referencia a 1 byte de X, pero mi duda esta en P^8i, en el primer for 8·i daria cero y al final cuando i es 15 daria 120. Esa parte no la entiendo mucho la verdad.

Creo que la respuesta esta en estos parrafos:

Citar
Note that i loops from 15 down to zero so that the rightmost byte is associated with the lowest power of P8. In order to use this method, we need an efficient way to compute X · P8 for an arbitrary element X.


The expression x · P8(i+1), for x ∈S and 0 ≤ i< 15, corresponds to a simple bit-rotation of the element x totherightbyeightbits.Thusthefirst15termsonthe right-handsideofEquation 9can be computed with only a rotation. The expression x · P128 is not so simple, but can be computed usinga table,aswedid above.

Pasando al algorimo 3 y a su explicacion arriba, vale creo que entiendo la funcion, en la explicacion cuando dice esto:

Citar
The table can be computed using Algorithm 3, which makes a single pass over the data, using only 247 field additions and eight ‘mutliply by P’ operations

Citar
while i> 0 do
M ← M[2i] · P
i ←li/2J

Partiendo de que el valor de i es 64, Ese ciclo multiplicaria por P ocho veces si no me equivoco.

Bien y en la parte de la multiplicacion por P:

Citar
M ← M[2i] · P

Es igual a

if  M[2i]127 =0 then
M ← rightshift(M[2i])
else
M ← rightshift(M[2i]) ⊕ R
end if

Y las 247 adiciones seria:

Citar
M[i + j]= M ⊕M[j]

Estoy en lo cierto?

Creo que con eso ya bastaria para crear la tabla M0, pero no entiendo lo de las elevacion a P a 8, 128 o i.

Saludos y gracias.


Título: Re: GCM tablas M
Publicado por: xv0 en 21 Mayo 2020, 00:45 am
Voy a dejar mis avances, creo que ya casi lo tengo, el algoritmo numero 3 el de la creacion de la tabla M0 es de la siguiente manera:

Citar
     while 1
-----------------

M[128] =  H
M[64]  =  M[128]· P
M[32]  =  M[64] · P
M[16]  =  M[32] · P
M[8]   =  M[16] · P
M[4]   =  M[8]  · P
M[2]   =  M[4]  · P
M[1]   =  M[2]  · P

     while 2 and for
-----------------

for i = 2 

M[3]   =  M[2] XOR M[1]

i = 4   

M[5]   =  M[4] XOR M[1]
M[6]   =  M[4] XOR M[2]
M[7]   =  M[4] XOR M[3]

i = 8   

M[9]   =  M[8] XOR M[1]
M[10]  =  M[8] XOR M[2]
M[11]  =  M[8] XOR M[3]
M[12]  =  M[8] XOR M[4]
M[13]  =  M[8] XOR M[5]
M[14]  =  M[8] XOR M[6]
M[15]  =  M[8] XOR M[7]

i = 16   

M[17]  =  M[16] XOR M[1]
M[18]  =  M[16] XOR M[2]


to i =  .......128

M[0]  =  0^128

end
ret M

Eso crearia la tabla M0 de 4096 bytes a partir de H, pero tengo la siguente duda, ya que me quedaria por crear la tabla de R que son 1024 bytes. Supongo que se refiere a esto:

Citar
The index 192 (decimal)has a binary decomposition of 11000000, so M0[192] = H ⊕ H · P = M0[64] ⊕ M0[128].

Otra cosa que aun no he entendido es en el algoritmo 2 a la hora de usar las tablas M0, en la directiva byte(X,i), no la he encontrado documentada en el paper, pero supongo que tomara el byte de X segun el valor de i, pero no entiendo lo siguiente, en el caso de ser el valor de X "0xff" se haria un XOR a Z con esa tabla, pero como estan las tablas enumeradas? No se si me explico.

Saludos.


Título: Re: GCM tablas M
Publicado por: kub0x en 17 Junio 2020, 14:07 pm
Hola,

hace un tiempo que no comento en este post. Estudiando el campo de los finite fields, hace un tiempo di con una representación del producto de dos polinomios o elementos de GF(p^e) mediante operaciones en un algebra de matrices. Es decir, GF(p^e) es isomorfo a un algebra matricial, donde cada matriz representa un polinomio p(x) en GF(p^e) o F_q como lo quieras llamar.

Por lo tanto, dado un polinomio irreducible f(x) modulo p, podemos representar el producto p(x)q(x) = r(x) mediante una operacion Ax = b donde A es una matriz cuadrada que siempre tendrá determinante 1, por lo tanto no singular. x es un vector columna, es decir de n y b igual.

La matriz A en columnas quedaría: A = [p(x), p(x)*x,p(x)*x^2,...,p(x)*x^(n-1)]. Entonces al computar A.(y1,...,yn) obtendremos el producto el producto r(x) de ambos polinomios, como vector es decir en F_q^{n} que es un espacio vectorial (imaginate (1,0,1) en vector es 1+x^2.

Un ejemplito, toma el poly irreducible f(x) = y^4+y^3+1. La matriz A queda:

A =

(https://i.imgur.com/ZhepVca.png)

y por lo tanto r(x)=pq(x) se escribe como un sistema de n ecuaciones no lineales en 2n variables:

x1 y1 + x4 y2 + (x3 + x4) y3 + (x2 + x3 + x4) y4,
x2 y1 + x1 y2 + x4 y3 + (x3 + x4) y4,
x3 y1 + x2 y2 + x1 y3 + x4 y4,
x4 y1 + (x3 + x4) y2 + (x2 + x3 + x4) y3 + (x1 + x2 + x3 + x4) y4

Ahora selecciona un p(x) y q(x) en este finite field. Múltiplica y comprueba que el sistema obtiene r(x).

Con este sistema puedes computar incluso las inversas, poli caracteristico, traza, trabajar en extensiones etc

Lo mismo pasa con los linearised polynomials, al final son matrices que definen la misma transformación lineal.

Saludos.


Título: Re: GCM tablas M
Publicado por: xv0 en 17 Junio 2020, 21:51 pm
Hola

Agradezco el apoyo, ya tengo algo terminado, cuando tenga todo listo lo subire, yo tambien hace tiempo que no digo nada por el echo que ahora mismo estoy haciendo otra cosa, como arreglarme la moto xD, no es broma.

A el codigo que subi esta mal, en casi todo, no se que me fumaria aquel dia, ya pondre el bueno.

Saludos.


Título: Re: GCM tablas M
Publicado por: kub0x en 24 Junio 2020, 21:01 pm
Hola

Agradezco el apoyo, ya tengo algo terminado, cuando tenga todo listo lo subire, yo tambien hace tiempo que no digo nada por el echo que ahora mismo estoy haciendo otra cosa, como arreglarme la moto xD, no es broma.

A el codigo que subi esta mal, en casi todo, no se que me fumaria aquel dia, ya pondre el bueno.

Saludos.

Estaría bien que pusieras por aquí el code de multiplicar dos elementos en GF(p^n). Así podemos comparar costes y si resulta mejor te facilito el código de multiplicación, el cual es matricial. Por lo demás, que siga todo bien.

Saludos.


Título: Re: GCM tablas M
Publicado por: xv0 en 21 Julio 2021, 22:42 pm
Hola

Cuanto tiempo ha pasado ya, disculpas por abandonar el tema pero he tenido que ocuparme de otras cosas.

Aqui dejo el codigo, lo he testeado a mano siguiendo el algoritmo del PDF del NIST el 1. Testeado con 1 byte.

Se que se puede mejorar, pero no he encontrado un TEST VECTOR para este algoritmo, como los que hay en el PDF de AES al final de todo.

He pensado en contruir todo el PAPER del NIST y luego retomar esto de las las tablas, no se o ire tirando.

Código
  1. .section .text
  2. .globl _start
  3. .align 16
  4.  
  5. _start:
  6.  
  7. pxor %xmm0, %xmm0                        # xmm0 | Z
  8. movdqu %xmm1, (%rsp)                     # rsp  | x
  9. movdqu %xmm1, -16(%rsp)                  # rsp  | V
  10.  
  11. _l02:
  12.  
  13. movq $-16, %rax                           # contador byte
  14.  
  15. _l01:
  16.  
  17. xorq %r8, %r8                          # contador bit
  18. movq $-8, %r9
  19.  
  20. _l0:
  21.  
  22. btq %r8, 16(%rsp, %rax)                 # compruebo el bit  de el primer byte
  23. jnc _l1                                  # si el bit es 0,  paso a LSB
  24.  
  25. movdqu -16(%rsp), %xmm3
  26. pxor %xmm3, %xmm0                        # si el bit es 1, Z xor V, paso a LSB
  27.  
  28. _l1:
  29.  
  30. btq $63, -8(%rsp)                        # compruebo el ultimo bit 127 LSB 1 (V)
  31. jc _l2
  32.  
  33. movq -8(%rsp), %rbx
  34. shlq $63, %rbx
  35. shrq $1, -8(%rsp)
  36. shrq $1, -16(%rsp)                       # LSB(V)=0
  37. orq %rbx, -16(%rsp)
  38.  
  39. jmp _l3
  40.  
  41. _l2:
  42.  
  43. movq -8(%rsp), %rbx
  44. shlq $63, %rbx
  45. shrq $1, -8(%rsp)                        #LSB(V)=1
  46. shrq $1, -16(%rsp)
  47. orq %rbx, -16(%rsp)
  48. xorq $0x00000000000000e1, -16(%rsp)
  49.  
  50. _l3:
  51.  
  52. incq %r8
  53. incq %r9
  54. js _l0
  55.  
  56. incq %rax
  57. js _l01

El codigo en realidad no es muy bueno, comparandolo con las tablas GCM, y ni hablar del paso de parametros. Y todas las operaciones las realizo en memoria.

Me gustaria encontrar un test vector de este algoritmo, si alguien sabe algo por favor que me lo diga, o que me confirme que el codigo opera bien.

Saludos.


Título: Re: GCM tablas M
Publicado por: xv0 en 7 Febrero 2022, 00:59 am
Hola, cuanto tiempo ha pasado, deje de lado el problema por otros asuntos pero ya lo tengo resuelto, y de vez en cuando leo el foro y me acorde de este problema que publique. Y no me gusta dejar las cosas colgadas.

Bien, el ultimo codigo que comparti esta mal, interprete erroneamente el algoritmo y la multiplicacion de galois de GCM.

Lo que sucede es que GCM toma los bytes en little-endian y los bits en big-endian, hay estaba el problema a parte de algunas tonterias mas.

Por ejemplo el polinomio f = 1 + α + α2 + α7 = 0x87(10000111) pero en realidad es  0xe1 (11100001) ya que como dije anteriormente los bit son representados en big-endian.

Pues podemos aplicar todo eso al algoritmo de multiplicacion, que sucede que el bit menos significativo 0 es realidad es 127, si por ejemplo 0x80, se representa como 0x01. Aqui el codigo donde se puede ver todo lo que digo:

Código
  1. .section .data
  2.  
  3. R: .quad 0xb32b6656a05b40b6,0x952b2a56a5604ac0
  4. S: .quad 0xffcaff95f830f061,0xdfa6bf4ded81db03
  5.  
  6. .section .text
  7. .globl _start
  8. .align 16
  9.  
  10. _start:
  11.  
  12. pxor %xmm0, %xmm0                        # xmm0 | Z
  13. movdqu R, %xmm1
  14. movdqu S, %xmm2
  15. movdqu %xmm1, (%rsp)                     # rsp  | Y
  16. movdqu %xmm2, -16(%rsp)                  # rsp-16  | V
  17.  
  18. _l02:
  19.  
  20. movq $15, %rax                           # byte position
  21.  
  22. _l01:
  23.  
  24. movq $7, %r8
  25.  
  26. _l0:
  27.  
  28. btq %r8, (%rsp, %rax)                 # check the bit posotion 0 - 7
  29. jnc _l1                                 # bit equal to 0,  jump to _l1
  30.  
  31. movdqu -16(%rsp), %xmm3
  32. pxor %xmm3, %xmm0                        # bit equal to 1, Z xor V
  33.  
  34. _l1:
  35.  
  36. btq $0, -16(%rsp)                        # check V[127] equal to 1 V = rightshift(V) xor R
  37. jc _l2                                   # equal to 0, V = rightshift(V)
  38.  
  39.  
  40. movq -8(%rsp), %rbx
  41. shlq $63,%rbx
  42. shrq $1, -8(%rsp)
  43. shrq $1, -16(%rsp)                       #Rightshift V in memory
  44. orq %rbx, -16(%rsp)
  45.  
  46. jmp _l3
  47.  
  48. _l2:
  49.  
  50. movq -8(%rsp), %rbx
  51. shlq $63, %rbx
  52. shrq $1, -8(%rsp)
  53. shrq $1, -16(%rsp)                       #Rightshift V in memory and xored by R
  54. orq %rbx, -16(%rsp)
  55. xorb $0xe1, -1(%rsp)
  56.  
  57. _l3:
  58.  
  59. decq %r8                                   #next bit position
  60. jns _l0                                     #r9 equal to 0, jump to next byte
  61.  
  62. decq %rax                                  #byte addition, rax equal to 0, block finished
  63. jns _l01
  64.  
  65.  
  66. //RET Z IN XMM0

R Y S son los valores a multiplicar sacados de un Test vector. Bueno lo dejo aqui. Seguramente que tenga las tablas para algun dia... voy haciendo cuando puedo.

Saludos.

P.D:Cualquier pregunta ya saben.