| // 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; | |
| } | |
| } | |
| } |