class JSON::LD::SIGNATURE::RsaSigner
Attributes
priv[W]
pub[W]
Public Instance Methods
priv()
click to toggle source
# File lib/json/ld/signature/rsaSigner.rb, line 14 def priv @priv end
pub()
click to toggle source
# File lib/json/ld/signature/rsaSigner.rb, line 10 def pub @pub end
sign(input, options = {} )
click to toggle source
# File lib/json/ld/signature/rsaSigner.rb, line 18 def sign(input, options = {} ) # We require a creator to identify the signing key if options['creator'].nil? raise JsonLdSignatureError::MissingCreator, "the creator of the signature must be identified" end creator = options['creator'] # TODO: Validate the resolvability of the URL? # We require a privateKeyPem in the options hash # if options['privateKeyPem'].nil? # raise JsonLdSignatureError::MissingKey, "options parameter must include privateKeyPem" # end # The privateKeyPem can be either a String or a parsed RSA key # privateKey = case options['privateKeyPem'] # when String then OpenSSL::PKey::RSA.new options['privateKeyPem'] # when OpenSSL::PKey::RSA then options['privateKeyPem'] # else # raise JsonLdSignatureError::InvalidKeyType, "key must be RSA Key or PEM String" # end privateKey = @priv unless privateKey.private? raise JsonLdSignatureError::WrongKeyType, "submitted key is a public key" end # Check the input, it should either be a String or a parsed JSON object jsonld = case input when String then begin JSON.parse(input) rescue JSON::ParserError => e raise JsonLdSignatureError::InvalidJsonLdDocument, e.message end when Hash then input else raise JsonLdSignatureError::InvalidJsonLdDocument end jsonld.delete 'signature' # created = Time.now.iso8601 created = "2018-03-15T00:00:00Z" nonce = options['nonce'] domain = options['domain'] normOpts = { 'nonce' => nonce, 'domain' => options['domain'], 'created' => created, 'creator' => creator } normalizedGraph = JSON::LD::SIGNATURE::generateNormalizedGraph jsonld, normOpts digest = OpenSSL::Digest::SHA256.new signature = privateKey.sign digest, normalizedGraph enc = Base64.strict_encode64(signature) # "@context" : "https://w3id.org/security/v1", sigobj = JSON.parse %({ "type" : "RsaSignature2017", "creator" : "#{creator}", "created" : "#{created}", "signatureValue" : "#{enc}" }) sigobj['domain'] = domain unless options['domain'].nil? sigobj['nonce'] = nonce unless nonce.nil? jsonld['signature'] = sigobj jsonld.to_json end