SHA1Context * SHA1_Resurrect(unsigned char *space,void *arg) { SHA1Context *cx = SHA1_NewContext(); if (cx == NULL) return NULL; PORT_Memcpy(cx,space, sizeof(SHA1Context)); return cx; }
/* take string password and turn it into a key. The key is dependent * on a global salt entry acquired from the database. This salted * value will be based to a pkcs5 pbe function before it is used * in an actual encryption */ static SECStatus sftkdb_passwordToKey(SFTKDBHandle *keydb, SECItem *salt, const char *pw, SECItem *key) { SHA1Context *cx = NULL; SECStatus rv = SECFailure; key->data = PORT_Alloc(SHA1_LENGTH); if (key->data == NULL) { goto loser; } key->len = SHA1_LENGTH; cx = SHA1_NewContext(); if (cx == NULL) { goto loser; } SHA1_Begin(cx); if (salt && salt->data) { SHA1_Update(cx, salt->data, salt->len); } SHA1_Update(cx, (unsigned char *)pw, PORT_Strlen(pw)); SHA1_End(cx, key->data, &key->len, key->len); rv = SECSuccess; loser: if (cx) { SHA1_DestroyContext(cx, PR_TRUE); } if (rv != SECSuccess) { if (key->data != NULL) { PORT_ZFree(key->data, key->len); } key->data = NULL; } return rv; }