#include <time.h>
#include "decodekey.h"
-#include "getcgi.h"
#include "keydb.h"
#include "keyid.h"
#include "keyindex.h"
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, "<", 1023 - strlen(buf));
+ string = nextptr;
+ }
+
+ ptr = strchr(string, '>');
+ if (ptr != NULL) {
+ nextptr = ptr + 1;
+ *ptr = 0;
+ strncat(buf, string, 1023 - strlen(buf));
+ strncat(buf, ">", 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.
*/
{
unsigned int length;
uint8_t keyofs;
+ enum onak_oid oid;
switch (keydata->data[0]) {
case 2:
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,
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;
(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:
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) {
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>");
}
(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:
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;