/* * Copyright (c) 2005-2008 robert wilson * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #define _GNU_SOURCE #include #include #include #include #include #include #include #include #include #include #ifndef HEADER_NEW_DES_H #define DES_fcrypt des_fcrypt #endif #ifdef __predict_false #define probably_false(x) __predict_false(x) #else #define probably_false(x) (x) #endif #ifdef NO_STRCASESTR char *strcasestr(const char *a, const char *b){ size_t l; char f[3]; snprintf(f, sizeof(f), "%c%c", tolower(*b), toupper(*b)); for(l = strcspn(a, f); l != strlen(a); l += strcspn(a + l + 1, f) + 1) if(strncasecmp(a + l, b, strlen(b)) == 0) return (char *)(a + l); return NULL; } #endif uint_fast32_t z1, z2, z3, z4; static inline uint32_t lfsr113(){ z1 = ((z1 & 4294967294) << 18) ^ ((((z1 << 6) ^ z1) & UINT32_MAX) >> 13); z2 = ((z2 & 4294967288) << 2) ^ ((((z2 << 2) ^ z2) & UINT32_MAX) >> 27); z3 = ((z3 & 4294967280) << 7) ^ ((((z3 << 13) ^ z3) & UINT32_MAX) >> 21); z4 = ((z4 & 4294967168) << 13) ^ ((((z4 << 3) ^ z4) & UINT32_MAX) >> 12); return z1 ^ z2 ^ z3 ^ z4; } static inline void init_lfsr113(long seed){ srand48(seed); z1 = lrand48(); z2 = lrand48(); z3 = lrand48(); z4 = lrand48(); for(int i = 0; i < 256; ++i) lfsr113(); } int main(int argc, char *argv[]){ const char tripc[] = " !#$%()*+-./0123456789:;=?ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]" "^_`abcdefghijklmnopqrstuvwxyz{|}~&"; const char saltc[] = "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqr" "stuvwxyz"; char salt[2] = {0}, cap[24] = {0}; char *searchstring, *temp = cap + 10, *trip = temp + 3; char *(*compare)(const char *, const char *); int c; uint_fast8_t i, cflag = 0; while((c = getopt(argc, argv, "c")) != -1) switch(c){ case 'c': cflag = 1; break; case '?': printf("Usage: %s [-c] [regex]\n", argv[0]); return 1; default: abort(); } if(optind < argc) searchstring = argv[optind]; else{ searchstring = ""; cflag = 1; } init_lfsr113(time(0)); compare = cflag ? &strstr : &strcasestr; cap[8] = cap[9] = ' '; for(;;){ cap[0] = tripc[lfsr113() % (sizeof(tripc) - 2)]; salt[0] = saltc[lfsr113() % (sizeof(saltc) - 1)]; salt[1] = saltc[lfsr113() % (sizeof(saltc) - 1)]; memcpy(cap + 1, salt, 2); for(i = 3; i < 7; ++i) cap[i] = tripc[lfsr113() % (sizeof(tripc) - 2)]; cap[7] = tripc[lfsr113() % (sizeof(tripc) - 1)]; DES_fcrypt(cap, salt, temp); if(probably_false(compare(trip, searchstring))){ cap[10] = '='; cap[11] = cap[12] = ' '; cap[23] = '\n'; fwrite(cap, 24, 1, stdout); } } return(0); }