rucades 0.3.0

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.
Files changed (87) hide show
  1. checksums.yaml +7 -0
  2. data/.rspec +3 -0
  3. data/.rubocop.yml +18 -0
  4. data/Gemfile +16 -0
  5. data/LICENSE.txt +21 -0
  6. data/README.md +132 -0
  7. data/Rakefile +21 -0
  8. data/ext/rucades/cplib/Blob.h +192 -0
  9. data/ext/rucades/cplib/DateTime.h +518 -0
  10. data/ext/rucades/cplib/StringProxy.h +281 -0
  11. data/ext/rucades/cpstldll.h +183 -0
  12. data/ext/rucades/errormsg.cpp +561 -0
  13. data/ext/rucades/errormsg.h +31 -0
  14. data/ext/rucades/extconf.rb +91 -0
  15. data/ext/rucades/rucades.cpp +90 -0
  16. data/ext/rucades/rucades.h +14 -0
  17. data/ext/rucades/rucades_about.cpp +75 -0
  18. data/ext/rucades/rucades_about.h +26 -0
  19. data/ext/rucades/rucades_algorithm.cpp +54 -0
  20. data/ext/rucades/rucades_algorithm.h +28 -0
  21. data/ext/rucades/rucades_attribute.cpp +112 -0
  22. data/ext/rucades/rucades_attribute.h +30 -0
  23. data/ext/rucades/rucades_attributes.cpp +62 -0
  24. data/ext/rucades/rucades_attributes.h +28 -0
  25. data/ext/rucades/rucades_basic_constraints.cpp +67 -0
  26. data/ext/rucades/rucades_basic_constraints.h +27 -0
  27. data/ext/rucades/rucades_blobs.cpp +46 -0
  28. data/ext/rucades/rucades_blobs.h +25 -0
  29. data/ext/rucades/rucades_certificate.cpp +182 -0
  30. data/ext/rucades/rucades_certificate.h +59 -0
  31. data/ext/rucades/rucades_certificate_status.cpp +36 -0
  32. data/ext/rucades/rucades_certificate_status.h +23 -0
  33. data/ext/rucades/rucades_certificates.cpp +140 -0
  34. data/ext/rucades/rucades_certificates.h +31 -0
  35. data/ext/rucades/rucades_const.cpp +241 -0
  36. data/ext/rucades/rucades_crl.cpp +84 -0
  37. data/ext/rucades/rucades_crl.h +29 -0
  38. data/ext/rucades/rucades_eku.cpp +55 -0
  39. data/ext/rucades/rucades_eku.h +26 -0
  40. data/ext/rucades/rucades_ekus.cpp +43 -0
  41. data/ext/rucades/rucades_ekus.h +27 -0
  42. data/ext/rucades/rucades_encoded_data.cpp +41 -0
  43. data/ext/rucades/rucades_encoded_data.h +23 -0
  44. data/ext/rucades/rucades_enveloped_data.cpp +122 -0
  45. data/ext/rucades/rucades_enveloped_data.h +33 -0
  46. data/ext/rucades/rucades_extended_key_usage.cpp +53 -0
  47. data/ext/rucades/rucades_extended_key_usage.h +27 -0
  48. data/ext/rucades/rucades_hashed_data.cpp +90 -0
  49. data/ext/rucades/rucades_hashed_data.h +31 -0
  50. data/ext/rucades/rucades_key_usage.cpp +116 -0
  51. data/ext/rucades/rucades_key_usage.h +33 -0
  52. data/ext/rucades/rucades_oid.cpp +70 -0
  53. data/ext/rucades/rucades_oid.h +30 -0
  54. data/ext/rucades/rucades_private_key.cpp +86 -0
  55. data/ext/rucades/rucades_private_key.h +31 -0
  56. data/ext/rucades/rucades_public_key.cpp +59 -0
  57. data/ext/rucades/rucades_public_key.h +28 -0
  58. data/ext/rucades/rucades_raw_signature.cpp +42 -0
  59. data/ext/rucades/rucades_raw_signature.h +26 -0
  60. data/ext/rucades/rucades_recipients.cpp +63 -0
  61. data/ext/rucades/rucades_recipients.h +28 -0
  62. data/ext/rucades/rucades_signature_status.cpp +35 -0
  63. data/ext/rucades/rucades_signature_status.h +23 -0
  64. data/ext/rucades/rucades_signed_data.cpp +253 -0
  65. data/ext/rucades/rucades_signed_data.h +41 -0
  66. data/ext/rucades/rucades_signed_xml.cpp +87 -0
  67. data/ext/rucades/rucades_signed_xml.h +29 -0
  68. data/ext/rucades/rucades_signer.cpp +157 -0
  69. data/ext/rucades/rucades_signer.h +45 -0
  70. data/ext/rucades/rucades_signers.cpp +43 -0
  71. data/ext/rucades/rucades_signers.h +27 -0
  72. data/ext/rucades/rucades_store.cpp +78 -0
  73. data/ext/rucades/rucades_store.h +34 -0
  74. data/ext/rucades/rucades_symmetric_algorithm.cpp +107 -0
  75. data/ext/rucades/rucades_symmetric_algorithm.h +30 -0
  76. data/ext/rucades/rucades_tools.cpp +18 -0
  77. data/ext/rucades/rucades_version.cpp +60 -0
  78. data/ext/rucades/rucades_version.h +24 -0
  79. data/ext/rucades/stdafx.h +190 -0
  80. data/lib/rucades/version.rb +9 -0
  81. data/lib/rucades.rb +36 -0
  82. data/samples/encrypt_decrypt.rb +25 -0
  83. data/samples/sign_verify.rb +28 -0
  84. data/samples/sign_verify_hash.rb +30 -0
  85. data/samples/sign_verify_xml.rb +44 -0
  86. data/sig/rucades.rbs +4 -0
  87. metadata +156 -0
@@ -0,0 +1,18 @@
1
+ // Copyright (c) 2023 Maxim [maxirmx] Samsonov (https://sw.consulting)
2
+ // All rights reserved.
3
+ // This file is a part of rucades
4
+
5
+ #include "rucades.h"
6
+
7
+ namespace rucades {
8
+ void hr_method_check(HRESULT hr) {
9
+ if (hr != S_OK) {
10
+ CAtlStringW message = GetErrorMessage(HRESULT_FROM_WIN32(hr),
11
+ MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US));
12
+ wchar_t buff[14];
13
+ swprintf(buff, 14, L" (0x%08X)", hr);
14
+ message.Append(buff);
15
+ throw std::runtime_error(CW2A(message, CP_UTF8));
16
+ }
17
+ }
18
+ }
@@ -0,0 +1,60 @@
1
+ // Copyright (c) 2023 Maxim [maxirmx] Samsonov (https://sw.consulting)
2
+ // All rights reserved.
3
+ // This file is a part of rucades
4
+
5
+ #include <rice/rice.hpp>
6
+ #include <rice/stl.hpp>
7
+
8
+ #include "rucades.h"
9
+ #include "rucades_version.h"
10
+
11
+ using namespace Rice;
12
+ using namespace CryptoPro::PKI::CAdES;
13
+
14
+ namespace rucades {
15
+ pre_rb_Version::pre_rb_Version(void):
16
+ m_pCppCadesImpl(boost::shared_ptr<CPPVersionObject>(new CPPVersionObject())) { }
17
+
18
+ pre_rb_Version::pre_rb_Version(boost::shared_ptr<CPPVersionObject> other):
19
+ m_pCppCadesImpl(other) { }
20
+
21
+ unsigned int pre_rb_Version::major_version(void)
22
+ {
23
+ unsigned int version = 0;
24
+ hr_method_check(m_pCppCadesImpl->get_MajorVersion(&version));
25
+ return version;
26
+ }
27
+
28
+ unsigned int pre_rb_Version::minor_version(void)
29
+ {
30
+ unsigned int version = 0;
31
+ hr_method_check(m_pCppCadesImpl->get_MinorVersion(&version));
32
+ return version;
33
+ }
34
+
35
+ unsigned int pre_rb_Version::build_version(void)
36
+ {
37
+ unsigned int version = 0;
38
+ hr_method_check(m_pCppCadesImpl->get_BuildVersion(&version));
39
+ return version;
40
+ }
41
+
42
+ std::string pre_rb_Version::to_s(void)
43
+ {
44
+ CAtlString AtlVersion;
45
+ hr_method_check(m_pCppCadesImpl->toString(AtlVersion));
46
+ return AtlVersion.GetString();
47
+ }
48
+
49
+ void pre_rb_Version::define_ruby_class(VALUE module)
50
+ {
51
+ Data_Type<pre_rb_Version> rb_cVersion =
52
+ define_class_under<pre_rb_Version>(module, "Version")
53
+ .define_constructor(Constructor<pre_rb_Version>())
54
+ .define_method("major_version", &pre_rb_Version::major_version)
55
+ .define_method("minor_version", &pre_rb_Version::minor_version)
56
+ .define_method("build_version", &pre_rb_Version::build_version)
57
+ .define_method("to_s", &pre_rb_Version::to_s);
58
+
59
+ }
60
+ }
@@ -0,0 +1,24 @@
1
+ // Copyright (c) 2023 Maxim [maxirmx] Samsonov (https://sw.consulting)
2
+ // All rights reserved.
3
+ // This file is a part of rucades
4
+
5
+ #pragma once
6
+
7
+ #include "rucades.h"
8
+ #include "CPPVersion.h"
9
+
10
+ namespace rucades {
11
+ class pre_rb_Version {
12
+ protected:
13
+ boost::shared_ptr<CryptoPro::PKI::CAdES::CPPVersionObject> m_pCppCadesImpl;
14
+ public:
15
+ pre_rb_Version(void);
16
+ pre_rb_Version(boost::shared_ptr<CryptoPro::PKI::CAdES::CPPVersionObject> other);
17
+ unsigned int major_version(void);
18
+ unsigned int minor_version(void);
19
+ unsigned int build_version(void);
20
+ std::string to_s(void);
21
+
22
+ static void define_ruby_class(VALUE module);
23
+ };
24
+ }
@@ -0,0 +1,190 @@
1
+ // stdafx.h : include file for standard system include files,
2
+ // or project specific include files that are used frequently, but
3
+ // are changed infrequently
4
+ //
5
+ #pragma once
6
+
7
+ #define CRYPT_SIGN_MESSAGE_PARA_HAS_CMS_FIELDS
8
+ #define CMSG_SIGNER_ENCODE_INFO_HAS_CMS_FIELDS
9
+ #define CMSG_SIGNED_ENCODE_INFO_HAS_CMS_FIELDS
10
+ #define CERT_PARA_HAS_EXTRA_FIELDS
11
+
12
+ #define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
13
+ // Windows Header Files:
14
+ #ifdef _WIN32
15
+ #define RETURN_ATL_STRING RETURN_ATL_STRING_W
16
+ #define RETURN_ATL_STRINGL RETURN_ATL_STRINGL_W
17
+ #endif
18
+
19
+
20
+ #include "boost/shared_ptr.hpp"
21
+ #include <iostream>
22
+ #include <memory> //Этот хедер тут нужен что бы компилить с новыми версиями libstdc++
23
+ //в них есть конфликт с __in и __out макросами которые определены в MS хедерах.
24
+
25
+ #ifdef UNIX
26
+ #include "CSP_WinDef.h"
27
+ #include "CSP_WinError.h"
28
+ #include <string>
29
+ #include <stdarg.h>
30
+ #include <atldef2.h>
31
+ #define CADES_CLASS
32
+ #define RETURN_ATL_STRING RETURN_ATL_STRING_A
33
+ #define RETURN_ATL_STRINGL RETURN_ATL_STRINGL_A
34
+ #endif //UNIX
35
+ #include <WinCryptEx.h>
36
+
37
+ #include "atltrace2.h"
38
+ #include <atldef2.h>
39
+ #include <atlenc.h>
40
+ #include <atlcrypt2.h>
41
+
42
+ #define _ATL_APARTMENT_THREADED
43
+ // some CString constructors will be explicit
44
+ #define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS
45
+ // turns off ATL's hiding of some common and often safely ignored warning messages
46
+ #define _ATL_ALL_WARNINGS
47
+
48
+ #include <atlbase.h>
49
+ #ifdef _WIN32
50
+ #include <atlcom.h>
51
+ #endif //_WIN32
52
+ #pragma warning(push)
53
+ #pragma warning(disable : 4127)
54
+ #include <atlstr.h>
55
+ #pragma warning(pop)
56
+ #include "errormsg.h"
57
+
58
+ #ifndef UNIX
59
+ #pragma warning(push)
60
+ #pragma warning(disable : 4005)
61
+ #endif
62
+
63
+ #define RETURN_ATL_STRING_W(atlstr) \
64
+ { \
65
+ char *str; \
66
+ int len = 0; \
67
+ len = atlstr.GetLength(); \
68
+ str = (char *)ecalloc(len + 1, sizeof(char)); \
69
+ wcstombs(str, atlstr, len); \
70
+ str[len] = '\0'; \
71
+ RETURN_STRING(str, 0) \
72
+ }
73
+
74
+ #define RETURN_ATL_STRINGL_W(atlstr) \
75
+ { \
76
+ char *str; \
77
+ int len = 0; \
78
+ len = atlstr.GetLength(); \
79
+ str = (char *)ecalloc(len, sizeof(char)); \
80
+ wcstombs(str, atlstr, len); \
81
+ RETURN_STRINGL(str, len, 0) \
82
+ }
83
+
84
+ #define RETURN_ATL_STRING_A(atlstr) \
85
+ { \
86
+ char *str; \
87
+ int len = 0; \
88
+ len = atlstr.GetLength(); \
89
+ str = (char *)ecalloc(len + 1, sizeof(char)); \
90
+ memcpy(str, atlstr, len); \
91
+ str[len] = '\0'; \
92
+ RETURN_STRING(str, 0) \
93
+ }
94
+
95
+ #define RETURN_ATL_STRINGL_A(atlstr) \
96
+ { \
97
+ char *str; \
98
+ int len = 0; \
99
+ len = atlstr.GetLength(); \
100
+ str = (char *)ecalloc(len, sizeof(char)); \
101
+ memcpy(str, atlstr, len); \
102
+ RETURN_STRINGL(str, len, 0) \
103
+ }
104
+
105
+ #define RETURN_PROXY_STRING(prstr) \
106
+ { \
107
+ char *str; \
108
+ int len = 0; \
109
+ len = strlen(prstr.c_str()); \
110
+ str = (char *)ecalloc(len + 1, sizeof(char)); \
111
+ strncpy(str, prstr.c_str(), len + 1); \
112
+ RETURN_STRING(str, 0) \
113
+ }
114
+
115
+ #ifdef UNIX //разные макросы ибо на линуксе нет _vscwprintf() который нужен внутри AppendFormat().
116
+
117
+ #ifdef MAKELANGID
118
+ #undef MAKELANGID
119
+ #endif //MAKELANGID
120
+
121
+ #define MAKELANGID(a, b) 0x409 //English U.S.
122
+
123
+ #define RETURN_NULL_WITH_EXCEPTION(err) \
124
+ do \
125
+ { \
126
+ CAtlStringW message = GetErrorMessage(HRESULT_FROM_WIN32(err), \
127
+ MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); \
128
+ wchar_t buff[14]; \
129
+ swprintf(buff, 14, L" (0x%08X)", err); \
130
+ message.Append(buff); \
131
+ PyErr_SetString(PyExc_Exception, CW2A(message, CP_UTF8)); \
132
+ return NULL; \
133
+ } while (0)
134
+
135
+ #define RETURN_MINUS_1_WITH_EXCEPTION(err) \
136
+ do \
137
+ { \
138
+ CAtlStringW message = GetErrorMessage(HRESULT_FROM_WIN32(err), \
139
+ MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); \
140
+ wchar_t buff[14]; \
141
+ swprintf(buff, 14, L" (0x%08X)", err); \
142
+ message.Append(buff); \
143
+ PyErr_SetString(PyExc_Exception, CW2A(message, CP_UTF8)); \
144
+ return -1; \
145
+ } while (0)
146
+
147
+ #else
148
+ #define RETURN_NULL_WITH_EXCEPTION(err) \
149
+ do \
150
+ { \
151
+ CAtlStringW message = GetErrorMessage(HRESULT_FROM_WIN32(err), \
152
+ MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); \
153
+ message.AppendFormat(L" (0x%08X)", err); \
154
+ PyErr_SetString(PyExc_Exception, CW2A(message, CP_UTF8)); \
155
+ return NULL; \
156
+ } while (0)
157
+
158
+ #define RETURN_MINUS_1_WITH_EXCEPTION(err) \
159
+ do \
160
+ { \
161
+ CAtlStringW message = GetErrorMessage(HRESULT_FROM_WIN32(err), \
162
+ MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)); \
163
+ message.AppendFormat(L" (0x%08X)", err); \
164
+ PyErr_SetString(PyExc_Exception, CW2A(message, CP_UTF8)); \
165
+ return -1; \
166
+ } while (0)
167
+
168
+ #endif //UNIX
169
+
170
+ #define HR_SETTER_ERRORCHECK_RETURN(expr) \
171
+ __pragma(warning(push)) \
172
+ __pragma(warning(disable : 4127)) do \
173
+ { \
174
+ HRESULT stdafx_hr = (expr); \
175
+ if (stdafx_hr != S_OK) \
176
+ { \
177
+ RETURN_MINUS_1_WITH_EXCEPTION(stdafx_hr); \
178
+ } \
179
+ } while (0)
180
+
181
+ #define HR_METHOD_ERRORCHECK_RETURN(expr) \
182
+ __pragma(warning(push)) \
183
+ __pragma(warning(disable : 4127)) do \
184
+ { \
185
+ HRESULT stdafx_hr = (expr); \
186
+ if (stdafx_hr != S_OK) \
187
+ { \
188
+ RETURN_NULL_WITH_EXCEPTION(stdafx_hr); \
189
+ } \
190
+ } while (0)
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright (c) 2023 Maxim [maxirmx] Samsonov (https://sw.consulting)
4
+ # All rights reserved.
5
+ # This file is a part of rucades
6
+
7
+ module Rucades
8
+ VERSION = "0.3.0"
9
+ end
data/lib/rucades.rb ADDED
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright (c) 2023 Maxim [maxirmx] Samsonov (https://sw.consulting)
4
+ # All rights reserved.
5
+ # This file is a part of rucades
6
+
7
+ require_relative "rucades/version"
8
+ require_relative "rucades/rucades"
9
+
10
+ # Rucades module
11
+ # Some staff on top of C++ bindings
12
+ module Rucades
13
+ # Polyfill for Certificates.find
14
+ class Certificates
15
+ def find(type, *args)
16
+ return find_no_query(type) if args.empty?
17
+
18
+ valid_only = (args.length == 1 ? 0 : -1)
19
+ return internal_find_query_string(type, args[1], valid_only) if args[1].is_a?(String)
20
+
21
+ internal_find_query_long(type, args[1], valid_only)
22
+ end
23
+
24
+ private
25
+
26
+ def find_no_query(type)
27
+ if type != Rucades::CAPICOM_CERTIFICATE_FIND_TIME_VALID &&
28
+ type != Rucades::CAPICOM_CERTIFICATE_FIND_TIME_NOT_YET_VALID &&
29
+ type != Rucades::CAPICOM_CERTIFICATE_FIND_TIME_EXPIRED
30
+ raise ArgumentError, "Missing query"
31
+ end
32
+
33
+ internal_find_query_string(type, "", 0)
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rucades"
4
+
5
+ store = Rucades::Store.new
6
+ store.open(Rucades::CADESCOM_CONTAINER_STORE, Rucades::CAPICOM_MY_STORE,
7
+ Rucades::CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED)
8
+ certs = store.certificates
9
+
10
+ raise "Certificates with private key not found" unless certs.any?
11
+
12
+ signer = Rucades::Signer.new
13
+ signer.certificate = certs[1]
14
+ signer.check_certificate = true
15
+
16
+ signed_data = Rucades::SignedData.new
17
+ signed_data.content = "Test content to be signed"
18
+ signature = signed_data.sign_cades(signer, Rucades::CADESCOM_CADES_BES)
19
+ puts "============= Signature ============="
20
+ puts signature
21
+ puts "====================================="
22
+
23
+ signed_data2 = Rucades::SignedData.new
24
+ signed_data2.verify_cades(signature, Rucades::CADESCOM_CADES_BES)
25
+ puts "******* Verified successfully ******"
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rucades"
4
+
5
+ store = Rucades::Store.new
6
+ store.open(Rucades::CADESCOM_CONTAINER_STORE, Rucades::CAPICOM_MY_STORE,
7
+ Rucades::CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED)
8
+ certs = store.certificates
9
+
10
+ raise "Certificates with private key not found" unless certs.any?
11
+
12
+ # hashed_data = Rucades::HashedData.new
13
+
14
+ enveloped_data = Rucades::EnvelopedData.new
15
+ enveloped_data.content = "Message to encrypt с русскими буквами"
16
+ enveloped_data.recipients.add(certs[1])
17
+ encrypted_message = enveloped_data.encrypt(Rucades::CADESCOM_ENCODE_BASE64)
18
+ puts "============= Encrypted Message ============="
19
+ puts encrypted_message
20
+ puts "============================================="
21
+
22
+ enveloped_data_dec = Rucades::EnvelopedData.new
23
+ enveloped_data_dec.decrypt(encrypted_message)
24
+ content = enveloped_data_dec.content
25
+
26
+ raise "Incorrect value of EnvelopedData.decrypt result" unless content == "Message to encrypt с русскими буквами"
27
+
28
+ puts "=========== Decrypted successfully =========="
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rucades"
4
+
5
+ store = Rucades::Store.new
6
+ store.open(Rucades::CADESCOM_CONTAINER_STORE, Rucades::CAPICOM_MY_STORE,
7
+ Rucades::CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED)
8
+ certs = store.certificates
9
+
10
+ raise "Certificates with private key not found" unless certs.any?
11
+
12
+ signer = Rucades::Signer.new
13
+ signer.certificate = certs[1]
14
+ signer.check_certificate = true
15
+
16
+ hashed_data = Rucades::HashedData.new
17
+ hashed_data.algorithm = Rucades::CADESCOM_HASH_ALGORITHM_CP_GOST_3411_2012_256
18
+ hashed_data.hash("test data")
19
+
20
+ signed_data = Rucades::SignedData.new
21
+ signature = signed_data.sign_hash(hashed_data, signer, Rucades::CADESCOM_CADES_BES)
22
+
23
+ puts "============= Encrypted Message ============="
24
+ puts signature
25
+ puts "============================================="
26
+
27
+ signed_data_dec = Rucades::SignedData.new
28
+ signed_data_dec.verify_hash(hashed_data, signature, Rucades::CADESCOM_CADES_BES)
29
+
30
+ puts "=========== Verified successfully ==========="
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rucades"
4
+
5
+ store = Rucades::Store.new
6
+ store.open(Rucades::CADESCOM_CONTAINER_STORE, Rucades::CAPICOM_MY_STORE,
7
+ Rucades::CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED)
8
+ certs = store.certificates
9
+
10
+ raise "Certificates with private key not found" unless certs.any?
11
+
12
+ signer = Rucades::Signer.new
13
+ signer.certificate = certs[1]
14
+
15
+ content_to_sign = <<~XML
16
+ <?xml version="1.0" encoding="UTF-8"?>
17
+ <!--
18
+ "XML Security Library example: Original XML doc file for sign2 example. "
19
+ -->
20
+ <Envelope xmlns="urn:envelope">
21
+ <Data>
22
+ Hello, World!
23
+ </Data>
24
+ <Node xml:id="nodeID">
25
+ Hello, Node!
26
+ </Node>
27
+ </Envelope>
28
+ XML
29
+
30
+ signed_xml = Rucades::SignedXML.new
31
+ signed_xml.content = content_to_sign
32
+ signed_xml.signature_type = Rucades::CADESCOM_XML_SIGNATURE_TYPE_ENVELOPED | Rucades::CADESCOM_XADES_BES
33
+ signature = signed_xml.sign(signer)
34
+
35
+ puts "============= Encrypted Message ============="
36
+ puts signature
37
+ puts "============================================="
38
+
39
+ signed_xml_dec = Rucades::SignedXML.new
40
+ signed_xml_dec.verify(signature)
41
+
42
+ raise "Incorrect value of SignedXML.verify result" unless signed_xml.content == content_to_sign
43
+
44
+ puts "=========== Verified successfully ==========="
data/sig/rucades.rbs ADDED
@@ -0,0 +1,4 @@
1
+ module Rucades
2
+ VERSION: String
3
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
4
+ end
metadata ADDED
@@ -0,0 +1,156 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rucades
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.3.0
5
+ platform: ruby
6
+ authors:
7
+ - Maxim [maxirmx] Samsonov
8
+ bindir: exe
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: fiddle
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - "~>"
17
+ - !ruby/object:Gem::Version
18
+ version: '1'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - "~>"
24
+ - !ruby/object:Gem::Version
25
+ version: '1'
26
+ - !ruby/object:Gem::Dependency
27
+ name: rice
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - "~>"
31
+ - !ruby/object:Gem::Version
32
+ version: '4.1'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '4.1'
40
+ description: Ruby CaDes bindings
41
+ email:
42
+ - maxirmx@sw.consulting
43
+ executables: []
44
+ extensions:
45
+ - ext/rucades/extconf.rb
46
+ extra_rdoc_files: []
47
+ files:
48
+ - ".rspec"
49
+ - ".rubocop.yml"
50
+ - Gemfile
51
+ - LICENSE.txt
52
+ - README.md
53
+ - Rakefile
54
+ - ext/rucades/cplib/Blob.h
55
+ - ext/rucades/cplib/DateTime.h
56
+ - ext/rucades/cplib/StringProxy.h
57
+ - ext/rucades/cpstldll.h
58
+ - ext/rucades/errormsg.cpp
59
+ - ext/rucades/errormsg.h
60
+ - ext/rucades/extconf.rb
61
+ - ext/rucades/rucades.cpp
62
+ - ext/rucades/rucades.h
63
+ - ext/rucades/rucades_about.cpp
64
+ - ext/rucades/rucades_about.h
65
+ - ext/rucades/rucades_algorithm.cpp
66
+ - ext/rucades/rucades_algorithm.h
67
+ - ext/rucades/rucades_attribute.cpp
68
+ - ext/rucades/rucades_attribute.h
69
+ - ext/rucades/rucades_attributes.cpp
70
+ - ext/rucades/rucades_attributes.h
71
+ - ext/rucades/rucades_basic_constraints.cpp
72
+ - ext/rucades/rucades_basic_constraints.h
73
+ - ext/rucades/rucades_blobs.cpp
74
+ - ext/rucades/rucades_blobs.h
75
+ - ext/rucades/rucades_certificate.cpp
76
+ - ext/rucades/rucades_certificate.h
77
+ - ext/rucades/rucades_certificate_status.cpp
78
+ - ext/rucades/rucades_certificate_status.h
79
+ - ext/rucades/rucades_certificates.cpp
80
+ - ext/rucades/rucades_certificates.h
81
+ - ext/rucades/rucades_const.cpp
82
+ - ext/rucades/rucades_crl.cpp
83
+ - ext/rucades/rucades_crl.h
84
+ - ext/rucades/rucades_eku.cpp
85
+ - ext/rucades/rucades_eku.h
86
+ - ext/rucades/rucades_ekus.cpp
87
+ - ext/rucades/rucades_ekus.h
88
+ - ext/rucades/rucades_encoded_data.cpp
89
+ - ext/rucades/rucades_encoded_data.h
90
+ - ext/rucades/rucades_enveloped_data.cpp
91
+ - ext/rucades/rucades_enveloped_data.h
92
+ - ext/rucades/rucades_extended_key_usage.cpp
93
+ - ext/rucades/rucades_extended_key_usage.h
94
+ - ext/rucades/rucades_hashed_data.cpp
95
+ - ext/rucades/rucades_hashed_data.h
96
+ - ext/rucades/rucades_key_usage.cpp
97
+ - ext/rucades/rucades_key_usage.h
98
+ - ext/rucades/rucades_oid.cpp
99
+ - ext/rucades/rucades_oid.h
100
+ - ext/rucades/rucades_private_key.cpp
101
+ - ext/rucades/rucades_private_key.h
102
+ - ext/rucades/rucades_public_key.cpp
103
+ - ext/rucades/rucades_public_key.h
104
+ - ext/rucades/rucades_raw_signature.cpp
105
+ - ext/rucades/rucades_raw_signature.h
106
+ - ext/rucades/rucades_recipients.cpp
107
+ - ext/rucades/rucades_recipients.h
108
+ - ext/rucades/rucades_signature_status.cpp
109
+ - ext/rucades/rucades_signature_status.h
110
+ - ext/rucades/rucades_signed_data.cpp
111
+ - ext/rucades/rucades_signed_data.h
112
+ - ext/rucades/rucades_signed_xml.cpp
113
+ - ext/rucades/rucades_signed_xml.h
114
+ - ext/rucades/rucades_signer.cpp
115
+ - ext/rucades/rucades_signer.h
116
+ - ext/rucades/rucades_signers.cpp
117
+ - ext/rucades/rucades_signers.h
118
+ - ext/rucades/rucades_store.cpp
119
+ - ext/rucades/rucades_store.h
120
+ - ext/rucades/rucades_symmetric_algorithm.cpp
121
+ - ext/rucades/rucades_symmetric_algorithm.h
122
+ - ext/rucades/rucades_tools.cpp
123
+ - ext/rucades/rucades_version.cpp
124
+ - ext/rucades/rucades_version.h
125
+ - ext/rucades/stdafx.h
126
+ - lib/rucades.rb
127
+ - lib/rucades/version.rb
128
+ - samples/encrypt_decrypt.rb
129
+ - samples/sign_verify.rb
130
+ - samples/sign_verify_hash.rb
131
+ - samples/sign_verify_xml.rb
132
+ - sig/rucades.rbs
133
+ homepage: https://github.com/maxirmx/rucades
134
+ licenses:
135
+ - MIT
136
+ metadata:
137
+ homepage_uri: https://github.com/maxirmx/rucades
138
+ source_code_uri: https://github.com/maxirmx/rucades
139
+ rdoc_options: []
140
+ require_paths:
141
+ - lib
142
+ required_ruby_version: !ruby/object:Gem::Requirement
143
+ requirements:
144
+ - - ">="
145
+ - !ruby/object:Gem::Version
146
+ version: 2.7.8
147
+ required_rubygems_version: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - ">="
150
+ - !ruby/object:Gem::Version
151
+ version: '0'
152
+ requirements: []
153
+ rubygems_version: 3.6.9
154
+ specification_version: 4
155
+ summary: https://github.com/maxirmx/rucades
156
+ test_files: []