/*
* ofpwgen: convert a string to an XOR'd
* hex string that can be used as the value
* for security-password in Open Firmware
*/
#include <sys/types.h>
#include <sys/param.h>
#include <stdio.h>
#include <string.h>

int
main( int ac, char *av[] )
{
/* stores password given by user */
char buf[ MAXPATHLEN ];

int i, c, val = 0;

/* XOR key used by Open Firmware */
int x[ 2 ] = { 'A', 'A' };

if ( ac != 2 ) {
fprintf( stderr, "Usage: %s password\n", av[ 0 ] );
exit( 1 );
}

if ( strlen( av[ 1 ] ) >= MAXPATHLEN ) {
fprintf( stderr, "%s: too long\n", av[ 1 ] );
exit( 2 );
}
strcpy( buf, av[ 1 ] );

/* shifting magic, conversion from ASCII to hex */
c = x[ 0 ];
val = val << 4;
val = val + c - 'A' + 10;
val = val << 4;
val = val + c - 'A' + 10;
x[ 0 ] = val;

val = 0;
c = x[ 1 ];
val = val << 4;
val = val + c - 'A' + 10;
val = val << 4;
val = val + c - 'A' + 10;
x[ 1 ] = val;

/* print out the XOR'd version of pw in firmware format */
for ( i = 0; i < strlen( buf ); i++ ) {
printf( "%%%.2x", buf[ i ] ^ x[ i % 2 ] );
}
putc( '\n', stdout );

return( 0 );
}

