Prompted by review of
7be31e47b2a8
"util.[ch]: Factor out hex encoding and decoding utilities."
which says
The interface is a bit odd, but it will fit with the uses
I have in mind.
Not sure if it's the encode or decode interface which is referred to.
Certainly there should be a non-allocating variant. I decided to
rename the allocating one.
The two separate buffer arguments to hex_decode are indeed a bit odd
but IMO tolerable.
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
return safe_realloc_ary(0,size,count,message);
}
return safe_realloc_ary(0,size,count,message);
}
-string_t hex_encode(const uint8_t *bin, int binsize)
+void hex_encode(const uint8_t *bin, int binsize, char *buff)
- buff=safe_malloc(binsize*2 + 1,"hex_encode");
-
for (i=0; i<binsize; i++) {
buff[i*2]=hexdigits[(bin[i] & 0xf0) >> 4];
buff[i*2+1]=hexdigits[(bin[i] & 0xf)];
}
buff[binsize*2]=0;
for (i=0; i<binsize; i++) {
buff[i*2]=hexdigits[(bin[i] & 0xf0) >> 4];
buff[i*2+1]=hexdigits[(bin[i] & 0xf)];
}
buff[binsize*2]=0;
+}
+
+string_t hex_encode_alloc(const uint8_t *bin, int binsize)
+{
+ char *buff;
+
+ buff=safe_malloc(hex_encode_size(binsize),"hex_encode");
+ hex_encode(bin,binsize,buff);
void read_mpbin(MP_INT *a, uint8_t *bin, int binsize)
{
void read_mpbin(MP_INT *a, uint8_t *bin, int binsize)
{
- char *buff = hex_encode(bin, binsize);
+ char *buff = hex_encode_alloc(bin, binsize);
mpz_set_str(a, buff, 16);
free(buff);
}
mpz_set_str(a, buff, 16);
free(buff);
}
/* Append a two-byte length and the string to the buffer. Length is in
* network byte order. */
/* Append a two-byte length and the string to the buffer. Length is in
* network byte order. */
-extern string_t hex_encode(const uint8_t *bin, int binsize);
- /* Convert a byte array to hex, returning the result in a freshly allocated
- * string. */
+static inline int hex_encode_size(int binsize) { return binsize*2 + 1; }
+extern void hex_encode(const uint8_t *bin, int binsize, char *buf);
+ /* Convert a byte array to hex into a supplied buffer. */
+extern string_t hex_encode_alloc(const uint8_t *bin, int binsize);
+ /* Returns the result in a freshly allocated string. */
extern bool_t hex_decode(uint8_t *buffer, int32_t buflen, int32_t *outlen,
cstring_t hb, bool_t allow_odd_nibble);
extern bool_t hex_decode(uint8_t *buffer, int32_t buflen, int32_t *outlen,
cstring_t hb, bool_t allow_odd_nibble);