XORでジャミング済みのPNGファイルを読み込む

XORでbitshiftさせたPNGをcocos2d-x側で読み込む際にデコードする。
PNGの処理については割愛

# cocos/platform/CCImage.h 
# 
# XOR_SEED と XOR_SEED_CNT は任意の値
#
	const char* XOR_SEED = "ABCDE12345";
	const int XOR_SEED_CNT = 10;


# cocos/platform/CCImage.cpp line 515
#
# 画像データを扱うImage関数 (cocos2d-x 3.13)
#
#
bool Image::initWithImageData(const unsigned char * data, ssize_t dataLen)
{
    bool ret = false;
    
    do
    {
        CC_BREAK_IF(! data || dataLen <= 0);
        
        unsigned char* unpackedData = nullptr;
        ssize_t unpackedLen = 0;
        
        //detect and unzip the compress file
        if (ZipUtils::isCCZBuffer(data, dataLen))
        {
            unpackedLen = ZipUtils::inflateCCZBuffer(data, dataLen, &unpackedData);
        }
        else if (ZipUtils::isGZipBuffer(data, dataLen))
        {
            unpackedLen = ZipUtils::inflateMemory(const_cast<unsigned char*>(data), dataLen, &unpackedData);
        }
        else
        {
            unpackedData = const_cast<unsigned char*>(data);
            unpackedLen = dataLen;
        }

        _fileType = detectFormat(unpackedData, unpackedLen);

        switch (_fileType)
        {
        case Format::PNG:
            ret = initWithPngData(unpackedData, unpackedLen);
            break;
        case Format::JPG:
            ret = initWithJpgData(unpackedData, unpackedLen);
            break;
        case Format::TIFF:
            ret = initWithTiffData(unpackedData, unpackedLen);
            break;
        case Format::WEBP:
            ret = initWithWebpData(unpackedData, unpackedLen);
            break;
        case Format::PVR:
            ret = initWithPVRData(unpackedData, unpackedLen);
            break;
        case Format::ETC:
            ret = initWithETCData(unpackedData, unpackedLen);
            break;
        case Format::S3TC:
            ret = initWithS3TCData(unpackedData, unpackedLen);
            break;
        case Format::ATITC:
            ret = initWithATITCData(unpackedData, unpackedLen);
            break;
        default:
            {

            // ここから -------------------------------------------
                // XOR/PNG
                int ci = XOR_SEED_CNT; 
                unpackedData = const_cast<unsigned char*>(data);

                for (int i = 0; i < unpackedLen; i++) {
                    int idx = i % ci;
                    int key = XOR_SEED[idx] % 256;
                    unpackedData[i] = unpackedData[i] ^ key;
                }

                _fileType = detectFormat(unpackedData, unpackedLen);
                //
                if (_fileType == Format::PNG) {
                    ret = initWithPngData(unpackedData, unpackedLen);
                    break;
                }
           // ここまで ---------------------------------------------

                // load and detect image format
                tImageTGA* tgaData = tgaLoadBuffer(unpackedData, unpackedLen);
                
                if (tgaData != nullptr && tgaData->status == TGA_OK)
                {
                    ret = initWithTGAData(tgaData);
                }
                else
                {

                    CCLOG("cocos2d: unsupported image format!");
                }
                
                free(tgaData);
                break;
            }
        }
        
        if(unpackedData != data)
        {
            free(unpackedData);
        }
    } while (0);
    
    return ret;
}