/* * ofpwgen: convert a string to an XOR'd * hex string that can be used as the value * for security-password in Open Firmware */ #include #include #include #include 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 ); }