类 OpenSSL::Timestamp::Request
允许创建时间戳请求或解析现有请求。一个 Request
也需要使用 Factory
从头开始创建时间戳。当从头开始创建时,会设置一些默认值
-
version 设置为
1
-
cert_requested 设置为
true
-
algorithm、
message_imprint
、policy_id
和 nonce 设置为false
公共类方法
OpenSSL::Timestamp::Request.new(file) → request 点击切换源代码
OpenSSL::Timestamp::Request.new(string) → request
OpenSSL::Timestamp::Request.new → 空请求
当使用 File
或 string
参数创建 Request
时,相应的 File
或 string
必须是 DER 编码的。
static VALUE ossl_ts_req_initialize(int argc, VALUE *argv, VALUE self) { TS_REQ *ts_req = DATA_PTR(self); BIO *in; VALUE arg; if(rb_scan_args(argc, argv, "01", &arg) == 0) { return self; } arg = ossl_to_der_if_possible(arg); in = ossl_obj2bio(&arg); ts_req = d2i_TS_REQ_bio(in, &ts_req); BIO_free(in); if (!ts_req) { DATA_PTR(self) = NULL; ossl_raise(eTimestampError, "Error when decoding the timestamp request"); } DATA_PTR(self) = ts_req; return self; }
公共实例方法
algorithm → string 点击切换源代码
返回表示用于创建消息摘要的算法的对象标识符的“短名称”。
static VALUE ossl_ts_req_get_algorithm(VALUE self) { TS_REQ *req; TS_MSG_IMPRINT *mi; X509_ALGOR *algor; GetTSRequest(self, req); mi = TS_REQ_get_msg_imprint(req); algor = TS_MSG_IMPRINT_get_algo(mi); return get_asn1obj(algor->algorithm); }
algorithm = "string" → string 点击切换源代码
允许设置用于创建消息摘要的算法的对象标识符或“短名称”。
示例:¶ ↑
request.algorithm = "SHA1"
static VALUE ossl_ts_req_set_algorithm(VALUE self, VALUE algo) { TS_REQ *req; TS_MSG_IMPRINT *mi; ASN1_OBJECT *obj; X509_ALGOR *algor; GetTSRequest(self, req); obj = obj_to_asn1obj(algo); mi = TS_REQ_get_msg_imprint(req); algor = TS_MSG_IMPRINT_get_algo(mi); if (!X509_ALGOR_set0(algor, obj, V_ASN1_NULL, NULL)) { ASN1_OBJECT_free(obj); ossl_raise(eTimestampError, "X509_ALGOR_set0"); } return algo; }
cert_requested = boolean → true 或 false 点击切换源代码
指定响应是否应包含时间戳颁发机构的证书。默认值为 true
。
static VALUE ossl_ts_req_set_cert_requested(VALUE self, VALUE requested) { TS_REQ *req; GetTSRequest(self, req); TS_REQ_set_cert_req(req, RTEST(requested)); return requested; }
cert_requested? → true 或 false 点击切换源代码
指示响应是否应包含时间戳颁发机构的证书。
static VALUE ossl_ts_req_get_cert_requested(VALUE self) { TS_REQ *req; GetTSRequest(self, req); return TS_REQ_get_cert_req(req) ? Qtrue: Qfalse; }
message_imprint → string 或 nil 点击切换源代码
返回要加时间戳的数据的消息摘要。
static VALUE ossl_ts_req_get_msg_imprint(VALUE self) { TS_REQ *req; TS_MSG_IMPRINT *mi; ASN1_OCTET_STRING *hashed_msg; VALUE ret; GetTSRequest(self, req); mi = TS_REQ_get_msg_imprint(req); hashed_msg = TS_MSG_IMPRINT_get_msg(mi); ret = rb_str_new((const char *)hashed_msg->data, hashed_msg->length); return ret; }
message_imprint = "string" → string 点击切换源代码
设置消息印记摘要。
static VALUE ossl_ts_req_set_msg_imprint(VALUE self, VALUE hash) { TS_REQ *req; TS_MSG_IMPRINT *mi; StringValue(hash); GetTSRequest(self, req); mi = TS_REQ_get_msg_imprint(req); if (!TS_MSG_IMPRINT_set_msg(mi, (unsigned char *)RSTRING_PTR(hash), RSTRING_LENINT(hash))) ossl_raise(eTimestampError, "TS_MSG_IMPRINT_set_msg"); return hash; }
nonce → BN 或 nil 点击切换源代码
返回服务器应在其响应中包含的随机数(一次性数字)。
static VALUE ossl_ts_req_get_nonce(VALUE self) { TS_REQ *req; const ASN1_INTEGER * nonce; GetTSRequest(self, req); if (!(nonce = TS_REQ_get_nonce(req))) return Qnil; return asn1integer_to_num(nonce); }
nonce = number → BN 点击切换源代码
设置服务器应在其响应中包含的随机数(一次性数字)。如果设置了随机数,服务器必须在有效的 Response
中返回相同的随机数。
static VALUE ossl_ts_req_set_nonce(VALUE self, VALUE num) { TS_REQ *req; ASN1_INTEGER *nonce; int ok; GetTSRequest(self, req); nonce = num_to_asn1integer(num, NULL); ok = TS_REQ_set_nonce(req, nonce); ASN1_INTEGER_free(nonce); if (!ok) ossl_raise(eTimestampError, NULL); return num; }
policy_id → string 或 nil 点击切换源代码
返回表示服务器应在其中创建时间戳的时间戳策略的标识符的“短名称”。
static VALUE ossl_ts_req_get_policy_id(VALUE self) { TS_REQ *req; GetTSRequest(self, req); if (!TS_REQ_get_policy_id(req)) return Qnil; return get_asn1obj(TS_REQ_get_policy_id(req)); }
policy_id = "string" → string 点击切换源代码
允许设置表示服务器应在其中创建时间戳的时间戳策略的标识符。这可以保留为 nil
,这意味着时间戳服务器将使用某些默认策略来颁发时间戳。
示例:¶ ↑
request.policy_id = "1.2.3.4.5"
static VALUE ossl_ts_req_set_policy_id(VALUE self, VALUE oid) { TS_REQ *req; ASN1_OBJECT *obj; int ok; GetTSRequest(self, req); obj = obj_to_asn1obj(oid); ok = TS_REQ_set_policy_id(req, obj); ASN1_OBJECT_free(obj); if (!ok) ossl_raise(eTimestampError, "TS_REQ_set_policy_id"); return oid; }
to_der → DER 编码字符串 点击切换源代码
将此 Request
编码为 DER。
static VALUE ossl_ts_req_to_der(VALUE self) { TS_REQ *req; TS_MSG_IMPRINT *mi; X509_ALGOR *algo; ASN1_OCTET_STRING *hashed_msg; GetTSRequest(self, req); mi = TS_REQ_get_msg_imprint(req); algo = TS_MSG_IMPRINT_get_algo(mi); if (OBJ_obj2nid(algo->algorithm) == NID_undef) ossl_raise(eTimestampError, "Message imprint missing algorithm"); hashed_msg = TS_MSG_IMPRINT_get_msg(mi); if (!hashed_msg->length) ossl_raise(eTimestampError, "Message imprint missing hashed message"); return asn1_to_der((void *)req, (int (*)(void *, unsigned char **))i2d_TS_REQ); }
version → Integer 点击切换源代码
返回此请求的版本。1
是默认值。
static VALUE ossl_ts_req_get_version(VALUE self) { TS_REQ *req; GetTSRequest(self, req); return LONG2NUM(TS_REQ_get_version(req)); }
version = number → Integer 点击切换源代码
设置此 Request
的版本号。对于符合标准的服务器,这应该为 1
。
static VALUE ossl_ts_req_set_version(VALUE self, VALUE version) { TS_REQ *req; long ver; if ((ver = NUM2LONG(version)) < 0) ossl_raise(eTimestampError, "version must be >= 0!"); GetTSRequest(self, req); if (!TS_REQ_set_version(req, ver)) ossl_raise(eTimestampError, "TS_REQ_set_version"); return version; }