#include "crc/sha512.h"
#include "crc/sha1.h"
#include "crc/xxhash.h"
+#include "crc/sha3.h"
static void populate_hdr(struct thread_data *td, struct io_u *io_u,
struct verify_header *hdr, unsigned int header_num,
case VERIFY_SHA512:
len = sizeof(struct vhdr_sha512);
break;
+ case VERIFY_SHA3_224:
+ len = sizeof(struct vhdr_sha3_224);
+ break;
+ case VERIFY_SHA3_256:
+ len = sizeof(struct vhdr_sha3_256);
+ break;
+ case VERIFY_SHA3_384:
+ len = sizeof(struct vhdr_sha3_384);
+ break;
+ case VERIFY_SHA3_512:
+ len = sizeof(struct vhdr_sha3_512);
+ break;
case VERIFY_XXHASH:
len = sizeof(struct vhdr_xxhash);
break;
fd = open(fname, O_CREAT | O_TRUNC | O_WRONLY, 0644);
if (fd < 0) {
perror("open verify buf file");
+ free(ptr);
return;
}
(void)paste_format_inplace(pattern, pattern_size,
td->o.verify_fmt, td->o.verify_fmt_sz, io_u);
- buf = (void *) hdr + header_size;
+ buf = (char *) hdr + header_size;
len = get_hdr_inc(td, io_u) - header_size;
mod = (get_hdr_inc(td, io_u) * vc->hdr_num + header_size) % pattern_size;
return EILSEQ;
}
+static int verify_io_u_sha3(struct verify_header *hdr, struct vcont *vc,
+ struct fio_sha3_ctx *sha3_ctx, uint8_t *sha,
+ unsigned int sha_size, const char *name)
+{
+ void *p = io_u_verify_off(hdr, vc);
+
+ dprint(FD_VERIFY, "%s verify io_u %p, len %u\n", name, vc->io_u, hdr->len);
+
+ fio_sha3_update(sha3_ctx, p, hdr->len - hdr_size(vc->td, hdr));
+ fio_sha3_final(sha3_ctx);
+
+ if (!memcmp(sha, sha3_ctx->sha, sha_size))
+ return 0;
+
+ vc->name = name;
+ vc->good_crc = sha;
+ vc->bad_crc = sha3_ctx->sha;
+ vc->crc_len = sha_size;
+ log_verify_failure(hdr, vc);
+ return EILSEQ;
+}
+
+static int verify_io_u_sha3_224(struct verify_header *hdr, struct vcont *vc)
+{
+ struct vhdr_sha3_224 *vh = hdr_priv(hdr);
+ uint8_t sha[SHA3_224_DIGEST_SIZE];
+ struct fio_sha3_ctx sha3_ctx = {
+ .sha = sha,
+ };
+
+ fio_sha3_224_init(&sha3_ctx);
+
+ return verify_io_u_sha3(hdr, vc, &sha3_ctx, vh->sha,
+ SHA3_224_DIGEST_SIZE, "sha3-224");
+}
+
+static int verify_io_u_sha3_256(struct verify_header *hdr, struct vcont *vc)
+{
+ struct vhdr_sha3_256 *vh = hdr_priv(hdr);
+ uint8_t sha[SHA3_256_DIGEST_SIZE];
+ struct fio_sha3_ctx sha3_ctx = {
+ .sha = sha,
+ };
+
+ fio_sha3_256_init(&sha3_ctx);
+
+ return verify_io_u_sha3(hdr, vc, &sha3_ctx, vh->sha,
+ SHA3_256_DIGEST_SIZE, "sha3-256");
+}
+
+static int verify_io_u_sha3_384(struct verify_header *hdr, struct vcont *vc)
+{
+ struct vhdr_sha3_384 *vh = hdr_priv(hdr);
+ uint8_t sha[SHA3_384_DIGEST_SIZE];
+ struct fio_sha3_ctx sha3_ctx = {
+ .sha = sha,
+ };
+
+ fio_sha3_384_init(&sha3_ctx);
+
+ return verify_io_u_sha3(hdr, vc, &sha3_ctx, vh->sha,
+ SHA3_384_DIGEST_SIZE, "sha3-384");
+}
+
+static int verify_io_u_sha3_512(struct verify_header *hdr, struct vcont *vc)
+{
+ struct vhdr_sha3_512 *vh = hdr_priv(hdr);
+ uint8_t sha[SHA3_512_DIGEST_SIZE];
+ struct fio_sha3_ctx sha3_ctx = {
+ .sha = sha,
+ };
+
+ fio_sha3_512_init(&sha3_ctx);
+
+ return verify_io_u_sha3(hdr, vc, &sha3_ctx, vh->sha,
+ SHA3_512_DIGEST_SIZE, "sha3-512");
+}
+
static int verify_io_u_sha512(struct verify_header *hdr, struct vcont *vc)
{
void *p = io_u_verify_off(hdr, vc);
* state of numberio, that would have been written to each block
* in a previous run of fio, has been reached.
*/
- if ((td_write(td) || td_rw(td)) && (td_min_bs(td) == td_max_bs(td)) &&
+ if (td_write(td) && (td_min_bs(td) == td_max_bs(td)) &&
!td->o.time_based)
if (!td->o.verify_only || td->o.loops == 0)
if (hdr->numberio != io_u->numberio) {
case VERIFY_SHA512:
ret = verify_io_u_sha512(hdr, &vc);
break;
+ case VERIFY_SHA3_224:
+ ret = verify_io_u_sha3_224(hdr, &vc);
+ break;
+ case VERIFY_SHA3_256:
+ ret = verify_io_u_sha3_256(hdr, &vc);
+ break;
+ case VERIFY_SHA3_384:
+ ret = verify_io_u_sha3_384(hdr, &vc);
+ break;
+ case VERIFY_SHA3_512:
+ ret = verify_io_u_sha3_512(hdr, &vc);
+ break;
case VERIFY_XXHASH:
ret = verify_io_u_xxhash(hdr, &vc);
break;
vh->hash = XXH32_digest(state);
}
+static void fill_sha3(struct fio_sha3_ctx *sha3_ctx, void *p, unsigned int len)
+{
+ fio_sha3_update(sha3_ctx, p, len);
+ fio_sha3_final(sha3_ctx);
+}
+
+static void fill_sha3_224(struct verify_header *hdr, void *p, unsigned int len)
+{
+ struct vhdr_sha3_224 *vh = hdr_priv(hdr);
+ struct fio_sha3_ctx sha3_ctx = {
+ .sha = vh->sha,
+ };
+
+ fio_sha3_224_init(&sha3_ctx);
+ fill_sha3(&sha3_ctx, p, len);
+}
+
+static void fill_sha3_256(struct verify_header *hdr, void *p, unsigned int len)
+{
+ struct vhdr_sha3_256 *vh = hdr_priv(hdr);
+ struct fio_sha3_ctx sha3_ctx = {
+ .sha = vh->sha,
+ };
+
+ fio_sha3_256_init(&sha3_ctx);
+ fill_sha3(&sha3_ctx, p, len);
+}
+
+static void fill_sha3_384(struct verify_header *hdr, void *p, unsigned int len)
+{
+ struct vhdr_sha3_384 *vh = hdr_priv(hdr);
+ struct fio_sha3_ctx sha3_ctx = {
+ .sha = vh->sha,
+ };
+
+ fio_sha3_384_init(&sha3_ctx);
+ fill_sha3(&sha3_ctx, p, len);
+}
+
+static void fill_sha3_512(struct verify_header *hdr, void *p, unsigned int len)
+{
+ struct vhdr_sha3_512 *vh = hdr_priv(hdr);
+ struct fio_sha3_ctx sha3_ctx = {
+ .sha = vh->sha,
+ };
+
+ fio_sha3_512_init(&sha3_ctx);
+ fill_sha3(&sha3_ctx, p, len);
+}
+
static void fill_sha512(struct verify_header *hdr, void *p, unsigned int len)
{
struct vhdr_sha512 *vh = hdr_priv(hdr);
hdr->rand_seed = rand_seed;
hdr->offset = io_u->offset + header_num * td->o.verify_interval;
hdr->time_sec = io_u->start_time.tv_sec;
- hdr->time_usec = io_u->start_time.tv_usec;
+ hdr->time_usec = io_u->start_time.tv_nsec / 1000;
hdr->thread = td->thread_number;
hdr->numberio = io_u->numberio;
hdr->crc32 = fio_crc32c(p, offsetof(struct verify_header, crc32));
unsigned int header_len)
{
unsigned int data_len;
- void *data, *p;
+ void *data;
+ char *p;
- p = (void *) hdr;
+ p = (char *) hdr;
fill_hdr(td, io_u, hdr, header_num, header_len, io_u->rand_seed);
io_u, hdr->len);
fill_sha512(hdr, data, data_len);
break;
+ case VERIFY_SHA3_224:
+ dprint(FD_VERIFY, "fill sha3-224 io_u %p, len %u\n",
+ io_u, hdr->len);
+ fill_sha3_224(hdr, data, data_len);
+ break;
+ case VERIFY_SHA3_256:
+ dprint(FD_VERIFY, "fill sha3-256 io_u %p, len %u\n",
+ io_u, hdr->len);
+ fill_sha3_256(hdr, data, data_len);
+ break;
+ case VERIFY_SHA3_384:
+ dprint(FD_VERIFY, "fill sha3-384 io_u %p, len %u\n",
+ io_u, hdr->len);
+ fill_sha3_384(hdr, data, data_len);
+ break;
+ case VERIFY_SHA3_512:
+ dprint(FD_VERIFY, "fill sha3-512 io_u %p, len %u\n",
+ io_u, hdr->len);
+ fill_sha3_512(hdr, data, data_len);
+ break;
case VERIFY_XXHASH:
dprint(FD_VERIFY, "fill xxhash io_u %p, len %u\n",
io_u, hdr->len);