win32-certstore 0.1.11 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
  - - ">="