]> the.earth.li Git - onak.git/blobdiff - keyindex.c
Fix systemd RuntimeDirectory
[onak.git] / keyindex.c
index f6784d70edaf032a8afb2eba868d9967f9777952..fbd32c710959ebc0ce6c30fa8543e2d92bf9d3a1 100644 (file)
@@ -24,7 +24,6 @@
 #include <time.h>
 
 #include "decodekey.h"
-#include "getcgi.h"
 #include "keydb.h"
 #include "keyid.h"
 #include "keyindex.h"
@@ -74,6 +73,54 @@ char pkalgo2char(uint8_t algo)
        return typech;
 }
 
+/**
+ *     txt2html - Takes a string and converts it to HTML.
+ *     @string: The string to HTMLize.
+ *
+ *     Takes a string and escapes any HTML entities.
+ */
+const char *txt2html(const char *string)
+{
+       static char buf[1024];
+       char *ptr = NULL;
+       char *nextptr = NULL;
+
+       if (strlen(string) > 1000) {
+               return string;
+       }
+
+       memset(buf, 0, 1024);
+
+       ptr = strchr(string, '<');
+       if (ptr != NULL) {
+               nextptr = ptr + 1;
+               *ptr = 0;
+               strncpy(buf, string, 1023);
+               strncat(buf, "&lt;", 1023 - strlen(buf));
+               string = nextptr;
+       }
+
+       ptr = strchr(string, '>');
+       if (ptr != NULL) {
+               nextptr = ptr + 1;
+               *ptr = 0;
+               strncat(buf, string, 1023 - strlen(buf));
+               strncat(buf, "&gt;", 1023 - strlen(buf));
+               string = nextptr;
+       }
+
+       /*
+        * TODO: We need to while() this really as each entity may appear more
+        * than once. We need to start with & and ; as we replace with those
+        * throughout. Fuck it for the moment though; it's Easter and < & > are
+        * the most common and tend to only appear once.
+        */
+
+       strncat(buf, string, 1023 - strlen(buf));
+
+       return buf;
+}
+
 /*
  * Given a public key/subkey packet return the key length.
  */
@@ -81,6 +128,7 @@ unsigned int keylength(struct openpgp_packet *keydata)
 {
        unsigned int length;
        uint8_t keyofs;
+       enum onak_oid oid;
 
        switch (keydata->data[0]) {
        case 2:
@@ -97,101 +145,25 @@ unsigned int keylength(struct openpgp_packet *keydata)
                case OPENPGP_PKALGO_ECDSA:
                case OPENPGP_PKALGO_EDDSA:
                        /* Elliptic curve key size is based on OID */
-                       /* Curve25519 / 1.3.6.1.4.1.3029.1.5.1 */
-                       if ((keydata->data[keyofs] == 10) &&
-                                       (keydata->data[keyofs + 1] == 0x2B) &&
-                                       (keydata->data[keyofs + 2] == 0x06) &&
-                                       (keydata->data[keyofs + 3] == 0x01) &&
-                                       (keydata->data[keyofs + 4] == 0x04) &&
-                                       (keydata->data[keyofs + 5] == 0x01) &&
-                                       (keydata->data[keyofs + 6] == 0x97) &&
-                                       (keydata->data[keyofs + 7] == 0x55) &&
-                                       (keydata->data[keyofs + 8] == 0x01) &&
-                                       (keydata->data[keyofs + 9] == 0x05) &&
-                                       (keydata->data[keyofs + 10] == 0x01)) {
+                       oid = onak_parse_oid(&keydata->data[keyofs],
+                                       keydata->length - keyofs);
+                       if (oid == ONAK_OID_CURVE25519) {
                                length = 255;
-                       /* Ed25519 / 1.3.6.1.4.1.11591.15.1 */
-                       } else if ((keydata->data[keyofs] == 9) &&
-                                       (keydata->data[keyofs + 1] == 0x2B) &&
-                                       (keydata->data[keyofs + 2] == 0x06) &&
-                                       (keydata->data[keyofs + 3] == 0x01) &&
-                                       (keydata->data[keyofs + 4] == 0x04) &&
-                                       (keydata->data[keyofs + 5] == 0x01) &&
-                                       (keydata->data[keyofs + 6] == 0xDA) &&
-                                       (keydata->data[keyofs + 7] == 0x47) &&
-                                       (keydata->data[keyofs + 8] == 0x0F) &&
-                                       (keydata->data[keyofs + 9] == 0x01)) {
+                       } else if (oid == ONAK_OID_ED25519) {
                                length = 255;
-                       /* nistp256 / 1.2.840.10045.3.1.7 */
-                       } else if ((keydata->data[keyofs] == 8) &&
-                                       (keydata->data[keyofs + 1] == 0x2A) &&
-                                       (keydata->data[keyofs + 2] == 0x86) &&
-                                       (keydata->data[keyofs + 3] == 0x48) &&
-                                       (keydata->data[keyofs + 4] == 0xCE) &&
-                                       (keydata->data[keyofs + 5] == 0x3D) &&
-                                       (keydata->data[keyofs + 6] == 0x03) &&
-                                       (keydata->data[keyofs + 7] == 0x01) &&
-                                       (keydata->data[keyofs + 8] == 0x07)) {
+                       } else if (oid == ONAK_OID_NISTP256) {
                                length = 256;
-                       /* nistp384 / 1.3.132.0.34 */
-                       } else if ((keydata->data[keyofs] == 5) &&
-                                       (keydata->data[keyofs + 1] == 0x2B) &&
-                                       (keydata->data[keyofs + 2] == 0x81) &&
-                                       (keydata->data[keyofs + 3] == 0x04) &&
-                                       (keydata->data[keyofs + 4] == 0x00) &&
-                                       (keydata->data[keyofs + 5] == 0x22)) {
+                       } else if (oid == ONAK_OID_NISTP384) {
                                length = 384;
-                       /* nistp521 / 1.3.132.0.35 */
-                       } else if ((keydata->data[keyofs] == 5) &&
-                                       (keydata->data[keyofs + 1] == 0x2B) &&
-                                       (keydata->data[keyofs + 2] == 0x81) &&
-                                       (keydata->data[keyofs + 3] == 0x04) &&
-                                       (keydata->data[keyofs + 4] == 0x00) &&
-                                       (keydata->data[keyofs + 5] == 0x23)) {
+                       } else if (oid == ONAK_OID_NISTP521) {
                                length = 521;
-                       /* brainpoolP256r1 / 1.3.36.3.3.2.8.1.1.7 */
-                       } else if ((keydata->data[keyofs] == 9) &&
-                                       (keydata->data[keyofs + 1] == 0x2B) &&
-                                       (keydata->data[keyofs + 2] == 0x24) &&
-                                       (keydata->data[keyofs + 3] == 0x03) &&
-                                       (keydata->data[keyofs + 4] == 0x03) &&
-                                       (keydata->data[keyofs + 5] == 0x02) &&
-                                       (keydata->data[keyofs + 6] == 0x08) &&
-                                       (keydata->data[keyofs + 7] == 0x01) &&
-                                       (keydata->data[keyofs + 8] == 0x01) &&
-                                       (keydata->data[keyofs + 9] == 0x07)) {
+                       } else if (oid == ONAK_OID_BRAINPOOLP256R1) {
                                length = 256;
-                       /* brainpoolP384r1 / 1.3.36.3.3.2.8.1.1.11 */
-                       } else if ((keydata->data[keyofs] == 9) &&
-                                       (keydata->data[keyofs + 1] == 0x2B) &&
-                                       (keydata->data[keyofs + 2] == 0x24) &&
-                                       (keydata->data[keyofs + 3] == 0x03) &&
-                                       (keydata->data[keyofs + 4] == 0x03) &&
-                                       (keydata->data[keyofs + 5] == 0x02) &&
-                                       (keydata->data[keyofs + 6] == 0x08) &&
-                                       (keydata->data[keyofs + 7] == 0x01) &&
-                                       (keydata->data[keyofs + 8] == 0x01) &&
-                                       (keydata->data[keyofs + 9] == 0x0B)) {
+                       } else if (oid == ONAK_OID_BRAINPOOLP384R1) {
                                length = 384;
-                       /* brainpoolP512r1 / 1.3.36.3.3.2.8.1.1.13 */
-                       } else if ((keydata->data[keyofs] == 9) &&
-                                       (keydata->data[keyofs + 1] == 0x2B) &&
-                                       (keydata->data[keyofs + 2] == 0x24) &&
-                                       (keydata->data[keyofs + 3] == 0x03) &&
-                                       (keydata->data[keyofs + 4] == 0x03) &&
-                                       (keydata->data[keyofs + 5] == 0x02) &&
-                                       (keydata->data[keyofs + 6] == 0x08) &&
-                                       (keydata->data[keyofs + 7] == 0x01) &&
-                                       (keydata->data[keyofs + 8] == 0x01) &&
-                                       (keydata->data[keyofs + 9] == 0x0D)) {
+                       } else if (oid == ONAK_OID_BRAINPOOLP512R1) {
                                length = 512;
-                       /* secp256k1 / 1.3.132.0.10 */
-                       } else if ((keydata->data[keyofs] == 5) &&
-                                       (keydata->data[keyofs + 1] == 0x2B) &&
-                                       (keydata->data[keyofs + 2] == 0x81) &&
-                                       (keydata->data[keyofs + 3] == 0x04) &&
-                                       (keydata->data[keyofs + 4] == 0x00) &&
-                                       (keydata->data[keyofs + 5] == 0x0A)) {
+                       } else if (oid == ONAK_OID_SECP256K1) {
                                length = 256;
                        } else {
                                logthing(LOGTHING_ERROR,
@@ -306,7 +278,7 @@ int list_subkeys(struct onak_dbctx *dbctx,
                struct openpgp_signedpacket_list *subkeys, bool verbose,
                bool html)
 {
-       struct tm       *created = NULL;
+       struct tm       created;
        time_t          created_time = 0;
        int             type = 0;
        int             length = 0;
@@ -319,7 +291,7 @@ int list_subkeys(struct onak_dbctx *dbctx,
                                        (subkeys->packet->data[2] << 16) +
                                        (subkeys->packet->data[3] << 8) +
                                        subkeys->packet->data[4];
-                       created = gmtime(&created_time);
+                       gmtime_r(&created_time, &created);
 
                        switch (subkeys->packet->data[0]) {
                        case 2:
@@ -345,9 +317,9 @@ int list_subkeys(struct onak_dbctx *dbctx,
                                length,
                                pkalgo2char(type),
                                keyid,
-                               created->tm_year + 1900,
-                               created->tm_mon + 1,
-                               created->tm_mday);
+                               created.tm_year + 1900,
+                               created.tm_mon + 1,
+                               created.tm_mday);
 
                }
                if (verbose) {
@@ -423,13 +395,14 @@ int key_index(struct onak_dbctx *dbctx,
                        bool skshash, bool html)
 {
        struct openpgp_signedpacket_list        *curuid = NULL;
-       struct tm                               *created = NULL;
+       struct tm                                created;
        time_t                                   created_time = 0;
        int                                      type = 0;
        int                                      length = 0;
        char                                     buf[1024];
        uint64_t                                 keyid;
 
+
        if (html) {
                puts("<pre>");
        }
@@ -439,7 +412,7 @@ int key_index(struct onak_dbctx *dbctx,
                                        (keys->publickey->data[2] << 16) +
                                        (keys->publickey->data[3] << 8) +
                                        keys->publickey->data[4];
-               created = gmtime(&created_time);
+               gmtime_r(&created_time, &created);
 
                switch (keys->publickey->data[0]) {
                case 2:
@@ -468,17 +441,17 @@ int key_index(struct onak_dbctx *dbctx,
                                pkalgo2char(type),
                                keyid,
                                keyid,
-                               created->tm_year + 1900,
-                               created->tm_mon + 1,
-                               created->tm_mday);
+                               created.tm_year + 1900,
+                               created.tm_mon + 1,
+                               created.tm_mday);
                } else {
                        printf("pub  %5d%c/0x%016" PRIX64 " %04d/%02d/%02d ",
                                length,
                                pkalgo2char(type),
                                keyid,
-                               created->tm_year + 1900,
-                               created->tm_mon + 1,
-                               created->tm_mday);
+                               created.tm_year + 1900,
+                               created.tm_mon + 1,
+                               created.tm_mday);
                }
 
                curuid = keys->uids;