class OpenSSL::Timestamp::TokenInfo

来自 Response 的时间戳令牌信息的不可变且只读的表示形式。

公共类方法

OpenSSL::Timestamp::TokenInfo.new(file) → token-info 点击切换源码
OpenSSL::Timestamp::TokenInfo.new(string) → token-info

Filestring 参数创建 TokenInfo,相应的 Filestring 必须是 DER 编码的。请注意,TokenInfo 是一个不可变的只读类。如果要创建时间戳,请参考 Factory

static VALUE
ossl_ts_token_info_initialize(VALUE self, VALUE der)
{
    TS_TST_INFO *info = DATA_PTR(self);
    BIO *in;

    der = ossl_to_der_if_possible(der);
    in  = ossl_obj2bio(&der);
    info = d2i_TS_TST_INFO_bio(in, &info);
    BIO_free(in);
    if (!info) {
        DATA_PTR(self) = NULL;
        ossl_raise(eTimestampError, "Error when decoding the timestamp token info");
    }
    DATA_PTR(self) = info;

    return self;
}

公共实例方法

algorithm → string 或 nil 点击切换源码

返回用于导出消息印记摘要的算法的对象标识符的“短名称”。对于有效的时间戳,这与 Request 中已给出的值相同。如果状态为 GRANTED 或 GRANTED_WITH_MODS,则永远不会为 nil

示例:

algo = token_info.algorithm
puts algo                -> "SHA1"
static VALUE
ossl_ts_token_info_get_algorithm(VALUE self)
{
    TS_TST_INFO *info;
    TS_MSG_IMPRINT *mi;
    X509_ALGOR *algo;

    GetTSTokenInfo(self, info);
    mi = TS_TST_INFO_get_msg_imprint(info);
    algo = TS_MSG_IMPRINT_get_algo(mi);
    return get_asn1obj(algo->algorithm);
}
gen_time → Time 点击切换源码

返回创建此时间戳令牌的时间。如果状态为 GRANTED 或 GRANTED_WITH_MODS,则永远不会为 nil

static VALUE
ossl_ts_token_info_get_gen_time(VALUE self)
{
    TS_TST_INFO *info;

    GetTSTokenInfo(self, info);
    return asn1time_to_time(TS_TST_INFO_get_time(info));
}
msg_imprint → string. 点击切换源码

返回消息印记摘要。对于有效的时间戳,这与 Request 中已给出的值相同。如果状态为 GRANTED 或 GRANTED_WITH_MODS,则永远不会为 nil

示例:

mi = token_info.msg_imprint
puts mi                -> "DEADBEEF"
static VALUE
ossl_ts_token_info_get_msg_imprint(VALUE self)
{
    TS_TST_INFO *info;
    TS_MSG_IMPRINT *mi;
    ASN1_OCTET_STRING *hashed_msg;
    VALUE ret;

    GetTSTokenInfo(self, info);
    mi = TS_TST_INFO_get_msg_imprint(info);
    hashed_msg = TS_MSG_IMPRINT_get_msg(mi);
    ret = rb_str_new((const char *)hashed_msg->data, hashed_msg->length);

    return ret;
}
nonce → BN 或 nil 点击切换源码

如果时间戳令牌有效,则此字段包含在初始 Request 中传递给时间戳服务器的相同随机数。

static VALUE
ossl_ts_token_info_get_nonce(VALUE self)
{
    TS_TST_INFO *info;
    const ASN1_INTEGER *nonce;

    GetTSTokenInfo(self, info);
    if (!(nonce = TS_TST_INFO_get_nonce(info)))
        return Qnil;

    return asn1integer_to_num(nonce);
}
ordering → true, false 或 nil 点击切换源码

如果缺少 ordering 字段,或者如果 ordering 字段存在并设置为 false,则 genTime 字段仅指示 TSA 创建时间戳令牌的时间。在这种情况下,只有当第一个时间戳令牌的 genTime 和第二个时间戳令牌的 genTime 之间的差异大于每个时间戳令牌的 genTime 精度之和时,才能对同一 TSA 或不同 TSA 颁发的时间戳令牌进行排序。

如果 ordering 字段存在并设置为 true,则始终可以基于 genTime 字段对来自同一 TSA 的每个时间戳令牌进行排序,而无需考虑 genTime 的准确性。

static VALUE
ossl_ts_token_info_get_ordering(VALUE self)
{
    TS_TST_INFO *info;

    GetTSTokenInfo(self, info);
    return TS_TST_INFO_get_ordering(info) ? Qtrue : Qfalse;
}
policy_id → string 或 nil 点击切换源码

返回创建此时间戳所依据的策略的时间戳策略对象标识符。如果状态为 GRANTED 或 GRANTED_WITH_MODS,则永远不会为 nil

示例:

id = token_info.policy_id
puts id                 -> "1.2.3.4.5"
static VALUE
ossl_ts_token_info_get_policy_id(VALUE self)
{
    TS_TST_INFO *info;

    GetTSTokenInfo(self, info);
    return get_asn1obj(TS_TST_INFO_get_policy_id(info));
}
serial_number → BN 或 nil 点击切换源码

返回时间戳令牌的序列号。对于专用时间戳机构颁发的两个时间戳令牌,此值绝不相同。如果状态为 GRANTED 或 GRANTED_WITH_MODS,则永远不会为 nil

static VALUE
ossl_ts_token_info_get_serial_number(VALUE self)
{
    TS_TST_INFO *info;

    GetTSTokenInfo(self, info);
    return asn1integer_to_num(TS_TST_INFO_get_serial(info));
}
to_der → string 点击切换源码

返回 DER 编码格式的 TokenInfo

static VALUE
ossl_ts_token_info_to_der(VALUE self)
{
    TS_TST_INFO *info;

    GetTSTokenInfo(self, info);
    return asn1_to_der((void *)info, (int (*)(void *, unsigned char **))i2d_TS_TST_INFO);
}
to_text() 点击切换源码
static VALUE
ossl_ts_token_info_to_text(VALUE self)
{
    TS_TST_INFO *info;
    BIO *out;

    GetTSTokenInfo(self, info);

    out = BIO_new(BIO_s_mem());
    if (!out) ossl_raise(eTimestampError, NULL);

    if (!TS_TST_INFO_print_bio(out, info)) {
        BIO_free(out);
        ossl_raise(eTimestampError, NULL);
    }

    return ossl_membio2str(out);
}
version → Integer 或 nil 点击切换源码

返回令牌信息的版本号。对于兼容的服务器,如果存在,则此值应为 1。如果状态为 GRANTED 或 GRANTED_WITH_MODS。

static VALUE
ossl_ts_token_info_get_version(VALUE self)
{
    TS_TST_INFO *info;

    GetTSTokenInfo(self, info);
    return LONG2NUM(TS_TST_INFO_get_version(info));
}