win32-certstore 0.1.11 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: da6e8ade18f40b72dc3716b9e89767f346aaca6741ac57c9ac815e6e10955298
4
- data.tar.gz: ebb4b370fcdc8a679135a688d9ecc19bfc0dc71bd094114996e7d3ae810a14c5
3
+ metadata.gz: '0806f9e6b2fd19bdcbe22360d33ee9c192e603662564ec5007332b03b498d9ce'
4
+ data.tar.gz: 5cc20bb3a2767b6ea0a9495bb0e7c27892bf9189f662db233d1901c31006b6a9
5
5
  SHA512:
6
- metadata.gz: df778b28e7d2e9d730babee977e23aec1627702d2f199a85d9f5b8b1d014a02e96a5a0c27507e872adc8bb7f11a3810f61dce5e3c999a3e16045813bc4c25435
7
- data.tar.gz: 507f27ee6151029a3a52135de9f462a36d7b664ab3004b5829cb725909e81bba0da127ca26b2d55d0d20dd68f885bebccc8c210f41bf386365a15317d7637f56
6
+ metadata.gz: 9882eb9c3f237dc8564c36cde26fd437ed5fd54f786f2fa9289793e5cab193acd845e425ba240f9eab320c57f693f33a08416f89bb6c0c8ff6db7dcd6363e41b
7
+ data.tar.gz: d86c06df2d6be60b044a7474bcb72851245b2b28c2bd81dbb9b9e5e43185cc344a48302c53f6fcd03ebd4ce2416e384b77d0768015cd01a024786c9aab8c892e
@@ -29,9 +29,10 @@ module Win32
29
29
  include Win32::Certstore::Mixin::String
30
30
  include Win32::Certstore::StoreBase
31
31
 
32
- attr_reader :store_name
32
+ attr_accessor :store_name
33
33
 
34
34
  def initialize(store_name)
35
+ @store_name = store_name
35
36
  @certstore_handler = open(store_name)
36
37
  end
37
38
 
@@ -55,6 +55,7 @@ module Win32
55
55
  PKCS_7_ASN_ENCODING = 0x00010000
56
56
  PKCS_7_NDR_ENCODING = 0x00020000
57
57
  PKCS_7_OR_X509_ASN_ENCODING = (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING)
58
+ ENCODING_TYPE = X509_ASN_ENCODING | PKCS_7_ASN_ENCODING
58
59
 
59
60
  # Certificate Display Format
60
61
  CERT_NAME_EMAIL_TYPE = 1
@@ -67,8 +68,12 @@ module Win32
67
68
  CERT_NAME_UPN_TYPE = 8
68
69
 
69
70
  # Retrieve Certificates flag
70
- CERT_FIND_SUBJECT_STR = 0x00080007
71
- CERT_FIND_ISSUER_STR = 0x00080004
71
+ CERT_COMPARE_SHA1_HASH = 1
72
+ CERT_INFO_SUBJECT_FLAG = 7
73
+ CERT_COMPARE_NAME_STR_W = 8
74
+ CERT_COMPARE_SHIFT = 16
75
+ CERT_FIND_SHA1_HASH = CERT_COMPARE_SHA1_HASH << CERT_COMPARE_SHIFT
76
+ CERT_FIND_SUBJECT_STR = CERT_COMPARE_NAME_STR_W << CERT_COMPARE_SHIFT | CERT_INFO_SUBJECT_FLAG
72
77
 
73
78
  # List Certificates Flag
74
79
  CERT_NAME_ISSUER_FLAG = 0x1
@@ -122,6 +127,23 @@ module Win32
122
127
  end
123
128
  end
124
129
 
130
+ class CRYPT_HASH_BLOB < FFI::Struct
131
+ layout :cbData, DWORD, # Count, in bytes, of data
132
+ :pbData, :pointer # Pointer to data buffer
133
+
134
+ def initialize(str = nil)
135
+ super(nil)
136
+ if str
137
+ byte_arr = [str].pack("H*").unpack("C*") # Converting string to its byte array
138
+
139
+ buffer = FFI::MemoryPointer.new(:char, byte_arr.size) # Create the pointer to the array
140
+ buffer.put_array_of_char 0, byte_arr # Fill the memory location with data
141
+ self[:pbData] = buffer
142
+ self[:cbData] = byte_arr.size
143
+ end
144
+ end
145
+ end
146
+
125
147
  class CERT_EXTENSION < FFI::Struct
126
148
  layout :pszObjId, LPTSTR,
127
149
  :fCritical, BOOL,
@@ -23,10 +23,10 @@ module Win32
23
23
  module Helper
24
24
 
25
25
  # PSCommand to search certificate from thumbprint and convert in pem
26
- def cert_ps_cmd(thumbprint)
26
+ def cert_ps_cmd(thumbprint, store_name)
27
27
  <<-EOH
28
28
  $content = $null
29
- $cert = Get-ChildItem Cert:\ -Recurse | Where { $_.Thumbprint -eq '#{thumbprint}' }
29
+ $cert = Get-ChildItem Cert:\\LocalMachine\\'#{store_name}' -Recurse | Where { $_.Thumbprint -eq '#{thumbprint}' }
30
30
  if($cert -ne $null)
31
31
  {
32
32
  $content = @(
@@ -40,11 +40,3 @@ module FFI
40
40
  end
41
41
  end
42
42
  end
43
-
44
- class String
45
- include Win32::Certstore::Mixin::String
46
-
47
- def to_wstring
48
- utf8_to_wide(self)
49
- end
50
- end
@@ -50,7 +50,6 @@ module Win32
50
50
  end
51
51
 
52
52
  # Get certificate from open certificate store and return certificate object
53
- # store_handler => Open certificate store handler
54
53
  # certificate_thumbprint => thumbprint is a hash. which could be sha1 or md5.
55
54
  def cert_get(certificate_thumbprint)
56
55
  validate_thumbprint(certificate_thumbprint)
@@ -86,21 +85,16 @@ module Win32
86
85
  def cert_delete(store_handler, certificate_thumbprint)
87
86
  validate_thumbprint(certificate_thumbprint)
88
87
  thumbprint = update_thumbprint(certificate_thumbprint)
89
- cert_pem = format_pem(get_cert_pem(thumbprint))
90
- cert_rdn = get_rdn(build_openssl_obj(cert_pem)) unless cert_pem.empty?
91
88
  cert_delete_flag = false
92
89
  begin
93
- cert_args = cert_find_args(store_handler, cert_rdn)
94
- if (pcert_context = CertFindCertificateInStore(*cert_args)) && !pcert_context.null?
90
+ cert_args = cert_find_args(store_handler, thumbprint)
91
+ pcert_context = CertFindCertificateInStore(*cert_args)
92
+ if !pcert_context.null?
95
93
  cert_delete_flag = CertDeleteCertificateFromStore(CertDuplicateCertificateContext(pcert_context)) || lookup_error
96
94
  end
97
95
  CertFreeCertificateContext(pcert_context)
98
96
  rescue
99
- if cert_pem.empty?
100
- raise SystemCallError.new("Invalid thumbprint #{certificate_thumbprint}.")
101
- else
102
- lookup_error("delete")
103
- end
97
+ lookup_error("delete")
104
98
  end
105
99
  cert_delete_flag
106
100
  end
@@ -144,8 +138,8 @@ module Win32
144
138
  end
145
139
 
146
140
  # Build arguments for CertFindCertificateInStore
147
- def cert_find_args(store_handler, cert_rdn)
148
- [store_handler, X509_ASN_ENCODING, 0, CERT_FIND_ISSUER_STR, cert_rdn.to_wstring, nil]
141
+ def cert_find_args(store_handler, thumbprint)
142
+ [store_handler, ENCODING_TYPE, 0, CERT_FIND_SHA1_HASH, CRYPT_HASH_BLOB.new(thumbprint), nil]
149
143
  end
150
144
 
151
145
  # Match certificate CN exist in cert_rdn
@@ -188,15 +182,10 @@ module Win32
188
182
 
189
183
  # Get certificate pem
190
184
  def get_cert_pem(thumbprint)
191
- get_data = powershell_out!(cert_ps_cmd(thumbprint))
185
+ get_data = powershell_out!(cert_ps_cmd(thumbprint, store_name))
192
186
  get_data.stdout
193
187
  end
194
188
 
195
- # To get RDN from certificate object
196
- def get_rdn(cert_obj)
197
- cert_obj.issuer.to_s.concat("/").scan(/=(.*?)\//).join(", ")
198
- end
199
-
200
189
  # Format pem
201
190
  def format_pem(cert_pem)
202
191
  cert_pem.delete("\r")
@@ -1,6 +1,6 @@
1
1
  module Win32
2
2
  class Certstore
3
- VERSION = "0.1.11".freeze
3
+ VERSION = "0.2.1".freeze
4
4
  MAJOR, MINOR, TINY = VERSION.split(".")
5
5
  end
6
6
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: win32-certstore
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.11
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
- - nimisha
7
+ - Chef Software
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-10-31 00:00:00.000000000 Z
11
+ date: 2019-01-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -68,7 +68,7 @@ dependencies:
68
68
  version: '0'
69
69
  description:
70
70
  email:
71
- - nimisha.sharad@msystechnologies.com
71
+ - oss@chef.io
72
72
  executables: []
73
73
  extensions: []
74
74
  extra_rdoc_files: []
@@ -97,7 +97,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
97
97
  requirements:
98
98
  - - ">="
99
99
  - !ruby/object:Gem::Version
100
- version: '0'
100
+ version: '2.3'
101
101
  required_rubygems_version: !ruby/object:Gem::Requirement
102
102
  requirements:
103
103
  - - ">="