| /* 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 |