cryptopals

Cryptopals Challenges
git clone https://git.pngu.org/cryptopals
Log | Files | Refs

hex.c (1378B)


#include "hex.h"

int hex_to_int(char c) {
  int first = c / 16 - 3;
  int second = c % 16;
  int res = first * 10 + second;
  if (res > 9)
    res--;
  if (res > 29)
    res -= 20;
  return res;
}

int hex_to_ascii(const char *hex, char **res) {
  size_t hex_len = strlen(hex), res_len = hex_len / 2, i;
  *res = (char *)malloc((res_len + 1) * sizeof(char));
  char buf = 0;
  for (i = 0; i < hex_len; i++)
    if (i % 2) {
      int high = hex_to_int(buf) * 16;
      int low = hex_to_int(hex[i]);
      (*res)[i / 2] = high + low;
    } else
      buf = hex[i];
  (*res)[i] = 0;
  return res_len;
}

char hex_digit(unsigned int n) { return n < 10 ? n + '0' : (n - 10) + 'a'; }

int ascii_to_hex(const char *ascii, char **res) {
  size_t ascii_len = strlen((char *)ascii), res_len = ascii_len * 2, i;
  *res = (char *)malloc((res_len + 1) * sizeof(char));
  for (i = 0; i < ascii_len; i++) {
    (*res)[i * 2] = hex_digit(ascii[i] / 0x10);
    (*res)[i * 2 + 1] = hex_digit(ascii[i] % 0x10);
  }
  (*res)[i * 2] = 0;
  return res_len;
}

int to_hex(const unsigned char *data, size_t data_len, char **res) {
  size_t res_len = data_len * 2, i;
  *res = (char *)malloc((res_len + 1) * sizeof(char));
  for (i = 0; i < data_len; i++) {
    (*res)[i * 2] = hex_digit(data[i] / 0x10);
    (*res)[i * 2 + 1] = hex_digit(data[i] % 0x10);
  }
  (*res)[i * 2] = 0;
  return res_len;
}