晋太元中,武陵人捕鱼为业。缘溪行,忘路之远近。忽逢桃花林,夹岸数百步,中无杂树,芳草鲜美,落英缤纷。渔人甚异之,复前行,欲穷其林。 林尽水源,便得一山,山有小口,仿佛若有光。便舍船,从口入。初极狭,才通人。复行数十步,豁然开朗。土地平旷,屋舍俨然,有良田、美池、桑竹之属。阡陌交通,鸡犬相闻。其中往来种作,男女衣着,悉如外人。黄发垂髫,并怡然自乐。 见渔人,乃大惊,问所从来。具答之。便要还家,设酒杀鸡作食。村中闻有此人,咸来问讯。自云先世避秦时乱,率妻子邑人来此绝境,不复出焉,遂与外人间隔。问今是何世,乃不知有汉,无论魏晋。此人一一为具言所闻,皆叹惋。余人各复延至其家,皆出酒食。停数日,辞去。此中人语云:“不足为外人道也。”(间隔 一作:隔绝) 既出,得其船,便扶向路,处处志之。及郡下,诣太守,说如此。太守即遣人随其往,寻向所志,遂迷,不复得路。 南阳刘子骥,高尚士也,闻之,欣然规往。未果,寻病终。后遂无问津者。
| DIR:/opt/alt/ruby34/share/ruby/openssl/ |
| Current File : //opt/alt/ruby34/share/ruby/openssl/asn1.rb |
# frozen_string_literal: true
#--
#
# = Ruby-space definitions that completes C-space funcs for ASN.1
#
# = Licence
# This program is licensed under the same licence as Ruby.
# (See the file 'COPYING'.)
#++
module OpenSSL
module ASN1
class ASN1Data
#
# Carries the value of a ASN.1 type.
# Please confer Constructive and Primitive for the mappings between
# ASN.1 data types and Ruby classes.
#
attr_accessor :value
# An Integer representing the tag number of this ASN1Data. Never +nil+.
attr_accessor :tag
# A Symbol representing the tag class of this ASN1Data. Never +nil+.
# See ASN1Data for possible values.
attr_accessor :tag_class
#
# Never +nil+. A boolean value indicating whether the encoding uses
# indefinite length (in the case of parsing) or whether an indefinite
# length form shall be used (in the encoding case).
# In DER, every value uses definite length form. But in scenarios where
# large amounts of data need to be transferred it might be desirable to
# have some kind of streaming support available.
# For example, huge OCTET STRINGs are preferably sent in smaller-sized
# chunks, each at a time.
# This is possible in BER by setting the length bytes of an encoding
# to zero and by this indicating that the following value will be
# sent in chunks. Indefinite length encodings are always constructed.
# The end of such a stream of chunks is indicated by sending a EOC
# (End of Content) tag. SETs and SEQUENCEs may use an indefinite length
# encoding, but also primitive types such as e.g. OCTET STRINGS or
# BIT STRINGS may leverage this functionality (cf. ITU-T X.690).
#
attr_accessor :indefinite_length
alias infinite_length indefinite_length
alias infinite_length= indefinite_length=
#
# :call-seq:
# OpenSSL::ASN1::ASN1Data.new(value, tag, tag_class) => ASN1Data
#
# _value_: Please have a look at Constructive and Primitive to see how Ruby
# types are mapped to ASN.1 types and vice versa.
#
# _tag_: An Integer indicating the tag number.
#
# _tag_class_: A Symbol indicating the tag class. Please cf. ASN1 for
# possible values.
#
# == Example
# asn1_int = OpenSSL::ASN1Data.new(42, 2, :UNIVERSAL) # => Same as OpenSSL::ASN1::Integer.new(42)
# tagged_int = OpenSSL::ASN1Data.new(42, 0, :CONTEXT_SPECIFIC) # implicitly 0-tagged INTEGER
#
def initialize(value, tag, tag_class)
raise ASN1Error, "invalid tag class" unless tag_class.is_a?(Symbol)
@tag = tag
@value = value
@tag_class = tag_class
@indefinite_length = false
end
end
module TaggedASN1Data
#
# May be used as a hint for encoding a value either implicitly or
# explicitly by setting it either to +:IMPLICIT+ or to +:EXPLICIT+.
# _tagging_ is not set when a ASN.1 structure is parsed using
# OpenSSL::ASN1.decode.
#
attr_accessor :tagging
# :call-seq:
# OpenSSL::ASN1::Primitive.new(value [, tag, tagging, tag_class ]) => Primitive
#
# _value_: is mandatory.
#
# _tag_: optional, may be specified for tagged values. If no _tag_ is
# specified, the UNIVERSAL tag corresponding to the Primitive sub-class
# is used by default.
#
# _tagging_: may be used as an encoding hint to encode a value either
# explicitly or implicitly, see ASN1 for possible values.
#
# _tag_class_: if _tag_ and _tagging_ are +nil+ then this is set to
# +:UNIVERSAL+ by default. If either _tag_ or _tagging_ are set then
# +:CONTEXT_SPECIFIC+ is used as the default. For possible values please
# cf. ASN1.
#
# == Example
# int = OpenSSL::ASN1::Integer.new(42)
# zero_tagged_int = OpenSSL::ASN1::Integer.new(42, 0, :IMPLICIT)
# private_explicit_zero_tagged_int = OpenSSL::ASN1::Integer.new(42, 0, :EXPLICIT, :PRIVATE)
#
def initialize(value, tag = nil, tagging = nil, tag_class = nil)
tag ||= ASN1.take_default_tag(self.class)
raise ASN1Error, "must specify tag number" unless tag
if tagging
raise ASN1Error, "invalid tagging method" unless tagging.is_a?(Symbol)
end
tag_class ||= tagging ? :CONTEXT_SPECIFIC : :UNIVERSAL
raise ASN1Error, "invalid tag class" unless tag_class.is_a?(Symbol)
@tagging = tagging
super(value ,tag, tag_class)
end
end
class Primitive < ASN1Data
include TaggedASN1Data
undef_method :indefinite_length=
undef_method :infinite_length=
end
class Constructive < ASN1Data
include TaggedASN1Data
include Enumerable
# :call-seq:
# asn1_ary.each { |asn1| block } => asn1_ary
#
# Calls the given block once for each element in self, passing that element
# as parameter _asn1_. If no block is given, an enumerator is returned
# instead.
#
# == Example
# asn1_ary.each do |asn1|
# puts asn1
# end
#
def each(&blk)
@value.each(&blk)
self
end
end
class Boolean < Primitive ; end
class Integer < Primitive ; end
class Enumerated < Primitive ; end
class BitString < Primitive
attr_accessor :unused_bits
def initialize(*)
super
@unused_bits = 0
end
end
class EndOfContent < ASN1Data
def initialize
super("", 0, :UNIVERSAL)
end
end
# :nodoc:
def self.take_default_tag(klass)
tag = CLASS_TAG_MAP[klass]
return tag if tag
sklass = klass.superclass
return unless sklass
take_default_tag(sklass)
end
end
end
|