static int filehash_cb (const char *p, const char *f, probe_ctx *ctx, oval_schema_version_t over) { SEXP_t *itm; char pbuf[PATH_MAX+1]; size_t plen, flen; bool include_filepath; int fd; if (f == NULL) return (0); /* * Prepare path */ plen = strlen (p); flen = strlen (f); if (plen + flen + 1 > PATH_MAX) return (-1); memcpy (pbuf, p, sizeof (char) * plen); if (p[plen - 1] != FILE_SEPARATOR) { pbuf[plen] = FILE_SEPARATOR; ++plen; } memcpy (pbuf + plen, f, sizeof (char) * flen); pbuf[plen+flen] = '\0'; include_filepath = oval_schema_version_cmp(over, OVAL_SCHEMA_VERSION(5.6)) >= 0; /* * Open the file */ fd = open (pbuf, O_RDONLY); if (fd < 0) { strerror_r (errno, pbuf, PATH_MAX); pbuf[PATH_MAX] = '\0'; itm = probe_item_create(OVAL_INDEPENDENT_FILE_HASH, NULL, "filepath", OVAL_DATATYPE_STRING, include_filepath ? pbuf : NULL, "path", OVAL_DATATYPE_STRING, p, "filename", OVAL_DATATYPE_STRING, f, NULL ); probe_item_add_msg(itm, OVAL_MESSAGE_LEVEL_ERROR, "Can't open \"%s\": errno=%d, %s.", pbuf, errno, strerror (errno)); probe_item_setstatus(itm, SYSCHAR_STATUS_ERROR); } else { uint8_t md5_dst[16]; size_t md5_dstlen = sizeof md5_dst; char md5_str[(sizeof md5_dst * 2) + 1]; uint8_t sha1_dst[20]; size_t sha1_dstlen = sizeof sha1_dst; char sha1_str[(sizeof sha1_dst * 2) + 1]; /* * Compute hash values */ if (crapi_mdigest_fd (fd, 2, CRAPI_DIGEST_MD5, md5_dst, &md5_dstlen, CRAPI_DIGEST_SHA1, sha1_dst, &sha1_dstlen) != 0) { close (fd); return (-1); } close (fd); md5_str[0] = '\0'; sha1_str[0] = '\0'; mem2hex (md5_dst, md5_dstlen, md5_str, sizeof md5_str); mem2hex (sha1_dst, sha1_dstlen, sha1_str, sizeof sha1_str); /* * Create and add the item */ itm = probe_item_create(OVAL_INDEPENDENT_FILE_HASH, NULL, "filepath", OVAL_DATATYPE_STRING, include_filepath ? pbuf : NULL, "path", OVAL_DATATYPE_STRING, p, "filename", OVAL_DATATYPE_STRING, f, "md5", OVAL_DATATYPE_STRING, md5_str, "sha1", OVAL_DATATYPE_STRING, sha1_str, NULL); if (md5_dstlen == 0 || sha1_dstlen == 0) probe_item_setstatus(itm, SYSCHAR_STATUS_ERROR); if (md5_dstlen == 0) probe_item_add_msg(itm, OVAL_MESSAGE_LEVEL_ERROR, "Unable to compute md5 hash value of \"%s\".", pbuf); if (sha1_dstlen == 0) probe_item_add_msg(itm, OVAL_MESSAGE_LEVEL_ERROR, "Unable to compute sha1 hash value of \"%s\".", pbuf); } probe_item_collect(ctx, itm); return (0); }
static int filehash58_cb (const char *p, const char *f, const char *h, probe_ctx *ctx) { SEXP_t *itm; char pbuf[PATH_MAX+1]; size_t plen, flen; int fd; if (f == NULL) return (0); /* * Prepare path */ plen = strlen (p); flen = strlen (f); if (plen + flen + 1 > PATH_MAX) return (-1); memcpy (pbuf, p, sizeof (char) * plen); if (p[plen - 1] != FILE_SEPARATOR) { pbuf[plen] = FILE_SEPARATOR; ++plen; } memcpy (pbuf + plen, f, sizeof (char) * flen); pbuf[plen+flen] = '\0'; /* * Open the file */ fd = open (pbuf, O_RDONLY); if (fd < 0) { strerror_r (errno, pbuf, PATH_MAX); pbuf[PATH_MAX] = '\0'; itm = probe_item_create (OVAL_INDEPENDENT_FILE_HASH58, NULL, "filepath", OVAL_DATATYPE_STRING, pbuf, "path", OVAL_DATATYPE_STRING, p, "filename", OVAL_DATATYPE_STRING, f, "hash_type",OVAL_DATATYPE_STRING, h, NULL); probe_item_add_msg(itm, OVAL_MESSAGE_LEVEL_ERROR, "Can't open \"%s\": errno=%d, %s.", pbuf, errno, strerror (errno)); probe_item_setstatus(itm, SYSCHAR_STATUS_ERROR); } else { uint8_t hash_dst[1025]; size_t hash_dstlen = sizeof hash_dst; char hash_str[2051]; crapi_alg_t hash_type; hash_type = oscap_string_to_enum(CRAPI_ALG_MAP, h); hash_dstlen = oscap_string_to_enum(CRAPI_ALG_MAP_SIZE, h); /* * Compute hash value */ if (crapi_mdigest_fd (fd, 1, hash_type, hash_dst, &hash_dstlen) != 0) { close (fd); return (-1); } close (fd); hash_str[0] = '\0'; mem2hex (hash_dst, hash_dstlen, hash_str, sizeof hash_str); /* * Create and add the item */ itm = probe_item_create(OVAL_INDEPENDENT_FILE_HASH58, NULL, "filepath", OVAL_DATATYPE_STRING, pbuf, "path", OVAL_DATATYPE_STRING, p, "filename", OVAL_DATATYPE_STRING, f, "hash_type",OVAL_DATATYPE_STRING, h, "hash", OVAL_DATATYPE_STRING, hash_str, NULL); if (hash_dstlen == 0) { probe_item_add_msg(itm, OVAL_MESSAGE_LEVEL_ERROR, "Unable to compute %s hash value of \"%s\".", h, pbuf); probe_item_setstatus(itm, SYSCHAR_STATUS_ERROR); } } probe_item_collect(ctx, itm); return (0); }