extern void lzma_check_update(lzma_check_state *check, lzma_check type, const uint8_t *buf, size_t size) { switch (type) { #ifdef HAVE_CHECK_CRC32 case LZMA_CHECK_CRC32: check->state.crc32 = lzma_crc32(buf, size, check->state.crc32); break; #endif #ifdef HAVE_CHECK_CRC64 case LZMA_CHECK_CRC64: check->state.crc64 = lzma_crc64(buf, size, check->state.crc64); break; #endif #ifdef HAVE_CHECK_SHA256 case LZMA_CHECK_SHA256: lzma_sha256_update(buf, size, check); break; #endif default: break; } return; }
int compute_checksum(uchar_t *cksum_buf, int cksum, uchar_t *buf, int64_t bytes) { if (cksum == CKSUM_CRC64) { uint64_t *ck = (uint64_t *)cksum_buf; *ck = lzma_crc64(buf, bytes, 0); } else if (cksum == CKSUM_SKEIN256) { Skein_512_Ctxt_t ctx; Skein_512_Init(&ctx, 256); Skein_512_Update(&ctx, buf, bytes); Skein_512_Final(&ctx, cksum_buf); } else if (cksum == CKSUM_SKEIN512) { Skein_512_Ctxt_t ctx; Skein_512_Init(&ctx, 512); Skein_512_Update(&ctx, buf, bytes); Skein_512_Final(&ctx, cksum_buf); } else if (cksum == CKSUM_SHA256) { if (cksum_provider == PROVIDER_OPENSSL) { SHA256_CTX ctx; SHA256_Init(&ctx); SHA256_Update(&ctx, buf, bytes); SHA256_Final(cksum_buf, &ctx); } else { SHA256_Context ctx; opt_SHA256_Init(&ctx); opt_SHA256_Update(&ctx, buf, bytes); opt_SHA256_Final(&ctx, cksum_buf); } } else if (cksum == CKSUM_SHA512) { SHA512_CTX ctx; SHA512_Init(&ctx); SHA512_Update(&ctx, buf, bytes); SHA512_Final(cksum_buf, &ctx); } else if (cksum == CKSUM_KECCAK256) { if (Keccak_Hash(256, buf, bytes, cksum_buf) != 0) return (-1); } else if (cksum == CKSUM_KECCAK512) { if (Keccak_Hash(512, buf, bytes, cksum_buf) != 0) return (-1); } else { return (-1); } return (0); }
SEXP crc64(SEXP in) { uint64_t crc = 0; char ans[17]; if (!isString(in)) error("input must be a character string"); const char *str = CHAR(STRING_ELT(in, 0)); /* Seems this is really 64-bit only on 64-bit platforms */ crc = lzma_crc64((uint8_t *)str, strlen(str), crc); snprintf(ans, 17, "%lx", (long unsigned int) crc); return mkString(ans); }