/* *Getthecanonicalhuman-readablenamecorrespondingtoachecksumtype.
*/ char *
pg_checksum_type_name(pg_checksum_type type)
{ switch (type)
{ case CHECKSUM_TYPE_NONE: return"NONE"; case CHECKSUM_TYPE_CRC32C: return"CRC32C"; case CHECKSUM_TYPE_SHA224: return"SHA224"; case CHECKSUM_TYPE_SHA256: return"SHA256"; case CHECKSUM_TYPE_SHA384: return"SHA384"; case CHECKSUM_TYPE_SHA512: return"SHA512";
}
switch (type)
{ case CHECKSUM_TYPE_NONE: /* do nothing */ break; case CHECKSUM_TYPE_CRC32C:
INIT_CRC32C(context->raw_context.c_crc32c); break; case CHECKSUM_TYPE_SHA224:
context->raw_context.c_sha2 = pg_cryptohash_create(PG_SHA224); if (context->raw_context.c_sha2 == NULL) return -1; if (pg_cryptohash_init(context->raw_context.c_sha2) < 0)
{
pg_cryptohash_free(context->raw_context.c_sha2); return -1;
} break; case CHECKSUM_TYPE_SHA256:
context->raw_context.c_sha2 = pg_cryptohash_create(PG_SHA256); if (context->raw_context.c_sha2 == NULL) return -1; if (pg_cryptohash_init(context->raw_context.c_sha2) < 0)
{
pg_cryptohash_free(context->raw_context.c_sha2); return -1;
} break; case CHECKSUM_TYPE_SHA384:
context->raw_context.c_sha2 = pg_cryptohash_create(PG_SHA384); if (context->raw_context.c_sha2 == NULL) return -1; if (pg_cryptohash_init(context->raw_context.c_sha2) < 0)
{
pg_cryptohash_free(context->raw_context.c_sha2); return -1;
} break; case CHECKSUM_TYPE_SHA512:
context->raw_context.c_sha2 = pg_cryptohash_create(PG_SHA512); if (context->raw_context.c_sha2 == NULL) return -1; if (pg_cryptohash_init(context->raw_context.c_sha2) < 0)
{
pg_cryptohash_free(context->raw_context.c_sha2); return -1;
} break;
}
return0;
}
/* *Updateachecksumcontextwithnewdata. *Returns0forasuccess,-1forafailure.
*/ int
pg_checksum_update(pg_checksum_context *context, const uint8 *input,
size_t len)
{ switch (context->type)
{ case CHECKSUM_TYPE_NONE: /* do nothing */ break; case CHECKSUM_TYPE_CRC32C:
COMP_CRC32C(context->raw_context.c_crc32c, input, len); break; case CHECKSUM_TYPE_SHA224: case CHECKSUM_TYPE_SHA256: case CHECKSUM_TYPE_SHA384: case CHECKSUM_TYPE_SHA512: if (pg_cryptohash_update(context->raw_context.c_sha2, input, len) < 0) return -1; break;
}
return0;
}
/* *Finalizeachecksumcomputationandwritetheresulttoanoutputbuffer. * *ThecallermustensurethatthebufferisatleastPG_CHECKSUM_MAX_LENGTH *bytesinlength.Thereturnvalueisthenumberofbytesactuallywritten, *or-1forafailure.
*/ int
pg_checksum_final(pg_checksum_context *context, uint8 *output)
{ int retval = 0;
StaticAssertDecl(sizeof(pg_crc32c) <= PG_CHECKSUM_MAX_LENGTH, "CRC-32C digest too big for PG_CHECKSUM_MAX_LENGTH");
StaticAssertDecl(PG_SHA224_DIGEST_LENGTH <= PG_CHECKSUM_MAX_LENGTH, "SHA224 digest too big for PG_CHECKSUM_MAX_LENGTH");
StaticAssertDecl(PG_SHA256_DIGEST_LENGTH <= PG_CHECKSUM_MAX_LENGTH, "SHA256 digest too big for PG_CHECKSUM_MAX_LENGTH");
StaticAssertDecl(PG_SHA384_DIGEST_LENGTH <= PG_CHECKSUM_MAX_LENGTH, "SHA384 digest too big for PG_CHECKSUM_MAX_LENGTH");
StaticAssertDecl(PG_SHA512_DIGEST_LENGTH <= PG_CHECKSUM_MAX_LENGTH, "SHA512 digest too big for PG_CHECKSUM_MAX_LENGTH");
switch (context->type)
{ case CHECKSUM_TYPE_NONE: break; case CHECKSUM_TYPE_CRC32C:
FIN_CRC32C(context->raw_context.c_crc32c);
retval = sizeof(pg_crc32c);
memcpy(output, &context->raw_context.c_crc32c, retval); break; case CHECKSUM_TYPE_SHA224:
retval = PG_SHA224_DIGEST_LENGTH; if (pg_cryptohash_final(context->raw_context.c_sha2,
output, retval) < 0) return -1;
pg_cryptohash_free(context->raw_context.c_sha2); break; case CHECKSUM_TYPE_SHA256:
retval = PG_SHA256_DIGEST_LENGTH; if (pg_cryptohash_final(context->raw_context.c_sha2,
output, retval) < 0) return -1;
pg_cryptohash_free(context->raw_context.c_sha2); break; case CHECKSUM_TYPE_SHA384:
retval = PG_SHA384_DIGEST_LENGTH; if (pg_cryptohash_final(context->raw_context.c_sha2,
output, retval) < 0) return -1;
pg_cryptohash_free(context->raw_context.c_sha2); break; case CHECKSUM_TYPE_SHA512:
retval = PG_SHA512_DIGEST_LENGTH; if (pg_cryptohash_final(context->raw_context.c_sha2,
output, retval) < 0) return -1;
pg_cryptohash_free(context->raw_context.c_sha2); break;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.