Hi,

thank you again for your answer.

Now I set for every variable the BN_FLG_CONSTIME Flag, so that I can be sure, 
that they will need the same time. 
I measured the time the BN_nnmod operation in the BN_mod_add function needs for 
the modulo operation and I see again big differences in the operationtimes. 
Shouldn't the modulo operation now need nearly equal time for the same modulos? 
It seems to me that all mod-operations needs a little bit more time now but 
they only little converge. The difference is about 40 percent sometimes. A 
number which is bigger then the modulos takes normally about 30 percent more 
time for the Mod operation, then a smaller one. How can one converge the 
operation time?

Something that is also strange, when I use some bignums for example as a 
summand in a Mod_add function, then the value of the summand itself get lost. 
(I don't overwrite it). When I want to use the summands value later, then it 
just has the value zero. 

Thank you for your help.

-------- Original-Nachricht --------
> Datum: Mon, 28 May 2012 23:23:43 +0100
> Von: "Matt Caswell (fr...@baggins.org)" <fr...@baggins.org>
> An: openssl-users@openssl.org
> Betreff: Re: Problems with OpenSSl BN

> On 28/05/12 22:22, chip...@gmx.de wrote:
> > Hi,
> >
> > Thank you for your answer it helped me and gives me a plausible
> explanation. But I didn't understand some things when I look at the source 
> code. I
> will explain my conditions more in detail.
> >
> > I have for example to bignums which I want to add modulo another
> bignumber. This BN can be as you said of an arbitrary length. But normaly they
> have an length of 224 bit, sometimes 223-bits and often 1 or 0-bits. They will
> be calculated on a 32-bit system. I want now that an addition of an
> 224-bit to an 0-bit number (thus 0), an addition of two 224-bit nummbers, or 
> an
> addition of two 0-bit numbers take equal time, because it is a security
> requirement.
> >
> > You said, you can use BN_FLG_CONSTTIME, but how do I do it. Is it just a
> define statement which I have to insert in my code, and how does it looks
> like?
> >
> > I looked in the bn.h and see a function, which is called
> BN_set_flags(b,n), but what are the two parameters? I didn't find a hint in 
> the OpenSSL
> Documentation or an example. Do I have to call the function for every Bignum
> or every operation?
> BIGNUM *mynum;
> 
> mynum = BN_new();
> BN_set_flags(mynum, BN_FLG_CONSTIME);
> 
> You just need to set it once on each BIGNUM. The library will check the 
> BIGNUMs involved in each operation - as long as one of them has the flag 
> then it will treat the operation as constant time.
> 
> >
> > I run a debugger in order to get information which steps my program make
> when I for example add to Bignums modulo a number (BN_mod_add).
> > First it goes in the BN_add_funtion.
> > I see that the bigger result, which takes more time run into the
> BN_expand (BN_expand2) function, and then there call other functions like
> OpenSSL_malloc and so on, so I think this is what you mean with the size of 
> the
> Bignumber. The other Bignums, which are smaller (not much), did not run in
> these functions. So this could explain a little time difference.
> >
> > After that it goes in the BN_mod function, but there I see no difference
> in the steps which the debugger does. It doesn't matter if the number is
> bigger then the modul or not. The function always make the same steps. This
> is what I don't understand. Do you have a hint?
> > But in total the time consumption is very different as you said. It
> depends if the result is bigger or smaller then the modul.
> 
> BN_mod is just a macro that uses BN_div defined in bn_div.c
> 
> It is these lines where the number is compared with the divisor 
> (modulus). If it is less then it just copies the number straight into 
> the result and returns. Notice the "!no_branch", check on this if. This 
> is set to TRUE if BN_FLG_CONSTTIME is set for one of the BIGNUMs.
> 
>      if (!no_branch && BN_ucmp(num,divisor) < 0)
>          {
>          if (rm != NULL)
>              { if (BN_copy(rm,num) == NULL) return(0); }
>          if (dv != NULL) BN_zero(dv);
>          return(1);
>          }
> 
> > Another thing which I find interresting, when I call for example the
> operation BN_mod_add(r,a,b,m,ctx1) very early in the code, then it takes more
> time than if do it late. First I thought it would be the cache, but I do
> not use any of these variables in other operations before. I just created and
> set space for them with BN_new, like with the other variables too. I
> tested this operations in a loop, and the phenomena is the same.
> > How can this be?
> The context is used to cache temporary variables for later reuse - so 
> this is possibly due to reuse of those temporary variables?
> 
> > I have also a general question about context variables. Is it ok, to use
> the same context variable for all calculating operations one after
> another? Or should each operation have a different one? I measured the time 
> with
> different context variables, but it has no consequences. The caculating
> results also stay the same.
> You can reuse the same one. In fact its better to reuse, as you will 
> benefit from the caching of temporary variables.
> 
> > Thank you for your answer.
> >
> >
> > -------- Original-Nachricht --------
> >> Datum: Tue, 15 May 2012 00:04:16 +0100
> >> Von: "Matt Caswell (fr...@baggins.org)"<fr...@baggins.org>
> >> An: openssl-users@openssl.org
> >> Betreff: Re: Problems with OpenSSl BN
> >> On 14/05/12 15:48, chip...@gmx.de wrote:
> >>> Hello,
> >>>
> >>> I am using the OpenSSL BN functions. Wenn I measure the time which a
> BN
> >> function needs, then I see that for example BN_mod_add, needs for every
> >> calling different times. Shouldn't it be the same timeconsumption,
> every time
> >> I call for example BN_mod_add?
> >>> The deviation is up to 300%.
> >>>
> >>> Thank you!
> >> You don't say how you did your testing or under what conditions you
> >> expect responses to be constant time.
> >>
> >> There are a couple of reasons that I can think of why BN_mod_add would
> >> provide different results for different invocations.
> >>
> >> 1) Different bit lengths of the parameters.
> >> Obviously the BN functions are designed to work with integers of
> >> arbitrary length. Under the covers BN_mod_add will add these by looping
> >> through a word at a time. Obviously adding together integers that are 1
> >> word long each is going to give you significantly different results to
> >> integers that are 10 words long each. Also the time for the addition is
> >> largely related to size of the *smallest* integer. So for example
> adding
> >> a 1 word integer to a 10 word integer will be quicker than adding a 10
> >> word integer to another 10 word integer.
> >>
> >> 2) The mod operation
> >> In order to calculate the "mod" part of BN_mod_add essentially a
> >> division operation is performed with the result being the remainder.
> >> However a short cut is if the result of the add is less than the mod
> >> value. In that case no division is necessary, and therefore this
> >> operation can be avoided. Therefore if you are comparing BN_mod_adds
> >> that require a division with those that do not then you are likely to
> >> see different performance results.
> >>
> >> If constant time is important to you, I believe it is possible to force
> >> certain operations within the BN library to respond in a more
> >> predictable response time by setting the BN_FLG_CONSTTIME flag. However
> >> this does not apply to all function calls and removes certain
> >> optimizations from the code.
> >>
> >> Hope that helps
> >>
> >> Matt
> >>
> >>
> >>
> >>
> >> ______________________________________________________________________
> >> OpenSSL Project                                 http://www.openssl.org
> >> User Support Mailing List                    openssl-users@openssl.org
> >> Automated List Manager                           majord...@openssl.org
> 
> ______________________________________________________________________
> OpenSSL Project                                 http://www.openssl.org
> User Support Mailing List                    openssl-users@openssl.org
> Automated List Manager                           majord...@openssl.org

-- 
NEU: FreePhone 3-fach-Flat mit kostenlosem Smartphone!                          
        
Jetzt informieren: http://mobile.1und1.de/?ac=OM.PW.PW003K20328T7073a
______________________________________________________________________
OpenSSL Project                                 http://www.openssl.org
User Support Mailing List                    openssl-users@openssl.org
Automated List Manager                           majord...@openssl.org

Reply via email to