/* Copyright 2017 The Chromium OS Authors. All rights reserved. * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ /* Base-32 encoding/decoding, designed for manual operator entry. */ #ifndef __CROS_EC_BASE32_H #define __CROS_EC_BASE32_H /* Symbol map for base32 encoding */ extern const char base32_map[33]; /** * CRC-5-USB Initially created for USB Token Packets. It uses * the generator polynomial X^5 + X^2 + X^0 and is 5-bits. * * @param sym New symbol to update CRC with * @param previous_crc Existing CRC value * @return The updated CRC. */ uint8_t crc5_sym(uint8_t sym, uint8_t previous_crc); /** * base32-encode data into a null-terminated string * * Uses A-Z0-9 encoding, skipping I,O,0,1 since they're easy to get mixed up. * * @param dest Destination buffer; set to empty string on * error * @param destlen_chars Length of destination buffer in characters * @param src Source binary data * @param srclen_bits Length of source *in bits*. If this is not a * multiple of 8, the *most significant* bits of * the last byte will be used. If this is not a * multiple of 5, the least significant bits of * the last symbol will be padded with 0 bits. * @param add_crc_every If non-zero, add a CRC symbol after each group * of this many symbols. There must be an exact * number of groups; that is, ceil(srclen_bits/5) * must be a multiple of add_crc_every. * @return EC_SUCCESS, or non-zero error code. */ int base32_encode(char *dest, int destlen_chars, const void *srcbits, int srclen_bits, int add_crc_every); /** * base32-decode data from a null-terminated string * * Ignores whitespace and '-' dashes in the source string. * * If the destination is smaller than the decoded bitstream, only that many * bits will be decoded. This is useful for decoding the first part of a * bitstream to look for a struct version. * * If the destination is larger than the decoded bitstream, check the return * value to determine how many bits were decoded from the source. Note that if * padding was added by base32_encode (that is, the input length was not a * multiple of 5 bits), the padding will be included in the count. * * @param dest Destination; must be at least * ceil(destlen_bits/8) bytes. * @param destlen_bits Length of destination *in bits*. * @param src Source string (null-terminated) * @param crc_after_every If non-zero, expect CRC symbol after every * group of this many symbols. * @return Number of decoded *bits*, or -1 if error. */ int base32_decode(uint8_t *dest, int destlen_bits, const char *src, int crc_after_every); #endif