static void process_file(const char *filename) { FILE *pfxfile; int i, count; unsigned char buffer[LINE_BUFFER_SIZE]; BIO* in = NULL; PKCS12 *p12 = NULL; const char *ext[] = {".p12",".pfx"}; char *fname; if (!(pfxfile = fopen(filename, "rb"))) { fprintf(stderr, "! %s : %s\n", filename, strerror(errno)); return; } in = BIO_new_file(filename, "rb"); if (!in) { fprintf (stderr, "PKCS12 file not found: %s\n", filename); fclose(pfxfile); return; } if(!(p12 = d2i_PKCS12_bio (in, NULL))) { perror("Unable to create PKCS12 object\n"); fclose(pfxfile); return; } if(PKCS12_verify_mac(p12, "", -1)) { fprintf(stderr, "%s has no password!\n", filename); fclose(pfxfile); return; } count = fread(buffer, 1, LINE_BUFFER_SIZE, pfxfile); fname = strip_suffixes(basename(filename), ext, 2); printf("%s:$pfx$*%d*", fname, count); for (i = 0; i < count; i++) { printf("%c%c", itoa16[ARCH_INDEX(buffer[i] >> 4)], itoa16[ARCH_INDEX(buffer[i] & 0x0f)]); } printf("\n"); fclose(pfxfile); if(in) BIO_free(in); }
static void process_file(const char *filename) { FILE *fp; int count; unsigned char buf[32]; unsigned int iterations; const char *ext[] = {".psafe3"}; if (!(fp = fopen(filename, "rb"))) { fprintf(stderr, "! %s: %s\n", filename, strerror(errno)); return; } count = fread(buf, 4, 1, fp); assert(count == 1); if(memcmp(buf, magic, 4)) { fprintf(stderr, "%s : Couldn't find PWS3 magic string. Is this a Password Safe file?\n", filename); exit(1); } count = fread(buf, 32, 1, fp); assert(count == 1); iterations = fget32(fp); printf("%s:$pwsafe$*3*", strip_suffixes(basename(filename), ext, 1)); print_hex(buf, 32); printf("*%d*", iterations); count = fread(buf, 32, 1, fp); assert(count == 1); print_hex(buf,32); printf("\n"); fclose(fp); }
static void process_path(char *path) { int i; struct stat sb; struct NSSPKCS5PBEParameter gpbe_param; unsigned char salt_data[4096]; unsigned char data1[256]; unsigned char data2[512]; SECItem secPreHash; SECItem pkcs5_pfxpbe; const char *extension[]= {".db"}; char *fname; if(stat(path, &sb) == 0) { if(S_ISDIR(sb.st_mode)) { fprintf (stderr, "%s : is a directory, expecting key3.db file!\n", path); return; } } if(CrackKeyData(path, &keyCrackData) == false) { return; } // initialize the pkcs5 structure saltItem.type = (SECItemType) 0; saltItem.len = keyCrackData.saltLen; assert(keyCrackData.saltLen < 32); assert(keyCrackData.oidLen < 32); saltItem.data = keyCrackData.salt; paramPKCS5 = nsspkcs5_NewParam(0, &saltItem, 1, &gpbe_param, salt_data); if(paramPKCS5 == NULL) { fprintf(stderr, "Failed to initialize NSSPKCS5 structure\n"); return; } // Current algorithm is // SEC_OID_PKCS12_PBE_WITH_SHA1_AND_TRIPLE_DES_CBC // Setup the encrypted password-check string memcpy(encString, keyCrackData.encData, keyCrackData.encDataLen); // Calculate partial sha1 data for password hashing SHA1_Init(&pctx); SHA1_Update(&pctx, keyCrackData.globalSalt, keyCrackData.globalSaltLen); secPreHash.data = data1; memcpy(secPreHash.data + SHA1_LENGTH, saltItem.data, saltItem.len); secPreHash.len = saltItem.len + SHA1_LENGTH; pkcs5_pfxpbe.data = data2; if(CheckMasterPassword("", &pkcs5_pfxpbe, &secPreHash)) { fprintf (stderr, "%s : no Master Password set!\n", path); return; } fname = strip_suffixes(basename(path),extension,1); printf("%s:$mozilla$*%d*%d*%d*",fname, keyCrackData.version, keyCrackData.saltLen, keyCrackData.nnLen); for (i = 0; i < keyCrackData.saltLen; i++) printf("%c%c", itoa16[ARCH_INDEX(keyCrackData.salt[i] >> 4)], itoa16[ARCH_INDEX(keyCrackData.salt[i] & 0x0f)]); printf("*%d*", keyCrackData.oidLen); for (i = 0; i < keyCrackData.oidLen; i++) printf("%c%c", itoa16[ARCH_INDEX(keyCrackData.oidData[i] >> 4)], itoa16[ARCH_INDEX(keyCrackData.oidData[i] & 0x0f)]); printf("*%d*", keyCrackData.encDataLen); for (i = 0; i < keyCrackData.encDataLen; i++) printf("%c%c", itoa16[ARCH_INDEX(keyCrackData.encData[i] >> 4)], itoa16[ARCH_INDEX(keyCrackData.encData[i] & 0x0f)]); printf("*%d*", keyCrackData.globalSaltLen); for (i = 0; i < keyCrackData.globalSaltLen; i++) printf("%c%c", itoa16[ARCH_INDEX(keyCrackData.globalSalt[i] >> 4)], itoa16[ARCH_INDEX(keyCrackData.globalSalt[i] & 0x0f)]); printf("\n"); }
static void process_file(const char *fname) { FILE *fp; unsigned char buf[1024]; long size, offset = 0; size_t i, j; uint32_t n; const char *extension[]={".kwl"}; char *bname; if (!(fp = fopen(fname, "rb"))) { fprintf(stderr, "%s : %s\n", fname, strerror(errno)); return; } fseek(fp, 0, SEEK_END); size = ftell(fp); fseek(fp, 0, SEEK_SET); count = fread(buf, KWMAGIC_LEN, 1, fp); if (memcmp(buf, KWMAGIC, KWMAGIC_LEN) != 0) { fprintf(stderr, "%s : Not a KDE KWallet file!\n", fname); exit(1); } offset += KWMAGIC_LEN; count = fread(buf, 4, 1, fp); offset += 4; /* First byte is major version, second byte is minor version */ if (buf[0] != KWALLET_VERSION_MAJOR) { fprintf(stderr, "%s : Unknown version!\n", fname); exit(2); } if (buf[1] != KWALLET_VERSION_MINOR) { fprintf(stderr, "%s : Unknown version!\n", fname); exit(3); } if (buf[2] != KWALLET_CIPHER_BLOWFISH_CBC) { fprintf(stderr, "%s : Unsupported cipher\n", fname); exit(4); } if (buf[3] != KWALLET_HASH_SHA1) { fprintf(stderr, "%s : Unsupported hash\n", fname); exit(5); } /* Read in the hashes */ n = fget32_(fp); if (n > 0xffff) { fprintf(stderr, "%s : sanity check failed!\n", fname); exit(6); } offset += 4; for (i = 0; i < n; ++i) { uint32_t fsz; count = fread(buf, 16, 1, fp); offset += 16; fsz = fget32_(fp); offset += 4; for (j = 0; j < fsz; ++j) { count = fread(buf, 16, 1, fp); offset += 16; } } /* Read in the rest of the file. */ encrypted_size = size - offset; count = fread(encrypted, encrypted_size, 1, fp); if ((encrypted_size % 8) != 0) { fprintf(stderr, "%s : invalid file structure!\n", fname); exit(7); } bname = strip_suffixes(basename(fname), extension, 1); printf("%s:$kwallet$%ld$", bname, encrypted_size); print_hex(encrypted, encrypted_size); printf(":::::%s\n", fname); fclose(fp); }