Cada implementación TLS1.0 debe admitir el uso del conjunto de cifrado TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA . Esta suite de cifrado dicta que el servidor debe enviar un mensaje ServerKeyExchange con las siguientes estructuras:
struct {
opaque dh_p<1..2^16-1>;
opaque dh_g<1..2^16-1>;
opaque dh_Ys<1..2^16-1>;
} ServerDHParams;
select (SignatureAlgorithm)
{ ....... omitted ........
case dsa:
digitally-signed struct {
opaque sha_hash[20];
};
} Signature;
El valor sha_hash
se calcula mediante SHA(ClientHello.random + ServerHello.random + ServerParams)
y luego el hash calculado se asigna al algoritmo DSA para producir la firma (que a su vez está codificada en DER). Mi pregunta es ¿cómo se derivan los aportes a la DSA en este caso?
Según wikipedia DSA requiere los siguientes parámetros:
- N: q longitud
- L: p longitud
- q: N-bit prime
- p: Módulo principal de L-bit tal que p-1 es un múltiplo de q
- g: un número cuyo orden multiplicativo módulo p es q
- x: clave secreta, donde
0 < x < q
- y: clave pública y = g ^ x mod p
¿Es la clave pública (o cualquier otro valor) el mismo valor contenido en el certificado X.509 enviado por el servidor? ¿O todos los valores se generan específicamente para la firma DSA?
También: he leído en alguna parte que N y L deben ser 1024/160. ¿Es este un requisito del protocolo TLS u otros valores son válidos en el contexto de TLS?