summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
5d8acf9)
This replaces the stdio-based implementation (printf(), scanf())
with a hand-written one. This should be worthwhile even if it's
unlikely that these functions show up in any profile.
#include "types.h"
#include <inttypes.h>
#include "types.h"
#include <inttypes.h>
#include <string.h>
#if defined(USE_POLARSSL)
#include <string.h>
#if defined(USE_POLARSSL)
static inline void SSLi_hash2hex(uint8_t *hash, char *out)
{
static inline void SSLi_hash2hex(uint8_t *hash, char *out)
{
+ const char hexdigits[] = "0123456789abcdef";
- for (i = 0; i < 20; i++)
- offset += sprintf(out + offset, "%02x", hash[i]);
+ for (i = 0; i < 20; i++) {
+ out[offset++] = hexdigits[hash[i] >> 4];
+ out[offset++] = hexdigits[hash[i] & 0x0f];
+ }
+
+ out[offset] = '\0';
+}
+
+static inline uint8_t nibble(char c)
+{
+ if (c >= '0' && c <= '9')
+ return c - '0';
+
+ /* Force lower case so we don't need to check
+ * for upper case characters.
+ */
+ c |= 32;
+
+ return c - 'a' + 10;
}
static inline void SSLi_hex2hash(char *in, uint8_t *hash)
{
}
static inline void SSLi_hex2hash(char *in, uint8_t *hash)
{
- int i;
- char byte[3];
- int scanned;
for (i = 0; i < 20; i++) {
for (i = 0; i < 20; i++) {
- memcpy(byte, &in[i * 2], 2);
- sscanf(byte, "%02x", &scanned);
- hash[i] = scanned;
+ uint8_t upper, lower;
+
+ upper = nibble(in[offset++]);
+ lower = nibble(in[offset++]);
+
+ hash[i] = (upper << 4) | lower;