Hi All

I found in NIST Special Publication 800-56A Revision 3
5.6.2.3.1 FFC Full Public-Key Validation Routine
2. Verify  that  1 = y q mod p.

This test is implemented in OPENSSL

This test relies on the fact  that q and p are prime

Pascal



Le mer. 4 déc. 2019 à 18:16, Antoine Delignat-Lavaud <
anto...@delignat-lavaud.fr> a écrit :

> Hi Pascal,
>
> TLS 1.2 does not mandate servers to use safe DH primes. As a client, you
> get g and p from the server. You don't know if p is a safe prime, or
> indeed if it is a prime at all. You don't even know if g is a generator
> of Zp* - it could also be a generator for a small order subgroup. In
> that sense, RFC 7919 is correct in that, in general TLS 1.2, clients
> could pick any private exponent between 2 and p-2 when you have no
> information on p and g. When using an arbitrary server-selected prime
> and generator there is no guarantee that the server selected a share
> that is not in a small subgroup, and similarly there is no guarantee for
> the server that the client share is not of small order. In fact you
> don't even have this guarantee either with ECDH (where the curves are
> chosen from a fixed list) because some curves also have small subgroups.
>
> If you want the guarantee that your DH key exchange is contributive,
> that is, that neither single party can determine with high-probability
> the DH secret produced by the key exchange, you can either 1. use one of
> the safe groups defined in RFC7919. When using these groups, you should
> pick an exponent between 2 and q-1. 2. Figure out all of the low-order
> elements of Zp* and check that the DH secret is not one of them.
>
> Most implementations will do (2), i.e. they check that g^xy is not 0, 1,
> p-1. This is sufficient if p is a safe prime, but it is too expensive to
> check that p and p-1/2 are prime. For X25519 most implementations now
> check that x(yG) <> I, as it is much simpler than checking xG and yG for
> the 8 small order elements. You may be interested in checking Section
> III.B of [1]
>
> Best,
>
> Antoine
>
> [1] http://antoine.delignat-lavaud.fr/doc/ndss15.pdf
>
> On 2019-12-04 16:23, Pascal Urien wrote:
> > Hi all
> >
> > https://tools.ietf.org/html/rfc7919 seems somewhat confusing because
> > the order of the generator (2) is q=(p-1)/2 and not  (p-1 )
> >
> > So in place of
> >
> > "Traditional finite field Diffie-Hellman has each peer choose their
> > secret exponent from the range [2, p-2]."
> > It should suggest to use
> >  "Traditional finite field Diffie-Hellman has each peer choose their
> > secret exponent from the range [2, q-1]."
> >
> > I put below some basic background that could help to understand the DH
> > security
> >
> > If a safe prime p=2q+1 is congruent to 7 modulo 8, then it is a
> > divisor of the Mersenne number
> > with its matching Sophie Germain prime (q) as exponent.
> > a Mersenne prime is a prime number that is one less than a power of
> > two.
> > That is, it is a prime number of the form Mn = 2**n - 1 for some
> > integer n.
> >
> > 2**q-1 = kp;
> > 2**(p-1)/2 = 1 mod p
> > Therefore 2 is a generator of order q=(p-1)/2
> >
> > (p-1) is a generator of order 2, since (p-1)**2 = (p**2+1-2p) = 1 mod
> > q
> >
> > Example
> > p=7 = 2x3 +1, q=3
> > p = 7 mod 8
> > 6 = 2x3
> > 1 group of order 6, phi(6)= 2 generators (q-1)
> > 1 group of order 3, phi(3)= 2 generators (q-1)
> > 1 group of order 2, phi(2)= 1 generators
> >
> > 2 4 1
> > 3 2 6 4 5 1
> > 4 2 1
> > 5 4 6 2 3 1
> > 6 1
> >
> > Le mer. 4 déc. 2019 à 02:52, Andrey Jivsov <cry...@brainhub.org> a
> > écrit :
> >
> >> https://tools.ietf.org/html/rfc7919#section-5.1 prohibits x=(p-1)/2
> >> because this results in a peer's public key g^x= 1.
> >>
> >> Allowing this makes some man-in-the middle attacks on TLS easier,
> >> because the attacker can predict the value of the ephemeral secret
> >> key on another leg of the connection.
> >>
> >> On Tue, Dec 3, 2019 at 3:03 PM Scott Fluhrer (sfluhrer)
> >> <sfluh...@cisco.com> wrote:
> >>
> >>> See SRF
> >>>
> >>> FROM: TLS <tls-boun...@ietf.org> ON BEHALF OF Pascal Urien
> >>> SENT: Tuesday, December 03, 2019 5:16 PM
> >>> TO: tls@ietf.org
> >>> SUBJECT: [TLS] DH security issue in TLS
> >>>
> >>> I wonder if g**x , with x =(1-p)/2 is checked in current TLS 1.2
> >>> implementation ?
> >>>
> >>> In RFC https://tools.ietf.org/html/rfc7919
> >>> "Negotiated Finite Field Diffie-Hellman Ephemeral Parameters for
> >>> Transport Layer Security (TLS)"
> >>>
> >>> "Traditional finite field Diffie-Hellman has each peer choose
> >>> their secret exponent from the range [2, p-2].
> >>> Using exponentiation by squaring, this means each peer must do
> >>> roughly 2*log_2(p) multiplications,
> >>> twice (once for the generator and once for the peer's public
> >>> key)."
> >>>
> >>> Not True !!!
> >>> Even for p= safe prime (i.e.. Sophie Germain prime, p=2*q+1, with
> >>> p & q prime number) secret exponent x= (p-1)/2 is a security issue
> >>> since :
> >>>
> >>> g**xy = 1       with y an even integer
> >>> g**xy = g**x   for y an odd integer
> >>>
> >>> SRF: actually, g**xy  = 1 in both cases, as g**x = 1 (for the g, p
> >>> values specified in RFC7919); this is easily seen as all listed p
> >>> values are safe primes, and in all cases, g=2 and p=7 mod 8.
> >>>
> >>> In any case, why would that be a security issue?  If both sides
> >>> are honest (and select their x, y values honestly), the
> >>> probability of one of them selecting (p-1)/2 as their private
> >>> value is negligible (even if our selection logic allowed that as a
> >>> possible value – it generally doesn’t).  If we have two honest
> >>> parties with an adversary replacing one of the side’s key share
> >>> with g**(p-1)/2, well, the protocol transmits signatures of the
> >>> transcript, and so that’ll be detected. If you have an honest
> >>> side negotiating with a dishonest one, well, the dishonest one
> >>> could select (p-1)/2 as its private value – however, they could
> >>> also run the protocol honestly (and learn the shared secret and
> >>> the symmetric keys, which are usually the target), and there’s
> >>> nothing the protocol can do about that.
> >>>
> >>> Now, if an honest party reused their private values for multiple
> >>> exchanges, a similar observation would allow an adversary to
> >>> obtain a single bit of the private value.  He would do that by
> >>> performing an exchange with the honest party mostly honestly,
> >>> selecting a value x as his private value, but instead of
> >>> transmitting g**x as his key share, he would transmit -g**x.
> >>> Then, the shared value that the honest party would derive is:
> >>>
> >>> g**xy  with y an even integer
> >>>
> >>> -g**xy  with y an odd integer
> >>>
> >>> The adversary can compute both these values, and determine which
> >>> is being used later in the protocol.
> >>>
> >>> So, the adversary can learn a single bit of the private value
> >>> (which doesn’t translate to him learning any bit of the shared
> >>> secret, much less the symmetric keys) – however, he cannot
> >>> leverage this to learn anything else of the private key.  I do not
> >>> believe that a single bit is worth worrying about.  And, again, if
> >>> we generate a fresh DH private value for every exchange (which we
> >>> encourage people to do for PFS), even that single bit doesn’t
> >>> apply to any other exchange.
> >>>
> >>> If p is not a safe prime (like in RFC 5114) other issues occur....
> >>>
> >>>
> >>> Pascal _______________________________________________
> >>> TLS mailing list
> >>> TLS@ietf.org
> >>> https://www.ietf.org/mailman/listinfo/tls
> > _______________________________________________
> > TLS mailing list
> > TLS@ietf.org
> > https://www.ietf.org/mailman/listinfo/tls
>
_______________________________________________
TLS mailing list
TLS@ietf.org
https://www.ietf.org/mailman/listinfo/tls

Reply via email to