static void *get_salt(char *ciphertext) { int i; char *p; char *ctcopy = strdup(ciphertext); char *keeptr = ctcopy; ctcopy += 9; /* skip over "$vnc$*" */ salt_struct = mem_alloc_tiny(sizeof(struct custom_salt), MEM_ALIGN_WORD); p = strtok(ctcopy, "*"); salt_struct->keyCrackData.version = atoi(p); p = strtok(NULL, "*"); salt_struct->keyCrackData.saltLen = atoi(p); p = strtok(NULL, "*"); salt_struct->keyCrackData.nnLen = atoi(p); p = strtok(NULL, "*"); for (i = 0; i < salt_struct->keyCrackData.saltLen; i++) salt_struct->keyCrackData.salt[i] = atoi16[ARCH_INDEX(p[i * 2])] * 16 + atoi16[ARCH_INDEX(p[i * 2 + 1])]; salt_struct->keyCrackData.salt[salt_struct->keyCrackData.saltLen] = 0; p = strtok(NULL, "*"); salt_struct->keyCrackData.oidLen = atoi(p); p = strtok(NULL, "*"); for (i = 0; i < salt_struct->keyCrackData.oidLen; i++) salt_struct->keyCrackData.oidData[i] = atoi16[ARCH_INDEX(p[i * 2])] * 16 + atoi16[ARCH_INDEX(p[i * 2 + 1])]; salt_struct->keyCrackData.oidData[salt_struct->keyCrackData.oidLen] =0; p = strtok(NULL, "*"); salt_struct->keyCrackData.encDataLen = atoi(p); p = strtok(NULL, "*"); for (i = 0; i < salt_struct->keyCrackData.encDataLen; i++) salt_struct->keyCrackData.encData[i] = atoi16[ARCH_INDEX(p[i * 2])] * 16 + atoi16[ARCH_INDEX(p[i * 2 + 1])]; p = strtok(NULL, "*"); salt_struct->keyCrackData.globalSaltLen = atoi(p); p = strtok(NULL, "*"); for (i = 0; i < salt_struct->keyCrackData.globalSaltLen; i++) salt_struct->keyCrackData.globalSalt[i] = atoi16[ARCH_INDEX(p[i * 2])] * 16 + atoi16[ARCH_INDEX(p[i * 2 + 1])]; // initialize the pkcs5 structure salt_struct->saltItem.type = (SECItemType) 0; salt_struct->saltItem.len = salt_struct->keyCrackData.saltLen; salt_struct->saltItem.data = salt_struct->keyCrackData.salt; salt_struct->paramPKCS5 = nsspkcs5_NewParam(0, &salt_struct->saltItem, 1, &salt_struct->gpbe_param, salt_struct->salt_data); if(salt_struct->paramPKCS5 == NULL) { fprintf(stderr, "\nFailed to initialize NSSPKCS5 structure"); exit(0); } // Current algorithm is // SEC_OID_PKCS12_PBE_WITH_SHA1_AND_TRIPLE_DES_CBC // Setup the encrypted password-check string memcpy(salt_struct->encString, salt_struct->keyCrackData.encData, salt_struct->keyCrackData.encDataLen ); // Calculate partial sha1 data for password hashing SHA1_Init(&salt_struct->pctx); SHA1_Update(&salt_struct->pctx, salt_struct->keyCrackData.globalSalt, salt_struct->keyCrackData.globalSaltLen); MEM_FREE(keeptr); return (void *)salt_struct; }
int FireMasterInit(char *dirProfile) { SECItem saltItem; if( CrackKeyData(dirProfile, &keyCrackData) == false) { exit(0); } // Initialize the pkcs5 structure... saltItem.type = (SECItemType) 0; saltItem.len = keyCrackData.saltLen; saltItem.data = keyCrackData.salt; paramPKCS5 = nsspkcs5_NewParam(0, &saltItem, 1); if( paramPKCS5 == NULL) { printf("\n Failed to initialize NSSPKCS5 structure"); exit(0); } // 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 ); if( CheckMasterPassword("") == true ) { printf("\n Master password is not set ...exiting FireMaster \n\n"); exit(0); } // Calculate partial sha1 data for password hashing... SHA1_Init(&pctx); SHA1_Update(&pctx, keyCrackData.globalSalt, keyCrackData.globalSaltLen); return true; }
static void process_path(char *path) { int i; struct stat sb; 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; struct NSSPKCS5PBEParameter gpbe_param; unsigned char salt_data[4096]; 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); unsigned char data1[256]; unsigned char data2[512]; SECItem secPreHash; secPreHash.data = data1; memcpy(secPreHash.data + SHA1_LENGTH, saltItem.data, saltItem.len); secPreHash.len = saltItem.len + SHA1_LENGTH; SECItem pkcs5_pfxpbe; pkcs5_pfxpbe.data = data2; if(CheckMasterPassword("", &pkcs5_pfxpbe, &secPreHash)) { fprintf (stderr, "%s : no Master Password set!\n", path); return; } printf("%s:$mozilla$*%d*%d*%d*",path, 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"); }