Update stdlib and concat to 6.1.0 both
[mirror/dsa-puppet.git] / 3rdparty / modules / stdlib / lib / puppet / parser / functions / validate_x509_rsa_key_pair.rb
1 #
2 # validate_x509_rsa_key_pair.rb
3 #
4 module Puppet::Parser::Functions
5   newfunction(:validate_x509_rsa_key_pair, :doc => <<-DOC
6     @summary
7       Validates a PEM-formatted X.509 certificate and RSA private key using
8       OpenSSL. Verifies that the certficate's signature was created from the
9       supplied key.
10
11     @return
12       Fail compilation if any value fails this check.
13
14     ```validate_x509_rsa_key_pair($cert, $key)```
15
16     DOC
17              ) do |args|
18
19     require 'openssl'
20
21     NUM_ARGS = 2 unless defined? NUM_ARGS
22
23     unless args.length == NUM_ARGS
24       raise Puppet::ParseError,
25             "validate_x509_rsa_key_pair(): wrong number of arguments (#{args.length}; must be #{NUM_ARGS})"
26     end
27
28     args.each do |arg|
29       unless arg.is_a?(String)
30         raise Puppet::ParseError, "#{arg.inspect} is not a string."
31       end
32     end
33
34     begin
35       cert = OpenSSL::X509::Certificate.new(args[0])
36     rescue OpenSSL::X509::CertificateError => e
37       raise Puppet::ParseError, "Not a valid x509 certificate: #{e}"
38     end
39
40     begin
41       key = OpenSSL::PKey::RSA.new(args[1])
42     rescue OpenSSL::PKey::RSAError => e
43       raise Puppet::ParseError, "Not a valid RSA key: #{e}"
44     end
45
46     unless cert.verify(key)
47       raise Puppet::ParseError, 'Certificate signature does not match supplied key'
48     end
49   end
50 end