Hi, Kurt,

> On Wed, Feb 13, 2013 at 12:19:19PM +0100, Andy Polyakov via RT wrote:
>> 
>>> Probably this "strict aliasing" 64-bit optimization bug for 
>>> "crypto/bn/bn_nist.c"
> What bug are you talking about?  There doesn't seem to be a strict
> aliasing warning in that file, and they use a union to get around
> the problem.


Sorry, I mean about compilers bug of "-fstrict-aliasing" optimization.

> I can at least reproduce the problem with clang 3.0.
> It works without problems with gcc 4.7.


gcc-mp-4.7 & gcc-mp-4.8 not affected. 

But Apple Xcode compiler and MacPorts clang compilers affected (based on llvm 
version 3.0-3.2).  

Number MacPorts user report about this problem, see 
https://trac.macports.org/ticket/38015

> PS: I think at least this patch makes sense, but doesn't change anything:
> -       const unsigned int      *bp=(const unsigned int *)buf;
> +       const unsigned int      *bp=(const unsigned int *)buf.ui;


This patch inefficient.

Workaround:

leom:openssl-SNAP-20130212.test-x86_64 leo$ diff -u 
../openssl-SNAP-20130212/crypto/bn/bn_nist.c crypto/bn/bn_nist.c
--- ../openssl-SNAP-20130212/crypto/bn/bn_nist.c        2013-01-11 
18:13:43.000000000 +0400
+++ crypto/bn/bn_nist.c 2013-02-14 03:06:43.000000000 +0400
@@ -424,7 +424,7 @@
 #if defined(NIST_INT64)
        {
        NIST_INT64              acc;    /* accumulator */
-       unsigned int            *rp=(unsigned int *)r_d;
+       volatile unsigned int           *rp=(unsigned int *)r_d;
        const unsigned int      *bp=(const unsigned int *)buf.ui;
 
        acc  = rp[0];   acc += bp[3*2-6];
@@ -556,7 +556,7 @@
 #if defined(NIST_INT64) && BN_BITS2!=64
        {
        NIST_INT64              acc;    /* accumulator */
-       unsigned int            *rp=(unsigned int *)r_d;
+       volatile unsigned int           *rp=(unsigned int *)r_d;
        const unsigned int      *bp=(const unsigned int *)buf.ui;
 
        acc  = rp[0];   acc -= bp[7-7];
@@ -704,7 +704,7 @@
 #if defined(NIST_INT64)
        {
        NIST_INT64              acc;    /* accumulator */
-       unsigned int            *rp=(unsigned int *)r_d;
+       volatile unsigned int           *rp=(unsigned int *)r_d;
        const unsigned int      *bp=(const unsigned int *)buf.ui;
 
        acc = rp[0];    acc += bp[8-8];
@@ -909,7 +909,7 @@
 #if defined(NIST_INT64)
        {
        NIST_INT64              acc;    /* accumulator */
-       unsigned int            *rp=(unsigned int *)r_d;
+       volatile unsigned int           *rp=(unsigned int *)r_d;
        const unsigned int      *bp=(const unsigned int *)buf.ui;
 
        acc = rp[0];    acc += bp[12-12];

-- 
Sorry for my bests English.
 
Serguei E. Leontiev w:+7(495)939-2382 USSR,Moscow,Universitetskij 13
Sternberg Astronom. w:+7(495)780-4820 USSR,Moscow,127018,Sushchevskij val 16-5
Institute, MSU      h:+7(495)318-1146 USSR,Moscow,113303,Kakhovka 6-40
                    m:+7(916)686-1081 SMS: <http://www.mts.ru/sms>
           <http://lnfm1.sai.msu.ru/~leo>



13.02.2013, в 23:23, Kurt Roeckx <k...@roeckx.be> написал(а):

> On Wed, Feb 13, 2013 at 12:19:19PM +0100, Andy Polyakov via RT wrote:
>> 
>>> Probably this "strict aliasing" 64-bit optimization bug for 
>>> "crypto/bn/bn_nist.c"
> 
> What bug are you talking about?  There doesn't seem to be a strict
> aliasing warning in that file, and they use a union to get around
> the problem.
> 
>>> Mac OSX compiler fail test/ectest: cc [Apple LLVM version 4.2 
>>> (clang-425.0.24) (based on LLVM 3.2svn)] gcc-mp-4.3 gcc-mp-4.4 gcc-mp-4.5 
>>> gcc-mp-4.6 clang-mp-3.0 clang-mp-3.1 clang-mp-3.2
>>> 
>>> Mac OSX compiler test/ectest OK: gcc-apple-4.2 gcc-mp-4.7 gcc-mp-4.8 
>>> [gcc-mp-4.8 (MacPorts gcc48 4.8-20130203_0+universal) 4.8.0 20130203 
>>> (experimental)] clang-mp-2.9 clang-mp-3.3 [clang version 3.3 (trunk 173279)]
> 
> I can at least reproduce the problem with clang 3.0.
> 
> It works without problems with gcc 4.7.
> 
>> Could you test following *instead*? In every #if defined(NIST_INT64)
>> section you'll see a number of references to bp[something]. Can you
>> replace them with buf.ui[samething] and run the test? Currently bp is
>> constified buf.ui and it might give overeager compiler idea to reorder
>> references to buf in #if defined(NIST_IN64) section and [inlined]
>> nist_cp_bn_0 and cause the mayhem.
> 
> That doesn't change anything.  I still get:
> testing internal curves: ...........
> EC_GROUP_check() failed with curve secp384r1
> .
> EC_GROUP_check() failed with curve prime192v1
> 
> EC_GROUP_check() failed with curve prime192v2
> 
> EC_GROUP_check() failed with curve prime192v3
> ...
> EC_GROUP_check() failed with curve prime256v1
> ............................................... failed
> 
> ectest.c:1268: ABORT
> 
> 
> Kurt
> 
> 
> PS: I think at least this patch makes sense, but doesn't change anything:
> --- a/crypto/bn/bn_nist.c
> +++ b/crypto/bn/bn_nist.c
> @@ -530,7 +530,7 @@ int BN_nist_mod_224(BIGNUM *r, const BIGNUM *a, const 
> BIGNUM *field,
>        {
>        NIST_INT64              acc;    /* accumulator */
>        unsigned int            *rp=(unsigned int *)r_d;
> -       const unsigned int      *bp=(const unsigned int *)buf;
> +       const unsigned int      *bp=(const unsigned int *)buf.ui;
> 
>        acc  = rp[0];   acc -= bp[7-7];
>                        acc -= bp[11-7]; rp[0] = (unsigned int)acc; acc >>= 32;
> 


______________________________________________________________________
OpenSSL Project                                 http://www.openssl.org
Development Mailing List                       openssl-dev@openssl.org
Automated List Manager                           majord...@openssl.org

Reply via email to