xmlsec 0.0.4 → 0.0.5
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.
- data/ext/xmlsec/sign.c +9 -4
- data/ext/xmlsec/verify.c +42 -10
- data/lib/xmlsec/version.rb +1 -1
- data/spec/assets/signed.test.xml +17 -5
- metadata +2 -2
data/ext/xmlsec/sign.c
CHANGED
@@ -19,7 +19,7 @@ static VALUE xmlsec_sign(VALUE self, xmlDocPtr doc, VALUE key_file, VALUE passwo
|
|
19
19
|
|
20
20
|
/* create signature template for RSA-SHA1 enveloped signature */
|
21
21
|
signNode = xmlSecTmplSignatureCreate( doc,
|
22
|
-
|
22
|
+
xmlSecTransformInclC14NWithCommentsId,
|
23
23
|
xmlSecTransformRsaSha1Id,
|
24
24
|
NULL
|
25
25
|
);
|
@@ -46,7 +46,7 @@ static VALUE xmlsec_sign(VALUE self, xmlDocPtr doc, VALUE key_file, VALUE passwo
|
|
46
46
|
refNode = xmlSecTmplSignatureAddReference(signNode,
|
47
47
|
xmlSecTransformSha1Id,
|
48
48
|
NULL,
|
49
|
-
|
49
|
+
"\0",
|
50
50
|
NULL);
|
51
51
|
if(refNode == NULL) {
|
52
52
|
if(doc != NULL) xmlFreeDoc(doc);
|
@@ -76,6 +76,11 @@ static VALUE xmlsec_sign(VALUE self, xmlDocPtr doc, VALUE key_file, VALUE passwo
|
|
76
76
|
rb_raise(rb_eRuntimeError, "Error: failed to add X509Data node\n");
|
77
77
|
return Qnil;
|
78
78
|
}
|
79
|
+
if(xmlSecTmplKeyInfoAddKeyValue(keyInfoNode) == NULL) {
|
80
|
+
if(doc != NULL) xmlFreeDoc(doc);
|
81
|
+
rb_raise(rb_eRuntimeError, "Error: failed to add KeyValue node\n");
|
82
|
+
return Qnil;
|
83
|
+
}
|
79
84
|
}
|
80
85
|
|
81
86
|
/* create signature context, we don't need keys manager in this example */
|
@@ -162,7 +167,7 @@ static VALUE rb_xmlsec_sign(VALUE self, VALUE template, VALUE key_file, VALUE pa
|
|
162
167
|
rb_raise(rb_eRuntimeError, "Error: unable to parse template.");
|
163
168
|
return Qnil;
|
164
169
|
}
|
165
|
-
return xmlsec_sign(self, doc, key_file, password, x509_file,node_name );
|
170
|
+
return xmlsec_sign(self, doc, key_file, password, x509_file, node_name );
|
166
171
|
}
|
167
172
|
|
168
173
|
|
@@ -171,4 +176,4 @@ void init_xmlsec_sign() {
|
|
171
176
|
rb_define_singleton_method(mXmlSec, "sign_file", rb_xmlsec_sign_file, 5);
|
172
177
|
rb_define_singleton_method(mXmlSec, "sign", rb_xmlsec_sign, 5);
|
173
178
|
|
174
|
-
}
|
179
|
+
}
|
data/ext/xmlsec/verify.c
CHANGED
@@ -6,8 +6,10 @@ extern VALUE mXmlSec, cXmlSecError;
|
|
6
6
|
|
7
7
|
VALUE xmlsec_is_valid_by_x509_file(VALUE self, xmlDocPtr doc, VALUE x509_file ) {
|
8
8
|
xmlSecKeysMngrPtr mngr;
|
9
|
+
VALUE v;
|
9
10
|
xmlNodePtr node = NULL;
|
10
11
|
xmlSecDSigCtxPtr dsigCtx = NULL;
|
12
|
+
long i;
|
11
13
|
|
12
14
|
mngr = xmlSecKeysMngrCreate();
|
13
15
|
|
@@ -23,15 +25,32 @@ VALUE xmlsec_is_valid_by_x509_file(VALUE self, xmlDocPtr doc, VALUE x509_file )
|
|
23
25
|
rb_raise(rb_eRuntimeError, "Error: failed to initialize keys manager.\n");
|
24
26
|
return Qnil;
|
25
27
|
}
|
28
|
+
if (TYPE(x509_file) == T_STRING){
|
29
|
+
/* load trusted cert */
|
30
|
+
if(xmlSecCryptoAppKeysMngrCertLoad(mngr, StringValuePtr(x509_file), xmlSecKeyDataFormatPem, xmlSecKeyDataTypeTrusted) < 0) {
|
31
|
+
if(doc != NULL) xmlFreeDoc(doc);
|
32
|
+
if(mngr != NULL) xmlSecKeysMngrDestroy(mngr);
|
33
|
+
rb_raise(rb_eRuntimeError, "Error: failed to load pem certificate from \"%s\"\n", StringValuePtr(x509_file));
|
34
|
+
return Qnil;
|
35
|
+
}
|
36
|
+
}
|
37
|
+
if (TYPE(x509_file) == T_ARRAY) {
|
38
|
+
for (i =0; i < RARRAY_LEN(x509_file); i++) {
|
39
|
+
v = rb_ary_entry(x509_file, i);
|
40
|
+
StringValue(v);
|
41
|
+
if(xmlSecCryptoAppKeysMngrCertLoad(mngr, RSTRING_PTR(v), xmlSecKeyDataFormatPem, xmlSecKeyDataTypeTrusted) < 0) {
|
42
|
+
if(doc != NULL) xmlFreeDoc(doc);
|
43
|
+
if(mngr != NULL) xmlSecKeysMngrDestroy(mngr);
|
44
|
+
rb_raise(rb_eRuntimeError, "Error: failed to load pem certificate from \"%s\"\n", RSTRING_PTR(v));
|
45
|
+
return Qnil;
|
46
|
+
}
|
47
|
+
|
48
|
+
}
|
49
|
+
//rb_ary_entry
|
26
50
|
|
27
|
-
/* load trusted cert */
|
28
|
-
if(xmlSecCryptoAppKeysMngrCertLoad(mngr, StringValuePtr(x509_file), xmlSecKeyDataFormatPem, xmlSecKeyDataTypeTrusted) < 0) {
|
29
|
-
if(doc != NULL) xmlFreeDoc(doc);
|
30
|
-
if(mngr != NULL) xmlSecKeysMngrDestroy(mngr);
|
31
|
-
rb_raise(rb_eRuntimeError, "Error: failed to load pem certificate from \"%s\"\n", StringValuePtr(x509_file));
|
32
|
-
return Qnil;
|
33
51
|
}
|
34
52
|
|
53
|
+
|
35
54
|
/* find start node */
|
36
55
|
node = xmlSecFindNode(xmlDocGetRootElement(doc), xmlSecNodeSignature, xmlSecDSigNs);
|
37
56
|
if(node == NULL) {
|
@@ -49,6 +68,9 @@ VALUE xmlsec_is_valid_by_x509_file(VALUE self, xmlDocPtr doc, VALUE x509_file )
|
|
49
68
|
return Qnil;
|
50
69
|
}
|
51
70
|
|
71
|
+
/* limit the Reference URI attributes to empty or NULL */
|
72
|
+
dsigCtx->enabledReferenceUris = xmlSecTransformUriTypeEmpty;
|
73
|
+
|
52
74
|
/* Verify signature */
|
53
75
|
if(xmlSecDSigCtxVerify(dsigCtx, node) < 0) {
|
54
76
|
if(dsigCtx != NULL) xmlSecDSigCtxDestroy(dsigCtx);
|
@@ -92,6 +114,7 @@ VALUE xmlsec_is_valid(VALUE self, xmlDocPtr doc) {
|
|
92
114
|
rb_raise(rb_eRuntimeError, "Error: failed to create signature context\n");
|
93
115
|
return Qnil;
|
94
116
|
}
|
117
|
+
dsigCtx->enabledReferenceUris = xmlSecTransformUriTypeEmpty;
|
95
118
|
|
96
119
|
/* Verify signature */
|
97
120
|
if(xmlSecDSigCtxVerify(dsigCtx, node) < 0) {
|
@@ -133,6 +156,7 @@ VALUE xmlsec_is_valid_by_key(VALUE self, xmlDocPtr doc, VALUE key_file ) {
|
|
133
156
|
rb_raise(rb_eRuntimeError, "Error: failed to create signature context\n");
|
134
157
|
return Qnil;
|
135
158
|
}
|
159
|
+
dsigCtx->enabledReferenceUris = xmlSecTransformUriTypeEmpty;
|
136
160
|
|
137
161
|
/* load public key */
|
138
162
|
dsigCtx->signKey = xmlSecCryptoAppKeyLoad(StringValuePtr(key_file), xmlSecKeyDataFormatPem, NULL, NULL, NULL);
|
@@ -177,7 +201,7 @@ static VALUE rb_xmlsec_is_valid_file(VALUE self, VALUE template_file, VALUE key_
|
|
177
201
|
doc = xmlParseFile(StringValuePtr(template_file));
|
178
202
|
|
179
203
|
if ((doc == NULL) || (xmlDocGetRootElement(doc) == NULL)) {
|
180
|
-
rb_raise(rb_eRuntimeError, "Error: unable to parse
|
204
|
+
rb_raise(rb_eRuntimeError, "Error: unable to parse template file.");
|
181
205
|
return Qnil;
|
182
206
|
}
|
183
207
|
if (! NIL_P(x509_file)) return xmlsec_is_valid_by_x509_file(self, doc, x509_file );
|
@@ -187,6 +211,11 @@ static VALUE rb_xmlsec_is_valid_file(VALUE self, VALUE template_file, VALUE key_
|
|
187
211
|
|
188
212
|
static VALUE rb_xmlsec_is_valid(VALUE self, VALUE template, VALUE key_file, VALUE x509_file ) {
|
189
213
|
xmlDocPtr doc;
|
214
|
+
|
215
|
+
if (TYPE(template) != T_STRING){
|
216
|
+
rb_raise(rb_eRuntimeError, "Error: Wrong template type");
|
217
|
+
}
|
218
|
+
|
190
219
|
doc = xmlReadMemory(
|
191
220
|
StringValuePtr(template),
|
192
221
|
RSTRING_LEN(template),
|
@@ -194,13 +223,16 @@ static VALUE rb_xmlsec_is_valid(VALUE self, VALUE template, VALUE key_file, VALU
|
|
194
223
|
NULL,
|
195
224
|
0
|
196
225
|
);
|
226
|
+
|
197
227
|
if ((doc == NULL) || (xmlDocGetRootElement(doc) == NULL)){
|
198
|
-
rb_raise(rb_eRuntimeError, "Error: unable to parse
|
228
|
+
rb_raise(rb_eRuntimeError, "Error: unable to parse template %s.", StringValuePtr(template));
|
229
|
+
|
230
|
+
rb_raise(rb_eRuntimeError, "Error: unable to parse template.");
|
199
231
|
return Qnil;
|
200
232
|
}
|
201
233
|
if (! NIL_P(x509_file)) return xmlsec_is_valid_by_x509_file(self, doc, x509_file );
|
202
234
|
if (! NIL_P(key_file)) return xmlsec_is_valid_by_key(self, doc, key_file);
|
203
|
-
return xmlsec_is_valid(self, doc);
|
235
|
+
//return xmlsec_is_valid(self, doc);
|
204
236
|
}
|
205
237
|
|
206
238
|
|
@@ -209,4 +241,4 @@ void init_xmlsec_verify(){
|
|
209
241
|
rb_define_singleton_method(mXmlSec, "valid_file?", rb_xmlsec_is_valid_file, 3);
|
210
242
|
rb_define_singleton_method(mXmlSec, "valid?", rb_xmlsec_is_valid, 3);
|
211
243
|
|
212
|
-
}
|
244
|
+
}
|
data/lib/xmlsec/version.rb
CHANGED
data/spec/assets/signed.test.xml
CHANGED
@@ -13,9 +13,9 @@
|
|
13
13
|
</Data>
|
14
14
|
<Security><Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
|
15
15
|
<SignedInfo>
|
16
|
-
<CanonicalizationMethod Algorithm="http://www.w3.org/2001/
|
16
|
+
<CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments"/>
|
17
17
|
<SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
|
18
|
-
<Reference>
|
18
|
+
<Reference URI="">
|
19
19
|
<Transforms>
|
20
20
|
<Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
|
21
21
|
</Transforms>
|
@@ -23,9 +23,9 @@
|
|
23
23
|
<DigestValue>cWRQ7e5Hp3G/m+AsreGhIefcB0A=</DigestValue>
|
24
24
|
</Reference>
|
25
25
|
</SignedInfo>
|
26
|
-
<SignatureValue>
|
27
|
-
|
28
|
-
|
26
|
+
<SignatureValue>VNdXZlm1D88wXUjJq6SaG+BrOTbRZeQRrO1bY/4vvJ0lKAQE2xJ+O/LV6XpVQM+f
|
27
|
+
1DhHisEM/rqXgXN1AcT9/jFCakdhGINY7p0y2k2ZjNkZebd43xNJylwP4HCepIVx
|
28
|
+
vXo1sUr7/c7Lovb+5sP5aTVD/6vvr6kWQRbhuhrHCjg=</SignatureValue>
|
29
29
|
<KeyInfo>
|
30
30
|
<X509Data>
|
31
31
|
<X509Certificate>MIIB+zCCAWQCCQCNDSfdaw1XODANBgkqhkiG9w0BAQUFADBCMQswCQYDVQQGEwJY
|
@@ -40,5 +40,17 @@ JZKuMzTdOBFMdJABXQ26ik4X5G3oQvLCvvfxqGoci4BnOa2TnxvpRw7g1jekjGxn
|
|
40
40
|
oxAOVnMI6cuAbNe5ydub5YeelyJGrlPEcIs+lm2GkUCRFZd4krVO4r2wptD0KP8a
|
41
41
|
5iD8CBI9Bl39pXP7k6pEM1UVPUfxyT/h7I2dpqxp+Q==</X509Certificate>
|
42
42
|
</X509Data>
|
43
|
+
<KeyValue>
|
44
|
+
<RSAKeyValue>
|
45
|
+
<Modulus>
|
46
|
+
zAkX2JwvyH6hUtXt9g7HAz/GQPe/nexZjGwVOfZtcLVR24wzSqMKUm+t+hsDrngZ
|
47
|
+
or7mYbkzrFwWJZKuMzTdOBFMdJABXQ26ik4X5G3oQvLCvvfxqGoci4BnOa2Tnxvp
|
48
|
+
Rw7g1jekjGxn393bFgOXJIi0gsjx+hcr20qLdaEnJyc=
|
49
|
+
</Modulus>
|
50
|
+
<Exponent>
|
51
|
+
AQAB
|
52
|
+
</Exponent>
|
53
|
+
</RSAKeyValue>
|
54
|
+
</KeyValue>
|
43
55
|
</KeyInfo>
|
44
56
|
</Signature></Security></Service>
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: xmlsec
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -12,7 +12,7 @@ authors:
|
|
12
12
|
autorequire:
|
13
13
|
bindir: bin
|
14
14
|
cert_chain: []
|
15
|
-
date: 2012-05
|
15
|
+
date: 2012-06-05 00:00:00.000000000 Z
|
16
16
|
dependencies:
|
17
17
|
- !ruby/object:Gem::Dependency
|
18
18
|
name: rake-compiler
|