Using Vice without Steam: Difference between revisions

From Valve Developer Community
Jump to navigation Jump to search
No edit summary
(Cleaned it up a little more, and added linux support.)
Line 1: Line 1:
== What is this? ==
== What is this? ==
This is a [[Steam port]] of [[Vice|VICE]] that is built to not depend on Steam.
This is a [[Steam port]] of [[Vice|VICE]] that is built to not depend on Steam.  Works on windows and linux.


== Usage ==
== Compiling on Windows ==
* First you need to create a new Empty VisualC++ Console Project that will compile this code into an executable.
* First you need to create a new Empty VisualC++ Console Project that will compile this code into an executable.
* Add public/IceKey.cpp into your project
* Add public/IceKey.cpp into your project
* Setup the include paths in your settings to include public/  (for the header file)
* Setup the include paths in your settings to include public/  (for the header file)
* Copy the code below into main.cpp, and compile.
* Copy the code below into main.cpp, and compile.
== Compiling on Linux ==
* Copy the makefile into a file called Makefile
* edit the Makefile to refleft the path to your SDK_ROOT/public/ directory
* make


== main.cpp ==
== main.cpp ==
Line 23: Line 28:


#include <stdio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "IceKey.H"
#include "IceKey.H"
#ifdef WIN32
#include "windows.h"
#else
#endif


// Globals
// Globals
Line 38: Line 40:
static char g_Extension[MAX_EXTENTION];
static char g_Extension[MAX_EXTENTION];


void Usage( void );
#ifdef WIN32
void Exit(const char *msg);
#define STRING_CMP stricmp
void SetExtention(char *dest, int length, const char *ext);
#else
#define STRING_CMP strcasecmp
#undef NULL
#define NULL 0
#endif
 
 
//----- Helpers -----
void Usage( void )
{
fprintf( stdout, "Usage: ice <-d> <-x ext> [-k IceKey(8 bit)] [file]\n" );
fprintf( stdout, "Default action: Encrypt. \n" );
fprintf( stdout, "-d : Decrypt a file. \n" );
fprintf( stdout, "-x : Extention to use as output. \n" );
fprintf( stdout, "-k : You need to specify your 8 bit Ice Encryption Key. \n" );
fprintf( stdout, "-h : Print the help menu, and stop.\n" );
}
 
void Exit(const char *msg)
{
fprintf( stderr, msg );
exit( 1 );
}
 
void SetExtention(char *dest, size_t length, const char *ext)
{
//Start at the end till we hit a .
//if we reach 0 without a .  just append the extension; one must not have existed.
size_t mover = length;


while( (*(dest + mover) != '.') && (mover > 0))
mover--;


if(mover == 0)
strcat(dest,ext);
else
{
strcpy(dest + mover,ext);
}
}
/*
The entry point, see usage for I/O
*/
int main(int argc, char* argv[])
int main(int argc, char* argv[])
{
{
Line 53: Line 96:
//By default we output .ctx
//By default we output .ctx
strncpy( g_Extension, ".ctx",MAX_EXTENTION );
strncpy( g_Extension, ".ctx",MAX_EXTENTION );
memset(g_ICEKey,NULL,MAX_ICE_KEY);
memset(g_ICEKey,0,MAX_ICE_KEY);


int i = 1;
int i = 1;
while( i < argc )
while( i < argc )
{
{
if( stricmp( argv[i], "-h" ) == 0 )
if( STRING_CMP( argv[i], "-h" ) == 0 )
{
{
Usage();
Usage();
exit( 0 );
exit( 0 );
}  
}  
else if( stricmp( argv[i], "-d" ) == 0 )
else if( STRING_CMP( argv[i], "-d" ) == 0 )
{
{
g_Encrypt = false;
g_Encrypt = false;
}  
}  
else if( stricmp( argv[i], "-x" ) == 0 )
else if( STRING_CMP( argv[i], "-x" ) == 0 )
{
{
//Extention
//Extention
Line 79: Line 122:
strncpy( g_Extension, argv[i], MAX_EXTENTION );
strncpy( g_Extension, argv[i], MAX_EXTENTION );
}
}
else if( stricmp( argv[i], "-k" ) == 0 )
else if( STRING_CMP( argv[i], "-k" ) == 0 )
{
{
//Key
//Key
Line 165: Line 208:
memcpy( p2, p1, bytesLeft );
memcpy( p2, p1, bytesLeft );


int outLength = strlen(argv[i]) + MAX_EXTENTION + 1;
size_t outLength = strlen(argv[i]) + MAX_EXTENTION + 1;
char *pOutPath = (char *)malloc(outLength);
char *pOutPath = (char *)malloc(outLength);
strncpy(pOutPath,argv[i],outLength);
strncpy(pOutPath,argv[i],outLength);
Line 186: Line 229:
free(pOutPath);
free(pOutPath);
}
}
</pre>


== Linux Makefile ==
<pre>
#Simple Makefile for compiling on linux
CPP = g++
PUBLIC=../../public
CPPFLAGS = ${PUBLIC}


ice:
${CPP} -o $@ main.cpp ${PUBLIC}/IceKey.cpp -I${PUBLIC}


clean:
-rm -f ice
</pre>


//----- Helpers -----
static void Usage( void )
{
fprintf( stdout, "Usage: ice <-d> <-x ext> [-k IceKey(8 bit)] [file]\n" );
fprintf( stdout, "Default action: Encrypt. \n" );
fprintf( stdout, "-d : Decrypt a file. \n" );
fprintf( stdout, "-x : Extention to use as output. \n" );
fprintf( stdout, "-k : You need to specify your 8 bit Ice Encryption Key. \n" );
fprintf( stdout, "-h : Print the help menu, and stop.\n" );
}
static void Exit(const char *msg)
{
fprintf( stderr, msg );
exit( 1 );
}
static void SetExtention(char *dest, int length, const char *ext)
{
//Start at the end till we hit a .
//if we reach 0 without a .  just append the extension; one must not have existed.
int mover = length;
while( (*(dest + mover) != '.') && (mover > 0))
mover--;
if(mover == 0)
strcat(dest,ext);
else
{
strcpy(dest + mover,ext);
}
}
</pre>
==See Also==
==See Also==
* [[Vice]]
* [[Vice]]

Revision as of 17:38, 31 January 2006

What is this?

This is a Steam port of VICE that is built to not depend on Steam. Works on windows and linux.

Compiling on Windows

  • First you need to create a new Empty VisualC++ Console Project that will compile this code into an executable.
  • Add public/IceKey.cpp into your project
  • Setup the include paths in your settings to include public/ (for the header file)
  • Copy the code below into main.cpp, and compile.

Compiling on Linux

  • Copy the makefile into a file called Makefile
  • edit the Makefile to refleft the path to your SDK_ROOT/public/ directory
  • make

main.cpp

//========= Copyright © 1996-2005, Valve Corporation, All rights reserved. ============//
//
// Purpose: Standalone utility to encrypt files with ice encryption, that doesn't
//			 depend on Steam.
//
// Author: Valve Software and Scott Loyd (scottloyd@gmail.com).
//			Tested and proofread by Me2.
// Depends on: Just needs public/IceKey.cpp to be compiled/linked with it
// $NoKeywords: $
//
//=============================================================================//

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "IceKey.H"

// Globals
static bool g_Encrypt = true; //By default we encrypt

#define MAX_ICE_KEY 8
#define MAX_EXTENTION 16
static char g_ICEKey[MAX_ICE_KEY];
static char g_Extension[MAX_EXTENTION];

#ifdef WIN32
#define STRING_CMP stricmp
#else
#define STRING_CMP strcasecmp
#undef NULL
#define NULL 0
#endif


//----- Helpers -----
void Usage( void )
{
	fprintf( stdout, "Usage: ice <-d> <-x ext> [-k IceKey(8 bit)] [file]\n" );
	fprintf( stdout, "Default action: Encrypt. \n" );
	fprintf( stdout, "-d : Decrypt a file. \n" );
	fprintf( stdout, "-x : Extention to use as output. \n" );
	fprintf( stdout, "-k : You need to specify your 8 bit Ice Encryption Key. \n" );
	fprintf( stdout, "-h : Print the help menu, and stop.\n" );
}

void Exit(const char *msg)
{
	fprintf( stderr, msg );
	exit( 1 );
}

void SetExtention(char *dest, size_t length, const char *ext)
{
	//Start at the end till we hit a .
	//if we reach 0 without a .  just append the extension; one must not have existed.
	size_t mover = length;

	while( (*(dest + mover) != '.') && (mover > 0))
		mover--;

	if(mover == 0)
		strcat(dest,ext);
	else
	{
		strcpy(dest + mover,ext);
	}
}

/*
The entry point, see usage for I/O
*/
int main(int argc, char* argv[])
{
	if(argc < 2)
	{
		Usage();
		exit( 0 );
	}
	
	//By default we output .ctx
	strncpy( g_Extension, ".ctx",MAX_EXTENTION );
	memset(g_ICEKey,0,MAX_ICE_KEY);

	int i = 1;
	while( i < argc )
	{
		if( STRING_CMP( argv[i], "-h" ) == 0 )
		{
			Usage();
			exit( 0 );
		} 
		else if( STRING_CMP( argv[i], "-d" ) == 0 )
		{
			g_Encrypt = false;
		} 
		else if( STRING_CMP( argv[i], "-x" ) == 0 )
		{
			//Extention
			i++;

			if ( strlen( argv[i] ) > MAX_EXTENTION )
			{
				Exit("Your Extention is too big.\n");
			}

			strncpy( g_Extension, argv[i], MAX_EXTENTION );
		}
		else if( STRING_CMP( argv[i], "-k" ) == 0 )
		{
			//Key
			i++;

			if ( strlen( argv[i] ) != MAX_ICE_KEY )
			{
				Exit("Your ICE key needs to be 8 characters long.\n");
			}

			strncpy( g_ICEKey, argv[i], MAX_ICE_KEY );
		}
		else 
		{
			break;
		}
		i++;
	}

	if(g_ICEKey[0] == '\0') {
		Exit("You need to specify a key.\n");
	}
	//Parse files starting from current arg position
	if(argv[i] == NULL && (strlen(argv[i]) < 1))
		Exit("Was not about to find a file to parse\n");

	//Open allocate/read a file into memory
	FILE *pFile;
	pFile = fopen (argv[i], "rb");
	if(! pFile)
		Exit("Failed to open input file\n");

	long lFileSize; //Size of input file
	unsigned char *pBuff; //Holds the input file contents
	unsigned char *pOutBuff; //Holds the output goodies

	// obtain file size.
	fseek (pFile , 0 , SEEK_END);
	lFileSize= ftell (pFile);
	rewind (pFile);

	// allocate memory to contain the whole file.
	pBuff = (unsigned char*) malloc (lFileSize);
	pOutBuff = (unsigned char*) malloc (lFileSize);

	if (pBuff == NULL || pOutBuff == NULL)
	{
		fclose(pFile);
		Exit("Could not allocate buffer\n");;
	}

	// copy the file into the buffer.
	fread (pBuff,1,lFileSize,pFile);
	
	//clean the output buffer
	memset(pOutBuff,NULL,lFileSize);

	fclose(pFile);

	//Lets start the ice goodies!
	IceKey ice( 0 ); // level 0 = 64bit key
	ice.set( (unsigned char*) g_ICEKey ); // set key

	int blockSize = ice.blockSize();

	unsigned char *p1 = pBuff;
	unsigned char *p2 = pOutBuff;

	// encrypt data in 8 byte blocks
	int bytesLeft = lFileSize;

	while ( bytesLeft >= blockSize )
	{
		if ( g_Encrypt )
			ice.encrypt( p1, p2 );
		else
			ice.decrypt( p1, p2 );

		bytesLeft -= blockSize;
		p1+=blockSize;
		p2+=blockSize;
	}

	//The end chunk doesn't get an encryption?  that sux...
	memcpy( p2, p1, bytesLeft );

	size_t outLength = strlen(argv[i]) + MAX_EXTENTION + 1;
	char *pOutPath = (char *)malloc(outLength);
	strncpy(pOutPath,argv[i],outLength);

	SetExtention(pOutPath, outLength, g_Extension);

	pFile = fopen (pOutPath , "w");
	if(pFile == NULL)
	{
		fprintf( stderr, "Was not able to open output file for writing.\n" );
		goto dealloc;
	}

	fwrite (pOutBuff , 1 , lFileSize , pFile);
	fclose (pFile);

dealloc:
	free(pBuff);
	free(pOutBuff);
	free(pOutPath);
}

Linux Makefile

#Simple Makefile for compiling on linux
CPP = g++
PUBLIC=../../public
CPPFLAGS = ${PUBLIC}

ice:
	${CPP} -o $@ main.cpp ${PUBLIC}/IceKey.cpp -I${PUBLIC}

clean:
	-rm -f ice

See Also