Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 12 additions & 1 deletion MODULE.bazel.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ dependencies = [
"hjson==3.1.0",
"libclang==16.0.0",
"libcst ~= 1.1",
"lz4 == 4.4.5",
"mako ~= 1.2",
"ninja ~= 1.11.1.1",
"pluralizer==1.2.0",
Expand Down
58 changes: 58 additions & 0 deletions python-requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,64 @@ libcst==1.8.6 \
lizard==1.20.0 \
--hash=sha256:7c03c6731838b156cc098154a8554fc3a13dc77ebdf4e0d37ff9c2da5a17d573 \
--hash=sha256:81280ba1b5f54fd6d0ac444eed67ade9a237703034d82e81b14d8bb3b2a76466
lz4==4.4.5 \
--hash=sha256:0846e6e78f374156ccf21c631de80967e03cc3c01c373c665789dc0c5431e7fc \
--hash=sha256:0bba042ec5a61fa77c7e380351a61cb768277801240249841defd2ff0a10742f \
--hash=sha256:12233624f1bc2cebc414f9efb3113a03e89acce3ab6f72035577bc61b270d24d \
--hash=sha256:13254bd78fef50105872989a2dc3418ff09aefc7d0765528adc21646a7288294 \
--hash=sha256:15551280f5656d2206b9b43262799c89b25a25460416ec554075a8dc568e4397 \
--hash=sha256:1dd4d91d25937c2441b9fc0f4af01704a2d09f30a38c5798bc1d1b5a15ec9581 \
--hash=sha256:214e37cfe270948ea7eb777229e211c601a3e0875541c1035ab408fbceaddf50 \
--hash=sha256:216ca0c6c90719731c64f41cfbd6f27a736d7e50a10b70fad2a9c9b262ec923d \
--hash=sha256:24092635f47538b392c4eaeff14c7270d2c8e806bf4be2a6446a378591c5e69e \
--hash=sha256:28ccaeb7c5222454cd5f60fcd152564205bcb801bd80e125949d2dfbadc76bbd \
--hash=sha256:2a2b7504d2dffed3fd19d4085fe1cc30cf221263fd01030819bdd8d2bb101cf1 \
--hash=sha256:2c3ea562c3af274264444819ae9b14dbbf1ab070aff214a05e97db6896c7597e \
--hash=sha256:33dd86cea8375d8e5dd001e41f321d0a4b1eb7985f39be1b6a4f466cd480b8a7 \
--hash=sha256:3b84a42da86e8ad8537aabef062e7f661f4a877d1c74d65606c49d835d36d668 \
--hash=sha256:451039b609b9a88a934800b5fc6ee401c89ad9c175abf2f4d9f8b2e4ef1afc64 \
--hash=sha256:533298d208b58b651662dd972f52d807d48915176e5b032fb4f8c3b6f5fe535c \
--hash=sha256:5f0b9e53c1e82e88c10d7c180069363980136b9d7a8306c4dca4f760d60c39f0 \
--hash=sha256:609a69c68e7cfcfa9d894dc06be13f2e00761485b62df4e2472f1b66f7b405fb \
--hash=sha256:61d0ee03e6c616f4a8b69987d03d514e8896c8b1b7cc7598ad029e5c6aedfd43 \
--hash=sha256:66c5de72bf4988e1b284ebdd6524c4bead2c507a2d7f172201572bac6f593901 \
--hash=sha256:67531da3b62f49c939e09d56492baf397175ff39926d0bd5bd2d191ac2bff95f \
--hash=sha256:6bb05416444fafea170b07181bc70640975ecc2a8c92b3b658c554119519716c \
--hash=sha256:6d0bf51e7745484d2092b3a51ae6eb58c3bd3ce0300cf2b2c14f76c536d5697a \
--hash=sha256:713a777de88a73425cf08eb11f742cd2c98628e79a8673d6a52e3c5f0c116f33 \
--hash=sha256:75419bb1a559af00250b8f1360d508444e80ed4b26d9d40ec5b09fe7875cb989 \
--hash=sha256:7b62f94b523c251cf32aa4ab555f14d39bd1a9df385b72443fd76d7c7fb051f5 \
--hash=sha256:7c4e7c44b6a31de77d4dc9772b7d2561937c9588a734681f70ec547cfbc51ecd \
--hash=sha256:7dc1e1e2dbd872f8fae529acd5e4839efd0b141eaa8ae7ce835a9fe80fbad89f \
--hash=sha256:83bc23ef65b6ae44f3287c38cbf82c269e2e96a26e560aa551735883388dcc4b \
--hash=sha256:8a842ead8ca7c0ee2f396ca5d878c4c40439a527ebad2b996b0444f0074ed004 \
--hash=sha256:92159782a4502858a21e0079d77cdcaade23e8a5d252ddf46b0652604300d7be \
--hash=sha256:9b5e6abca8df9f9bdc5c3085f33ff32cdc86ed04c65e0355506d46a5ac19b6e9 \
--hash=sha256:a1acbbba9edbcbb982bc2cac5e7108f0f553aebac1040fbec67a011a45afa1ba \
--hash=sha256:a2af2897333b421360fdcce895c6f6281dc3fab018d19d341cf64d043fc8d90d \
--hash=sha256:a482eecc0b7829c89b498fda883dbd50e98153a116de612ee7c111c8bcf82d1d \
--hash=sha256:a5f197ffa6fc0e93207b0af71b302e0a2f6f29982e5de0fbda61606dd3a55832 \
--hash=sha256:a88cbb729cc333334ccfb52f070463c21560fca63afcf636a9f160a55fac3301 \
--hash=sha256:b424df1076e40d4e884cfcc4c77d815368b7fb9ebcd7e634f937725cd9a8a72a \
--hash=sha256:bd85d118316b53ed73956435bee1997bd06cc66dd2fa74073e3b1322bd520a67 \
--hash=sha256:c1cfa663468a189dab510ab231aad030970593f997746d7a324d40104db0d0a9 \
--hash=sha256:c216b6d5275fc060c6280936bb3bb0e0be6126afb08abccde27eed23dead135f \
--hash=sha256:c8e71b14938082ebaf78144f3b3917ac715f72d14c076f384a4c062df96f9df6 \
--hash=sha256:cdd4bdcbaf35056086d910d219106f6a04e1ab0daa40ec0eeef1626c27d0fddb \
--hash=sha256:d221fa421b389ab2345640a508db57da36947a437dfe31aeddb8d5c7b646c22d \
--hash=sha256:d64141085864918392c3159cdad15b102a620a67975c786777874e1e90ef15ce \
--hash=sha256:d6da84a26b3aa5da13a62e4b89ab36a396e9327de8cd48b436a3467077f8ccd4 \
--hash=sha256:d994b87abaa7a88ceb7a37c90f547b8284ff9da694e6afcfaa8568d739faf3f7 \
--hash=sha256:da68497f78953017deb20edff0dba95641cc86e7423dfadf7c0264e1ac60dc22 \
--hash=sha256:daffa4807ef54b927451208f5f85750c545a4abbff03d740835fc444cd97f758 \
--hash=sha256:df5aa4cead2044bab83e0ebae56e0944cc7fcc1505c7787e9e1057d6d549897e \
--hash=sha256:e099ddfaa88f59dd8d36c8a3c66bd982b4984edf127eb18e30bb49bdba68ce67 \
--hash=sha256:e64e61f29cf95afb43549063d8433b46352baf0c8a70aa45e2585618fcf59d86 \
--hash=sha256:e928ec2d84dc8d13285b4a9288fd6246c5cde4f5f935b479f50d986911f085e3 \
--hash=sha256:f32b9e65d70f3684532358255dc053f143835c5f5991e28a5ac4c93ce94b9ea7 \
--hash=sha256:f6538aaaedd091d6e5abdaa19b99e6e82697d67518f114721b5248709b639fad \
--hash=sha256:f9b8bde9909a010c75b3aea58ec3910393b758f3c219beed67063693df854db0 \
--hash=sha256:ff1b50aeeec64df5603f17984e4b5be6166058dcf8f1e26a3da40d7a0f6ab547
mako==1.3.10 \
--hash=sha256:99579a6f39583fa7e5630a28c3c1f440e4e97a414b80372649c0ce338da2ea28 \
--hash=sha256:baef24a52fc4fc514a0887ac600f9f1cff3d82c61d4d700a1fa84d597b88db59
Expand Down
10 changes: 10 additions & 0 deletions sw/device/lib/base/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -296,6 +296,16 @@ cc_library(
],
)

cc_library(
name = "lz4",
srcs = ["lz4.c"],
hdrs = ["lz4.h"],
deps = [
":memory",
"//sw/device/lib/base:macros",
],
)

cc_test(
name = "random_order_unittest",
srcs = ["random_order_unittest.cc"],
Expand Down
83 changes: 83 additions & 0 deletions sw/device/lib/base/lz4.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
// Copyright lowRISC contributors (OpenTitan project).
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
// SPDX-License-Identifier: Apache-2.0

#include "sw/device/lib/base/lz4.h"

#include <stdint.h>

int LZ4_decompress(const char *src_in, char *dst_in, int compressed_size,
int dst_capacity) {
const uint8_t *src = (const uint8_t *)src_in;
const uint8_t *src_end = src + compressed_size;
uint8_t *dst = (uint8_t *)dst_in;
uint8_t *dst_end = dst + dst_capacity;
uint8_t *dst_ptr = dst;

while (src < src_end) {
uint8_t token = *src++;

// Process literals
unsigned int lit_len = token >> 4;
if (lit_len == 15) {
uint8_t s;
do {
if (src >= src_end)
return -1; // Unexpected end of src
s = *src++;
lit_len += s;
} while (s == 255);
}

if (lit_len > 0) {
if ((size_t)(src_end - src) < lit_len ||
(size_t)(dst_end - dst_ptr) < lit_len) {
return -1;
}

unsigned int l = lit_len;
do {
*dst_ptr++ = *src++;
} while (--l);
}

if (src >= src_end) {
break;
}

// Process match offset
if (src + 2 > src_end)
return -1;
uint16_t offset = (uint16_t)(src[0] | (src[1] << 8));
src += 2;

if (offset == 0 || offset > (size_t)(dst_ptr - dst)) {
return -1; // Offset out of bounds
}

unsigned int match_len = token & 0x0F;
if (match_len == 15) {
uint8_t s;
do {
if (src >= src_end)
return -1;
s = *src++;
match_len += s;
} while (s == 255);
}
match_len += 4;

// Check bounds for match destination
if ((size_t)(dst_end - dst_ptr) < match_len) {
return -1;
}

const uint8_t *match_ptr = dst_ptr - offset;
unsigned int m = match_len;
do {
*dst_ptr++ = *match_ptr++;
} while (--m);
}

return (int)(dst_ptr - dst);
}
34 changes: 34 additions & 0 deletions sw/device/lib/base/lz4.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
// Copyright lowRISC contributors (OpenTitan project).
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
// SPDX-License-Identifier: Apache-2.0

#ifndef OPENTITAN_SW_DEVICE_LIB_BASE_LZ4_H_
#define OPENTITAN_SW_DEVICE_LIB_BASE_LZ4_H_

#include <stddef.h>

#ifdef __cplusplus
extern "C" {
#endif

/**
* Decompresses a raw LZ4 block into a destination buffer.
*
* This implementation is designed specifically for constrained embedded
* environments. It performs no dynamic allocation and requires no
* framing metadata.
*
* @param src Pointer to the compressed data.
* @param dst Pointer to the destination buffer.
* @param compressed_size The exact size of the compressed data.
* @param dst_capacity The maximum capacity of the destination buffer.
* @return The number of bytes decompressed, or a negative value on error.
*/
int LZ4_decompress(const char *src, char *dst, int compressed_size,
int dst_capacity);

#ifdef __cplusplus
}
#endif

#endif // OPENTITAN_SW_DEVICE_LIB_BASE_LZ4_H_
1 change: 1 addition & 0 deletions sw/device/lib/crypto/drivers/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -390,6 +390,7 @@ cc_library(
"//sw/device/lib/base:bitfield",
"//sw/device/lib/base:crc32",
"//sw/device/lib/base:hardened",
"//sw/device/lib/base:lz4",
"//sw/device/lib/base:random_order",
"//sw/device/lib/crypto/impl:status",
],
Expand Down
Loading
Loading