Blame certdata2pem.c

Ørjan Malde a78577
/* Copyright (C) 2013, Felix Janda <felix.janda@posteo.de>
Ørjan Malde a78577
Ørjan Malde a78577
Permission to use, copy, modify, and/or distribute this software for
Ørjan Malde a78577
any purpose with or without fee is hereby granted, provided that the
Ørjan Malde a78577
above copyright notice and this permission notice appear in all copies.
Ørjan Malde a78577
Ørjan Malde a78577
SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
Ørjan Malde a78577
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
Ørjan Malde a78577
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
Ørjan Malde a78577
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
Ørjan Malde a78577
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
Ørjan Malde a78577
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
Ørjan Malde a78577
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
Ørjan Malde a78577
*/
Ørjan Malde a78577
Ørjan Malde a78577
#include <stdio.h>
Ørjan Malde a78577
#include <stdlib.h>
Ørjan Malde a78577
#include <string.h>
Ørjan Malde a78577
#include <err.h>
Ørjan Malde a78577
Ørjan Malde a78577
void xwrite(FILE *f, void *p, size_t size)
Ørjan Malde a78577
{
Ørjan Malde a78577
  if (fwrite(p, 1, size, f) != size) err(1, 0);
Ørjan Malde a78577
}
Ørjan Malde a78577
Ørjan Malde a78577
int main(void)
Ørjan Malde a78577
{
Ørjan Malde a78577
  FILE *f;
Ørjan Malde a78577
  char cert[4096], ecert[4096*4/3 + 100];
James Larrowe b007d0
  char *line = 0, *tmp, *filename, *label = 0, *pcert = 0;
Ørjan Malde a78577
  ssize_t len;
James Larrowe b007d0
  size_t size, certsize = 0;
James Larrowe b007d0
  int trust = 0;
Ørjan Malde a78577
  char **blacklist = 0, **node;
Ørjan Malde a78577
Ørjan Malde a78577
  filename = "./blacklist.txt";
Ørjan Malde a78577
  if (!(f = fopen(filename, "r"))) err(1, "%s", filename);
Ørjan Malde a78577
  while ((len = getline(&line, &size, f)) != -1) {
Ørjan Malde a78577
    if ((line[0] != '#') && (len > 1)) {
Ørjan Malde a78577
      if (!(node = malloc(sizeof(void*) + len))) err(1, 0);
Ørjan Malde a78577
      *node = (char*)blacklist;
Ørjan Malde a78577
      memcpy(node + 1, line, len);
Ørjan Malde a78577
      blacklist = node;
Ørjan Malde a78577
    }
Ørjan Malde a78577
  }
Ørjan Malde a78577
  fclose(f);
Ørjan Malde a78577
Ørjan Malde a78577
  filename = "./certdata.txt";
Ørjan Malde a78577
  if (!(f = fopen(filename, "r"))) err(1, "%s", filename);
Ørjan Malde a78577
  while ((len = getline(&line, &size, f)) != -1) {
Ørjan Malde a78577
    tmp = line;
Ørjan Malde a78577
    if (line[0] == '#') continue;
Ørjan Malde a78577
    if (pcert) {
Ørjan Malde a78577
      if (!strcmp(line, "END\n")) {
Ørjan Malde a78577
        char *base64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Ørjan Malde a78577
                       "abcdefghijklmnopqrstuvwxyz0123456789+/";
Ørjan Malde a78577
        size_t i, j, k, val;
Ørjan Malde a78577
Ørjan Malde a78577
        for (i = 0, val = 0, tmp = ecert; i < (size_t)(pcert - cert); i++) {
Ørjan Malde a78577
          val = (val << 8) + (unsigned char)cert[i];
Ørjan Malde a78577
          if (i % 3 == 2) {
Ørjan Malde a78577
            for (j = 0; j < 4; j++, val >>= 6) tmp[3 - j] = base64[val & 0x3f];
Ørjan Malde a78577
            tmp += 4;
Ørjan Malde a78577
          }
Ørjan Malde a78577
          if (i && !(i % 48)) {
Ørjan Malde a78577
            *tmp = '\n';
Ørjan Malde a78577
            tmp++;
Ørjan Malde a78577
          }
Ørjan Malde a78577
        }
James Larrowe b007d0
	k = i % 3;
James Larrowe b007d0
        if (k) {
Ørjan Malde a78577
          tmp[2] = '=';
Ørjan Malde a78577
          tmp[3] = '=';
Ørjan Malde a78577
          val <<= 6 - 2*k;
Ørjan Malde a78577
          for (j = 0; j < k + 1; j++, val >>= 6) tmp[k - j] = base64[val & 0x3f];
Ørjan Malde a78577
          tmp += 4;
Ørjan Malde a78577
        }
Ørjan Malde a78577
        certsize = tmp - ecert;
Ørjan Malde a78577
        pcert = 0;
Ørjan Malde a78577
      } else while (sscanf(tmp, "\\%hho", pcert) == 1) pcert++, tmp += 4;
Ørjan Malde a78577
    } else if (!memcmp(line, "CKA_LABEL UTF8 ", 15)) {
Ørjan Malde a78577
Ørjan Malde a78577
      char *p2, *tmp2;
Ørjan Malde a78577
      len -= 15;
Ørjan Malde a78577
      if (!(label = malloc(len))) err(1, 0);
Ørjan Malde a78577
      memcpy(label, line + 15, len);
Ørjan Malde a78577
      trust = 0;
Ørjan Malde a78577
      for (node = blacklist; node; node = (char**)*node)
Ørjan Malde a78577
        if (!strcmp(label, (char*)(node + 1))) trust = 4;
Ørjan Malde a78577
      if (!(p2 = malloc(len + 2))) err(1, 0);
Ørjan Malde a78577
      for (tmp = label + 1, tmp2 = p2; *tmp != '"'; tmp++, tmp2++) {
Ørjan Malde a78577
        switch (*tmp) {
Ørjan Malde a78577
        case '\\':
Ørjan Malde a78577
          if (sscanf(tmp, "\\x%hhx", tmp2)!=1) errx(1, "Bad triple: %s\n", tmp);
Ørjan Malde a78577
          tmp += 3;
Ørjan Malde a78577
          break;
Ørjan Malde a78577
        case '/':
Ørjan Malde a78577
        case ' ':
Ørjan Malde a78577
          *tmp2 = '_';
Ørjan Malde a78577
          break;
Ørjan Malde a78577
        case '(':
Ørjan Malde a78577
        case ')':
Ørjan Malde a78577
          *tmp2 = '=';
Ørjan Malde a78577
          break;
Ørjan Malde a78577
        default:
Ørjan Malde a78577
          *tmp2 = *tmp;
Ørjan Malde a78577
        }
Ørjan Malde a78577
      }
Ørjan Malde a78577
      strcpy(tmp2, ".crt");
Ørjan Malde a78577
      free(label);
Ørjan Malde a78577
      label = p2;
Ørjan Malde a78577
    } else if (!strcmp(line, "CKA_VALUE MULTILINE_OCTAL\n")) pcert = cert;
Ørjan Malde a78577
    else if (!memcmp(line, "CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_", 39)) {
Ørjan Malde a78577
      tmp += 39;
Ørjan Malde a78577
      if (!strcmp(tmp, "TRUSTED_DELEGATOR\n")) trust |= 1;
Ørjan Malde a78577
      else if (!strcmp(tmp, "NOT_TRUSTED\n")) trust |= 2;
Ørjan Malde a78577
    } else if (!memcmp(line,
Ørjan Malde a78577
                       "CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_", 44)) {
Ørjan Malde a78577
      tmp += 44;
Ørjan Malde a78577
      if (!strcmp(tmp, "TRUSTED_DELEGATOR\n")) trust |= 1;
Ørjan Malde a78577
      else if (!strcmp(tmp, "NOT_TRUSTED\n")) trust |= 2;
Ørjan Malde a78577
      if (!trust) printf("Ignoring %s\n", label);
Ørjan Malde a78577
      if (trust == 1) {
Ørjan Malde a78577
        FILE *out;
Ørjan Malde a78577
        if (!(out = fopen(label, "w"))) err(1, "%s", label);
Ørjan Malde a78577
        xwrite(out, "-----BEGIN CERTIFICATE-----\n", 28);
Ørjan Malde a78577
        xwrite(out, ecert, certsize);
Ørjan Malde a78577
        xwrite(out, "\n-----END CERTIFICATE-----\n", 27);
Ørjan Malde a78577
        fclose(out);
Ørjan Malde a78577
      }
Ørjan Malde a78577
    }
Ørjan Malde a78577
  }
Ørjan Malde a78577
  fclose(f);
Ørjan Malde a78577
  
Ørjan Malde a78577
  while (blacklist) {
Ørjan Malde a78577
    node = (char**)*blacklist;
Ørjan Malde a78577
    free(blacklist);
Ørjan Malde a78577
    blacklist = node;
Ørjan Malde a78577
  }
Ørjan Malde a78577
  free(line);
Ørjan Malde a78577
  free(label);
Ørjan Malde a78577
  return 0;
James Larrowe b007d0
}