[PATCHv2 2/7] Move net/ceph/armor to lib/ and add docs
Plus, add functions that assist in managing buffer bounds. Signed-off-by: Dan Aloni--- include/linux/base64-armor.h | 65 ++ lib/Kconfig| 7 lib/Makefile | 1 + net/ceph/armor.c => lib/base64-armor.c | 13 --- net/ceph/Kconfig | 1 + net/ceph/Makefile | 2 +- net/ceph/crypto.c | 3 +- net/ceph/crypto.h | 4 --- 8 files changed, 85 insertions(+), 11 deletions(-) create mode 100644 include/linux/base64-armor.h rename net/ceph/armor.c => lib/base64-armor.c (86%) diff --git a/include/linux/base64-armor.h b/include/linux/base64-armor.h new file mode 100644 index ..e5160c77bb2f --- /dev/null +++ b/include/linux/base64-armor.h @@ -0,0 +1,65 @@ +#ifndef __LINUX_BASE64_ARMOR_H__ +#define __LINUX_BASE64_ARMOR_H__ + +#include + +/** + * base64_armor: Perform armored base64 encoding. Output may or may + * not contain newlines, depending on input length. + * + * @dst: Beginning of the destination buffer. + * @src: Beginning of the source buffer. + * @end: Sentinel for the source buffer, pointing one byte after the + * last byte to be encoded. + * + * Returns the number of bytes written to the destination buffer. + * + * _Neither_ the input or output are expected to be NULL-terminated. + * + * The number of output bytes is exactly (n * 4 + (n / 16)) where + * n = ((end - src) + 2) / 3. A less stringent but more wasteful + * validation for output buffer size can be: 4 + (end - src) * 2. + * + * See base64_encode_buffer_bound below. + */ + +extern int base64_armor(char *dst, const char *src, const char *end); + +/** + * base64_unarmor: Perform armored base64 decoding. + * + * @dst: Beginning of the destination buffer. + * @src: Beginning of the source buffer + * @end: Sentinel for the source buffer, pointing one byte after the + * last byte to be encoded. + * + * Returns the number of bytes written to the destination buffer, or + * -EINVAL if the source buffer contains invalid bytes. + * + * _Neither_ the input or output are expected to be NULL-terminated. + * + * It can be assumed that the number of output bytes is less or + * equals to: 3 * ((end - src) / 4). + * + * See base64_decode_buffer_bound below. + */ +extern int base64_unarmor(char *dst, const char *src, const char *end); + + +/* + * Utility functions for buffer upper bounds: + */ + +static inline size_t base64_encode_buffer_bound(size_t src_len) +{ + size_t n = (src_len + 2) / 3; + + return (n * 4 + (n / 16)); +} + +static inline size_t base64_decode_buffer_bound(size_t src_len) +{ + return 3 * (src_len / 4); +} + +#endif diff --git a/lib/Kconfig b/lib/Kconfig index c5e84fbcb30b..caddcaebbc2f 100644 --- a/lib/Kconfig +++ b/lib/Kconfig @@ -188,6 +188,13 @@ config CRC8 when they need to do cyclic redundancy check according CRC8 algorithm. Module will be called crc8. +config BASE64_ARMOR + tristate "BASE64 encoding/decoding functions" + help + This option provides BASE64 encoding and decoding functions. + Module name will be base64-armor if this code is built as a + module. + config XXHASH tristate diff --git a/lib/Makefile b/lib/Makefile index d11c48ec8ffd..47335d28f77f 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -94,6 +94,7 @@ ifneq ($(CONFIG_HAVE_DEC_LOCK),y) lib-y += dec_and_lock.o endif +obj-$(CONFIG_BASE64_ARMOR) += base64-armor.o obj-$(CONFIG_BITREVERSE) += bitrev.o obj-$(CONFIG_RATIONAL) += rational.o obj-$(CONFIG_CRC_CCITT)+= crc-ccitt.o diff --git a/net/ceph/armor.c b/lib/base64-armor.c similarity index 86% rename from net/ceph/armor.c rename to lib/base64-armor.c index 0db8065928df..e07d25ac2850 100644 --- a/net/ceph/armor.c +++ b/lib/base64-armor.c @@ -1,9 +1,8 @@ // SPDX-License-Identifier: GPL-2.0 #include - -int ceph_armor(char *dst, const char *src, const char *end); -int ceph_unarmor(char *dst, const char *src, const char *end); +#include +#include /* * base64 encode/decode. @@ -34,7 +33,7 @@ static int decode_bits(char c) return -EINVAL; } -int ceph_armor(char *dst, const char *src, const char *end) +int base64_armor(char *dst, const char *src, const char *end) { int olen = 0; int line = 0; @@ -71,8 +70,9 @@ int ceph_armor(char *dst, const char *src, const char *end) } return olen; } +EXPORT_SYMBOL(base64_unarmor); -int ceph_unarmor(char *dst, const char *src, const char *end) +int base64_unarmor(char *dst, const char *src, const char *end) { int olen = 0; @@ -104,3 +104,6 @@ int ceph_unarmor(char *dst, const char *src, const char *end) } return olen; } +EXPORT_SYMBOL(base64_armor); + +MODULE_LICENSE("GPL v2"); diff --git a/net/ceph/Kconfig b/net/ceph/Kconfig index f8cceb99e732..5c4e7d0f2896 100644 ---
[PATCHv2 2/7] Move net/ceph/armor to lib/ and add docs
Plus, add functions that assist in managing buffer bounds. Signed-off-by: Dan Aloni --- include/linux/base64-armor.h | 65 ++ lib/Kconfig| 7 lib/Makefile | 1 + net/ceph/armor.c => lib/base64-armor.c | 13 --- net/ceph/Kconfig | 1 + net/ceph/Makefile | 2 +- net/ceph/crypto.c | 3 +- net/ceph/crypto.h | 4 --- 8 files changed, 85 insertions(+), 11 deletions(-) create mode 100644 include/linux/base64-armor.h rename net/ceph/armor.c => lib/base64-armor.c (86%) diff --git a/include/linux/base64-armor.h b/include/linux/base64-armor.h new file mode 100644 index ..e5160c77bb2f --- /dev/null +++ b/include/linux/base64-armor.h @@ -0,0 +1,65 @@ +#ifndef __LINUX_BASE64_ARMOR_H__ +#define __LINUX_BASE64_ARMOR_H__ + +#include + +/** + * base64_armor: Perform armored base64 encoding. Output may or may + * not contain newlines, depending on input length. + * + * @dst: Beginning of the destination buffer. + * @src: Beginning of the source buffer. + * @end: Sentinel for the source buffer, pointing one byte after the + * last byte to be encoded. + * + * Returns the number of bytes written to the destination buffer. + * + * _Neither_ the input or output are expected to be NULL-terminated. + * + * The number of output bytes is exactly (n * 4 + (n / 16)) where + * n = ((end - src) + 2) / 3. A less stringent but more wasteful + * validation for output buffer size can be: 4 + (end - src) * 2. + * + * See base64_encode_buffer_bound below. + */ + +extern int base64_armor(char *dst, const char *src, const char *end); + +/** + * base64_unarmor: Perform armored base64 decoding. + * + * @dst: Beginning of the destination buffer. + * @src: Beginning of the source buffer + * @end: Sentinel for the source buffer, pointing one byte after the + * last byte to be encoded. + * + * Returns the number of bytes written to the destination buffer, or + * -EINVAL if the source buffer contains invalid bytes. + * + * _Neither_ the input or output are expected to be NULL-terminated. + * + * It can be assumed that the number of output bytes is less or + * equals to: 3 * ((end - src) / 4). + * + * See base64_decode_buffer_bound below. + */ +extern int base64_unarmor(char *dst, const char *src, const char *end); + + +/* + * Utility functions for buffer upper bounds: + */ + +static inline size_t base64_encode_buffer_bound(size_t src_len) +{ + size_t n = (src_len + 2) / 3; + + return (n * 4 + (n / 16)); +} + +static inline size_t base64_decode_buffer_bound(size_t src_len) +{ + return 3 * (src_len / 4); +} + +#endif diff --git a/lib/Kconfig b/lib/Kconfig index c5e84fbcb30b..caddcaebbc2f 100644 --- a/lib/Kconfig +++ b/lib/Kconfig @@ -188,6 +188,13 @@ config CRC8 when they need to do cyclic redundancy check according CRC8 algorithm. Module will be called crc8. +config BASE64_ARMOR + tristate "BASE64 encoding/decoding functions" + help + This option provides BASE64 encoding and decoding functions. + Module name will be base64-armor if this code is built as a + module. + config XXHASH tristate diff --git a/lib/Makefile b/lib/Makefile index d11c48ec8ffd..47335d28f77f 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -94,6 +94,7 @@ ifneq ($(CONFIG_HAVE_DEC_LOCK),y) lib-y += dec_and_lock.o endif +obj-$(CONFIG_BASE64_ARMOR) += base64-armor.o obj-$(CONFIG_BITREVERSE) += bitrev.o obj-$(CONFIG_RATIONAL) += rational.o obj-$(CONFIG_CRC_CCITT)+= crc-ccitt.o diff --git a/net/ceph/armor.c b/lib/base64-armor.c similarity index 86% rename from net/ceph/armor.c rename to lib/base64-armor.c index 0db8065928df..e07d25ac2850 100644 --- a/net/ceph/armor.c +++ b/lib/base64-armor.c @@ -1,9 +1,8 @@ // SPDX-License-Identifier: GPL-2.0 #include - -int ceph_armor(char *dst, const char *src, const char *end); -int ceph_unarmor(char *dst, const char *src, const char *end); +#include +#include /* * base64 encode/decode. @@ -34,7 +33,7 @@ static int decode_bits(char c) return -EINVAL; } -int ceph_armor(char *dst, const char *src, const char *end) +int base64_armor(char *dst, const char *src, const char *end) { int olen = 0; int line = 0; @@ -71,8 +70,9 @@ int ceph_armor(char *dst, const char *src, const char *end) } return olen; } +EXPORT_SYMBOL(base64_unarmor); -int ceph_unarmor(char *dst, const char *src, const char *end) +int base64_unarmor(char *dst, const char *src, const char *end) { int olen = 0; @@ -104,3 +104,6 @@ int ceph_unarmor(char *dst, const char *src, const char *end) } return olen; } +EXPORT_SYMBOL(base64_armor); + +MODULE_LICENSE("GPL v2"); diff --git a/net/ceph/Kconfig b/net/ceph/Kconfig index f8cceb99e732..5c4e7d0f2896 100644 --- a/net/ceph/Kconfig +++