Ejemplo n.º 1
1
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);
}
Ejemplo n.º 2
0
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);
}
Ejemplo n.º 3
0
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");
}
Ejemplo n.º 4
0
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);
}