certstore_c 0.1.4 → 0.1.5

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: '0910066063e5a1d4bbfeb144a111b6c14f663959aa52eef2e3eed7fa0b024d41'
4
- data.tar.gz: b964fbfaa33f0a75cbc3df611fa7ea141870f8a2cf5791d4ffa2264067df0567
3
+ metadata.gz: f17868bc6c40ee22029b990df5920db1a54c51495d53907d1eeb18b1ff778f23
4
+ data.tar.gz: '06048cdc00d4e4613a8c9ea7bdc7f08dcec8d1791b4a8a991bbb04b10e12e560'
5
5
  SHA512:
6
- metadata.gz: 5403938369f1e51832e2b299bbb08df72efb5fc7f676b17a92bb7c63836a402480503311b26ed409a07cf4ba2ca5400492c2333b79662cdb47389b4d3971d85d
7
- data.tar.gz: c04387a545822a2af1c9a6fb1ff2d49dbc92a0eb09cd71e335a320754e7f4418fdc8c715475a951f27eab65d18248e0417b6367e8341a758487896e028fe3b5e
6
+ metadata.gz: 73b42304e47fce36a05de43bad75eaa39fc102a77fb04409aa95b67d17e1de7fe901ed13a94a6cfa11f944cbb22f16175078da50a8db58d43da742451c53b7f1
7
+ data.tar.gz: 8680f9c88dfb5cf78788b6bbf89befad5b5f40a05e074a391ba585980efc7b9038e4462368346fc26da94e97869e9cc83062657e4488c6cc166bdcdb7e0757a4
data/.clang-format ADDED
@@ -0,0 +1,5 @@
1
+ BasedOnStyle: Mozilla
2
+ ColumnLimit: 90
3
+ BinPackParameters: true
4
+ BinPackArguments: false
5
+ AllowShortCaseLabelsOnASingleLine: false
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Certstore
2
2
 
3
- [![Build status](https://ci.appveyor.com/api/projects/status/0iukmyau7wq971o4/branch/master?svg=true)](https://ci.appveyor.com/project/cosmo0920/certstore-c/branch/master)
3
+ [![Build status](https://ci.appveyor.com/api/projects/status/ecis54vyb81aset5/branch/master?svg=true)](https://ci.appveyor.com/project/cosmo0920/certstore-c-xbglu/branch/master)
4
4
 
5
5
  ## Prerequisites
6
6
 
@@ -36,4 +36,4 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
36
36
 
37
37
  ## Contributing
38
38
 
39
- Bug reports and pull requests are welcome on GitHub at https://github.com/cosmo0920/certstore_c.
39
+ Bug reports and pull requests are welcome on GitHub at https://github.com/fluent-plugins-nursery/certstore_c.
data/certstore_c.gemspec CHANGED
@@ -11,7 +11,7 @@ Gem::Specification.new do |spec|
11
11
 
12
12
  spec.summary = %q{Windows CertStore loader and ruby-openssl extension for TLS connection.}
13
13
  spec.description = spec.summary
14
- spec.homepage = "https://github.com/cosmo0920/certstore_c"
14
+ spec.homepage = "https://github.com/fluent-plugins-nursery/certstore_c"
15
15
 
16
16
  # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
17
17
  # to allow pushing to a single host or delete this section to allow pushing to any host.
@@ -19,7 +19,7 @@ Gem::Specification.new do |spec|
19
19
  spec.metadata["allowed_push_host"] = "https://rubygems.org"
20
20
 
21
21
  spec.metadata["homepage_uri"] = spec.homepage
22
- spec.metadata["source_code_uri"] = "https://github.com/cosmo0920/certstore_c"
22
+ spec.metadata["source_code_uri"] = "https://github.com/fluent-plugins-nursery/certstore_c"
23
23
  else
24
24
  raise "RubyGems 2.0 or newer is required to protect against " \
25
25
  "public gem pushes."
@@ -16,18 +16,17 @@
16
16
  #include <ruby/encoding.h>
17
17
 
18
18
  #ifdef __GNUC__
19
- # include <w32api.h>
20
- # define MINIMUM_WINDOWS_VERSION WindowsVista
21
- #else /* __GNUC__ */
22
- # define MINIMUM_WINDOWS_VERSION 0x0600 /* Vista */
23
- #endif /* __GNUC__ */
19
+ #include <w32api.h>
20
+ #define MINIMUM_WINDOWS_VERSION WindowsVista
21
+ #else /* __GNUC__ */
22
+ #define MINIMUM_WINDOWS_VERSION 0x0600 /* Vista */
23
+ #endif /* __GNUC__ */
24
24
 
25
25
  #ifdef _WIN32_WINNT
26
- # undef _WIN32_WINNT
26
+ #undef _WIN32_WINNT
27
27
  #endif /* WIN32_WINNT */
28
28
  #define _WIN32_WINNT MINIMUM_WINDOWS_VERSION
29
29
 
30
- #define CERT_THUMBPRINT_STR_LENGTH 40
31
30
  #define CERT_THUMBPRINT_SIZE (160 / 8)
32
31
 
33
32
  #include <wincrypt.h>
@@ -36,12 +35,12 @@ VALUE rb_mCertstore;
36
35
  VALUE rb_cCertLoader;
37
36
  VALUE rb_eCertLoaderError;
38
37
 
39
- struct CertstoreLoader {
38
+ struct CertstoreLoader
39
+ {
40
40
  HCERTSTORE hStore;
41
41
  };
42
42
 
43
- TCHAR* handle_error_code(VALUE self, DWORD errCode);
44
- char* wstr_to_mbstr(UINT cp, const WCHAR *wstr, int clen);
43
+ void handle_error_code(VALUE self, DWORD errCode);
45
44
  void Init_certstore_loader(VALUE rb_mCertstore);
46
45
 
47
46
  #endif // _WINEVT_H
@@ -11,35 +11,22 @@
11
11
 
12
12
  #include <certstore.h>
13
13
 
14
- char*
15
- wstr_to_mbstr(UINT cp, const WCHAR *wstr, int clen)
16
- {
17
- char *ptr;
18
- int len = WideCharToMultiByte(cp, 0, wstr, clen, NULL, 0, NULL, NULL);
19
- if (!(ptr = xmalloc(len))) return NULL;
20
- WideCharToMultiByte(cp, 0, wstr, clen, ptr, len, NULL, NULL);
21
-
22
- return ptr;
23
- }
24
-
25
- TCHAR*
14
+ void
26
15
  handle_error_code(VALUE self, DWORD errCode)
27
16
  {
28
17
  DWORD ret;
29
- static TCHAR buffer[1024];
18
+ CHAR buffer[1024];
30
19
 
31
- ret = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,
32
- NULL,
33
- errCode,
34
- MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US),
35
- buffer,
36
- sizeof(buffer)/sizeof(buffer[0]),
37
- NULL);
20
+ ret = FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM,
21
+ NULL,
22
+ errCode,
23
+ MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US),
24
+ buffer,
25
+ sizeof(buffer) / sizeof(buffer[0]),
26
+ NULL);
38
27
 
39
28
  if (ret) {
40
29
  rb_ivar_set(self, rb_intern("@error_code"), INT2NUM(errCode));
41
30
  rb_ivar_set(self, rb_intern("@error_message"), rb_utf8_str_new_cstr(buffer));
42
31
  }
43
-
44
- return buffer;
45
32
  }
@@ -10,21 +10,25 @@
10
10
  /* limitations under the License. */
11
11
 
12
12
  #include <certstore.h>
13
- #include <tchar.h>
14
13
 
15
- static void certstore_loader_free(void *certstore);
14
+ static void certstore_loader_free(void* certstore);
16
15
 
17
16
  static const rb_data_type_t rb_win_certstore_loader_type = {
18
- "winevt/certstore_loader", {
19
- 0, certstore_loader_free, 0,
20
- }, NULL, NULL,
17
+ "winevt/certstore_loader",
18
+ {
19
+ 0,
20
+ certstore_loader_free,
21
+ 0,
22
+ },
23
+ NULL,
24
+ NULL,
21
25
  RUBY_TYPED_FREE_IMMEDIATELY
22
26
  };
23
27
 
24
28
  static void
25
- certstore_loader_free(void *ptr)
29
+ certstore_loader_free(void* ptr)
26
30
  {
27
- struct CertstoreLoader *loader = (struct CertstoreLoader *)ptr;
31
+ struct CertstoreLoader* loader = (struct CertstoreLoader*)ptr;
28
32
  if (loader->hStore)
29
33
  CertCloseStore(loader->hStore, 0);
30
34
 
@@ -35,11 +39,9 @@ static VALUE
35
39
  rb_win_certstore_loader_alloc(VALUE klass)
36
40
  {
37
41
  VALUE obj;
38
- struct CertstoreLoader *loader;
39
- obj = TypedData_Make_Struct(klass,
40
- struct CertstoreLoader,
41
- &rb_win_certstore_loader_type,
42
- loader);
42
+ struct CertstoreLoader* loader;
43
+ obj = TypedData_Make_Struct(
44
+ klass, struct CertstoreLoader, &rb_win_certstore_loader_type, loader);
43
45
  return obj;
44
46
  }
45
47
 
@@ -47,55 +49,62 @@ static VALUE
47
49
  rb_win_certstore_loader_initialize(VALUE self, VALUE store_name, VALUE use_enterprise)
48
50
  {
49
51
  VALUE vStoreName;
50
- struct CertstoreLoader *loader;
52
+ struct CertstoreLoader* loader;
51
53
  DWORD len;
52
54
  DWORD errCode;
53
- TCHAR buffer[1024];
54
- TCHAR errBuffer[1132];
55
+ CHAR buffer[1024];
55
56
  DWORD ret;
56
57
 
57
58
  Check_Type(store_name, T_STRING);
58
59
 
59
60
  // store_name : To wide char
60
- len = MultiByteToWideChar(CP_UTF8, 0, RSTRING_PTR(store_name), RSTRING_LEN(store_name), NULL, 0);
61
- PWSTR winStoreName = ALLOCV_N(WCHAR, vStoreName, len+1);
62
- MultiByteToWideChar(CP_UTF8, 0, RSTRING_PTR(store_name), RSTRING_LEN(store_name), winStoreName, len);
61
+ len = MultiByteToWideChar(
62
+ CP_UTF8, 0, RSTRING_PTR(store_name), RSTRING_LEN(store_name), NULL, 0);
63
+ PWSTR winStoreName = ALLOCV_N(WCHAR, vStoreName, len + 1);
64
+ MultiByteToWideChar(
65
+ CP_UTF8, 0, RSTRING_PTR(store_name), RSTRING_LEN(store_name), winStoreName, len);
63
66
  winStoreName[len] = L'\0';
64
67
 
65
- TypedData_Get_Struct(self, struct CertstoreLoader, &rb_win_certstore_loader_type, loader);
68
+ TypedData_Get_Struct(
69
+ self, struct CertstoreLoader, &rb_win_certstore_loader_type, loader);
66
70
 
67
71
  if (RTEST(use_enterprise)) {
68
- loader->hStore = CertOpenStore(CERT_STORE_PROV_SYSTEM, 0, 0, CERT_SYSTEM_STORE_LOCAL_MACHINE_ENTERPRISE, winStoreName);
72
+ loader->hStore = CertOpenStore(CERT_STORE_PROV_SYSTEM,
73
+ 0,
74
+ 0,
75
+ CERT_SYSTEM_STORE_LOCAL_MACHINE_ENTERPRISE,
76
+ winStoreName);
69
77
  } else {
70
- loader->hStore = CertOpenStore(CERT_STORE_PROV_SYSTEM, 0, 0, CERT_SYSTEM_STORE_LOCAL_MACHINE, winStoreName);
78
+ loader->hStore = CertOpenStore(
79
+ CERT_STORE_PROV_SYSTEM, 0, 0, CERT_SYSTEM_STORE_LOCAL_MACHINE, winStoreName);
71
80
  }
81
+ ALLOCV_END(vStoreName);
82
+
72
83
  errCode = GetLastError();
73
84
  switch (errCode) {
74
- case ERROR_SUCCESS:
75
- break;
76
- case ERROR_ACCESS_DENIED: {
77
- ALLOCV_END(vStoreName);
78
- ret = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,
79
- NULL,
80
- errCode,
81
- MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US),
82
- buffer,
83
- sizeof(buffer)/sizeof(buffer[0]),
84
- NULL);
85
- if (ret) {
86
- _snprintf_s(errBuffer, 1024, _TRUNCATE,
87
- "cannot access specified logical store. Perhaps you should do as an administrator. ErrorCode: %d, Message: %s",
88
- errCode,
89
- buffer);
90
- rb_raise(rb_eCertLoaderError, errBuffer);
85
+ case ERROR_SUCCESS:
86
+ break;
87
+ case ERROR_ACCESS_DENIED: {
88
+ ret = FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM,
89
+ NULL,
90
+ errCode,
91
+ MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US),
92
+ buffer,
93
+ sizeof(buffer) / sizeof(buffer[0]),
94
+ NULL);
95
+ if (!ret)
96
+ buffer[0] = '\0';
97
+
98
+ rb_raise(rb_eCertLoaderError,
99
+ "cannot access specified logical store. Perhaps you should do as an "
100
+ "administrator. ErrorCode: %lu, Message: %s",
101
+ errCode,
102
+ buffer);
103
+ }
104
+ default: {
105
+ handle_error_code(self, errCode);
91
106
  }
92
107
  }
93
- default: {
94
- handle_error_code(self, errCode);
95
- }
96
-
97
- }
98
- ALLOCV_END(vStoreName);
99
108
 
100
109
  return Qnil;
101
110
  }
@@ -103,53 +112,66 @@ rb_win_certstore_loader_initialize(VALUE self, VALUE store_name, VALUE use_enter
103
112
  static VALUE
104
113
  certificate_context_to_string(PCCERT_CONTEXT pContext)
105
114
  {
106
- WCHAR *wszString;
115
+ VALUE vWszString;
116
+ WCHAR* wszString;
107
117
  DWORD cchString;
108
- CHAR *utf8str;
109
- CHAR *certificate;
110
- CHAR *certHeader = "-----BEGIN CERTIFICATE-----\n";
111
- CHAR *certFooter = "\n-----END CERTIFICATE-----";
118
+ VALUE vUtf8str;
119
+ CHAR* utf8str;
120
+ VALUE vCertificate;
121
+ CHAR* certificate;
122
+ CHAR* certHeader = "-----BEGIN CERTIFICATE-----\n";
123
+ CHAR* certFooter = "\n-----END CERTIFICATE-----";
112
124
  CHAR errBuf[256];
113
125
  DWORD errCode;
126
+ DWORD len = 0;
114
127
 
115
128
  #ifndef CRYPT_STRING_NOCRLF
116
- #define CRYPT_STRING_NOCRLF 0x40000000
129
+ #define CRYPT_STRING_NOCRLF 0x40000000
117
130
  #endif
118
131
 
119
- if (!CryptBinaryToStringW(pContext->pbCertEncoded, pContext->cbCertEncoded,
132
+ if (!CryptBinaryToStringW(pContext->pbCertEncoded,
133
+ pContext->cbCertEncoded,
120
134
  CRYPT_STRING_BASE64 | CRYPT_STRING_NOCRLF,
121
- NULL, &cchString)) {
135
+ NULL,
136
+ &cchString)) {
122
137
  rb_raise(rb_eCertLoaderError, "cannot obtain certificate string length.");
123
138
  }
124
139
 
125
- wszString = malloc(sizeof(WCHAR) * cchString);
126
- CryptBinaryToStringW(pContext->pbCertEncoded, pContext->cbCertEncoded,
140
+ wszString = ALLOCV_N(WCHAR, vWszString, cchString);
141
+ CryptBinaryToStringW(pContext->pbCertEncoded,
142
+ pContext->cbCertEncoded,
127
143
  CRYPT_STRING_BASE64 | CRYPT_STRING_NOCRLF,
128
- wszString, &cchString);
129
-
130
- utf8str = wstr_to_mbstr(CP_UTF8, wszString, -1);
131
- // malloc sizeof CHAR * ((base64 cert content + header + footer) length).
132
- certificate = malloc(sizeof(CHAR) * (strlen(utf8str) + strlen(certHeader) + strlen(certFooter)));
133
- sprintf(certificate, "%s%s%s", certHeader, utf8str, certFooter);
144
+ wszString,
145
+ &cchString);
146
+
147
+ len = WideCharToMultiByte(CP_UTF8, 0, wszString, -1, NULL, 0, NULL, NULL);
148
+ utf8str = ALLOCV_N(CHAR, vUtf8str, len);
149
+ len = WideCharToMultiByte(CP_UTF8, 0, wszString, -1, NULL, 0, NULL, NULL);
150
+ WideCharToMultiByte(CP_UTF8, 0, wszString, -1, utf8str, len, NULL, NULL);
151
+ // malloc ((strlen(base64 cert content) + strlen(header) +
152
+ // strlen(footer) + 1(null terminator)) length).
153
+ len = strlen(utf8str) + strlen(certHeader) + strlen(certFooter);
154
+ certificate = ALLOCV_N(CHAR, vCertificate, len + 1);
155
+ _snprintf_s(certificate, len + 1, len, "%s%s%s", certHeader, utf8str, certFooter);
134
156
 
135
157
  errCode = GetLastError();
136
158
  if (ERROR_SUCCESS != errCode && CRYPT_E_NOT_FOUND != errCode) {
137
- _snprintf_s(errBuf, 256, _TRUNCATE, "ErrorCode(%d)", errCode);
159
+ _snprintf_s(errBuf, sizeof(errBuf), _TRUNCATE, "ErrorCode(%d)", errCode);
138
160
 
139
161
  goto error;
140
162
  }
141
163
 
142
164
  VALUE rb_pem = rb_utf8_str_new_cstr(certificate);
143
- xfree(utf8str);
144
- free(wszString);
145
- free(certificate);
165
+ ALLOCV_END(vUtf8str);
166
+ ALLOCV_END(vWszString);
167
+ ALLOCV_END(vCertificate);
146
168
 
147
169
  return rb_pem;
148
170
 
149
171
  error:
150
- xfree(utf8str);
151
- free(wszString);
152
- free(certificate);
172
+ ALLOCV_END(vUtf8str);
173
+ ALLOCV_END(vWszString);
174
+ ALLOCV_END(vCertificate);
153
175
 
154
176
  rb_raise(rb_eCertLoaderError, errBuf);
155
177
  }
@@ -158,28 +180,28 @@ static VALUE
158
180
  rb_win_certstore_loader_each_pem(VALUE self)
159
181
  {
160
182
  PCCERT_CONTEXT pContext = NULL;
161
- struct CertstoreLoader *loader;
183
+ struct CertstoreLoader* loader;
162
184
 
163
185
  RETURN_ENUMERATOR(self, 0, 0);
164
186
 
165
- TypedData_Get_Struct(self, struct CertstoreLoader, &rb_win_certstore_loader_type, loader);
187
+ TypedData_Get_Struct(
188
+ self, struct CertstoreLoader, &rb_win_certstore_loader_type, loader);
166
189
 
167
190
  while ((pContext = CertEnumCertificatesInStore(loader->hStore, pContext)) != NULL) {
168
191
  VALUE rb_certificate = certificate_context_to_string(pContext);
169
192
  rb_yield(rb_certificate);
170
193
  }
171
194
 
172
- CertFreeCertificateContext(pContext);
173
-
174
195
  return Qnil;
175
196
  }
176
197
 
177
198
  static VALUE
178
199
  rb_win_certstore_loader_dispose(VALUE self)
179
200
  {
180
- struct CertstoreLoader *loader;
201
+ struct CertstoreLoader* loader;
181
202
 
182
- TypedData_Get_Struct(self, struct CertstoreLoader, &rb_win_certstore_loader_type, loader);
203
+ TypedData_Get_Struct(
204
+ self, struct CertstoreLoader, &rb_win_certstore_loader_type, loader);
183
205
 
184
206
  /* What should we dispose here? */
185
207
 
@@ -190,13 +212,15 @@ static VALUE
190
212
  rb_win_certstore_loader_each(VALUE self)
191
213
  {
192
214
  PCCERT_CONTEXT pContext = NULL;
193
- struct CertstoreLoader *loader;
215
+ struct CertstoreLoader* loader;
194
216
 
195
217
  RETURN_ENUMERATOR(self, 0, 0);
196
218
 
197
- TypedData_Get_Struct(self, struct CertstoreLoader, &rb_win_certstore_loader_type, loader);
219
+ TypedData_Get_Struct(
220
+ self, struct CertstoreLoader, &rb_win_certstore_loader_type, loader);
198
221
 
199
- rb_ensure(rb_win_certstore_loader_each_pem, self, rb_win_certstore_loader_dispose, self);
222
+ rb_ensure(
223
+ rb_win_certstore_loader_each_pem, self, rb_win_certstore_loader_dispose, self);
200
224
 
201
225
  return Qnil;
202
226
  }
@@ -206,87 +230,88 @@ rb_win_certstore_loader_find_certificate(VALUE self, VALUE rb_thumbprint)
206
230
  {
207
231
  VALUE vThumbprint;
208
232
  PCCERT_CONTEXT pContext = NULL;
209
- struct CertstoreLoader *loader;
233
+ struct CertstoreLoader* loader;
210
234
  DWORD len;
211
- CHAR errBuf[256];
212
235
 
213
236
  Check_Type(rb_thumbprint, T_STRING);
214
237
 
215
- TypedData_Get_Struct(self, struct CertstoreLoader, &rb_win_certstore_loader_type, loader);
238
+ TypedData_Get_Struct(
239
+ self, struct CertstoreLoader, &rb_win_certstore_loader_type, loader);
216
240
 
217
241
  // thumbprint : To wide char
218
- len = MultiByteToWideChar(CP_UTF8, 0, RSTRING_PTR(rb_thumbprint), RSTRING_LEN(rb_thumbprint), NULL, 0);
219
- WCHAR *winThumbprint = ALLOCV_N(WCHAR, vThumbprint, len+1);
220
- MultiByteToWideChar(CP_UTF8, 0, RSTRING_PTR(rb_thumbprint), RSTRING_LEN(rb_thumbprint), winThumbprint, len);
242
+ len = MultiByteToWideChar(
243
+ CP_UTF8, 0, RSTRING_PTR(rb_thumbprint), RSTRING_LEN(rb_thumbprint), NULL, 0);
244
+ WCHAR* winThumbprint = ALLOCV_N(WCHAR, vThumbprint, len + 1);
245
+ MultiByteToWideChar(CP_UTF8,
246
+ 0,
247
+ RSTRING_PTR(rb_thumbprint),
248
+ RSTRING_LEN(rb_thumbprint),
249
+ winThumbprint,
250
+ len);
221
251
  winThumbprint[len] = L'\0';
222
252
 
223
253
  BYTE pbThumb[CERT_THUMBPRINT_SIZE];
224
254
  CRYPT_HASH_BLOB blob;
225
255
  blob.cbData = CERT_THUMBPRINT_SIZE;
226
256
  blob.pbData = pbThumb;
227
- CryptStringToBinaryW(winThumbprint, CERT_THUMBPRINT_STR_LENGTH, CRYPT_STRING_HEX, pbThumb,
228
- &blob.cbData, NULL, NULL);
229
-
230
- pContext = CertFindCertificateInStore(
231
- loader->hStore,
232
- X509_ASN_ENCODING | PKCS_7_ASN_ENCODING,
233
- 0,
234
- CERT_FIND_HASH,
235
- &blob,
236
- pContext);
237
-
238
- if (!pContext)
239
- goto error;
257
+ CryptStringToBinaryW(winThumbprint,
258
+ 0,
259
+ CRYPT_STRING_HEX,
260
+ pbThumb,
261
+ &blob.cbData,
262
+ NULL,
263
+ NULL);
264
+
265
+ pContext = CertFindCertificateInStore(loader->hStore,
266
+ X509_ASN_ENCODING | PKCS_7_ASN_ENCODING,
267
+ 0,
268
+ CERT_FIND_HASH,
269
+ &blob,
270
+ pContext);
271
+
272
+ if (!pContext) {
273
+ rb_raise(
274
+ rb_eCertLoaderError, "Cannot find certificates with thumbprint(%S)", winThumbprint);
275
+ }
240
276
 
241
277
  VALUE rb_certificate = certificate_context_to_string(pContext);
242
278
  CertFreeCertificateContext(pContext);
243
279
  ALLOCV_END(vThumbprint);
244
280
 
245
281
  return rb_certificate;
246
-
247
- error:
248
-
249
- CertFreeCertificateContext(pContext);
250
-
251
- _snprintf_s(errBuf, 256, _TRUNCATE, "Cannot find certificates with thumbprint(%S)", winThumbprint);
252
- rb_raise(rb_eCertLoaderError, errBuf);
253
282
  }
254
283
 
255
284
  static VALUE
256
285
  rb_win_certstore_loader_add_certificate(VALUE self, VALUE rb_der_cert_bin_str)
257
286
  {
258
- struct CertstoreLoader *loader;
259
- CHAR errBuf[256];
287
+ struct CertstoreLoader* loader;
260
288
 
261
289
  Check_Type(rb_der_cert_bin_str, T_STRING);
262
290
 
263
- TypedData_Get_Struct(self, struct CertstoreLoader, &rb_win_certstore_loader_type, loader);
291
+ TypedData_Get_Struct(
292
+ self, struct CertstoreLoader, &rb_win_certstore_loader_type, loader);
264
293
 
265
- if (CertAddEncodedCertificateToStore(loader->hStore, X509_ASN_ENCODING,
266
- RSTRING_PTR(rb_der_cert_bin_str), RSTRING_LEN(rb_der_cert_bin_str),
294
+ if (CertAddEncodedCertificateToStore(loader->hStore,
295
+ X509_ASN_ENCODING,
296
+ RSTRING_PTR(rb_der_cert_bin_str),
297
+ RSTRING_LEN(rb_der_cert_bin_str),
267
298
  CERT_STORE_ADD_NEW,
268
299
  NULL)) {
269
300
  return Qtrue;
270
301
  } else {
271
302
  DWORD errCode = GetLastError();
272
303
 
273
- switch (errCode){
274
- case CRYPT_E_EXISTS:
275
- handle_error_code(self, errCode);
276
- return Qfalse;
277
- default: {
278
- _snprintf_s(errBuf, 256, _TRUNCATE, "Cannot add certificates. ErrorCode: %d", errCode);
279
- goto error;
280
-
304
+ switch (errCode) {
305
+ case CRYPT_E_EXISTS:
306
+ handle_error_code(self, errCode);
307
+ return Qfalse;
308
+ default: {
309
+ rb_raise(rb_eCertLoaderError, "Cannot add certificates. ErrorCode: %lu", errCode);
281
310
  }
282
311
  }
283
312
  }
284
313
 
285
314
  return Qtrue;
286
-
287
- error:
288
-
289
- rb_raise(rb_eCertLoaderError, errBuf);
290
315
  }
291
316
 
292
317
  static VALUE
@@ -294,37 +319,49 @@ rb_win_certstore_loader_delete_certificate(VALUE self, VALUE rb_thumbprint)
294
319
  {
295
320
  VALUE vThumbprint;
296
321
  PCCERT_CONTEXT pContext = NULL;
297
- struct CertstoreLoader *loader;
322
+ struct CertstoreLoader* loader;
298
323
  DWORD len;
299
- CHAR errBuf[256];
300
324
 
301
325
  Check_Type(rb_thumbprint, T_STRING);
302
326
 
303
- TypedData_Get_Struct(self, struct CertstoreLoader, &rb_win_certstore_loader_type, loader);
327
+ TypedData_Get_Struct(
328
+ self, struct CertstoreLoader, &rb_win_certstore_loader_type, loader);
304
329
 
305
330
  // thumbprint : To wide char
306
- len = MultiByteToWideChar(CP_UTF8, 0, RSTRING_PTR(rb_thumbprint), RSTRING_LEN(rb_thumbprint), NULL, 0);
307
- WCHAR *winThumbprint = ALLOCV_N(WCHAR, vThumbprint, len+1);
308
- MultiByteToWideChar(CP_UTF8, 0, RSTRING_PTR(rb_thumbprint), RSTRING_LEN(rb_thumbprint), winThumbprint, len);
331
+ len = MultiByteToWideChar(
332
+ CP_UTF8, 0, RSTRING_PTR(rb_thumbprint), RSTRING_LEN(rb_thumbprint), NULL, 0);
333
+ WCHAR* winThumbprint = ALLOCV_N(WCHAR, vThumbprint, len + 1);
334
+ MultiByteToWideChar(CP_UTF8,
335
+ 0,
336
+ RSTRING_PTR(rb_thumbprint),
337
+ RSTRING_LEN(rb_thumbprint),
338
+ winThumbprint,
339
+ len);
309
340
  winThumbprint[len] = L'\0';
310
341
 
311
342
  BYTE pbThumb[CERT_THUMBPRINT_SIZE];
312
343
  CRYPT_HASH_BLOB blob;
313
344
  blob.cbData = CERT_THUMBPRINT_SIZE;
314
345
  blob.pbData = pbThumb;
315
- CryptStringToBinaryW(winThumbprint, CERT_THUMBPRINT_STR_LENGTH, CRYPT_STRING_HEX, pbThumb,
316
- &blob.cbData, NULL, NULL);
317
-
318
- pContext = CertFindCertificateInStore(
319
- loader->hStore,
320
- X509_ASN_ENCODING | PKCS_7_ASN_ENCODING,
321
- 0,
322
- CERT_FIND_HASH,
323
- &blob,
324
- pContext);
325
-
326
- if (!pContext)
327
- goto error;
346
+ CryptStringToBinaryW(winThumbprint,
347
+ 0,
348
+ CRYPT_STRING_HEX,
349
+ pbThumb,
350
+ &blob.cbData,
351
+ NULL,
352
+ NULL);
353
+
354
+ pContext = CertFindCertificateInStore(loader->hStore,
355
+ X509_ASN_ENCODING | PKCS_7_ASN_ENCODING,
356
+ 0,
357
+ CERT_FIND_HASH,
358
+ &blob,
359
+ pContext);
360
+
361
+ if (!pContext) {
362
+ rb_raise(
363
+ rb_eCertLoaderError, "Cannot find certificates with thumbprint(%S)", winThumbprint);
364
+ }
328
365
 
329
366
  BOOL result = CertDeleteCertificateFromStore(pContext);
330
367
  CertFreeCertificateContext(pContext);
@@ -334,13 +371,6 @@ rb_win_certstore_loader_delete_certificate(VALUE self, VALUE rb_thumbprint)
334
371
  return Qtrue;
335
372
  else
336
373
  return Qfalse;
337
-
338
- error:
339
-
340
- CertFreeCertificateContext(pContext);
341
-
342
- _snprintf_s(errBuf, 256, _TRUNCATE, "Cannot find certificates with thumbprint(%S)", winThumbprint);
343
- rb_raise(rb_eCertLoaderError, errBuf);
344
374
  }
345
375
 
346
376
  static VALUE
@@ -348,42 +378,59 @@ rb_win_certstore_loader_export_pfx(VALUE self, VALUE rb_thumbprint, VALUE rb_pas
348
378
  {
349
379
  VALUE vThumbprint;
350
380
  PCCERT_CONTEXT pContext = NULL;
351
- struct CertstoreLoader *loader;
381
+ struct CertstoreLoader* loader;
352
382
  DWORD len;
353
383
  CHAR errBuf[256];
354
384
  HCERTSTORE hMemoryStore = NULL;
355
385
  VALUE vPassword;
356
386
  CRYPT_DATA_BLOB pfxPacket;
357
387
 
358
- TypedData_Get_Struct(self, struct CertstoreLoader, &rb_win_certstore_loader_type, loader);
388
+ TypedData_Get_Struct(
389
+ self, struct CertstoreLoader, &rb_win_certstore_loader_type, loader);
359
390
 
360
391
  // thumbprint : To wide char
361
- len = MultiByteToWideChar(CP_UTF8, 0, RSTRING_PTR(rb_thumbprint), RSTRING_LEN(rb_thumbprint), NULL, 0);
362
- WCHAR *winThumbprint = ALLOCV_N(WCHAR, vThumbprint, len+1);
363
- MultiByteToWideChar(CP_UTF8, 0, RSTRING_PTR(rb_thumbprint), RSTRING_LEN(rb_thumbprint), winThumbprint, len);
392
+ len = MultiByteToWideChar(
393
+ CP_UTF8, 0, RSTRING_PTR(rb_thumbprint), RSTRING_LEN(rb_thumbprint), NULL, 0);
394
+ WCHAR* winThumbprint = ALLOCV_N(WCHAR, vThumbprint, len + 1);
395
+ MultiByteToWideChar(CP_UTF8,
396
+ 0,
397
+ RSTRING_PTR(rb_thumbprint),
398
+ RSTRING_LEN(rb_thumbprint),
399
+ winThumbprint,
400
+ len);
364
401
  winThumbprint[len] = L'\0';
365
402
  // password : To wide char
366
- len = MultiByteToWideChar(CP_UTF8, 0, RSTRING_PTR(rb_password), RSTRING_LEN(rb_password), NULL, 0);
367
- WCHAR *winPassword = ALLOCV_N(WCHAR, vPassword, len+1);
368
- MultiByteToWideChar(CP_UTF8, 0, RSTRING_PTR(rb_password), RSTRING_LEN(rb_password), winPassword, len);
403
+ len = MultiByteToWideChar(
404
+ CP_UTF8, 0, RSTRING_PTR(rb_password), RSTRING_LEN(rb_password), NULL, 0);
405
+ WCHAR* winPassword = ALLOCV_N(WCHAR, vPassword, len + 1);
406
+ MultiByteToWideChar(
407
+ CP_UTF8, 0, RSTRING_PTR(rb_password), RSTRING_LEN(rb_password), winPassword, len);
369
408
  winPassword[len] = L'\0';
370
409
 
371
410
  BYTE pbThumb[CERT_THUMBPRINT_SIZE];
372
411
  CRYPT_HASH_BLOB blob;
373
412
  blob.cbData = CERT_THUMBPRINT_SIZE;
374
413
  blob.pbData = pbThumb;
375
- CryptStringToBinaryW(winThumbprint, CERT_THUMBPRINT_STR_LENGTH, CRYPT_STRING_HEX, pbThumb,
376
- &blob.cbData, NULL, NULL);
377
-
378
- pContext = CertFindCertificateInStore(
379
- loader->hStore,
380
- X509_ASN_ENCODING | PKCS_7_ASN_ENCODING,
381
- 0,
382
- CERT_FIND_HASH,
383
- &blob,
384
- pContext);
414
+ CryptStringToBinaryW(winThumbprint,
415
+ 0,
416
+ CRYPT_STRING_HEX,
417
+ pbThumb,
418
+ &blob.cbData,
419
+ NULL,
420
+ NULL);
421
+
422
+ pContext = CertFindCertificateInStore(loader->hStore,
423
+ X509_ASN_ENCODING | PKCS_7_ASN_ENCODING,
424
+ 0,
425
+ CERT_FIND_HASH,
426
+ &blob,
427
+ pContext);
385
428
  if (!pContext) {
386
- _snprintf_s(errBuf, 256, _TRUNCATE, "Cannot find certificates with thumbprint(%S)", winThumbprint);
429
+ _snprintf_s(errBuf,
430
+ sizeof(errBuf),
431
+ _TRUNCATE,
432
+ "Cannot find certificates with thumbprint(%S)",
433
+ winThumbprint);
387
434
 
388
435
  goto error;
389
436
  }
@@ -392,15 +439,33 @@ rb_win_certstore_loader_export_pfx(VALUE self, VALUE rb_thumbprint, VALUE rb_pas
392
439
  CertAddCertificateContextToStore(hMemoryStore, pContext, CERT_STORE_ADD_ALWAYS, NULL);
393
440
 
394
441
  pfxPacket.pbData = NULL;
395
- if (!PFXExportCertStoreEx(hMemoryStore, &pfxPacket, winPassword, NULL, EXPORT_PRIVATE_KEYS | REPORT_NO_PRIVATE_KEY | REPORT_NOT_ABLE_TO_EXPORT_PRIVATE_KEY)) {
396
- _snprintf_s(errBuf, 256, _TRUNCATE, "Cannot export pfx certificate with thumbprint(%S)", winThumbprint);
442
+ if (!PFXExportCertStoreEx(hMemoryStore,
443
+ &pfxPacket,
444
+ winPassword,
445
+ NULL,
446
+ EXPORT_PRIVATE_KEYS | REPORT_NO_PRIVATE_KEY |
447
+ REPORT_NOT_ABLE_TO_EXPORT_PRIVATE_KEY)) {
448
+ _snprintf_s(errBuf,
449
+ sizeof(errBuf),
450
+ _TRUNCATE,
451
+ "Cannot export pfx certificate with thumbprint(%S)",
452
+ winThumbprint);
397
453
 
398
454
  goto error;
399
455
  }
400
456
 
401
457
  pfxPacket.pbData = (LPBYTE)CryptMemAlloc(pfxPacket.cbData);
402
- if (!PFXExportCertStoreEx(hMemoryStore, &pfxPacket, winPassword, NULL, EXPORT_PRIVATE_KEYS | REPORT_NO_PRIVATE_KEY | REPORT_NOT_ABLE_TO_EXPORT_PRIVATE_KEY)) {
403
- _snprintf_s(errBuf, 256, _TRUNCATE, "Cannot export pfx certificate with thumbprint(%S)", winThumbprint);
458
+ if (!PFXExportCertStoreEx(hMemoryStore,
459
+ &pfxPacket,
460
+ winPassword,
461
+ NULL,
462
+ EXPORT_PRIVATE_KEYS | REPORT_NO_PRIVATE_KEY |
463
+ REPORT_NOT_ABLE_TO_EXPORT_PRIVATE_KEY)) {
464
+ _snprintf_s(errBuf,
465
+ sizeof(errBuf),
466
+ _TRUNCATE,
467
+ "Cannot export pfx certificate with thumbprint(%S)",
468
+ winThumbprint);
404
469
 
405
470
  CryptMemFree(pfxPacket.pbData);
406
471
 
@@ -433,14 +498,18 @@ void
433
498
  Init_certstore_loader(VALUE rb_mCertstore)
434
499
  {
435
500
  rb_cCertLoader = rb_define_class_under(rb_mCertstore, "Loader", rb_cObject);
436
- rb_eCertLoaderError = rb_define_class_under(rb_cCertLoader, "LoaderError", rb_eStandardError);
501
+ rb_eCertLoaderError =
502
+ rb_define_class_under(rb_cCertLoader, "LoaderError", rb_eStandardError);
437
503
 
438
504
  rb_define_alloc_func(rb_cCertLoader, rb_win_certstore_loader_alloc);
439
505
  rb_define_method(rb_cCertLoader, "initialize", rb_win_certstore_loader_initialize, 2);
440
506
  rb_define_method(rb_cCertLoader, "each", rb_win_certstore_loader_each, 0);
441
- rb_define_method(rb_cCertLoader, "find_cert", rb_win_certstore_loader_find_certificate, 1);
442
- rb_define_method(rb_cCertLoader, "delete_cert", rb_win_certstore_loader_delete_certificate, 1);
443
- rb_define_method(rb_cCertLoader, "add_cert", rb_win_certstore_loader_add_certificate, 1);
507
+ rb_define_method(
508
+ rb_cCertLoader, "find_cert", rb_win_certstore_loader_find_certificate, 1);
509
+ rb_define_method(
510
+ rb_cCertLoader, "delete_cert", rb_win_certstore_loader_delete_certificate, 1);
511
+ rb_define_method(
512
+ rb_cCertLoader, "add_cert", rb_win_certstore_loader_add_certificate, 1);
444
513
  rb_define_method(rb_cCertLoader, "export_pfx", rb_win_certstore_loader_export_pfx, 2);
445
514
 
446
515
  rb_ivar_set(rb_cCertLoader, rb_intern("@error_code"), INT2NUM(0));
@@ -15,5 +15,5 @@
15
15
  #
16
16
 
17
17
  module Certstore
18
- VERSION = "0.1.4"
18
+ VERSION = "0.1.5"
19
19
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: certstore_c
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Hiroshi Hatake
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-09-16 00:00:00.000000000 Z
11
+ date: 2019-09-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -94,6 +94,7 @@ extensions:
94
94
  - ext/certstore/extconf.rb
95
95
  extra_rdoc_files: []
96
96
  files:
97
+ - ".clang-format"
97
98
  - ".gitignore"
98
99
  - Gemfile
99
100
  - LICENSE.txt
@@ -114,13 +115,13 @@ files:
114
115
  - lib/certstore/loader.rb
115
116
  - lib/certstore/openssl/loader.rb
116
117
  - lib/certstore/version.rb
117
- homepage: https://github.com/cosmo0920/certstore_c
118
+ homepage: https://github.com/fluent-plugins-nursery/certstore_c
118
119
  licenses:
119
120
  - Apache-2.0
120
121
  metadata:
121
122
  allowed_push_host: https://rubygems.org
122
- homepage_uri: https://github.com/cosmo0920/certstore_c
123
- source_code_uri: https://github.com/cosmo0920/certstore_c
123
+ homepage_uri: https://github.com/fluent-plugins-nursery/certstore_c
124
+ source_code_uri: https://github.com/fluent-plugins-nursery/certstore_c
124
125
  post_install_message:
125
126
  rdoc_options: []
126
127
  require_paths: