I think I see the confusion between us. You are concerned with a fast
algorithm for determining equality of strings, whereas this program is
designed to be run in constant time, even if it is slower than a
variable time comparison.

For example, I don't know any practical hashing algorithms for variable
length strings that run in constant time.

On 31/10/14 11:11, Leslie S Satenstein wrote:
> 
> 
> Even if you inline your code, (previous examples) I don't think any of the 
> functions presented is faster than memcmp() from the standard C library.
> Earlier email I presented a challenge for searching a table containing a 
> large number of strings. I indicated that class of problem brings about its 
> own method of solution.
> I have used may tricks to speed up string matching, including the use of 
> hashing. This subject and example can be handled off line.
>  Regards 
>  Leslie
>  Mr. Leslie Satenstein
> Montréal Québec, Canada
> 
> 
>  
>       From: Joel Rees <joel.r...@gmail.com>
>  To: "debian-security@lists.debian.org" <debian-security@lists.debian.org> 
>  Sent: Thursday, October 30, 2014 11:38 AM
>  Subject: Re: streql - Constant-time string comparison
>    
> Here's the result of my work to this point:
> 
> ---------------------------
> /* Near-constant run time string/memory compare, with test frame.
> ** by Joel Rees,
> ** derived from work by Peter Scott, Riley Baird, et. al., see
> ** https://lists.debian.org/debian-security/2014/10/msg00060.html
> ** https://github.com/PeterScott/streql
> **
> ** Use allowed under GPL v. 3, see
> ** http://www.gnu.org/copyleft/gpl.html
> */
> 
> #include <string.h>
> #include <stdio.h>
> #include <stdlib.h>
> 
> 
> /* dbg */ static int gcount = 0;
> 
> // The core function: test two regions of memory for bytewise equality
> with constant time.
> // If cmplength is less than min( xlen, ylen ), comparison is incomplete.
> // Lengths should be signed to make conditionals more balanced.
> static int equals_internal_constime(
> const char *x, int xlen,
> const char *y, int ylen,
> int cmplength) {
> 
>   int result = 0;
> 
>   while ( --cmplength >= 0 ) {
>     char xtemp;
>     char ytemp;
> 
>     /* Using unsigned lengths here would induce unbalanced conditionals:
>     ** unsigned int xlen;
>     ** if ( xlen > 0 ) {
>     **  xtemp = *x++;
>     **  --xlen;
>     ** }
>     ** else {
>     **  xtemp = 0;
>     ** }
>     ** While this might be a problem with 16 bit ints,
>     ** you really aren't going to be comparing strings > 2^31 bytes
> with this function.
>     */
>     xtemp = ( --xlen >= 0 ) ? *x++ : 0;
>     ytemp = ( --ylen >= 0 ) ? *y++ : 0;
> 
> /* dbg */    ++gcount;
>     result |= xtemp ^ ytemp;
> /* dbg  printf( "%c(%d):%c(%d) =>%d@%d\n", xtemp, xlen, ytemp, ylen,
> result, gcount ); */
>   }
> 
>   return (xlen == ylen) && (result == 0);
> }
> 
> 
> int main( int argc, char * argv[] ) {
> 
>     char * left, * right;
>     int max = 32;
>     int result = 0;
> 
>     if ( argc > 2 ) {
>       left = argv[ 1 ];
>       right = argv[ 2 ];
>       if ( argc > 3 ) max = strtol( argv[ 3 ], NULL, 0 );
>       gcount = 0;
>       result = equals_internal_constime( left, strlen( left ), right,
> strlen( right ), max );
>       printf( "result: %d, strcmp: %d, count: %d\n", result, strcmp(
> left, right ), gcount );
>       if ( result != ( strcmp( left, right ) == 0 ) ) {
>         fputs( "*** failed ***\n", stdout );
>       }
>     }
> 
> 
>     return EXIT_SUCCESS;
> }
> ---------------------------
> 
> Note the change to signed lengths and the reasoning.
> 
> 
> 
> --
> Joel Rees
> 
> 


--
To UNSUBSCRIBE, email to debian-security-requ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org
Archive: https://lists.debian.org/54549d14.1090...@bitmessage.ch

Reply via email to