You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

base16.h 1.5KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. #ifndef _IPXE_BASE16_H
  2. #define _IPXE_BASE16_H
  3. /** @file
  4. *
  5. * Base16 encoding
  6. *
  7. */
  8. FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
  9. #include <stdint.h>
  10. #include <string.h>
  11. /**
  12. * Calculate length of base16-encoded data
  13. *
  14. * @v raw_len Raw data length
  15. * @ret encoded_len Encoded string length (excluding NUL)
  16. */
  17. static inline size_t base16_encoded_len ( size_t raw_len ) {
  18. return ( 2 * raw_len );
  19. }
  20. /**
  21. * Calculate maximum length of base16-decoded string
  22. *
  23. * @v encoded Encoded string
  24. * @v max_raw_len Maximum length of raw data
  25. */
  26. static inline size_t base16_decoded_max_len ( const char *encoded ) {
  27. return ( ( strlen ( encoded ) + 1 ) / 2 );
  28. }
  29. extern size_t hex_encode ( char separator, const void *raw, size_t raw_len,
  30. char *data, size_t len );
  31. extern int hex_decode ( char separator, const char *encoded, void *data,
  32. size_t len );
  33. /**
  34. * Base16-encode data
  35. *
  36. * @v raw Raw data
  37. * @v raw_len Length of raw data
  38. * @v data Buffer
  39. * @v len Length of buffer
  40. * @ret len Encoded length
  41. */
  42. static inline __attribute__ (( always_inline )) size_t
  43. base16_encode ( const void *raw, size_t raw_len, char *data, size_t len ) {
  44. return hex_encode ( 0, raw, raw_len, data, len );
  45. }
  46. /**
  47. * Base16-decode data
  48. *
  49. * @v encoded Encoded string
  50. * @v data Buffer
  51. * @v len Length of buffer
  52. * @ret len Length of data, or negative error
  53. */
  54. static inline __attribute__ (( always_inline )) int
  55. base16_decode ( const char *encoded, void *data, size_t len ) {
  56. return hex_decode ( 0, encoded, data, len );
  57. }
  58. #endif /* _IPXE_BASE16_H */