certstore_c 0.1.2 → 0.1.3
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 +4 -4
- data/certstore_c.gemspec +1 -1
- data/ext/certstore/loader.c +92 -0
- data/lib/certstore/openssl/loader.rb +12 -0
- data/lib/certstore/version.rb +1 -1
- metadata +4 -4
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 32b40c0e8ae962aa68d6c2fd6cb86df0ec314e21d40bdee26de0a3f06c46a42b
|
|
4
|
+
data.tar.gz: 1c03f74ab3269365b93b144065e08cb50fbf48ca23d07996a818583da550e100
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: e958c5a56fa98ccf15d27ea2f3b07c853351d0e2639eb0bd19ce0e7746c1bb22041279f2e49f562c6471f4f7c5603c0a6ab39b348250394221e5f8164077868c
|
|
7
|
+
data.tar.gz: e11e7dca9a24157ef53a28d3b49ded628e3514ac58f166737731fc7ef3a80dbb9d0117ba1b9e7352b7ff118a2a9110cb606de32f26564babc45c5de629d6175a
|
data/certstore_c.gemspec
CHANGED
|
@@ -9,7 +9,7 @@ Gem::Specification.new do |spec|
|
|
|
9
9
|
spec.authors = ["Hiroshi Hatake"]
|
|
10
10
|
spec.email = ["cosmo0920.wp@gmail.com"]
|
|
11
11
|
|
|
12
|
-
spec.summary = %q{Windows CertStore loader.}
|
|
12
|
+
spec.summary = %q{Windows CertStore loader and ruby-openssl extension for TLS connection.}
|
|
13
13
|
spec.description = spec.summary
|
|
14
14
|
spec.homepage = "https://github.com/cosmo0920/certstore_c"
|
|
15
15
|
|
data/ext/certstore/loader.c
CHANGED
|
@@ -220,6 +220,96 @@ error:
|
|
|
220
220
|
rb_raise(rb_eCertLoaderError, errBuf);
|
|
221
221
|
}
|
|
222
222
|
|
|
223
|
+
static VALUE
|
|
224
|
+
rb_win_certstore_loader_add_certificate(VALUE self, VALUE rb_der_cert_bin_str)
|
|
225
|
+
{
|
|
226
|
+
struct CertstoreLoader *loader;
|
|
227
|
+
CHAR errBuf[256];
|
|
228
|
+
|
|
229
|
+
Check_Type(rb_der_cert_bin_str, T_STRING);
|
|
230
|
+
|
|
231
|
+
TypedData_Get_Struct(self, struct CertstoreLoader, &rb_win_certstore_loader_type, loader);
|
|
232
|
+
|
|
233
|
+
if (CertAddEncodedCertificateToStore(loader->hStore, X509_ASN_ENCODING,
|
|
234
|
+
RSTRING_PTR(rb_der_cert_bin_str), RSTRING_LEN(rb_der_cert_bin_str),
|
|
235
|
+
CERT_STORE_ADD_NEW,
|
|
236
|
+
NULL)) {
|
|
237
|
+
return Qtrue;
|
|
238
|
+
} else {
|
|
239
|
+
DWORD errCode = GetLastError();
|
|
240
|
+
|
|
241
|
+
switch (errCode){
|
|
242
|
+
case CRYPT_E_EXISTS:
|
|
243
|
+
return Qfalse;
|
|
244
|
+
default: {
|
|
245
|
+
sprintf(errBuf, "Cannot add certificates. ErrorCode: %d", GetLastError());
|
|
246
|
+
goto error;
|
|
247
|
+
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
return Qtrue;
|
|
253
|
+
|
|
254
|
+
error:
|
|
255
|
+
|
|
256
|
+
rb_raise(rb_eCertLoaderError, errBuf);
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
static VALUE
|
|
260
|
+
rb_win_certstore_loader_delete_certificate(VALUE self, VALUE rb_thumbprint)
|
|
261
|
+
{
|
|
262
|
+
VALUE vThumbprint;
|
|
263
|
+
PCCERT_CONTEXT pContext = NULL;
|
|
264
|
+
struct CertstoreLoader *loader;
|
|
265
|
+
DWORD len;
|
|
266
|
+
CHAR errBuf[256];
|
|
267
|
+
|
|
268
|
+
Check_Type(rb_thumbprint, T_STRING);
|
|
269
|
+
|
|
270
|
+
TypedData_Get_Struct(self, struct CertstoreLoader, &rb_win_certstore_loader_type, loader);
|
|
271
|
+
|
|
272
|
+
// thumbprint : To wide char
|
|
273
|
+
len = MultiByteToWideChar(CP_UTF8, 0, RSTRING_PTR(rb_thumbprint), RSTRING_LEN(rb_thumbprint), NULL, 0);
|
|
274
|
+
WCHAR *winThumbprint = ALLOCV_N(WCHAR, vThumbprint, len+1);
|
|
275
|
+
MultiByteToWideChar(CP_UTF8, 0, RSTRING_PTR(rb_thumbprint), RSTRING_LEN(rb_thumbprint), winThumbprint, len);
|
|
276
|
+
winThumbprint[len] = L'\0';
|
|
277
|
+
|
|
278
|
+
BYTE pbThumb[CERT_THUMBPRINT_SIZE];
|
|
279
|
+
CRYPT_HASH_BLOB blob;
|
|
280
|
+
blob.cbData = CERT_THUMBPRINT_SIZE;
|
|
281
|
+
blob.pbData = pbThumb;
|
|
282
|
+
CryptStringToBinaryW(winThumbprint, CERT_THUMBPRINT_STR_LENGTH, CRYPT_STRING_HEX, pbThumb,
|
|
283
|
+
&blob.cbData, NULL, NULL);
|
|
284
|
+
|
|
285
|
+
pContext = CertFindCertificateInStore(
|
|
286
|
+
loader->hStore,
|
|
287
|
+
X509_ASN_ENCODING | PKCS_7_ASN_ENCODING,
|
|
288
|
+
0,
|
|
289
|
+
CERT_FIND_HASH,
|
|
290
|
+
&blob,
|
|
291
|
+
pContext);
|
|
292
|
+
|
|
293
|
+
if (!pContext)
|
|
294
|
+
goto error;
|
|
295
|
+
|
|
296
|
+
BOOL result = CertDeleteCertificateFromStore(pContext);
|
|
297
|
+
CertFreeCertificateContext(pContext);
|
|
298
|
+
ALLOCV_END(vThumbprint);
|
|
299
|
+
|
|
300
|
+
if (result)
|
|
301
|
+
return Qtrue;
|
|
302
|
+
else
|
|
303
|
+
return Qfalse;
|
|
304
|
+
|
|
305
|
+
error:
|
|
306
|
+
|
|
307
|
+
CertFreeCertificateContext(pContext);
|
|
308
|
+
|
|
309
|
+
sprintf(errBuf, "Cannot find certificates with thumbprint(%S)", winThumbprint);
|
|
310
|
+
rb_raise(rb_eCertLoaderError, errBuf);
|
|
311
|
+
}
|
|
312
|
+
|
|
223
313
|
static VALUE
|
|
224
314
|
rb_win_certstore_loader_export_pfx(VALUE self, VALUE rb_thumbprint, VALUE rb_password)
|
|
225
315
|
{
|
|
@@ -316,5 +406,7 @@ Init_certstore_loader(VALUE rb_mCertstore)
|
|
|
316
406
|
rb_define_method(rb_cCertLoader, "initialize", rb_win_certstore_loader_initialize, 2);
|
|
317
407
|
rb_define_method(rb_cCertLoader, "each", rb_win_certstore_loader_each, 0);
|
|
318
408
|
rb_define_method(rb_cCertLoader, "find_cert", rb_win_certstore_loader_find_certificate, 1);
|
|
409
|
+
rb_define_method(rb_cCertLoader, "delete_cert", rb_win_certstore_loader_delete_certificate, 1);
|
|
410
|
+
rb_define_method(rb_cCertLoader, "add_cert", rb_win_certstore_loader_add_certificate, 1);
|
|
319
411
|
rb_define_method(rb_cCertLoader, "export_pfx", rb_win_certstore_loader_export_pfx, 2);
|
|
320
412
|
}
|
|
@@ -60,6 +60,18 @@ module Certstore
|
|
|
60
60
|
def valid_duration?(x509_obj)
|
|
61
61
|
x509_obj.not_before < Time.now.utc && x509_obj.not_after > Time.now.utc
|
|
62
62
|
end
|
|
63
|
+
|
|
64
|
+
def add_certificate(cert_path)
|
|
65
|
+
File.readable?(cert_path)
|
|
66
|
+
File.open(cert_path) do |file|
|
|
67
|
+
@loader.add_cert(::OpenSSL::X509::Certificate.new(file.read).to_der)
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def delete_certificate(thumbprint)
|
|
72
|
+
thumbprint = cleanup_thumbprint(thumbprint)
|
|
73
|
+
@loader.delete_cert(thumbprint)
|
|
74
|
+
end
|
|
63
75
|
end
|
|
64
76
|
end
|
|
65
77
|
end
|
data/lib/certstore/version.rb
CHANGED
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
|
+
version: 0.1.3
|
|
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-
|
|
11
|
+
date: 2019-09-11 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: bundler
|
|
@@ -86,7 +86,7 @@ dependencies:
|
|
|
86
86
|
- - "~>"
|
|
87
87
|
- !ruby/object:Gem::Version
|
|
88
88
|
version: 3.3.3
|
|
89
|
-
description: Windows CertStore loader.
|
|
89
|
+
description: Windows CertStore loader and ruby-openssl extension for TLS connection.
|
|
90
90
|
email:
|
|
91
91
|
- cosmo0920.wp@gmail.com
|
|
92
92
|
executables: []
|
|
@@ -139,5 +139,5 @@ rubyforge_project:
|
|
|
139
139
|
rubygems_version: 2.7.3
|
|
140
140
|
signing_key:
|
|
141
141
|
specification_version: 4
|
|
142
|
-
summary: Windows CertStore loader.
|
|
142
|
+
summary: Windows CertStore loader and ruby-openssl extension for TLS connection.
|
|
143
143
|
test_files: []
|