// generate a random seed for OAEP void gsiCryptRSAGenerateSeed(unsigned char *buffer, gsi_u32 len) { unsigned int i=0; Util_RandSeed(current_time()); for (i=0; i < len; i++) { //buffer[i] = 0x0c; buffer[i] = (unsigned char)(Util_RandInt(0x00, 0xFF)+1); GS_ASSERT(buffer[i] != 0x00); } }
// generate a random pad for PKCS1 // [0x01 - 0xFF] void gsiCryptRSAGeneratePad(unsigned char *buffer, gsi_u32 len) { unsigned int i=0; Util_RandSeed(current_time()); for (i=0; i < len; i++) { #if defined(GS_CRYPT_NO_RANDOM) #pragma message("GS_CRYPT_NO_RANDOM defined, SSL is NOT SECURE!!!!\r\n") buffer[i] = 0x0c; #else buffer[i] = (unsigned char)(Util_RandInt(0x00, 0xFF)+1); #endif GS_ASSERT(buffer[i] != 0x00); } }
static GPResult gpiSendNewuser( GPConnection * connection, GPIConnectData * data ) { GPIConnection * iconnection = (GPIConnection*)*connection; size_t i; const int useAlternateEncoding = 1; // Encrypt the password (xor with random values) char passwordenc[GP_PASSWORDENC_LEN]; gpiEncodeString(iconnection->password, passwordenc); // Construct the outgoing message. ////////////////////////////////// gpiAppendStringToBuffer(connection, &iconnection->outputBuffer, "\\newuser\\"); gpiAppendStringToBuffer(connection, &iconnection->outputBuffer, "\\email\\"); gpiAppendStringToBuffer(connection, &iconnection->outputBuffer, iconnection->email); gpiAppendStringToBuffer(connection, &iconnection->outputBuffer, "\\nick\\"); gpiAppendStringToBuffer(connection, &iconnection->outputBuffer, iconnection->nick); gpiAppendStringToBuffer(connection, &iconnection->outputBuffer, "\\passwordenc\\"); gpiAppendStringToBuffer(connection, &iconnection->outputBuffer, passwordenc); gpiAppendStringToBuffer(connection, &iconnection->outputBuffer, "\\productid\\"); gpiAppendIntToBuffer(connection, &iconnection->outputBuffer, iconnection->productID); gpiAppendStringToBuffer(connection, &iconnection->outputBuffer, "\\gamename\\"); gpiAppendStringToBuffer(connection, &iconnection->outputBuffer, __GSIACGamename); gpiAppendStringToBuffer(connection, &iconnection->outputBuffer, "\\namespaceid\\"); gpiAppendIntToBuffer(connection, &iconnection->outputBuffer, iconnection->namespaceID); gpiAppendStringToBuffer(connection, &iconnection->outputBuffer, "\\uniquenick\\"); gpiAppendStringToBuffer(connection, &iconnection->outputBuffer, iconnection->uniquenick); if(data->cdkey[0]) { // Encrypt the cdkey (xor with random values) char cdkeyxor[GP_CDKEY_LEN]; char cdkeyenc[GP_CDKEYENC_LEN]; size_t cdkeylen = strlen(data->cdkey); Util_RandSeed((unsigned long)GP_XOR_SEED); for (i=0; i < cdkeylen; i++) { // XOR each character with the next rand char aRand = (char)Util_RandInt(0, 0xFF); cdkeyxor[i] = (char)(data->cdkey[i] ^ aRand); } cdkeyxor[i] = '\0'; // Base 64 it (printable chars only) B64Encode(cdkeyxor, cdkeyenc, (int)cdkeylen, useAlternateEncoding); //gpiAppendStringToBuffer(connection, &iconnection->outputBuffer, "\\cdkey\\"); //gpiAppendStringToBuffer(connection, &iconnection->outputBuffer, data->cdkey); gpiAppendStringToBuffer(connection, &iconnection->outputBuffer, "\\cdkeyenc\\"); gpiAppendStringToBuffer(connection, &iconnection->outputBuffer, cdkeyenc); } gpiAppendStringToBuffer(connection, &iconnection->outputBuffer, "\\partnerid\\"); gpiAppendIntToBuffer(connection, &iconnection->outputBuffer, iconnection->partnerID); gpiAppendStringToBuffer(connection, &iconnection->outputBuffer, "\\id\\1"); gpiAppendStringToBuffer(connection, &iconnection->outputBuffer, "\\final\\"); return GP_NO_ERROR; }