nokogiri-xmlsec-instructure 0.11.0 → 0.12.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.
@@ -0,0 +1,209 @@
1
+ #include "options.h"
2
+
3
+ #include "common.h"
4
+
5
+ #if (XMLSEC_VERSION_MAJOR > 1) || (XMLSEC_VERSION_MAJOR == 1 && (XMLSEC_VERSION_MINOR > 2 || (XMLSEC_VERSION_MINOR == 2 && XMLSEC_VERSION_SUBMINOR >= 20)))
6
+ # define HAS_ECDSA 1
7
+ #else
8
+ # define HAS_ECDSA 0
9
+ #endif
10
+
11
+ // Key Transport Strings.
12
+ static const char RSA1_5[] = "rsa-1_5";
13
+ static const char RSA_OAEP_MGF1P[] = "rsa-oaep-mgf1p";
14
+
15
+ // Block Encryption Strings.
16
+ static const char TRIPLEDES_CBC[] = "tripledes-cbc";
17
+ static const char AES128_CBC[] = "aes128-cbc";
18
+ static const char AES192_CBC[] = "aes192-cbc";
19
+ static const char AES256_CBC[] = "aes256-cbc";
20
+ static const char GCM128_CBC[] = "aes128-gcm";
21
+ static const char GCM192_CBC[] = "aes192-gcm";
22
+ static const char GCM256_CBC[] = "aes256-gcm";
23
+
24
+ // Supported signature algorithms taken from #6 of
25
+ // http://www.w3.org/TR/xmldsig-core1/
26
+ static const char RSA_SHA1[] = "rsa-sha1";
27
+ static const char RSA_SHA224[] = "rsa-sha224";
28
+ static const char RSA_SHA256[] = "rsa-sha256";
29
+ static const char RSA_SHA384[] = "rsa-sha384";
30
+ static const char RSA_SHA512[] = "rsa-sha512";
31
+ static const char DSA_SHA1[] = "dsa-sha1";
32
+
33
+ #if HAS_ECDSA
34
+ static const char ECDSA_SHA1[] = "ecdsa-sha1";
35
+ static const char ECDSA_SHA224[] = "ecdsa-sha224";
36
+ static const char ECDSA_SHA256[] = "ecdsa-sha256";
37
+ static const char ECDSA_SHA384[] = "ecdsa-sha384";
38
+ static const char ECDSA_SHA512[] = "ecdsa-sha512";
39
+ static const char DSA_SHA256[] = "dsa-sha256";
40
+ #endif // HAS_ECDSA
41
+
42
+ // Supported digest algorithms taken from #6 of
43
+ // http://www.w3.org/TR/xmldsig-core1/
44
+ static const char DIGEST_SHA1[] = "sha1";
45
+ static const char DIGEST_SHA224[] = "sha224";
46
+ static const char DIGEST_SHA256[] = "sha256";
47
+ static const char DIGEST_SHA384[] = "sha384";
48
+ static const char DIGEST_SHA512[] = "sha512";
49
+
50
+ // Canonicalization algorithms
51
+ // http://www.w3.org/TR/xmldsig-core1/#sec-Canonicalization
52
+ static const char C14N[] = "c14n";
53
+ static const char C14N_WITH_COMMENTS[] = "c14n-with-comments";
54
+ static const char EXCL_C14N[] = "exc-c14n";
55
+ static const char EXCL_C14N_WITH_COMMENTS[] = "exc-c14n-with-comments";
56
+
57
+ BOOL GetXmlEncOptions(VALUE rb_opts,
58
+ XmlEncOptions* options,
59
+ VALUE* rb_exception_result,
60
+ const char** exception_message) {
61
+ VALUE rb_block_encryption = rb_hash_aref(rb_opts, ID2SYM(rb_intern("block_encryption")));
62
+ VALUE rb_key_transport = rb_hash_aref(rb_opts, ID2SYM(rb_intern("key_transport")));
63
+ memset(options, 0, sizeof(XmlEncOptions));
64
+
65
+ if (NIL_P(rb_block_encryption) ||
66
+ TYPE(rb_block_encryption) != T_STRING ||
67
+ NIL_P(rb_key_transport) ||
68
+ TYPE(rb_key_transport) != T_STRING) {
69
+ *rb_exception_result = rb_eArgError;
70
+ *exception_message = "Must supply :block_encryption & :key_transport";
71
+ return FALSE;
72
+ }
73
+
74
+ char* blockEncryptionValue = RSTRING_PTR(rb_block_encryption);
75
+ int blockEncryptionLen = RSTRING_LEN(rb_block_encryption);
76
+ char* keyTransportValue = RSTRING_PTR(rb_key_transport);
77
+ int keyTransportLen = RSTRING_LEN(rb_key_transport);
78
+
79
+ if (strncmp(AES256_CBC, blockEncryptionValue, blockEncryptionLen) == 0) {
80
+ options->block_encryption = xmlSecTransformAes256CbcId;
81
+ options->key_type = "aes";
82
+ options->key_bits = 256;
83
+ } else if (strncmp(AES128_CBC, blockEncryptionValue, blockEncryptionLen) == 0) {
84
+ options->block_encryption = xmlSecTransformAes128CbcId;
85
+ options->key_type = "aes";
86
+ options->key_bits = 128;
87
+ } else if (strncmp(AES192_CBC, blockEncryptionValue, blockEncryptionLen) == 0) {
88
+ options->block_encryption = xmlSecTransformAes192CbcId;
89
+ options->key_type = "aes";
90
+ options->key_bits = 192;
91
+ } else if (strncmp(TRIPLEDES_CBC, blockEncryptionValue, blockEncryptionLen) == 0) {
92
+ options->block_encryption = xmlSecTransformDes3CbcId;
93
+ options->key_type = "des";
94
+ options->key_bits = 192;
95
+ } else if (strncmp(GCM256_CBC, blockEncryptionValue, blockEncryptionLen) == 0) {
96
+ options->block_encryption = xmlSecTransformAes256GcmId;
97
+ options->key_type = "aes";
98
+ options->key_bits = 256;
99
+ } else if (strncmp(GCM128_CBC, blockEncryptionValue, blockEncryptionLen) == 0) {
100
+ options->block_encryption = xmlSecTransformAes128GcmId;
101
+ options->key_type = "aes";
102
+ options->key_bits = 128;
103
+ } else if (strncmp(GCM192_CBC, blockEncryptionValue, blockEncryptionLen) == 0) {
104
+ options->block_encryption = xmlSecTransformAes192GcmId;
105
+ options->key_type = "aes";
106
+ options->key_bits = 192;
107
+ } else {
108
+ *rb_exception_result = rb_eArgError;
109
+ *exception_message = "Unknown :block_encryption value";
110
+ return FALSE;
111
+ }
112
+
113
+ if (strncmp(RSA1_5, keyTransportValue, keyTransportLen) == 0) {
114
+ options->key_transport = xmlSecTransformRsaPkcs1Id;
115
+ } else if (strncmp(RSA_OAEP_MGF1P, keyTransportValue, keyTransportLen) == 0) {
116
+ options->key_transport = xmlSecTransformRsaOaepId;
117
+ } else {
118
+ *rb_exception_result = rb_eArgError;
119
+ *exception_message = "Unknown :key_transport value";
120
+ return FALSE;
121
+ }
122
+
123
+ return TRUE;
124
+ }
125
+
126
+ xmlSecTransformId GetSignatureMethod(VALUE rb_signature_alg,
127
+ VALUE* rb_exception_result,
128
+ const char** exception_message) {
129
+ const char* signatureAlgorithm = RSTRING_PTR(rb_signature_alg);
130
+ unsigned int signatureAlgorithmLength = RSTRING_LEN(rb_signature_alg);
131
+
132
+ if (strncmp(RSA_SHA1, signatureAlgorithm, signatureAlgorithmLength) == 0) {
133
+ return xmlSecTransformRsaSha1Id;
134
+ } else if (strncmp(RSA_SHA224, signatureAlgorithm, signatureAlgorithmLength) == 0) {
135
+ return xmlSecTransformRsaSha224Id;
136
+ } else if (strncmp(RSA_SHA256, signatureAlgorithm, signatureAlgorithmLength) == 0) {
137
+ return xmlSecTransformRsaSha256Id;
138
+ } else if (strncmp(RSA_SHA384, signatureAlgorithm, signatureAlgorithmLength) == 0) {
139
+ return xmlSecTransformRsaSha384Id;
140
+ } else if (strncmp(RSA_SHA512, signatureAlgorithm, signatureAlgorithmLength) == 0) {
141
+ return xmlSecTransformRsaSha512Id;
142
+
143
+ }
144
+ #if HAS_ECDSA
145
+ else if (strncmp(ECDSA_SHA1, signatureAlgorithm, signatureAlgorithmLength) == 0) {
146
+ return xmlSecTransformEcdsaSha1Id;
147
+ } else if (strncmp(ECDSA_SHA224, signatureAlgorithm, signatureAlgorithmLength) == 0) {
148
+ return xmlSecTransformEcdsaSha224Id;
149
+ } else if (strncmp(ECDSA_SHA256, signatureAlgorithm, signatureAlgorithmLength) == 0) {
150
+ return xmlSecTransformEcdsaSha256Id;
151
+ } else if (strncmp(ECDSA_SHA384, signatureAlgorithm, signatureAlgorithmLength) == 0) {
152
+ return xmlSecTransformEcdsaSha384Id;
153
+ } else if (strncmp(ECDSA_SHA512, signatureAlgorithm, signatureAlgorithmLength) == 0) {
154
+ return xmlSecTransformEcdsaSha512Id;
155
+ } else if (strncmp(DSA_SHA1, signatureAlgorithm, signatureAlgorithmLength) == 0) {
156
+ return xmlSecTransformDsaSha1Id;
157
+ } else if (strncmp(DSA_SHA256, signatureAlgorithm, signatureAlgorithmLength) == 0) {
158
+ return xmlSecTransformDsaSha256Id;
159
+ }
160
+ #endif // HAS_ECDSA
161
+
162
+ *rb_exception_result = rb_eArgError;
163
+ *exception_message = "Unknown :signature_alg";
164
+ return xmlSecTransformIdUnknown;
165
+ }
166
+
167
+ xmlSecTransformId GetDigestMethod(VALUE rb_digest_alg,
168
+ VALUE* rb_exception_result,
169
+ const char** exception_message) {
170
+ const char* digestAlgorithm = RSTRING_PTR(rb_digest_alg);
171
+ unsigned int digestAlgorithmLength = RSTRING_LEN(rb_digest_alg);
172
+
173
+ if (strncmp(DIGEST_SHA1, digestAlgorithm, digestAlgorithmLength) == 0) {
174
+ return xmlSecTransformSha1Id;
175
+ } else if (strncmp(DIGEST_SHA224, digestAlgorithm, digestAlgorithmLength) == 0) {
176
+ return xmlSecTransformSha224Id;
177
+ } else if (strncmp(DIGEST_SHA256, digestAlgorithm, digestAlgorithmLength) == 0) {
178
+ return xmlSecTransformSha256Id;
179
+ } else if (strncmp(DIGEST_SHA384, digestAlgorithm, digestAlgorithmLength) == 0) {
180
+ return xmlSecTransformSha384Id;
181
+ } else if (strncmp(DIGEST_SHA512, digestAlgorithm, digestAlgorithmLength) == 0) {
182
+ return xmlSecTransformSha512Id;
183
+ }
184
+
185
+ *rb_exception_result = rb_eArgError;
186
+ *exception_message = "Unknown :digest_algorithm";
187
+ return xmlSecTransformIdUnknown;
188
+ }
189
+
190
+ xmlSecTransformId GetCanonicalizationMethod(VALUE rb_canon_alg,
191
+ VALUE *rb_exception_result,
192
+ const char **exception_message){
193
+ const char *canonAlgorithm = RSTRING_PTR(rb_canon_alg);
194
+ unsigned int canonAlgorithmLength = RSTRING_LEN(rb_canon_alg);
195
+
196
+ if (strncmp(C14N, canonAlgorithm, canonAlgorithmLength) == 0){
197
+ return xmlSecTransformInclC14NId;
198
+ }else if (strncmp(C14N_WITH_COMMENTS, canonAlgorithm, canonAlgorithmLength) == 0){
199
+ return xmlSecTransformInclC14NWithCommentsId;
200
+ }else if (strncmp(EXCL_C14N, canonAlgorithm, canonAlgorithmLength) == 0){
201
+ return xmlSecTransformExclC14NId;
202
+ } else if (strncmp(EXCL_C14N_WITH_COMMENTS, canonAlgorithm, canonAlgorithmLength) == 0){
203
+ return xmlSecTransformExclC14NWithCommentsId;
204
+ }
205
+
206
+ *rb_exception_result = rb_eArgError;
207
+ *exception_message = "Unknown :canon_alg";
208
+ return xmlSecTransformIdUnknown;
209
+ }
@@ -0,0 +1,38 @@
1
+ #ifndef NOKOGIRI_EXT_XMLSEC_OPTIONS_H
2
+ #define NOKOGIRI_EXT_XMLSEC_OPTIONS_H
3
+
4
+ #include "common.h"
5
+
6
+ #include <ruby.h>
7
+ #include <xmlsec/crypto.h>
8
+
9
+ typedef struct {
10
+ // From :block_encryption
11
+ xmlSecTransformId block_encryption;
12
+ const char* key_type;
13
+ int key_bits;
14
+
15
+ // From :key_transport
16
+ xmlSecTransformId key_transport;
17
+ } XmlEncOptions;
18
+
19
+ // Supported algorithms taken from #5.1 of
20
+ // http://www.w3.org/TR/xmlenc-core
21
+ //
22
+ // For options, only use the URL fragment (stuff post #)
23
+ // since that's unique enough and it removes a lot of typing.
24
+ BOOL GetXmlEncOptions(VALUE rb_opts, XmlEncOptions* options,
25
+ VALUE* rb_exception_result,
26
+ const char** exception_message);
27
+
28
+ // XML DSIG helpers.
29
+ xmlSecTransformId GetSignatureMethod(VALUE rb_method,
30
+ VALUE* rb_exception_result,
31
+ const char** exception_message);
32
+ xmlSecTransformId GetDigestMethod(VALUE rb_digest_method,
33
+ VALUE *rb_exception_result,
34
+ const char **exception_message);
35
+ xmlSecTransformId GetCanonicalizationMethod(VALUE rb_canonicalization_method,
36
+ VALUE *rb_exception_result,
37
+ const char **exception_message);
38
+ #endif // NOKOGIRI_EXT_XMLSEC_OPTIONS_H
@@ -0,0 +1,12 @@
1
+ #include "xmlsecrb.h"
2
+
3
+ /* not actually called anywhere right now, but here for posterity */
4
+ void Shutdown_xmlsecrb() {
5
+ xmlSecCryptoShutdown();
6
+ xmlSecCryptoAppShutdown();
7
+ xmlSecShutdown();
8
+ xsltCleanupGlobals();
9
+ #ifndef XMLSEC_NO_XSLT
10
+ xsltCleanupGlobals();
11
+ #endif /* XMLSEC_NO_XSLT */
12
+ }
@@ -0,0 +1,140 @@
1
+ #include "util.h"
2
+
3
+ #include <xmlsec/errors.h>
4
+
5
+ xmlSecKeysMngrPtr createKeyManagerWithSingleKey(
6
+ char* keyStr,
7
+ unsigned int keyLength,
8
+ char *keyName,
9
+ VALUE* rb_exception_result_out,
10
+ const char** exception_message_out) {
11
+ VALUE rb_exception_result = Qnil;
12
+ const char* exception_message = NULL;
13
+ xmlSecKeysMngrPtr mngr = NULL;
14
+ xmlSecKeyPtr key = NULL;
15
+
16
+ /* create and initialize keys manager, we use a simple list based
17
+ * keys manager, implement your own xmlSecKeysStore klass if you need
18
+ * something more sophisticated
19
+ */
20
+ mngr = xmlSecKeysMngrCreate();
21
+ if(mngr == NULL) {
22
+ rb_exception_result = rb_eDecryptionError;
23
+ exception_message = "failed to create keys manager.";
24
+ goto done;
25
+ }
26
+ if(xmlSecCryptoAppDefaultKeysMngrInit(mngr) < 0) {
27
+ rb_exception_result = rb_eDecryptionError;
28
+ exception_message = "failed to initialize keys manager.";
29
+ goto done;
30
+ }
31
+
32
+ /* load private RSA key */
33
+ key = xmlSecCryptoAppKeyLoadMemory((xmlSecByte *)keyStr,
34
+ keyLength,
35
+ xmlSecKeyDataFormatPem,
36
+ NULL, // the key file password
37
+ NULL, // the key password callback
38
+ NULL);// the user context for password callback
39
+ if(key == NULL) {
40
+ rb_exception_result = rb_eDecryptionError;
41
+ exception_message = "failed to load rsa key";
42
+ goto done;
43
+ }
44
+
45
+ if(xmlSecKeySetName(key, BAD_CAST keyName) < 0) {
46
+ rb_exception_result = rb_eDecryptionError;
47
+ exception_message = "failed to set key name";
48
+ goto done;
49
+ }
50
+
51
+ /* add key to keys manager, from now on keys manager is responsible
52
+ * for destroying key
53
+ */
54
+ if(xmlSecCryptoAppDefaultKeysMngrAdoptKey(mngr, key) < 0) {
55
+ rb_exception_result = rb_eDecryptionError;
56
+ exception_message = "failed to add key to keys manager";
57
+ goto done;
58
+ }
59
+
60
+ done:
61
+ if(rb_exception_result != Qnil) {
62
+ if (key) {
63
+ xmlSecKeyDestroy(key);
64
+ }
65
+
66
+ if (mngr) {
67
+ xmlSecKeysMngrDestroy(mngr);
68
+ mngr = NULL;
69
+ }
70
+ }
71
+
72
+ *rb_exception_result_out = rb_exception_result;
73
+ *exception_message_out = exception_message;
74
+ return mngr;
75
+ }
76
+
77
+ xmlSecDSigCtxPtr createDSigContext(xmlSecKeysMngrPtr keyManager) {
78
+ xmlSecDSigCtxPtr dsigCtx = xmlSecDSigCtxCreate(keyManager);
79
+ if (!dsigCtx) {
80
+ return NULL;
81
+ }
82
+
83
+ // Restrict ReferenceUris to same document or empty to avoid XXE attacks.
84
+ dsigCtx->enabledReferenceUris = xmlSecTransformUriTypeEmpty |
85
+ xmlSecTransformUriTypeSameDocument;
86
+
87
+ return dsigCtx;
88
+ }
89
+
90
+ #define ERROR_STACK_SIZE 4096
91
+ static char g_errorStack[ERROR_STACK_SIZE];
92
+ static size_t g_errorStackPos;
93
+
94
+ char* getXmlSecLastError() {
95
+ return g_errorStack;
96
+ }
97
+
98
+ int hasXmlSecLastError() {
99
+ return g_errorStack[0] != '\0';
100
+ }
101
+
102
+ void resetXmlSecError() {
103
+ g_errorStack[0] = '\0';
104
+ g_errorStackPos = 0;
105
+ xmlSecErrorsSetCallback(storeErrorCallback);
106
+ }
107
+
108
+ void storeErrorCallback(const char *file,
109
+ int line,
110
+ const char *func,
111
+ const char *errorObject,
112
+ const char *errorSubject,
113
+ int reason,
114
+ const char *msg) {
115
+ int i = 0;
116
+ const char* error_msg = NULL;
117
+ int amt = 0;
118
+ if (g_errorStackPos >= ERROR_STACK_SIZE) {
119
+ // Just bail. Earlier errors are more interesting usually anyway.
120
+ return;
121
+ }
122
+
123
+ for(i = 0; (i < XMLSEC_ERRORS_MAX_NUMBER) && (xmlSecErrorsGetMsg(i) != NULL); ++i) {
124
+ if(xmlSecErrorsGetCode(i) == reason) {
125
+ error_msg = xmlSecErrorsGetMsg(i);
126
+ break;
127
+ }
128
+ }
129
+
130
+ amt = snprintf(
131
+ &g_errorStack[g_errorStackPos],
132
+ ERROR_STACK_SIZE - g_errorStackPos,
133
+ "func=%s:file=%s:line=%d:obj=%s:subj=%s:error=%d:%s:%s\n",
134
+ func, file, line, errorObject, errorSubject, reason,
135
+ error_msg ? error_msg : "", msg);
136
+
137
+ if (amt > 0) {
138
+ g_errorStackPos += amt;
139
+ }
140
+ }
@@ -0,0 +1,42 @@
1
+ #ifndef NOKOGIRI_EXT_XMLSEC_UTIL_H
2
+ #define NOKOGIRI_EXT_XMLSEC_UTIL_H
3
+
4
+ #include "xmlsecrb.h"
5
+
6
+ // Constructs a xmlSecKeysMngr and adds the given named key to the manager.
7
+ //
8
+ // Caller takes ownership. Free with xmlSecKeysMngrDestroy().
9
+ xmlSecKeysMngrPtr createKeyManagerWithSingleKey(
10
+ char* keyStr,
11
+ unsigned int keyLength,
12
+ char *keyName,
13
+ VALUE* rb_exception_result_out,
14
+ const char** exception_message_out);
15
+
16
+ // Creates a xmlSecDSigCtx with defaults locked down to prevent XXE.
17
+ //
18
+ // Caller takes ownership of the context. Free with xmlSecDSigCtxDestroy().
19
+ xmlSecDSigCtxPtr createDSigContext(xmlSecKeysMngrPtr keyManager);
20
+
21
+ // Retrieves the recorded error strings from libxmlsec1. Ensure resetXmlSecError()
22
+ // is called at the start of the range of error collection.
23
+ char* getXmlSecLastError();
24
+
25
+ // Reset the recording of errors. After this getXmlSecLastError() will return
26
+ // an empty string. Call at the start of a logical interaction with libxmlsec.
27
+ void resetXmlSecError();
28
+
29
+ // Return false if there are no errors. If false, getXmlSecLastError() will
30
+ // return an empty string.
31
+ int hasXmlSecLastError();
32
+
33
+ // Error reporting hooks to redirect Xmlsec1 library errors away from stdout.
34
+ void storeErrorCallback(const char *file,
35
+ int line,
36
+ const char *func,
37
+ const char *errorObject,
38
+ const char *errorSubject,
39
+ int reason,
40
+ const char *msg);
41
+
42
+ #endif // NOKOGIRI_EXT_XMLSEC_UTIL_H
@@ -0,0 +1,49 @@
1
+ #ifndef NOKOGIRI_EXT_XMLSEC_XMLSECRB_H
2
+ #define NOKOGIRI_EXT_XMLSEC_XMLSECRB_H
3
+
4
+ #include "common.h"
5
+
6
+ #include <ruby.h>
7
+
8
+ #include <libxml/tree.h>
9
+ #include <libxml/xmlmemory.h>
10
+ #include <libxml/parser.h>
11
+ #include <libxml/xmlstring.h>
12
+
13
+ #include <libxslt/xslt.h>
14
+
15
+ #include <xmlsec/xmlsec.h>
16
+ #include <xmlsec/xmltree.h>
17
+ #include <xmlsec/xmldsig.h>
18
+ #include <xmlsec/xmlenc.h>
19
+ #include <xmlsec/templates.h>
20
+ #include <xmlsec/crypto.h>
21
+ #include <xmlsec/errors.h>
22
+
23
+ #include <nokogiri.h>
24
+ // Lifted from modern nokogiri.h
25
+ #ifndef Noko_Node_Get_Struct
26
+ #define Noko_Node_Get_Struct(obj,type,sval) ((sval) = (type*)DATA_PTR(obj))
27
+ #endif
28
+
29
+ // TODO(awong): Support non-gcc and non-clang compilers.
30
+ #define EXTENSION_EXPORT __attribute__((visibility("default")))
31
+
32
+ VALUE sign(VALUE self, VALUE rb_opts);
33
+ VALUE verify_with(VALUE self, VALUE rb_opts);
34
+ VALUE encrypt_with_key(VALUE self, VALUE rb_rsa_key_name, VALUE rb_rsa_key,
35
+ VALUE rb_opts);
36
+ VALUE decrypt_with_key(VALUE self, VALUE rb_key_name, VALUE rb_key);
37
+ VALUE set_id_attribute(VALUE self, VALUE rb_attr_name);
38
+ VALUE get_id(VALUE self, VALUE rb_id);
39
+
40
+ void Init_Nokogiri_ext(void);
41
+
42
+ extern VALUE rb_cNokogiri_XML_Document;
43
+ extern VALUE rb_eSigningError;
44
+ extern VALUE rb_eVerificationError;
45
+ extern VALUE rb_eKeystoreError;
46
+ extern VALUE rb_eEncryptionError;
47
+ extern VALUE rb_eDecryptionError;
48
+
49
+ #endif // NOKOGIRI_EXT_XMLSEC_XMLSECRB_H
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Xmlsec
4
- VERSION = "0.11.0"
4
+ VERSION = "0.12.0"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nokogiri-xmlsec-instructure
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.11.0
4
+ version: 0.12.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Albert J. Wong
8
8
  - Cody Cutrer
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2025-07-28 00:00:00.000000000 Z
11
+ date: 1980-01-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: nokogiri
@@ -41,9 +41,22 @@ extensions:
41
41
  - ext/nokogiri_ext_xmlsec/extconf.rb
42
42
  extra_rdoc_files: []
43
43
  files:
44
+ - ext/nokogiri_ext_xmlsec/common.h
44
45
  - ext/nokogiri_ext_xmlsec/extconf.rb
46
+ - ext/nokogiri_ext_xmlsec/init.c
47
+ - ext/nokogiri_ext_xmlsec/nokogiri_decrypt_with_key.c
48
+ - ext/nokogiri_ext_xmlsec/nokogiri_encrypt_with_key.c
49
+ - ext/nokogiri_ext_xmlsec/nokogiri_helpers_set_attribute_id.c
50
+ - ext/nokogiri_ext_xmlsec/nokogiri_init.c
51
+ - ext/nokogiri_ext_xmlsec/nokogiri_sign.c
52
+ - ext/nokogiri_ext_xmlsec/nokogiri_verify_with.c
53
+ - ext/nokogiri_ext_xmlsec/options.c
54
+ - ext/nokogiri_ext_xmlsec/options.h
55
+ - ext/nokogiri_ext_xmlsec/shutdown.c
56
+ - ext/nokogiri_ext_xmlsec/util.c
57
+ - ext/nokogiri_ext_xmlsec/util.h
58
+ - ext/nokogiri_ext_xmlsec/xmlsecrb.h
45
59
  - lib/nokogiri-xmlsec.rb
46
- - lib/nokogiri_ext_xmlsec.bundle
47
60
  - lib/xmlsec.rb
48
61
  - lib/xmlsec/version.rb
49
62
  homepage: https://github.com/instructure/nokogiri-xmlsec-instructure
@@ -65,7 +78,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
65
78
  - !ruby/object:Gem::Version
66
79
  version: '0'
67
80
  requirements: []
68
- rubygems_version: 3.6.2
81
+ rubygems_version: 3.6.7
69
82
  specification_version: 4
70
83
  summary: Wrapper around http://www.aleksey.com/xmlsec to support XML encryption, decryption,
71
84
  signing and signature validation in Ruby
Binary file