Пример #1
0
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);
}
Пример #2
0
/* 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;
}
Пример #3
0
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;
	}
}