// create a password that will take iter_count iterations to crack
void createPassword(char *password, char *pw_prefix, int iter_count) {
  assert(iter_count > 0);

  // first randomize the whole thing
  randomizeString(password, PASSWORD_LEN);
  strcpy(pw_prefix, password);

  // now convert iter_count into a base 26 number

  int digit_pos = PASSWORD_LEN - 1;
  iter_count--; // subtract 1 since iter_count is being used as an offset
  while (iter_count > 0) {
    int digit = iter_count % 26;
    password[digit_pos] = 'a' + digit;
    pw_prefix[digit_pos] = '.';
    iter_count /= 26;
    digit_pos--;
  }

  // *prefix_len = PASSWORD_LEN - digit_pos;
}
Ejemplo n.º 2
0
int main( int argc, char ** argv )
{
   #define BUF_SIZE 16
   #define TOTAL_COPY_CHECKS 1024
   char mem[ BUF_SIZE ] ;
   char buf[ BUF_SIZE * BUF_MULTIPLICITY ] ; 
   char copy[ BUF_SIZE ] ; 
   int numCopies = 0 ;
   int iterations = 0 ;
   int verbose = VERBOSE ;
   initializeBuffer( mem, sizeof(mem) ) ;

   for ( ; numCopies < TOTAL_COPY_CHECKS ; iterations++ )
   {
RETRY:
      char * src = randomizeString( buf, mem, BUF_SIZE ) ;
      size_t len = strlen( src ) ;
      assert( len < BUF_SIZE ) ;

      strcpy( copy, src ) ;

      char * dest ;
      ssize_t diff ;

      for ( int n = 0 ; ; )
      {
#if defined OVERLAPPED
         dest = &buf[ rand() % ( sizeof(buf) - 1 ) ] ;
#else
         dest = &buf[ BUF_SIZE + rand() % ( BUF_SIZE - 1 ) ] ;
#endif
         diff = dest - src ;

//#define REQUIRE_DEST_LESSER_THAN_SRC
#if defined REQUIRE_DEST_LESSER_THAN_SRC
         if ( diff > 0 )
         {
            continue ;
         }
#endif
         if ( diff < 0 )
         {
            diff = -diff ;
         }

         if ( pred( diff, len ) && (&dest[len + 1] < &buf[BUF_SIZE * BUF_MULTIPLICITY -1]) )
         {
            break ;
         }

         if ( ++n > 3 )
         {
            goto RETRY ;
         }
      }

      if ( verbose )
      {
         printf( "buf:\t[%p, %p]\n"
                 "dest:\t[%p, %p]\n"
                 "src:\t[%p, %p]\n"
                 "strlen + 1:\t%u\n"
                 "diff:\t%d\n",
                 buf,
                 buf + sizeof(buf) - 1,
                 dest,
                 dest + len + 1,
                 src,
                 src + len + 1,
                 (unsigned)len + 1,
                 (int)diff ) ;
      }
      else
      {
         printf( "." ) ;

         if ( (0 == (numCopies % 80)) && numCopies )
         {
            printf( "\n" ) ;
         }
      }

      numCopies++ ;

      systemStrcpy( dest, src ) ;
      if ( 0 != strcmp( dest, copy ) )
      {
         printf( "pattern: '%s'\n"
                 "dest: '%s'\n"
                 "src: %p\n"
                 "dest: %p\n"
                 "diff: %d\n"
                 "strlen + 1: %u\n",
                 copy,
                 dest,
                 src,
                 dest,
                 (int)diff,
                 (unsigned)len + 1 ) ;

         break ;
      }
   }

   printf( "\nDONE\n" ) ; 

   return iterations ;
}