blob: d2176c1cf27c113b605ba5b679b03b924fd9901c [file] [log] [blame]
// SwiftShader Software Renderer
//
// Copyright(c) 2005-2011 TransGaming Inc.
//
// All rights reserved. No part of this software may be copied, distributed, transmitted,
// transcribed, stored in a retrieval system, translated into any human or computer
// language by any means, or disclosed to third parties without the explicit written
// agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express
// or implied, including but not limited to any patent rights, are granted to you.
//
#include <string.h>
#include <stdio.h>
#include "serialvalid.h"
#include "crc.h"
static void DecryptString( char* string_to_decrypt, int string_length );
bool ValidateSerialNumber( const char* inSerialNumber, const char* checksum_key, const char* prefix)
{
if (strlen(inSerialNumber) != SERIAL_LENGTH)
{
return false;
}
if (strstr(inSerialNumber, prefix) != inSerialNumber)
{
return false;
}
char working_buffer[256];
char decrypted_serial[SERIAL_LENGTH+1];
long actual_checksum = 0;
strncpy(decrypted_serial, inSerialNumber, SERIAL_LENGTH);
decrypted_serial[SERIAL_LENGTH] = '\0';
DecryptString( &(decrypted_serial[PREFIX_LENGTH]),ROOT_LENGTH + CHECKSUM_LENGTH);
char dummy_prefix[10];
long long serial_number;
sscanf( decrypted_serial, "%2s%10llx%4x", dummy_prefix, &serial_number, &actual_checksum);
strcpy(working_buffer, checksum_key);
strcat(working_buffer, decrypted_serial);
working_buffer[strlen(checksum_key) + PREFIX_LENGTH + ROOT_LENGTH] = '\0';
crcInit();
crc calculated_checksum = crcFast((unsigned char*)working_buffer, strlen(working_buffer));
if (calculated_checksum == actual_checksum)
return true;
else
return false;
}
static void DecryptString( char* string_to_decrypt, int string_length )
{
for ( int i = 0 ; i < string_length ; i++)
{
switch (string_to_decrypt[i])
{
case 'c':
case 'C':
string_to_decrypt[i] = 'a';
break;
case 'd':
case 'D':
string_to_decrypt[i] = 'b';
break;
case 'g':
case 'G':
string_to_decrypt[i] = 'c';
break;
case 'f':
case 'F':
string_to_decrypt[i] = 'd';
break;
case 'h':
case 'H':
string_to_decrypt[i] = 'e';
break;
case 'b':
case 'B':
string_to_decrypt[i] = 'f';
break;
case '2':
string_to_decrypt[i] = '0';
break;
case '3':
string_to_decrypt[i] = '1';
break;
case '4':
string_to_decrypt[i] = '2';
break;
case '5':
string_to_decrypt[i] = '3';
break;
case '6':
string_to_decrypt[i] = '4';
break;
case '7':
string_to_decrypt[i] = '5';
break;
case '8':
string_to_decrypt[i] = '6';
break;
case '9':
string_to_decrypt[i] = '7';
break;
case 'j':
case 'J':
string_to_decrypt[i] = '8';
break;
case 'k':
case 'K':
string_to_decrypt[i] = '9';
break;
default:
break;
}
}
}