Class: WSS4R::Security::Xml::Signature

Inherits:
Object
  • Object
show all
Defined in:
lib/wss4r/security/xml/signature.rb

Instance Method Summary collapse

Constructor Details

#initialize(security_token) ⇒ Signature

Returns a new instance of Signature.



6
7
8
# File 'lib/wss4r/security/xml/signature.rb', line 6

def initialize(security_token)
  @security_token = security_token
end

Instance Method Details

#process(document) ⇒ Object



10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# File 'lib/wss4r/security/xml/signature.rb', line 10

def process(document)
  security = Security.new()
  security = security.process(document)
  security_token = @security_token.process(document)
  children = security.children()
  #children.each{|child|

  #  security.delete(child)

  #}   

  security.add_element(security_token)
  signature_element = security.add_element(Names::SIGNATURE)
  #children.each{|child|

  #  security.add_element(child)

  #}

  signature_element.add_namespace("xmlns:ds", Namespaces::DS)
  signed_info = SignedInfo.new()
  signed_info_element = signed_info.process(signature_element)
  signature_value = SignatureValue.new(@security_token, signed_info_element)
  signature_value.process(document)
  key_info = KeyInfo.new(@security_token, KeyInfo::REFERENCE).get_xml(signature_element)
  document
end

#unprocess(signature) ⇒ Object



32
33
34
35
36
37
38
39
# File 'lib/wss4r/security/xml/signature.rb', line 32

def unprocess(signature)
  @signature_value = XPath.first(signature, "ds:SignatureValue", {"ds" => Namespaces::DS}).text().gsub("\n","")
  key_info = XPath.first(signature, "ds:KeyInfo", {"ds" => Namespaces::DS})
  @key_info = KeyInfo.new(key_info)
  @signed_info = SignedInfo.new()
  @signed_info.unprocess(signature.document())
  @signature = signature
end

#verifyObject



61
62
63
64
# File 'lib/wss4r/security/xml/signature.rb', line 61

def verify()
  @signed_info.verify()
  verify_signature()
end

#verify_signatureObject

Raises:

  • (FaultError)


41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/wss4r/security/xml/signature.rb', line 41

def verify_signature()
  signed_info = XPath.first(@signature, "ds:SignedInfo", {"ds" => Namespaces::DS})
  inclusive_namespaces = XPath.first(signed_info, "ds:CanonicalizationMethod/InclusiveNamespaces", {"ds" => Namespaces::DS})
  prefix_list = inclusive_namespaces.attribute("PrefixList") if (inclusive_namespaces)
  if (prefix_list)
    prefix_list = prefix_list.value().split()
  end
  transformer = TransformerFactory::get_instance(@signed_info.canonicalizer_method())
  transformer.prefix_list=(prefix_list)
  result = transformer.canonicalize_element(signed_info)
  signature_value = Base64.decode64(@signature_value)#.strip()

  public_key = @key_info.security_token().certificate().public_key()
  #TODO: check certificate

  certificate = @key_info.security_token().certificate()
  
  verify = public_key.verify(OpenSSL::Digest::SHA1.new(), signature_value, result)
  raise FaultError.new(VerificationFault.new()) if !(verify)
  certitificate = @key_info.security_token().certificate()
end