#include <time.h> /* time */
#include <stdio.h> /* FILE, fopen, fwrite, fclose, fprintf */
#include <stdint.h> /* uint*_t int*_t */
#include <string.h> /* strlen */
#include <stdlib.h> /* srand, rand */
#include <sys/stat.h> /* stat */
#include <sys/types.h> /* off_t */
static uint8_t
CorruptStep( const char * filename, const off_t filesize, const char * pattern)
{
uint8_t ret = 0 ;
FILE
* fp
= fopen ( filename
, "w" ) ; if ( fp != NULL)
{
off_t i;
uint8_t length
= ( uint8_t ) strlen ( pattern
) ; if ( length > 0 )
{
off_t times = ( filesize / length) + ( filesize % length) ;
for ( i = 0 ; i < times; i++ )
{
fwrite ( pattern
, sizeof ( char ) , length
, fp
) ; }
}
else
{
for ( i = 0 ; i < filesize; i++ )
{
fwrite ( & n
, sizeof ( char ) , 1 , fp
) ; }
}
}
else
{
ret = 1 ;
}
return ret;
}
static uint8_t
CorruptFile( const char * filename)
{
uint8_t ret = 0 ;
struct stat st;
if ( stat( filename, & st) == 0 )
{
if ( S_ISREG( st.st_mode ) != 0 )
{
off_t filesize = st.st_size ;
const char * steps[ 35 ] = { "" , "" , "" , "" , "\x55 " , "\xAA " ,
"\x92 \x49 \x24 " , "\x49 \x24 \x92 " ,
"\x24 \x92 \x49 " , "\x00 " , "\x11 " ,
"\x22 " , "\x33 " , "\x44 " , "\x55 " ,
"\x66 " , "\x77 " , "\x88 " , "\x99 " ,
"\xAA " , "\xBB " , "\xCC " , "\xDD " ,
"\xEE " , "\xFF " , "\x92 \x49 \x24 " ,
"\x49 \x24 \x92 " , "\x24 \x92 \x49 " ,
"\x6D \xB6 \xDB " , "\xB6 \xDB \x6D " ,
"\xDB \x6D \xB6 " , "" , "" , "" , "" } ;
uint8_t i;
for ( i = 0 ; i < 35 ; i++ )
{
if ( CorruptStep( filename, filesize, steps[ i] ) != 0 )
{
fprintf ( stderr
, "corrupt: shredding of '%s' " , filename
) ; fprintf ( stderr
, "failed on step %d\n " , i
) ; ret = 1 ;
break ;
}
}
}
else
{
fprintf ( stderr
, "corrupt: '%s' is not a regular file\n " , filename
) ; ret = 1 ;
}
}
else
{
fprintf ( stderr
, "corrupt: '%s' not found\n " , filename
) ; ret = 1 ;
}
return ret;
}
int
main( int argc, char * argv[ ] )
{
if ( argc > 1 )
{
int i;
for ( i = 1 ; i < argc; i++ )
{
CorruptFile( argv[ i] ) ;
}
}
else
{
fprintf ( stderr
, "Usage: corrupt FILES...\n " ) ; fprintf ( stderr
, "Shreds files using the Gutmann method\n " ) ; }
return 0 ;
}
I2luY2x1ZGUgPHRpbWUuaD4gLyogdGltZSAqLwojaW5jbHVkZSA8c3RkaW8uaD4gLyogRklMRSwgZm9wZW4sIGZ3cml0ZSwgZmNsb3NlLCBmcHJpbnRmICovCiNpbmNsdWRlIDxzdGRpbnQuaD4gLyogdWludCpfdCBpbnQqX3QgKi8KI2luY2x1ZGUgPHN0cmluZy5oPiAvKiBzdHJsZW4gKi8KI2luY2x1ZGUgPHN0ZGxpYi5oPiAvKiBzcmFuZCwgcmFuZCAqLwojaW5jbHVkZSA8c3lzL3N0YXQuaD4gLyogc3RhdCAqLwojaW5jbHVkZSA8c3lzL3R5cGVzLmg+IC8qIG9mZl90ICovCgpzdGF0aWMgdWludDhfdApDb3JydXB0U3RlcChjb25zdCBjaGFyICpmaWxlbmFtZSwgY29uc3Qgb2ZmX3QgZmlsZXNpemUsIGNvbnN0IGNoYXIgKnBhdHRlcm4pCnsKICAgIHVpbnQ4X3QgcmV0ID0gMDsKCiAgICBGSUxFKiBmcCA9IGZvcGVuKGZpbGVuYW1lLCAgInciKTsKICAgIGlmIChmcCAhPSBOVUxMKQogICAgewogICAgICAgIG9mZl90IGk7CiAgICAgICAgdWludDhfdCBsZW5ndGggPSAodWludDhfdCkgc3RybGVuKHBhdHRlcm4pOwogICAgICAgIGlmIChsZW5ndGggPiAwKQogICAgICAgIHsKICAgICAgICAgICAgb2ZmX3QgdGltZXMgPSAoZmlsZXNpemUgLyBsZW5ndGgpICsgKGZpbGVzaXplICUgbGVuZ3RoKTsKICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHRpbWVzOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZ3cml0ZShwYXR0ZXJuLCBzaXplb2YoY2hhciksIGxlbmd0aCwgZnApOwogICAgICAgICAgICB9CiAgICAgICAgfSAKICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBzcmFuZCgodW5zaWduZWQgaW50KSB0aW1lKE5VTEwpKTsKICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGZpbGVzaXplOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGludCBuID0gcmFuZCgpOwogICAgICAgICAgICAgICAgZndyaXRlKCZuLCBzaXplb2YoY2hhciksIDEsIGZwKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmY2xvc2UoZnApOwogICAgfQogICAgZWxzZQogICAgeyAgIAogICAgICAgIHJldCA9IDE7CiAgICB9CiAgICByZXR1cm4gcmV0Owp9CgpzdGF0aWMgdWludDhfdApDb3JydXB0RmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSkKewogICAgdWludDhfdCByZXQgPSAwOwogICAgCiAgICBzdHJ1Y3Qgc3RhdCBzdDsKICAgIGlmKHN0YXQoZmlsZW5hbWUsICZzdCkgPT0gMCkKICAgIHsKICAgICAgICBpZiAoU19JU1JFRyhzdC5zdF9tb2RlKSAhPSAwKQogICAgICAgIHsKICAgICAgICAgICAgb2ZmX3QgZmlsZXNpemUgPSBzdC5zdF9zaXplOwogICAgICAgICAgICBjb25zdCBjaGFyKiBzdGVwc1szNV0gPSB7IiIsICIiLCAiIiwgIiIsICJceDU1IiwgIlx4QUEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4OTJceDQ5XHgyNCIsICJceDQ5XHgyNFx4OTIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4MjRceDkyXHg0OSIsICJceDAwIiwgIlx4MTEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4MjIiLCAiXHgzMyIsICJceDQ0IiwgIlx4NTUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4NjYiLCAiXHg3NyIsICJceDg4IiwgIlx4OTkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4QUEiLCAiXHhCQiIsICJceENDIiwgIlx4REQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4RUUiLCAiXHhGRiIsICJceDkyXHg0OVx4MjQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4NDlceDI0XHg5MiIsICJceDI0XHg5Mlx4NDkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4NkRceEI2XHhEQiIsICJceEI2XHhEQlx4NkQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4REJceDZEXHhCNiIsICIiLCAiIiwgIiIsICIifTsKICAgICAgICAgICAgdWludDhfdCBpOwogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzU7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKENvcnJ1cHRTdGVwKGZpbGVuYW1lLCBmaWxlc2l6ZSwgc3RlcHNbaV0pICE9IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJjb3JydXB0OiBzaHJlZGRpbmcgb2YgJyVzJyAiLCBmaWxlbmFtZSk7CiAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJmYWlsZWQgb24gc3RlcCAlZFxuIiwgaSk7CiAgICAgICAgICAgICAgICAgICAgcmV0ID0gMTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImNvcnJ1cHQ6ICclcycgaXMgbm90IGEgcmVndWxhciBmaWxlXG4iLCBmaWxlbmFtZSk7CiAgICAgICAgICAgIHJldCA9IDE7CiAgICAgICAgfQogICAgfSAgCiAgICBlbHNlCiAgICB7CiAgICAgICAgZnByaW50ZihzdGRlcnIsICJjb3JydXB0OiAnJXMnIG5vdCBmb3VuZFxuIiwgZmlsZW5hbWUpOwogICAgICAgIHJldCA9IDE7CiAgICB9CiAgICByZXR1cm4gcmV0Owp9CgppbnQKbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKQp7CiAgICBpZiAoYXJnYyA+IDEpCiAgICB7CiAgICAgICAgaW50IGk7CiAgICAgICAgZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIENvcnJ1cHRGaWxlKGFyZ3ZbaV0pOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiBjb3JydXB0IEZJTEVTLi4uXG4iKTsKICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlNocmVkcyBmaWxlcyB1c2luZyB0aGUgR3V0bWFubiBtZXRob2RcbiIpOwogICAgfQogICAgcmV0dXJuIDA7IAp9Cg==