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.
- checksums.yaml +7 -0
- data/.rspec +3 -0
- data/.rubocop.yml +18 -0
- data/Gemfile +16 -0
- data/LICENSE.txt +21 -0
- data/README.md +132 -0
- data/Rakefile +21 -0
- data/ext/rucades/cplib/Blob.h +192 -0
- data/ext/rucades/cplib/DateTime.h +518 -0
- data/ext/rucades/cplib/StringProxy.h +281 -0
- data/ext/rucades/cpstldll.h +183 -0
- data/ext/rucades/errormsg.cpp +561 -0
- data/ext/rucades/errormsg.h +31 -0
- data/ext/rucades/extconf.rb +91 -0
- data/ext/rucades/rucades.cpp +90 -0
- data/ext/rucades/rucades.h +14 -0
- data/ext/rucades/rucades_about.cpp +75 -0
- data/ext/rucades/rucades_about.h +26 -0
- data/ext/rucades/rucades_algorithm.cpp +54 -0
- data/ext/rucades/rucades_algorithm.h +28 -0
- data/ext/rucades/rucades_attribute.cpp +112 -0
- data/ext/rucades/rucades_attribute.h +30 -0
- data/ext/rucades/rucades_attributes.cpp +62 -0
- data/ext/rucades/rucades_attributes.h +28 -0
- data/ext/rucades/rucades_basic_constraints.cpp +67 -0
- data/ext/rucades/rucades_basic_constraints.h +27 -0
- data/ext/rucades/rucades_blobs.cpp +46 -0
- data/ext/rucades/rucades_blobs.h +25 -0
- data/ext/rucades/rucades_certificate.cpp +182 -0
- data/ext/rucades/rucades_certificate.h +59 -0
- data/ext/rucades/rucades_certificate_status.cpp +36 -0
- data/ext/rucades/rucades_certificate_status.h +23 -0
- data/ext/rucades/rucades_certificates.cpp +140 -0
- data/ext/rucades/rucades_certificates.h +31 -0
- data/ext/rucades/rucades_const.cpp +241 -0
- data/ext/rucades/rucades_crl.cpp +84 -0
- data/ext/rucades/rucades_crl.h +29 -0
- data/ext/rucades/rucades_eku.cpp +55 -0
- data/ext/rucades/rucades_eku.h +26 -0
- data/ext/rucades/rucades_ekus.cpp +43 -0
- data/ext/rucades/rucades_ekus.h +27 -0
- data/ext/rucades/rucades_encoded_data.cpp +41 -0
- data/ext/rucades/rucades_encoded_data.h +23 -0
- data/ext/rucades/rucades_enveloped_data.cpp +122 -0
- data/ext/rucades/rucades_enveloped_data.h +33 -0
- data/ext/rucades/rucades_extended_key_usage.cpp +53 -0
- data/ext/rucades/rucades_extended_key_usage.h +27 -0
- data/ext/rucades/rucades_hashed_data.cpp +90 -0
- data/ext/rucades/rucades_hashed_data.h +31 -0
- data/ext/rucades/rucades_key_usage.cpp +116 -0
- data/ext/rucades/rucades_key_usage.h +33 -0
- data/ext/rucades/rucades_oid.cpp +70 -0
- data/ext/rucades/rucades_oid.h +30 -0
- data/ext/rucades/rucades_private_key.cpp +86 -0
- data/ext/rucades/rucades_private_key.h +31 -0
- data/ext/rucades/rucades_public_key.cpp +59 -0
- data/ext/rucades/rucades_public_key.h +28 -0
- data/ext/rucades/rucades_raw_signature.cpp +42 -0
- data/ext/rucades/rucades_raw_signature.h +26 -0
- data/ext/rucades/rucades_recipients.cpp +63 -0
- data/ext/rucades/rucades_recipients.h +28 -0
- data/ext/rucades/rucades_signature_status.cpp +35 -0
- data/ext/rucades/rucades_signature_status.h +23 -0
- data/ext/rucades/rucades_signed_data.cpp +253 -0
- data/ext/rucades/rucades_signed_data.h +41 -0
- data/ext/rucades/rucades_signed_xml.cpp +87 -0
- data/ext/rucades/rucades_signed_xml.h +29 -0
- data/ext/rucades/rucades_signer.cpp +157 -0
- data/ext/rucades/rucades_signer.h +45 -0
- data/ext/rucades/rucades_signers.cpp +43 -0
- data/ext/rucades/rucades_signers.h +27 -0
- data/ext/rucades/rucades_store.cpp +78 -0
- data/ext/rucades/rucades_store.h +34 -0
- data/ext/rucades/rucades_symmetric_algorithm.cpp +107 -0
- data/ext/rucades/rucades_symmetric_algorithm.h +30 -0
- data/ext/rucades/rucades_tools.cpp +18 -0
- data/ext/rucades/rucades_version.cpp +60 -0
- data/ext/rucades/rucades_version.h +24 -0
- data/ext/rucades/stdafx.h +190 -0
- data/lib/rucades/version.rb +9 -0
- data/lib/rucades.rb +36 -0
- data/samples/encrypt_decrypt.rb +25 -0
- data/samples/sign_verify.rb +28 -0
- data/samples/sign_verify_hash.rb +30 -0
- data/samples/sign_verify_xml.rb +44 -0
- data/sig/rucades.rbs +4 -0
- 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)
|
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
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: []
|