Ogni implementazione TLS1.0 deve supportare l'uso della suite di crittografia TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA . Questa suite di crittografia stabilisce che il server deve inviare un messaggio ServerKeyExchange con le seguenti strutture:
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;
Il valore sha_hash
è calcolato da SHA(ClientHello.random + ServerHello.random + ServerParams)
, quindi l'hash calcolato viene assegnato all'algoritmo DSA per produrre la firma (che a sua volta è codificata in DER). La mia domanda è: come vengono derivati gli input per il DSA in questo caso?
Secondo wikipedia DSA richiede i seguenti parametri:
- N: q lunghezza
- L: p lunghezza
- q: N-bit primo
- p: modulo primo di L-bit tale che p-1 è un multiplo di q
- g: un numero il cui ordine moltiplicativo modulo p è q
- x: chiave segreta, dove
0 < x < q
- y: chiave pubblica y = g ^ x mod p
La chiave pubblica (o qualsiasi altro valore) è lo stesso valore contenuto nel certificato X.509 inviato dal server? Oppure tutti i valori sono generati in modo specifico per la firma DSA?
Inoltre: ho letto da qualche parte che N e L devono essere 1024/160. È un requisito del protocollo TLS o altri valori sono validi nel contesto di TLS?