/* Generate an ID for the trailer dict, PDF/A needs this. TODO: Better algorithm for generate unique ID. */ HPDF_STATUS HPDF_PDFA_GenerateID(HPDF_Doc pdf) { HPDF_Array id; HPDF_BYTE *currentTime; HPDF_BYTE idkey[HPDF_MD5_KEY_LEN]; HPDF_MD5_CTX md5_ctx; time_t ltime; ltime = time(NULL); currentTime = (HPDF_BYTE *)ctime(<ime); id = HPDF_Dict_GetItem(pdf->trailer, "ID", HPDF_OCLASS_ARRAY); if (!id) { id = HPDF_Array_New(pdf->mmgr); if (!id || HPDF_Dict_Add(pdf->trailer, "ID", id) != HPDF_OK) return pdf->error.error_no; HPDF_MD5Init(&md5_ctx); HPDF_MD5Update(&md5_ctx, (HPDF_BYTE *) "libHaru", sizeof("libHaru") - 1); HPDF_MD5Update(&md5_ctx, currentTime, HPDF_StrLen((const char *)currentTime, -1)); HPDF_MD5Final(idkey, &md5_ctx); if (HPDF_Array_Add (id, HPDF_Binary_New (pdf->mmgr, idkey, HPDF_MD5_KEY_LEN)) != HPDF_OK) return pdf->error.error_no; if (HPDF_Array_Add (id, HPDF_Binary_New (pdf->mmgr,idkey,HPDF_MD5_KEY_LEN)) != HPDF_OK) return pdf->error.error_no; return HPDF_OK; } return HPDF_OK; }
void HPDF_EncryptDict_CreateID (HPDF_EncryptDict dict, HPDF_Dict info, HPDF_Xref xref) { HPDF_MD5_CTX ctx; HPDF_Encrypt attr = (HPDF_Encrypt)dict->attr; /* use the result of 'time' function to get random value. * when debugging, 'time' value is ignored. */ #ifndef HPDF_DEBUG time_t t = HPDF_TIME (NULL); #endif /* HPDF_DEBUG */ HPDF_MD5Init (&ctx); #ifndef HPDF_DEBUG HPDF_MD5Update(&ctx, (HPDF_BYTE *)&t, sizeof(t)); /* create File Identifier from elements of Into dictionary. */ if (info) { const char *s; HPDF_UINT len; /* Author */ s = HPDF_Info_GetInfoAttr (info, HPDF_INFO_AUTHOR); if ((len = HPDF_StrLen (s, -1)) > 0) HPDF_MD5Update(&ctx, (const HPDF_BYTE *)s, len); /* Creator */ s = HPDF_Info_GetInfoAttr (info, HPDF_INFO_CREATOR); if ((len = HPDF_StrLen (s, -1)) > 0) HPDF_MD5Update(&ctx, (const HPDF_BYTE *)s, len); /* Producer */ s = HPDF_Info_GetInfoAttr (info, HPDF_INFO_PRODUCER); if ((len = HPDF_StrLen (s, -1)) > 0) HPDF_MD5Update(&ctx, (const HPDF_BYTE *)s, len); /* Title */ s = HPDF_Info_GetInfoAttr (info, HPDF_INFO_TITLE); if ((len = HPDF_StrLen (s, -1)) > 0) HPDF_MD5Update(&ctx, (const HPDF_BYTE *)s, len); /* Subject */ s = HPDF_Info_GetInfoAttr (info, HPDF_INFO_SUBJECT); if ((len = HPDF_StrLen (s, -1)) > 0) HPDF_MD5Update(&ctx, (const HPDF_BYTE *)s, len); /* Keywords */ s = HPDF_Info_GetInfoAttr (info, HPDF_INFO_KEYWORDS); if ((len = HPDF_StrLen (s, -1)) > 0) HPDF_MD5Update(&ctx, (const HPDF_BYTE *)s, len); HPDF_MD5Update(&ctx, (const HPDF_BYTE *)&(xref->entries->count), sizeof(HPDF_UINT32)); } #endif HPDF_MD5Final(attr->encrypt_id, &ctx); }