void qore_relative_time::set(const char* str) { if (*str == 'P' || *str == 'p') { setIso8601(str); return; } #ifdef HAVE_STRTOLL int64 date = strtoll(str, 0, 10); #else int64 date = atoll(str); #endif const char *p = strchr(str, '.'); int l = p ? p - str : strlen(str); // for date-only strings, move the date up to the right position if (l == 8) date *= 1000000; int us = p ? atoi(p + 1) : 0; if (us) { l = strlen(p + 1); assert(l < 7); us *= (int)pow((double)10, 6 - l); } setLiteral(date, us); }
/* private */ void LiteralValue_Priv::decode_krb5_principal_name(unsigned char* data, int len) { KRB5_PRINC_NAME *pname = NULL; const unsigned char *p; p = data; pname = d2i_KRB5_PRINC_NAME(NULL, &p, len); if(pname == NULL || pname->realm == NULL || pname->kerberosname == NULL || pname->kerberosname->namelist == NULL) { //ERR_print_errors_fp(stderr); LOGIT_ERROR("Unable to decode KRB5PrincipalName"); setLiteral("othername", std::string("unsupported(1.3.6.1.5.2.2)")); return; } std::string principal = ""; for(int i = 0; i < sk_ASN1_GENERALSTRING_num(pname->kerberosname->namelist); i++) { //LOGIT_DEBUG( "NAMELIST" << i << ":" << asn1string2string(sk_ASN1_GENERALSTRING_value(pname->kerberosname->namelist, i))); if(principal == "") { principal += asn1string2string(sk_ASN1_GENERALSTRING_value(pname->kerberosname->namelist, i)); } else { principal += "/" + asn1string2string(sk_ASN1_GENERALSTRING_value(pname->kerberosname->namelist, i)); } } principal += "@" + asn1string2string(pname->realm); setLiteral("1.3.6.1.5.2.2", principal); p = NULL; }
LiteralValue_Priv::LiteralValue_Priv(GENERAL_NAME *gen) : LiteralValue() { char oline[256], htmp[5]; unsigned char *p = NULL; int nid = 0; int i; ASN1_OBJECT *id_ms_san_upn; ASN1_OBJECT *id_pkinit_san; #define CREATE_OBJ_IF_NEEDED(oid, vn, sn, ln) \ nid = OBJ_txt2nid(oid); \ if (nid == NID_undef) { \ nid = OBJ_create(oid, sn, ln); \ if (nid == NID_undef) { \ LOGIT_ERROR("Error creating oid object for " << oid); \ return; \ } \ } \ vn = OBJ_nid2obj(nid); CREATE_OBJ_IF_NEEDED("1.3.6.1.5.2.2", id_pkinit_san, "id-pkinit-san", "KRB5PrincipalName"); CREATE_OBJ_IF_NEEDED("1.3.6.1.4.1.311.20.2.3", id_ms_san_upn, "id-ms-san-upn", "Microsoft Universal Principal Name"); switch (gen->type) { case GEN_EMAIL: setLiteral("email", asn1string2string(gen->d.ia5)); break; case GEN_DNS: setLiteral("DNS", asn1string2string(gen->d.ia5)); break; case GEN_URI: setLiteral("URI", asn1string2string(gen->d.ia5)); break; case GEN_DIRNAME: X509_NAME_oneline(gen->d.dirn, oline, 256); setLiteral("DirName", oline); break; case GEN_IPADD: p = gen->d.ip->data; /* BUG: doesn't support IPV6 */ if(gen->d.ip->length == 4) { BIO_snprintf(oline, sizeof oline, "%d.%d.%d.%d", p[0], p[1], p[2], p[3]); } else if(gen->d.ip->length == 16) { oline[0] = 0; for (i = 0; i < 8; i++) { BIO_snprintf(htmp, sizeof htmp, "%X", p[0] << 8 | p[1]); p += 2; strcat(oline, htmp); if (i != 7) strcat(oline, ":"); } } else { LOGIT_ERROR("Invalid IP Address"); CA_MGM_THROW(ca_mgm::SyntaxException, "Invalid IP Address"); break; } setLiteral("IP", oline); break; case GEN_RID: i2t_ASN1_OBJECT(oline, 256, gen->d.rid); setLiteral("RID", oline); break; case GEN_OTHERNAME: // krb5PrincipalName || Microsoft Universal Principal Name if(OBJ_cmp(id_pkinit_san, gen->d.otherName->type_id) == 0) { decode_krb5_principal_name(gen->d.otherName->value->value.sequence->data, gen->d.otherName->value->value.sequence->length); } else if (OBJ_cmp(id_ms_san_upn, gen->d.otherName->type_id) == 0) { setLiteral("1.3.6.1.4.1.311.20.2.3", (char*)gen->d.otherName->value->value.sequence->data); } else { setLiteral("othername", std::string("unsupported(") + str::numstring(OBJ_obj2nid(gen->d.otherName->type_id)) + ")"); } break; case GEN_X400: setLiteral("X400Name", "unsupported"); break; case GEN_EDIPARTY: setLiteral("EdiPartyName", "unsupported"); break; } }