coreboot-kgpe-d16/util/cbfstool/compress.c
Julius Werner d477565dbd cbfstool: Use cbfs_serialized.h and standard vboot helpers
This patch reduces some code duplication in cbfstool by switching it to
use the CBFS data structure definitions in commonlib rather than its own
private copy. In addition, replace a few custom helpers related to hash
algorithms with the official vboot APIs of the same purpose.

Signed-off-by: Julius Werner <jwerner@chromium.org>
Change-Id: I22eae1bcd76d85fff17749617cfe4f1de55603f4
Reviewed-on: https://review.coreboot.org/c/coreboot/+/41117
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Aaron Durbin <adurbin@chromium.org>
Reviewed-by: Wim Vervoorn <wvervoorn@eltan.com>
2020-12-03 00:00:33 +00:00

107 lines
2.4 KiB
C

/* compression handling for cbfstool */
/* SPDX-License-Identifier: GPL-2.0-only */
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include "common.h"
#include "lz4/lib/lz4frame.h"
#include <commonlib/bsd/compression.h>
static int lz4_compress(char *in, int in_len, char *out, int *out_len)
{
LZ4F_preferences_t prefs = {
.compressionLevel = 20,
.frameInfo = {
.blockSizeID = max4MB,
.blockMode = blockIndependent,
.contentChecksumFlag = noContentChecksum,
},
};
size_t worst_size = LZ4F_compressFrameBound(in_len, &prefs);
void *bounce = malloc(worst_size);
if (!bounce)
return -1;
*out_len = LZ4F_compressFrame(bounce, worst_size, in, in_len, &prefs);
if (LZ4F_isError(*out_len) || *out_len >= in_len)
return -1;
memcpy(out, bounce, *out_len);
return 0;
}
static int lz4_decompress(char *in, int in_len, char *out, int out_len,
size_t *actual_size)
{
size_t result = ulz4fn(in, in_len, out, out_len);
if (result == 0)
return -1;
if (actual_size != NULL)
*actual_size = result;
return 0;
}
static int lzma_compress(char *in, int in_len, char *out, int *out_len)
{
return do_lzma_compress(in, in_len, out, out_len);
}
static int lzma_decompress(char *in, int in_len, char *out, unused int out_len,
size_t *actual_size)
{
return do_lzma_uncompress(out, out_len, in, in_len, actual_size);
}
static int none_compress(char *in, int in_len, char *out, int *out_len)
{
memcpy(out, in, in_len);
*out_len = in_len;
return 0;
}
static int none_decompress(char *in, int in_len, char *out, unused int out_len,
size_t *actual_size)
{
memcpy(out, in, in_len);
if (actual_size != NULL)
*actual_size = in_len;
return 0;
}
comp_func_ptr compression_function(enum cbfs_compression algo)
{
comp_func_ptr compress;
switch (algo) {
case CBFS_COMPRESS_NONE:
compress = none_compress;
break;
case CBFS_COMPRESS_LZMA:
compress = lzma_compress;
break;
case CBFS_COMPRESS_LZ4:
compress = lz4_compress;
break;
default:
ERROR("Unknown compression algorithm %d!\n", algo);
return NULL;
}
return compress;
}
decomp_func_ptr decompression_function(enum cbfs_compression algo)
{
decomp_func_ptr decompress;
switch (algo) {
case CBFS_COMPRESS_NONE:
decompress = none_decompress;
break;
case CBFS_COMPRESS_LZMA:
decompress = lzma_decompress;
break;
case CBFS_COMPRESS_LZ4:
decompress = lz4_decompress;
break;
default:
ERROR("Unknown compression algorithm %d!\n", algo);
return NULL;
}
return decompress;
}