exit (2);
}
-/* convert the hashed binary password to hexadecimal representation and
- free the hashed binary password */
-void to_hexadecimal (char *hex, unsigned char *binary_pwd, unsigned int len)
+/* encode the binary data to readable text format using OpenSSL */
+void encode_binary (char *encoded, unsigned char *binary_data, unsigned int len)
{
- char buf[3];
- /* keep reference to beginning of the hashed password */
- unsigned char *binary_pw_begin = binary_pwd;
- for (int i = 0; i < len; i ++)
- {
- sprintf (buf, "%02x", (*binary_pwd)&0xff);
- strcat (hex, buf);
- binary_pwd ++;
- }
- /* free the hashed password */
- OPENSSL_free (binary_pw_begin);
+
+ EVP_EncodeBlock ((unsigned char*)encoded,
+ (const unsigned char*)binary_data, len);
+ OPENSSL_free (binary_data);
}
/* get a number from the user */
unsigned int len;
digest_message ((const unsigned char *)password, strlen(password),
&hashed_sol_password, &len);
- char hashed_hex_pwd[256] = { (char) NULL };
- to_hexadecimal (hashed_hex_pwd, hashed_sol_password, len);
+ char hashed_hex_pwd[256] = { '\0' };
+ encode_binary (hashed_hex_pwd, hashed_sol_password, len);
if (strcmp (p->hashed_solution_password, hashed_hex_pwd) == 0)
return true;
unsigned int len;
digest_message ((const unsigned char *)password, strlen(password),
&hashed_mas_password, &len);
- char hashed_hex_pwd[256] = { (char) NULL };
- to_hexadecimal (hashed_hex_pwd, hashed_mas_password, len);
+ char hashed_hex_pwd[256] = { '\0' };
+ encode_binary (hashed_hex_pwd, hashed_mas_password, len);
if (strcmp (p->hashed_master_password, hashed_hex_pwd) == 0)
return true;
/* the hashedpwd contains binary data - we will convert it to
hexadecimal data and store in file */
- to_hexadecimal (p->hashed_solution_password, hashedpwd, len);
+ encode_binary (p->hashed_solution_password, hashedpwd, len);
}
}
/* the hashedpwd contains binary data - we will convert it to
hexadecimal data and store in file */
- to_hexadecimal (p->hashed_master_password, hashedpwd, len);
+ encode_binary (p->hashed_master_password, hashedpwd, len);
}
}
/* read the puzzle from a file */
Puzzle load_puzzle (const char* file)
{
+ Puzzle p;
/* First open the GZip file */
gzFile insourcefile = gzopen (file, "rb");
if (insourcefile == NULL)
{
fprintf (stderr, "%s %s\n", ERROR_READING_FILE, COMPRESSED);
- exit (1);
+ /* return an invalid puzzle */
+ init_puzzle (&p, 0);
+ return p;
}
/* Open a temporary file to uncompress the contents */
FILE *infile = tmpfile ();
if (infile == NULL)
{
fprintf (stderr, "%s\n", ERROR_READING_FILE);
- exit (1);
+ init_puzzle (&p, 0);
+ return p;
}
/* Put the uncompressed content to the temp file */
char buf[128];
fprintf (stderr, "%s\n", ERROR_READING_FILE);
fclose (infile);
gzclose (insourcefile);
- exit (1);
+ /* return an invalid puzzle */
+ init_puzzle (&p, 0);
+ return p;
}
num = gzread (insourcefile, buf, 128);
}
fseek (infile, 0, 0);
/* Read the temporary file contents to the structure Puzzle */
- Puzzle p;
char line[MAX_CLUE_LENGTH+10];
fgets (line, MAX_CLUE_LENGTH + 10, infile);
p.grid_size = atoi (line);
+ /* if puzzle is invalid or otherwise not proper grid, return an invalid
+ puzzle object */
+ if (p.grid_size == 0)
+ {
+ fprintf (stderr, "%s\n", INVALID_PUZZLE);
+ init_puzzle (&p, 0);
+ return p;
+ }
fgets (line, MAX_CLUE_LENGTH + 10, infile);
p.grid_frozen = atoi (line) == 0 ? false : true ;
fgets (line, MAX_CLUE_LENGTH + 10, infile);