summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorÁlvaro Fernández Rojas2025-11-03 08:58:29 +0000
committerÁlvaro Fernández Rojas2025-11-03 13:46:31 +0000
commitadc651ffed55d4b538317e50da1a7ec143dbfd1d (patch)
tree8be0edd939d7d44adb742ef104c54b508f6e3aa1
parent5182e2b696ef21cb2df00e8e399e0af7c1b7bf6d (diff)
downloadodhcp6c-adc651ffed55d4b538317e50da1a7ec143dbfd1d.tar.gz
cmake: make libubox mandatory
- Drop USE_LIBUBOX from cmake. - Drop downstream MD5 implementation. - Drop libubox variants from Github CI. Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com> Link: https://github.com/openwrt/odhcp6c/pull/109 Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
-rw-r--r--.github/workflows/ci.yml49
-rw-r--r--CMakeLists.txt13
-rw-r--r--src/dhcpv6.c6
-rw-r--r--src/md5.c309
-rw-r--r--src/md5.h58
5 files changed, 18 insertions, 417 deletions
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 5ba65d1..a464658 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -25,14 +25,10 @@ jobs:
gcc: /usr/bin/x86_64-linux-gnu-gcc
packages: gcc-x86-64-linux-gnu
outputs:
- size-aarch64-without-libubox: ${{ steps.without_libubox.outputs.size_aarch64 }}
- size-aarch64-with-libubox: ${{ steps.with_libubox.outputs.size_aarch64 }}
- size-arm-without-libubox: ${{ steps.without_libubox.outputs.size_arm }}
- size-arm-with-libubox: ${{ steps.with_libubox.outputs.size_arm }}
- size-mips-without-libubox: ${{ steps.without_libubox.outputs.size_mips }}
- size-mips-with-libubox: ${{ steps.with_libubox.outputs.size_mips }}
- size-x86_64-without-libubox: ${{ steps.without_libubox.outputs.size_x86_64 }}
- size-x86_64-with-libubox: ${{ steps.with_libubox.outputs.size_x86_64 }}
+ size-aarch64: ${{ steps.build.outputs.size_aarch64 }}
+ size-arm: ${{ steps.build.outputs.size_arm }}
+ size-mips: ${{ steps.build.outputs.size_mips }}
+ size-x86_64: ${{ steps.build.outputs.size_x86_64 }}
steps:
- name: Checkout odhcp6c
uses: actions/checkout@v5
@@ -80,28 +76,14 @@ jobs:
make
make install
- - id: without_libubox
- name: Build odhcp6c (w/o libubox)
+ - id: build
+ name: Build odhcp6c
env:
- BUILD_DIR: build/odhcp6c-without-libubox
+ BUILD_DIR: build/odhcp6c
run: |
cmake \
-DCMAKE_C_COMPILER=${{ matrix.gcc }} \
-DCMAKE_PREFIX_PATH=${GITHUB_WORKSPACE}/build \
- -D USE_LIBUBOX=OFF \
- -B $BUILD_DIR
- make -C $BUILD_DIR
- echo "size_${{ matrix.arch }}=$( find $BUILD_DIR -type f -name odhcp6c -printf '%s' )" >> $GITHUB_OUTPUT
-
- - id: with_libubox
- name: Build odhcp6c (with libubox)
- env:
- BUILD_DIR: build/odhcp6c-with-libubox
- run: |
- cmake \
- -DCMAKE_C_COMPILER=${{ matrix.gcc }} \
- -DCMAKE_PREFIX_PATH=${GITHUB_WORKSPACE}/build \
- -DUSE_LIBUBOX=ON \
-B $BUILD_DIR
make -C $BUILD_DIR
echo "size_${{ matrix.arch }}=$( find $BUILD_DIR -type f -name odhcp6c -printf '%s' )" >> $GITHUB_OUTPUT
@@ -111,7 +93,7 @@ jobs:
with:
name: odhcp6c-${{ matrix.arch }}-binaries
path: |
- build/odhcp6c-*/odhcp6c
+ build/odhcp6c/odhcp6c
if-no-files-found: error
summary:
@@ -121,17 +103,12 @@ jobs:
steps:
- name: Sizes summary
env:
- size_aarch64_without_libubox: ${{needs.build.outputs.size-aarch64-without-libubox}}
- size_aarch64_with_libubox: ${{needs.build.outputs.size-aarch64-with-libubox}}
- size_arm_without_libubox: ${{needs.build.outputs.size-arm-without-libubox}}
- size_arm_with_libubox: ${{needs.build.outputs.size-arm-with-libubox}}
- size_mips_without_libubox: ${{needs.build.outputs.size-mips-without-libubox}}
- size_mips_with_libubox: ${{needs.build.outputs.size-mips-with-libubox}}
- size_x86_64_without_libubox: ${{needs.build.outputs.size-x86_64-without-libubox}}
- size_x86_64_with_libubox: ${{needs.build.outputs.size-x86_64-with-libubox}}
+ size_aarch64: ${{needs.build.outputs.size-aarch64}}
+ size_arm: ${{needs.build.outputs.size-arm}}
+ size_mips: ${{needs.build.outputs.size-mips}}
+ size_x86_64: ${{needs.build.outputs.size-x86_64}}
run: |
echo "### ${GITHUB_WORKFLOW} sizes :floppy_disk:" >> $GITHUB_STEP_SUMMARY
echo "| Variant | aarch64 | arm | mips | x86_64 |" >> $GITHUB_STEP_SUMMARY
echo "| :---: | :---: | :---: | :---: | :---: |" >> $GITHUB_STEP_SUMMARY
- echo "| w/o libubox | ${size_aarch64_without_libubox} | ${size_arm_without_libubox} | ${size_mips_without_libubox} | ${size_x86_64_without_libubox} |" >> $GITHUB_STEP_SUMMARY
- echo "| with libubox | ${size_aarch64_with_libubox} | ${size_arm_with_libubox} | ${size_mips_with_libubox} | ${size_x86_64_with_libubox} |" >> $GITHUB_STEP_SUMMARY
+ echo "| odhcp6c | ${size_aarch64} | ${size_arm} | ${size_mips} | ${size_x86_64} |" >> $GITHUB_STEP_SUMMARY
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 21c65d1..02d44be 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -32,15 +32,10 @@ target_compile_options(${PROJECT_NAME} PRIVATE -Wmissing-declarations)
# Libraries
target_link_libraries(${PROJECT_NAME} PRIVATE resolv)
-if (${USE_LIBUBOX})
- target_compile_definitions(${PROJECT_NAME} PRIVATE USE_LIBUBOX)
- find_path(ubox_include_dir libubox/md5.h)
- target_include_directories(${PROJECT_NAME} PRIVATE ${ubox_include_dir})
- find_library(libubox ubox)
- target_link_libraries(${PROJECT_NAME} PRIVATE ${libubox})
-else (${USE_LIBUBOX})
- target_sources(${PROJECT_NAME} PRIVATE src/md5.c)
-endif(${USE_LIBUBOX})
+find_path(ubox_include_dir libubox/md5.h)
+target_include_directories(${PROJECT_NAME} PRIVATE ${ubox_include_dir})
+find_library(libubox ubox)
+target_link_libraries(${PROJECT_NAME} PRIVATE ${libubox})
# Optional Features
diff --git a/src/dhcpv6.c b/src/dhcpv6.c
index 4c1b889..9b22a7d 100644
--- a/src/dhcpv6.c
+++ b/src/dhcpv6.c
@@ -35,12 +35,8 @@
#include <net/if.h>
#include <net/ethernet.h>
-#include "odhcp6c.h"
-#ifdef USE_LIBUBOX
#include <libubox/md5.h>
-#else
-#include "md5.h"
-#endif
+#include "odhcp6c.h"
#define ALL_DHCPV6_RELAYS {{{0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\
diff --git a/src/md5.c b/src/md5.c
deleted file mode 100644
index 3972b53..0000000
--- a/src/md5.c
+++ /dev/null
@@ -1,309 +0,0 @@
-/*
- * Copyright (C) 2014 Felix Fietkau <nbd@openwrt.org>
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-/*
- * This is an OpenSSL-compatible implementation of the RSA Data Security, Inc.
- * MD5 Message-Digest Algorithm (RFC 1321).
- *
- * Homepage:
- * http://openwall.info/wiki/people/solar/software/public-domain-source-code/md5
- *
- * Author:
- * Alexander Peslyak, better known as Solar Designer <solar at openwall.com>
- *
- * This software was written by Alexander Peslyak in 2001. No copyright is
- * claimed, and the software is hereby placed in the public domain.
- * In case this attempt to disclaim copyright and place the software in the
- * public domain is deemed null and void, then the software is
- * Copyright (c) 2001 Alexander Peslyak and it is hereby released to the
- * general public under the following terms:
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted.
- *
- * There's ABSOLUTELY NO WARRANTY, express or implied.
- *
- * (This is a heavily cut-down "BSD license".)
- *
- * This differs from Colin Plumb's older public domain implementation in that
- * no exactly 32-bit integer data type is required (any 32-bit or wider
- * unsigned integer data type will do), there's no compile-time endianness
- * configuration, and the function prototypes match OpenSSL's. No code from
- * Colin Plumb's implementation has been reused; this comment merely compares
- * the properties of the two independent implementations.
- *
- * The primary goals of this implementation are portability and ease of use.
- * It is meant to be fast, but not as fast as possible. Some known
- * optimizations are not included to reduce source code size and avoid
- * compile-time configuration.
- */
-
-#include <byteswap.h>
-#include <endian.h>
-#include <string.h>
-
-#include "md5.h"
-
-/*
- * The basic MD5 functions.
- *
- * F and G are optimized compared to their RFC 1321 definitions for
- * architectures that lack an AND-NOT instruction, just like in Colin Plumb's
- * implementation.
- */
-#define F(x, y, z) ((z) ^ ((x) & ((y) ^ (z))))
-#define G(x, y, z) ((y) ^ ((z) & ((x) ^ (y))))
-#define H(x, y, z) (((x) ^ (y)) ^ (z))
-#define H2(x, y, z) ((x) ^ ((y) ^ (z)))
-#define I(x, y, z) ((y) ^ ((x) | ~(z)))
-
-/*
- * The MD5 transformation for all four rounds.
- */
-#define STEP(f, a, b, c, d, x, t, s) \
- (a) += f((b), (c), (d)) + (x) + (t); \
- (a) = (((a) << (s)) | (((a) & 0xffffffff) >> (32 - (s)))); \
- (a) += (b);
-
-/*
- * SET reads 4 input bytes in little-endian byte order and stores them
- * in a properly aligned word in host byte order.
- */
-#if __BYTE_ORDER == __LITTLE_ENDIAN
-#define SET(n) \
- (*(uint32_t *)&ptr[(n) * 4])
-#define GET(n) \
- SET(n)
-#else
-#define SET(n) \
- (block[(n)] = \
- (uint32_t)ptr[(n) * 4] | \
- ((uint32_t)ptr[(n) * 4 + 1] << 8) | \
- ((uint32_t)ptr[(n) * 4 + 2] << 16) | \
- ((uint32_t)ptr[(n) * 4 + 3] << 24))
-#define GET(n) \
- (block[(n)])
-#endif
-
-/*
- * This processes one or more 64-byte data blocks, but does NOT update
- * the bit counters. There are no alignment requirements.
- */
-static const void *body(md5_ctx_t *ctx, const void *data, unsigned long size)
-{
- const unsigned char *ptr;
- uint32_t a, b, c, d;
- uint32_t saved_a, saved_b, saved_c, saved_d;
-#if __BYTE_ORDER != __LITTLE_ENDIAN
- uint32_t block[16];
-#endif
-
- ptr = (const unsigned char *)data;
-
- a = ctx->a;
- b = ctx->b;
- c = ctx->c;
- d = ctx->d;
-
- do {
- saved_a = a;
- saved_b = b;
- saved_c = c;
- saved_d = d;
-
-/* Round 1 */
- STEP(F, a, b, c, d, SET(0), 0xd76aa478, 7)
- STEP(F, d, a, b, c, SET(1), 0xe8c7b756, 12)
- STEP(F, c, d, a, b, SET(2), 0x242070db, 17)
- STEP(F, b, c, d, a, SET(3), 0xc1bdceee, 22)
- STEP(F, a, b, c, d, SET(4), 0xf57c0faf, 7)
- STEP(F, d, a, b, c, SET(5), 0x4787c62a, 12)
- STEP(F, c, d, a, b, SET(6), 0xa8304613, 17)
- STEP(F, b, c, d, a, SET(7), 0xfd469501, 22)
- STEP(F, a, b, c, d, SET(8), 0x698098d8, 7)
- STEP(F, d, a, b, c, SET(9), 0x8b44f7af, 12)
- STEP(F, c, d, a, b, SET(10), 0xffff5bb1, 17)
- STEP(F, b, c, d, a, SET(11), 0x895cd7be, 22)
- STEP(F, a, b, c, d, SET(12), 0x6b901122, 7)
- STEP(F, d, a, b, c, SET(13), 0xfd987193, 12)
- STEP(F, c, d, a, b, SET(14), 0xa679438e, 17)
- STEP(F, b, c, d, a, SET(15), 0x49b40821, 22)
-
-/* Round 2 */
- STEP(G, a, b, c, d, GET(1), 0xf61e2562, 5)
- STEP(G, d, a, b, c, GET(6), 0xc040b340, 9)
- STEP(G, c, d, a, b, GET(11), 0x265e5a51, 14)
- STEP(G, b, c, d, a, GET(0), 0xe9b6c7aa, 20)
- STEP(G, a, b, c, d, GET(5), 0xd62f105d, 5)
- STEP(G, d, a, b, c, GET(10), 0x02441453, 9)
- STEP(G, c, d, a, b, GET(15), 0xd8a1e681, 14)
- STEP(G, b, c, d, a, GET(4), 0xe7d3fbc8, 20)
- STEP(G, a, b, c, d, GET(9), 0x21e1cde6, 5)
- STEP(G, d, a, b, c, GET(14), 0xc33707d6, 9)
- STEP(G, c, d, a, b, GET(3), 0xf4d50d87, 14)
- STEP(G, b, c, d, a, GET(8), 0x455a14ed, 20)
- STEP(G, a, b, c, d, GET(13), 0xa9e3e905, 5)
- STEP(G, d, a, b, c, GET(2), 0xfcefa3f8, 9)
- STEP(G, c, d, a, b, GET(7), 0x676f02d9, 14)
- STEP(G, b, c, d, a, GET(12), 0x8d2a4c8a, 20)
-
-/* Round 3 */
- STEP(H, a, b, c, d, GET(5), 0xfffa3942, 4)
- STEP(H2, d, a, b, c, GET(8), 0x8771f681, 11)
- STEP(H, c, d, a, b, GET(11), 0x6d9d6122, 16)
- STEP(H2, b, c, d, a, GET(14), 0xfde5380c, 23)
- STEP(H, a, b, c, d, GET(1), 0xa4beea44, 4)
- STEP(H2, d, a, b, c, GET(4), 0x4bdecfa9, 11)
- STEP(H, c, d, a, b, GET(7), 0xf6bb4b60, 16)
- STEP(H2, b, c, d, a, GET(10), 0xbebfbc70, 23)
- STEP(H, a, b, c, d, GET(13), 0x289b7ec6, 4)
- STEP(H2, d, a, b, c, GET(0), 0xeaa127fa, 11)
- STEP(H, c, d, a, b, GET(3), 0xd4ef3085, 16)
- STEP(H2, b, c, d, a, GET(6), 0x04881d05, 23)
- STEP(H, a, b, c, d, GET(9), 0xd9d4d039, 4)
- STEP(H2, d, a, b, c, GET(12), 0xe6db99e5, 11)
- STEP(H, c, d, a, b, GET(15), 0x1fa27cf8, 16)
- STEP(H2, b, c, d, a, GET(2), 0xc4ac5665, 23)
-
-/* Round 4 */
- STEP(I, a, b, c, d, GET(0), 0xf4292244, 6)
- STEP(I, d, a, b, c, GET(7), 0x432aff97, 10)
- STEP(I, c, d, a, b, GET(14), 0xab9423a7, 15)
- STEP(I, b, c, d, a, GET(5), 0xfc93a039, 21)
- STEP(I, a, b, c, d, GET(12), 0x655b59c3, 6)
- STEP(I, d, a, b, c, GET(3), 0x8f0ccc92, 10)
- STEP(I, c, d, a, b, GET(10), 0xffeff47d, 15)
- STEP(I, b, c, d, a, GET(1), 0x85845dd1, 21)
- STEP(I, a, b, c, d, GET(8), 0x6fa87e4f, 6)
- STEP(I, d, a, b, c, GET(15), 0xfe2ce6e0, 10)
- STEP(I, c, d, a, b, GET(6), 0xa3014314, 15)
- STEP(I, b, c, d, a, GET(13), 0x4e0811a1, 21)
- STEP(I, a, b, c, d, GET(4), 0xf7537e82, 6)
- STEP(I, d, a, b, c, GET(11), 0xbd3af235, 10)
- STEP(I, c, d, a, b, GET(2), 0x2ad7d2bb, 15)
- STEP(I, b, c, d, a, GET(9), 0xeb86d391, 21)
-
- a += saved_a;
- b += saved_b;
- c += saved_c;
- d += saved_d;
-
- ptr += 64;
- } while (size -= 64);
-
- ctx->a = a;
- ctx->b = b;
- ctx->c = c;
- ctx->d = d;
-
- return ptr;
-}
-
-void md5_begin(md5_ctx_t *ctx)
-{
- ctx->a = 0x67452301;
- ctx->b = 0xefcdab89;
- ctx->c = 0x98badcfe;
- ctx->d = 0x10325476;
-
- ctx->lo = 0;
- ctx->hi = 0;
-}
-
-void md5_hash(const void *data, size_t size, md5_ctx_t *ctx)
-{
- uint32_t saved_lo;
- unsigned long used, available;
-
- saved_lo = ctx->lo;
- if ((ctx->lo = (saved_lo + size) & 0x1fffffff) < saved_lo)
- ctx->hi++;
- ctx->hi += size >> 29;
-
- used = saved_lo & 0x3f;
-
- if (used) {
- available = 64 - used;
-
- if (size < available) {
- memcpy(&ctx->buffer[used], data, size);
- return;
- }
-
- memcpy(&ctx->buffer[used], data, available);
- data = (const unsigned char *)data + available;
- size -= available;
- body(ctx, ctx->buffer, 64);
- }
-
- if (size >= 64) {
- data = body(ctx, data, size & ~((size_t) 0x3f));
- size &= 0x3f;
- }
-
- memcpy(ctx->buffer, data, size);
-}
-
-void md5_end(void *resbuf, md5_ctx_t *ctx)
-{
- unsigned char *result = resbuf;
- unsigned long used, available;
-
- used = ctx->lo & 0x3f;
-
- ctx->buffer[used++] = 0x80;
-
- available = 64 - used;
-
- if (available < 8) {
- memset(&ctx->buffer[used], 0, available);
- body(ctx, ctx->buffer, 64);
- used = 0;
- available = 64;
- }
-
- memset(&ctx->buffer[used], 0, available - 8);
-
- ctx->lo <<= 3;
- ctx->buffer[56] = ctx->lo;
- ctx->buffer[57] = ctx->lo >> 8;
- ctx->buffer[58] = ctx->lo >> 16;
- ctx->buffer[59] = ctx->lo >> 24;
- ctx->buffer[60] = ctx->hi;
- ctx->buffer[61] = ctx->hi >> 8;
- ctx->buffer[62] = ctx->hi >> 16;
- ctx->buffer[63] = ctx->hi >> 24;
-
- body(ctx, ctx->buffer, 64);
-
- result[0] = ctx->a;
- result[1] = ctx->a >> 8;
- result[2] = ctx->a >> 16;
- result[3] = ctx->a >> 24;
- result[4] = ctx->b;
- result[5] = ctx->b >> 8;
- result[6] = ctx->b >> 16;
- result[7] = ctx->b >> 24;
- result[8] = ctx->c;
- result[9] = ctx->c >> 8;
- result[10] = ctx->c >> 16;
- result[11] = ctx->c >> 24;
- result[12] = ctx->d;
- result[13] = ctx->d >> 8;
- result[14] = ctx->d >> 16;
- result[15] = ctx->d >> 24;
-
- memset(ctx, 0, sizeof(*ctx));
-}
diff --git a/src/md5.h b/src/md5.h
deleted file mode 100644
index b2f1b80..0000000
--- a/src/md5.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright (C) 2014 Felix Fietkau <nbd@openwrt.org>
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-/*
- * This is an OpenSSL-compatible implementation of the RSA Data Security, Inc.
- * MD5 Message-Digest Algorithm (RFC 1321).
- *
- * Homepage:
- * http://openwall.info/wiki/people/solar/software/public-domain-source-code/md5
- *
- * Author:
- * Alexander Peslyak, better known as Solar Designer <solar at openwall.com>
- *
- * This software was written by Alexander Peslyak in 2001. No copyright is
- * claimed, and the software is hereby placed in the public domain.
- * In case this attempt to disclaim copyright and place the software in the
- * public domain is deemed null and void, then the software is
- * Copyright (c) 2001 Alexander Peslyak and it is hereby released to the
- * general public under the following terms:
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted.
- *
- * There's ABSOLUTELY NO WARRANTY, express or implied.
- *
- * See md5.c for more information.
- */
-
-#ifndef _LIBUBOX_MD5_H
-#define _LIBUBOX_MD5_H
-
-#include <stdint.h>
-#include <stddef.h>
-
-typedef struct md5_ctx {
- uint32_t lo, hi;
- uint32_t a, b, c, d;
- unsigned char buffer[64];
-} md5_ctx_t;
-
-extern void md5_begin(md5_ctx_t *ctx);
-extern void md5_hash(const void *data, size_t length, md5_ctx_t *ctx);
-extern void md5_end(void *resbuf, md5_ctx_t *ctx);
-int md5sum(char *file, void *md5_buf);
-
-#endif