Class: Saro::Dat::DatCertificate

Inherits:
Object
  • Object
show all
Defined in:
lib/saro/dat/dat_certificate.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(cid, dat_issuance_start_seconds, dat_issuance_duration_seconds, dat_ttl_seconds, signature_key, crypto_key) ⇒ DatCertificate

Returns a new instance of DatCertificate.



13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# File 'lib/saro/dat/dat_certificate.rb', line 13

def initialize(cid, dat_issuance_start_seconds, dat_issuance_duration_seconds, dat_ttl_seconds, signature_key, crypto_key)
  @cid = u64!("cid", cid)
  @dat_issuance_start_seconds = u64!("dat_issuance_start_seconds", dat_issuance_start_seconds)
  duration = u64!("dat_issuance_duration_seconds", dat_issuance_duration_seconds)
  @dat_ttl_seconds = u64!("dat_ttl_seconds", dat_ttl_seconds)
  # Ruby 정수는 자동으로 bignum 이 되므로 그냥 더하면 u64 를 넘겨도 조용히
  # 통과한다. 기준 구현(rust)의 checked_add 와 같은 경계를 여기서 강제한다.
  @dat_issuance_end_seconds = u64!(
    "dat_issuance_start_seconds + dat_issuance_duration_seconds",
    @dat_issuance_start_seconds + duration
  )
  u64!(
    "dat_issuance_start_seconds + dat_issuance_duration_seconds + dat_ttl_seconds",
    @dat_issuance_end_seconds + @dat_ttl_seconds
  )
  @signature_key = signature_key
  @crypto_key = crypto_key
end

Instance Attribute Details

#cidObject (readonly)

Returns the value of attribute cid.



11
12
13
# File 'lib/saro/dat/dat_certificate.rb', line 11

def cid
  @cid
end

#crypto_keyObject (readonly)

Returns the value of attribute crypto_key.



11
12
13
# File 'lib/saro/dat/dat_certificate.rb', line 11

def crypto_key
  @crypto_key
end

#dat_issuance_end_secondsObject (readonly)

Returns the value of attribute dat_issuance_end_seconds.



11
12
13
# File 'lib/saro/dat/dat_certificate.rb', line 11

def dat_issuance_end_seconds
  @dat_issuance_end_seconds
end

#dat_issuance_start_secondsObject (readonly)

Returns the value of attribute dat_issuance_start_seconds.



11
12
13
# File 'lib/saro/dat/dat_certificate.rb', line 11

def dat_issuance_start_seconds
  @dat_issuance_start_seconds
end

#dat_ttl_secondsObject (readonly)

Returns the value of attribute dat_ttl_seconds.



11
12
13
# File 'lib/saro/dat/dat_certificate.rb', line 11

def dat_ttl_seconds
  @dat_ttl_seconds
end

#signature_keyObject (readonly)

Returns the value of attribute signature_key.



11
12
13
# File 'lib/saro/dat/dat_certificate.rb', line 11

def signature_key
  @signature_key
end

Class Method Details

.generate(cid, dat_issuance_start_seconds, dat_issuance_duration_seconds, dat_ttl_seconds, signature_algorithm, crypto_algorithm) ⇒ Object



45
46
47
48
49
50
51
# File 'lib/saro/dat/dat_certificate.rb', line 45

def self.generate(cid, dat_issuance_start_seconds, dat_issuance_duration_seconds, dat_ttl_seconds, signature_algorithm, crypto_algorithm)
  new(
    cid, dat_issuance_start_seconds, dat_issuance_duration_seconds, dat_ttl_seconds,
    Saro::Dat::DatSignature.generate(signature_algorithm),
    Saro::Dat::DatCrypto.generate(crypto_algorithm)
  )
end

.imports(format_str) ⇒ Object



53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/saro/dat/dat_certificate.rb', line 53

def self.imports(format_str)
  parts = format_str.split(".")
  if parts.length != 8
    raise Saro::Dat::Error.new(Saro::Dat::ErrorCode::CERT_MALFORMED, "expected exactly 8 dot-separated fields")
  end

  # 필드 파싱 실패는 인증서가 깨진 것이지 호출자의 인자 문제가 아니다.
  cid = _field("cid") { Saro::Dat::Util.parse_u64_hex(parts[0]) }
  dat_issuance_start_seconds = _field("issuance_start_seconds") { Saro::Dat::Util.parse_u64(parts[1]) }
  dat_issuance_duration_seconds = _field("issuance_duration_seconds") { Saro::Dat::Util.parse_u64(parts[2]) }
  dat_ttl_seconds = _field("dat_ttl_seconds") { Saro::Dat::Util.parse_u64(parts[3]) }
  signature_algorithm = parts[4]
  crypto_algorithm = parts[5]
  signature_key = Saro::Dat::DatSignature.imports(signature_algorithm, parts[6])
  crypto_key = Saro::Dat::DatCrypto.imports(crypto_algorithm, parts[7])

  new(cid, dat_issuance_start_seconds, dat_issuance_duration_seconds, dat_ttl_seconds, signature_key, crypto_key)
end

Instance Method Details

#expiredObject Also known as: expired?



77
78
79
# File 'lib/saro/dat/dat_certificate.rb', line 77

def expired
  Time.now.to_i > (@dat_issuance_end_seconds + @dat_ttl_seconds)
end

#exports(verify_only = false) ⇒ Object



32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/saro/dat/dat_certificate.rb', line 32

def exports(verify_only = false)
  cid_hex = @cid.to_s(16)
  dat_issuance_start_seconds = @dat_issuance_start_seconds.to_s
  dat_issuance_duration_seconds = (@dat_issuance_end_seconds - @dat_issuance_start_seconds).to_s
  dat_ttl_seconds = @dat_ttl_seconds.to_s
  signature_algorithm = @signature_key.algorithm
  crypto_algorithm = @crypto_key.algorithm
  signature_key = @signature_key.exports(verify_only)
  crypto_key = @crypto_key.exports

  "#{cid_hex}.#{dat_issuance_start_seconds}.#{dat_issuance_duration_seconds}.#{dat_ttl_seconds}.#{signature_algorithm}.#{crypto_algorithm}.#{signature_key}.#{crypto_key}"
end

#issuableObject Also known as: issuable?



72
73
74
75
# File 'lib/saro/dat/dat_certificate.rb', line 72

def issuable
  now = Time.now.to_i
  signable && @dat_issuance_start_seconds <= now && now <= @dat_issuance_end_seconds
end

#pairObject Also known as: pair?



85
86
87
# File 'lib/saro/dat/dat_certificate.rb', line 85

def pair
  @signature_key.pair
end

#signableObject Also known as: signable?



81
82
83
# File 'lib/saro/dat/dat_certificate.rb', line 81

def signable
  @signature_key.signable
end

#support_verify_onlyObject



89
90
91
# File 'lib/saro/dat/dat_certificate.rb', line 89

def support_verify_only
  @signature_key.support_verify_only
end