Bug Summary

File:libxmlsec/unxlngi6.pro/misc/build/xmlsec1-1.2.14/src/transforms.c
Location:line 2192, column 2
Description:Value stored to 'inSize' is never read

Annotated Source Code

1/**
2 * XML Security Library (http://www.aleksey.com/xmlsec).
3 *
4 * The Transforms Element (http://www.w3.org/TR/xmldsig-core/#sec-Transforms)
5 *
6 * The optional Transforms element contains an ordered list of Transform
7 * elements; these describe how the signer obtained the data object that
8 * was digested.
9 *
10 * Schema Definition:
11 *
12 * <element name="Transforms" type="ds:TransformsType"/>
13 * <complexType name="TransformsType">
14 * <sequence>
15 * <element ref="ds:Transform" maxOccurs="unbounded"/>
16 * </sequence>
17 * </complexType>
18 *
19 * <element name="Transform" type="ds:TransformType"/>
20 * <complexType name="TransformType" mixed="true">
21 * <choice minOccurs="0" maxOccurs="unbounded">
22 * <any namespace="##other" processContents="lax"/>
23 * <!-- (1,1) elements from (0,unbounded) namespaces -->
24 * <element name="XPath" type="string"/>
25 * </choice>
26 * <attribute name="Algorithm" type="anyURI" use="required"/>
27 * </complexType>
28 *
29 * DTD:
30 *
31 * <!ELEMENT Transforms (Transform+)>
32 * <!ELEMENT Transform (#PCDATA|XPath %Transform.ANY;)* >
33 * <!ATTLIST Transform Algorithm CDATA #REQUIRED >
34 * <!ELEMENT XPath (#PCDATA) >
35 *
36 * This is free software; see Copyright file in the source
37 * distribution for preciese wording.
38 *
39 * Copyright (C) 2002-2003 Aleksey Sanin <aleksey@aleksey.com>
40 */
41
42#include "globals.h"
43#include <stdlib.h>
44#include <stdio.h>
45#include <string.h>
46
47#include <libxml/tree.h>
48#include <libxml/xpath.h>
49#include <libxml/xpointer.h>
50
51#include <xmlsec/xmlsec.h>
52#include <xmlsec/buffer.h>
53#include <xmlsec/xmltree.h>
54#include <xmlsec/keysdata.h>
55#include <xmlsec/keys.h>
56#include <xmlsec/keyinfo.h>
57#include <xmlsec/transforms.h>
58#include <xmlsec/base64.h>
59#include <xmlsec/io.h>
60#include <xmlsec/membuf.h>
61#include <xmlsec/parser.h>
62#include <xmlsec/errors.h>
63
64/**************************************************************************
65 *
66 * Global xmlSecTransformIds list functions
67 *
68 *************************************************************************/
69static xmlSecPtrList xmlSecAllTransformIds;
70
71
72/**
73 * xmlSecTransformIdsGet:
74 *
75 * Gets global registered transform klasses list.
76 *
77 * Returns: the pointer to list of all registered transform klasses.
78 */
79xmlSecPtrListPtr
80xmlSecTransformIdsGet(void) {
81 return(&xmlSecAllTransformIds);
82}
83
84/**
85 * xmlSecTransformIdsInit:
86 *
87 * Initializes the transform klasses. This function is called from the
88 * #xmlSecInit function and the application should not call it directly.
89 *
90 * Returns: 0 on success or a negative value if an error occurs.
91 */
92int
93xmlSecTransformIdsInit(void) {
94 int ret;
95
96 ret = xmlSecPtrListInitialize(xmlSecTransformIdsGet(), xmlSecTransformIdListIdxmlSecTransformIdListGetKlass());
97 if(ret < 0) {
98 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",98,__FUNCTION__,
99 NULL((void*)0),
100 "xmlSecPtrListPtrInitialize",
101 XMLSEC_ERRORS_R_XMLSEC_FAILED1,
102 "xmlSecTransformIdListId");
103 return(-1);
104 }
105
106 ret = xmlSecTransformIdsRegisterDefault();
107 if(ret < 0) {
108 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",108,__FUNCTION__,
109 NULL((void*)0),
110 "xmlSecTransformIdsRegisterDefault",
111 XMLSEC_ERRORS_R_XMLSEC_FAILED1,
112 XMLSEC_ERRORS_NO_MESSAGE" ");
113 return(-1);
114 }
115
116 return(0);
117}
118
119/**
120 * xmlSecTransformIdsShutdown:
121 *
122 * Shuts down the keys data klasses. This function is called from the
123 * #xmlSecShutdown function and the application should not call it directly.
124 */
125void
126xmlSecTransformIdsShutdown(void) {
127 xmlSecPtrListFinalize(xmlSecTransformIdsGet());
128}
129
130/**
131 * xmlSecTransformIdsRegister:
132 * @id: the transform klass.
133 *
134 * Registers @id in the global list of transform klasses.
135 *
136 * Returns: 0 on success or a negative value if an error occurs.
137 */
138int
139xmlSecTransformIdsRegister(xmlSecTransformId id) {
140 int ret;
141
142 xmlSecAssert2(id != xmlSecTransformIdUnknown, -1)if(!( id != ((xmlSecTransformId)((void*)0)) ) ) { xmlSecError
("transforms.c",142,__FUNCTION__, ((void*)0), "id != xmlSecTransformIdUnknown"
, 100, " "); return(-1); }
;
143
144 ret = xmlSecPtrListAdd(xmlSecTransformIdsGet(), (xmlSecPtr)id);
145 if(ret < 0) {
146 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",146,__FUNCTION__,
147 NULL((void*)0),
148 "xmlSecPtrListAdd",
149 XMLSEC_ERRORS_R_XMLSEC_FAILED1,
150 "transform=%s",
151 xmlSecErrorsSafeString(xmlSecTransformKlassGetName(id))((((((id)) ? ((id)->name) : ((void*)0))) != ((void*)0)) ? (
(char*)((((id)) ? ((id)->name) : ((void*)0)))) : (char*)"NULL"
)
);
152 return(-1);
153 }
154
155 return(0);
156}
157
158/**
159 * xmlSecTransformIdsRegisterDefault:
160 *
161 * Registers default (implemented by XML Security Library)
162 * transform klasses: XPath transform, Base64 transform, ...
163 *
164 * Returns: 0 on success or a negative value if an error occurs.
165 */
166int
167xmlSecTransformIdsRegisterDefault(void) {
168 if(xmlSecTransformIdsRegister(xmlSecTransformBase64IdxmlSecTransformBase64GetKlass()) < 0) {
169 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",169,__FUNCTION__,
170 NULL((void*)0),
171 "xmlSecTransformIdsRegister",
172 XMLSEC_ERRORS_R_XMLSEC_FAILED1,
173 "name=%s",
174 xmlSecErrorsSafeString(xmlSecTransformKlassGetName(xmlSecTransformBase64Id))((((((xmlSecTransformBase64GetKlass())) ? ((xmlSecTransformBase64GetKlass
())->name) : ((void*)0))) != ((void*)0)) ? ((char*)((((xmlSecTransformBase64GetKlass
())) ? ((xmlSecTransformBase64GetKlass())->name) : ((void*
)0)))) : (char*)"NULL")
);
175 return(-1);
176 }
177
178 if(xmlSecTransformIdsRegister(xmlSecTransformEnvelopedIdxmlSecTransformEnvelopedGetKlass()) < 0) {
179 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",179,__FUNCTION__,
180 NULL((void*)0),
181 "xmlSecTransformIdsRegister",
182 XMLSEC_ERRORS_R_XMLSEC_FAILED1,
183 "name=%s",
184 xmlSecErrorsSafeString(xmlSecTransformKlassGetName(xmlSecTransformEnvelopedId))((((((xmlSecTransformEnvelopedGetKlass())) ? ((xmlSecTransformEnvelopedGetKlass
())->name) : ((void*)0))) != ((void*)0)) ? ((char*)((((xmlSecTransformEnvelopedGetKlass
())) ? ((xmlSecTransformEnvelopedGetKlass())->name) : ((void
*)0)))) : (char*)"NULL")
);
185 return(-1);
186 }
187
188 /* c14n methods */
189 if(xmlSecTransformIdsRegister(xmlSecTransformInclC14NIdxmlSecTransformInclC14NGetKlass()) < 0) {
190 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",190,__FUNCTION__,
191 NULL((void*)0),
192 "xmlSecTransformIdsRegister",
193 XMLSEC_ERRORS_R_XMLSEC_FAILED1,
194 "name=%s",
195 xmlSecErrorsSafeString(xmlSecTransformKlassGetName(xmlSecTransformInclC14NId))((((((xmlSecTransformInclC14NGetKlass())) ? ((xmlSecTransformInclC14NGetKlass
())->name) : ((void*)0))) != ((void*)0)) ? ((char*)((((xmlSecTransformInclC14NGetKlass
())) ? ((xmlSecTransformInclC14NGetKlass())->name) : ((void
*)0)))) : (char*)"NULL")
);
196 return(-1);
197 }
198 if(xmlSecTransformIdsRegister(xmlSecTransformInclC14NWithCommentsIdxmlSecTransformInclC14NWithCommentsGetKlass()) < 0) {
199 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",199,__FUNCTION__,
200 NULL((void*)0),
201 "xmlSecTransformIdsRegister",
202 XMLSEC_ERRORS_R_XMLSEC_FAILED1,
203 "name=%s",
204 xmlSecErrorsSafeString(xmlSecTransformKlassGetName(xmlSecTransformInclC14NWithCommentsId))((((((xmlSecTransformInclC14NWithCommentsGetKlass())) ? ((xmlSecTransformInclC14NWithCommentsGetKlass
())->name) : ((void*)0))) != ((void*)0)) ? ((char*)((((xmlSecTransformInclC14NWithCommentsGetKlass
())) ? ((xmlSecTransformInclC14NWithCommentsGetKlass())->name
) : ((void*)0)))) : (char*)"NULL")
);
205 return(-1);
206 }
207 if(xmlSecTransformIdsRegister(xmlSecTransformInclC14N11IdxmlSecTransformInclC14N11GetKlass()) < 0) {
208 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",208,__FUNCTION__,
209 NULL((void*)0),
210 "xmlSecTransformIdsRegister",
211 XMLSEC_ERRORS_R_XMLSEC_FAILED1,
212 "name=%s",
213 xmlSecErrorsSafeString(xmlSecTransformKlassGetName(xmlSecTransformInclC14N11Id))((((((xmlSecTransformInclC14N11GetKlass())) ? ((xmlSecTransformInclC14N11GetKlass
())->name) : ((void*)0))) != ((void*)0)) ? ((char*)((((xmlSecTransformInclC14N11GetKlass
())) ? ((xmlSecTransformInclC14N11GetKlass())->name) : ((void
*)0)))) : (char*)"NULL")
);
214 return(-1);
215 }
216 if(xmlSecTransformIdsRegister(xmlSecTransformInclC14N11WithCommentsIdxmlSecTransformInclC14N11WithCommentsGetKlass()) < 0) {
217 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",217,__FUNCTION__,
218 NULL((void*)0),
219 "xmlSecTransformIdsRegister",
220 XMLSEC_ERRORS_R_XMLSEC_FAILED1,
221 "name=%s",
222 xmlSecErrorsSafeString(xmlSecTransformKlassGetName(xmlSecTransformInclC14N11WithCommentsId))((((((xmlSecTransformInclC14N11WithCommentsGetKlass())) ? ((xmlSecTransformInclC14N11WithCommentsGetKlass
())->name) : ((void*)0))) != ((void*)0)) ? ((char*)((((xmlSecTransformInclC14N11WithCommentsGetKlass
())) ? ((xmlSecTransformInclC14N11WithCommentsGetKlass())->
name) : ((void*)0)))) : (char*)"NULL")
);
223 return(-1);
224 }
225 if(xmlSecTransformIdsRegister(xmlSecTransformExclC14NIdxmlSecTransformExclC14NGetKlass()) < 0) {
226 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",226,__FUNCTION__,
227 NULL((void*)0),
228 "xmlSecTransformIdsRegister",
229 XMLSEC_ERRORS_R_XMLSEC_FAILED1,
230 "name=%s",
231 xmlSecErrorsSafeString(xmlSecTransformKlassGetName(xmlSecTransformExclC14NId))((((((xmlSecTransformExclC14NGetKlass())) ? ((xmlSecTransformExclC14NGetKlass
())->name) : ((void*)0))) != ((void*)0)) ? ((char*)((((xmlSecTransformExclC14NGetKlass
())) ? ((xmlSecTransformExclC14NGetKlass())->name) : ((void
*)0)))) : (char*)"NULL")
);
232 return(-1);
233 }
234 if(xmlSecTransformIdsRegister(xmlSecTransformExclC14NWithCommentsIdxmlSecTransformExclC14NWithCommentsGetKlass()) < 0) {
235 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",235,__FUNCTION__,
236 NULL((void*)0),
237 "xmlSecTransformIdsRegister",
238 XMLSEC_ERRORS_R_XMLSEC_FAILED1,
239 "name=%s",
240 xmlSecErrorsSafeString(xmlSecTransformKlassGetName(xmlSecTransformExclC14NWithCommentsId))((((((xmlSecTransformExclC14NWithCommentsGetKlass())) ? ((xmlSecTransformExclC14NWithCommentsGetKlass
())->name) : ((void*)0))) != ((void*)0)) ? ((char*)((((xmlSecTransformExclC14NWithCommentsGetKlass
())) ? ((xmlSecTransformExclC14NWithCommentsGetKlass())->name
) : ((void*)0)))) : (char*)"NULL")
);
241 return(-1);
242 }
243
244 if(xmlSecTransformIdsRegister(xmlSecTransformXPathIdxmlSecTransformXPathGetKlass()) < 0) {
245 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",245,__FUNCTION__,
246 NULL((void*)0),
247 "xmlSecTransformIdsRegister",
248 XMLSEC_ERRORS_R_XMLSEC_FAILED1,
249 "name=%s",
250 xmlSecErrorsSafeString(xmlSecTransformKlassGetName(xmlSecTransformXPathId))((((((xmlSecTransformXPathGetKlass())) ? ((xmlSecTransformXPathGetKlass
())->name) : ((void*)0))) != ((void*)0)) ? ((char*)((((xmlSecTransformXPathGetKlass
())) ? ((xmlSecTransformXPathGetKlass())->name) : ((void*)
0)))) : (char*)"NULL")
);
251 return(-1);
252 }
253
254 if(xmlSecTransformIdsRegister(xmlSecTransformXPath2IdxmlSecTransformXPath2GetKlass()) < 0) {
255 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",255,__FUNCTION__,
256 NULL((void*)0),
257 "xmlSecTransformIdsRegister",
258 XMLSEC_ERRORS_R_XMLSEC_FAILED1,
259 "name=%s",
260 xmlSecErrorsSafeString(xmlSecTransformKlassGetName(xmlSecTransformXPath2Id))((((((xmlSecTransformXPath2GetKlass())) ? ((xmlSecTransformXPath2GetKlass
())->name) : ((void*)0))) != ((void*)0)) ? ((char*)((((xmlSecTransformXPath2GetKlass
())) ? ((xmlSecTransformXPath2GetKlass())->name) : ((void*
)0)))) : (char*)"NULL")
);
261 return(-1);
262 }
263
264 if(xmlSecTransformIdsRegister(xmlSecTransformXPointerIdxmlSecTransformXPointerGetKlass()) < 0) {
265 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",265,__FUNCTION__,
266 NULL((void*)0),
267 "xmlSecTransformIdsRegister",
268 XMLSEC_ERRORS_R_XMLSEC_FAILED1,
269 "name=%s",
270 xmlSecErrorsSafeString(xmlSecTransformKlassGetName(xmlSecTransformXPointerId))((((((xmlSecTransformXPointerGetKlass())) ? ((xmlSecTransformXPointerGetKlass
())->name) : ((void*)0))) != ((void*)0)) ? ((char*)((((xmlSecTransformXPointerGetKlass
())) ? ((xmlSecTransformXPointerGetKlass())->name) : ((void
*)0)))) : (char*)"NULL")
);
271 return(-1);
272 }
273
274#ifndef XMLSEC_NO_XSLT1
275 if(xmlSecTransformIdsRegister(xmlSecTransformXsltId) < 0) {
276 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",276,__FUNCTION__,
277 NULL((void*)0),
278 "xmlSecTransformIdsRegister",
279 XMLSEC_ERRORS_R_XMLSEC_FAILED1,
280 "name=%s",
281 xmlSecErrorsSafeString(xmlSecTransformKlassGetName(xmlSecTransformXsltId))((((((xmlSecTransformXsltId)) ? ((xmlSecTransformXsltId)->
name) : ((void*)0))) != ((void*)0)) ? ((char*)((((xmlSecTransformXsltId
)) ? ((xmlSecTransformXsltId)->name) : ((void*)0)))) : (char
*)"NULL")
);
282 return(-1);
283 }
284#endif /* XMLSEC_NO_XSLT */
285
286 return(0);
287}
288
289/**************************************************************************
290 *
291 * utils
292 *
293 *************************************************************************/
294/**
295 * xmlSecTransformUriTypeCheck:
296 * @type: the expected URI type.
297 * @uri: the uri for checking.
298 *
299 * Checks if @uri matches expected type @type.
300 *
301 * Returns: 1 if @uri matches @type, 0 if not or a negative value
302 * if an error occurs.
303 */
304int
305xmlSecTransformUriTypeCheck(xmlSecTransformUriType type, const xmlChar* uri) {
306 xmlSecTransformUriType uriType = 0;
307
308 if((uri == NULL((void*)0)) || (xmlStrlen(uri) == 0)) {
309 uriType = xmlSecTransformUriTypeEmpty0x0001;
310 } else if(uri[0] == '#') {
311 uriType = xmlSecTransformUriTypeSameDocument0x0002;
312 } else if(xmlStrncmp(uri, BAD_CAST(xmlChar *) "file://", 7) == 0) {
313 uriType = xmlSecTransformUriTypeLocal0x0004;
314 } else {
315 uriType = xmlSecTransformUriTypeRemote0x0008;
316 }
317 return(((uriType & type) != 0) ? 1 : 0);
318}
319
320/**************************************************************************
321 *
322 * xmlSecTransformCtx
323 *
324 *************************************************************************/
325
326/**
327 * xmlSecTransformCtxCreate:
328 *
329 * Creates transforms chain processing context.
330 * The caller is responsible for destroying returend object by calling
331 * #xmlSecTransformCtxDestroy function.
332 *
333 * Returns: pointer to newly allocated context object or NULL if an error
334 * occurs.
335 */
336xmlSecTransformCtxPtr
337xmlSecTransformCtxCreate(void) {
338 xmlSecTransformCtxPtr ctx;
339 int ret;
340
341 /* Allocate a new xmlSecTransform and fill the fields. */
342 ctx = (xmlSecTransformCtxPtr)xmlMalloc(sizeof(xmlSecTransformCtx));
343 if(ctx == NULL((void*)0)) {
344 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",344,__FUNCTION__,
345 NULL((void*)0),
346 NULL((void*)0),
347 XMLSEC_ERRORS_R_MALLOC_FAILED2,
348 "size=%d", sizeof(xmlSecTransformCtx));
349 return(NULL((void*)0));
350 }
351
352 ret = xmlSecTransformCtxInitialize(ctx);
353 if(ret < 0) {
354 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",354,__FUNCTION__,
355 NULL((void*)0),
356 "xmlSecTransformCtxInitialize",
357 XMLSEC_ERRORS_R_XMLSEC_FAILED1,
358 XMLSEC_ERRORS_NO_MESSAGE" ");
359 xmlSecTransformCtxDestroy(ctx);
360 return(NULL((void*)0));
361 }
362
363 return(ctx);
364}
365
366/**
367 * xmlSecTransformCtxDestroy:
368 * @ctx: the pointer to transforms chain processing context.
369 *
370 * Destroy context object created with #xmlSecTransformCtxCreate function.
371 */
372void
373xmlSecTransformCtxDestroy(xmlSecTransformCtxPtr ctx) {
374 xmlSecAssert(ctx != NULL)if(!( ctx != ((void*)0) ) ) { xmlSecError("transforms.c",374,
__FUNCTION__, ((void*)0), "ctx != NULL", 100, " "); return; }
;
375
376 xmlSecTransformCtxFinalize(ctx);
377 xmlFree(ctx);
378}
379
380/**
381 * xmlSecTransformCtxInitialize:
382 * @ctx: the pointer to transforms chain processing context.
383 *
384 * Initializes transforms chain processing context.
385 * The caller is responsible for cleaing up returend object by calling
386 * #xmlSecTransformCtxFinalize function.
387 *
388 * Returns: 0 on success or a negative value if an error occurs.
389 */
390int
391xmlSecTransformCtxInitialize(xmlSecTransformCtxPtr ctx) {
392 int ret;
393
394 xmlSecAssert2(ctx != NULL, -1)if(!( ctx != ((void*)0) ) ) { xmlSecError("transforms.c",394,
__FUNCTION__, ((void*)0), "ctx != NULL", 100, " "); return(-1
); }
;
395
396 memset(ctx, 0, sizeof(xmlSecTransformCtx));
397
398 ret = xmlSecPtrListInitialize(&(ctx->enabledTransforms), xmlSecTransformIdListIdxmlSecTransformIdListGetKlass());
399 if(ret < 0) {
400 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",400,__FUNCTION__,
401 NULL((void*)0),
402 "xmlSecPtrListInitialize",
403 XMLSEC_ERRORS_R_XMLSEC_FAILED1,
404 XMLSEC_ERRORS_NO_MESSAGE" ");
405 return(-1);
406 }
407
408 ctx->enabledUris = xmlSecTransformUriTypeAny0xFFFF;
409 return(0);
410}
411
412/**
413 * xmlSecTransformCtxFinalize:
414 * @ctx: the pointer to transforms chain processing context.
415 *
416 * Cleans up @ctx object initialized with #xmlSecTransformCtxInitialize function.
417 */
418void
419xmlSecTransformCtxFinalize(xmlSecTransformCtxPtr ctx) {
420 xmlSecAssert(ctx != NULL)if(!( ctx != ((void*)0) ) ) { xmlSecError("transforms.c",420,
__FUNCTION__, ((void*)0), "ctx != NULL", 100, " "); return; }
;
421
422 xmlSecTransformCtxReset(ctx);
423 xmlSecPtrListFinalize(&(ctx->enabledTransforms));
424 memset(ctx, 0, sizeof(xmlSecTransformCtx));
425}
426
427/**
428 * xmlSecTransformCtxReset:
429 * @ctx: the pointer to transforms chain processing context.
430 *
431 * Resets transfroms context for new processing.
432 */
433void
434xmlSecTransformCtxReset(xmlSecTransformCtxPtr ctx) {
435 xmlSecTransformPtr transform, tmp;
436
437 xmlSecAssert(ctx != NULL)if(!( ctx != ((void*)0) ) ) { xmlSecError("transforms.c",437,
__FUNCTION__, ((void*)0), "ctx != NULL", 100, " "); return; }
;
438
439 ctx->result = NULL((void*)0);
440 ctx->status = xmlSecTransformStatusNone;
441
442 /* destroy uri */
443 if(ctx->uri != NULL((void*)0)) {
444 xmlFree(ctx->uri);
445 ctx->uri = NULL((void*)0);
446 }
447 if(ctx->xptrExpr != NULL((void*)0)) {
448 xmlFree(ctx->xptrExpr);
449 ctx->xptrExpr = NULL((void*)0);
450 }
451
452 /* destroy transforms chain */
453 for(transform = ctx->first; transform != NULL((void*)0); transform = tmp) {
454 tmp = transform->next;
455 xmlSecTransformDestroy(transform);
456 }
457 ctx->first = ctx->last = NULL((void*)0);
458}
459
460/**
461 * xmlSecTransformCtxCopyUserPref:
462 * @dst: the pointer to destination transforms chain processing context.
463 * @src: the pointer to source transforms chain processing context.
464 *
465 * Copies user settings from @src context to @dst.
466 *
467 * Returns: 0 on success or a negative value otherwise.
468 */
469int
470xmlSecTransformCtxCopyUserPref(xmlSecTransformCtxPtr dst, xmlSecTransformCtxPtr src) {
471 int ret;
472
473 xmlSecAssert2(dst != NULL, -1)if(!( dst != ((void*)0) ) ) { xmlSecError("transforms.c",473,
__FUNCTION__, ((void*)0), "dst != NULL", 100, " "); return(-1
); }
;
474 xmlSecAssert2(src != NULL, -1)if(!( src != ((void*)0) ) ) { xmlSecError("transforms.c",474,
__FUNCTION__, ((void*)0), "src != NULL", 100, " "); return(-1
); }
;
475
476 dst->userData = src->userData;
477 dst->flags = src->flags;
478 dst->flags2 = src->flags2;
479 dst->enabledUris = src->enabledUris;
480 dst->preExecCallback = src->preExecCallback;
481
482 ret = xmlSecPtrListCopy(&(dst->enabledTransforms), &(src->enabledTransforms));
483 if(ret < 0) {
484 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",484,__FUNCTION__,
485 NULL((void*)0),
486 "xmlSecPtrListCopy",
487 XMLSEC_ERRORS_R_XMLSEC_FAILED1,
488 XMLSEC_ERRORS_NO_MESSAGE" ");
489 return(-1);
490 }
491
492 return(0);
493}
494
495/**
496 * xmlSecTransformCtxAppend:
497 * @ctx: the pointer to transforms chain processing context.
498 * @transform: the pointer to new transform.
499 *
500 * Connects the @transform to the end of the chain of transforms in the @ctx
501 * (see #xmlSecTransformConnect function for details).
502 *
503 * Returns: 0 on success or a negative value otherwise.
504 */
505int
506xmlSecTransformCtxAppend(xmlSecTransformCtxPtr ctx, xmlSecTransformPtr transform) {
507 int ret;
508
509 xmlSecAssert2(ctx != NULL, -1)if(!( ctx != ((void*)0) ) ) { xmlSecError("transforms.c",509,
__FUNCTION__, ((void*)0), "ctx != NULL", 100, " "); return(-1
); }
;
510 xmlSecAssert2(ctx->status == xmlSecTransformStatusNone, -1)if(!( ctx->status == xmlSecTransformStatusNone ) ) { xmlSecError
("transforms.c",510,__FUNCTION__, ((void*)0), "ctx->status == xmlSecTransformStatusNone"
, 100, " "); return(-1); }
;
511 xmlSecAssert2(xmlSecTransformIsValid(transform), -1)if(!( ((( transform ) != ((void*)0)) && (( transform )
->id != ((void*)0)) && (( transform )->id->klassSize
>= sizeof(xmlSecTransformKlass)) && (( transform )
->id->objSize >= sizeof(xmlSecTransform)) &&
(( transform )->id->name != ((void*)0))) ) ) { xmlSecError
("transforms.c",511,__FUNCTION__, ((void*)0), "xmlSecTransformIsValid(transform)"
, 100, " "); return(-1); }
;
512
513 if(ctx->last != NULL((void*)0)) {
514 ret = xmlSecTransformConnect(ctx->last, transform, ctx);
515 if(ret < 0) {
516 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",516,__FUNCTION__,
517 NULL((void*)0),
518 "xmlSecTransformConnect",
519 XMLSEC_ERRORS_R_XMLSEC_FAILED1,
520 "name=%s",
521 xmlSecErrorsSafeString(xmlSecTransformGetName(transform))(((((((( (transform) ) != ((void*)0)) && (( (transform
) )->id != ((void*)0)) && (( (transform) )->id->
klassSize >= sizeof(xmlSecTransformKlass)) && (( (
transform) )->id->objSize >= sizeof(xmlSecTransform)
) && (( (transform) )->id->name != ((void*)0)))
) ? ((((transform)->id)) ? (((transform)->id)->name)
: ((void*)0)) : ((void*)0))) != ((void*)0)) ? ((char*)((((((
(transform) ) != ((void*)0)) && (( (transform) )->
id != ((void*)0)) && (( (transform) )->id->klassSize
>= sizeof(xmlSecTransformKlass)) && (( (transform
) )->id->objSize >= sizeof(xmlSecTransform)) &&
(( (transform) )->id->name != ((void*)0)))) ? ((((transform
)->id)) ? (((transform)->id)->name) : ((void*)0)) : (
(void*)0)))) : (char*)"NULL")
);
522 return(-1);
523 }
524 } else {
525 xmlSecAssert2(ctx->first == NULL, -1)if(!( ctx->first == ((void*)0) ) ) { xmlSecError("transforms.c"
,525,__FUNCTION__, ((void*)0), "ctx->first == NULL", 100, " "
); return(-1); }
;
526 ctx->first = transform;
527 }
528 ctx->last = transform;
529
530 return(0);
531}
532
533/**
534 * xmlSecTransformCtxPrepend:
535 * @ctx: the pointer to transforms chain processing context.
536 * @transform: the pointer to new transform.
537 *
538 * Connects the @transform to the beggining of the chain of transforms in the @ctx
539 * (see #xmlSecTransformConnect function for details).
540 *
541 * Returns: 0 on success or a negative value otherwise.
542 */
543int
544xmlSecTransformCtxPrepend(xmlSecTransformCtxPtr ctx, xmlSecTransformPtr transform) {
545 int ret;
546
547 xmlSecAssert2(ctx != NULL, -1)if(!( ctx != ((void*)0) ) ) { xmlSecError("transforms.c",547,
__FUNCTION__, ((void*)0), "ctx != NULL", 100, " "); return(-1
); }
;
548 xmlSecAssert2(ctx->status == xmlSecTransformStatusNone, -1)if(!( ctx->status == xmlSecTransformStatusNone ) ) { xmlSecError
("transforms.c",548,__FUNCTION__, ((void*)0), "ctx->status == xmlSecTransformStatusNone"
, 100, " "); return(-1); }
;
549 xmlSecAssert2(xmlSecTransformIsValid(transform), -1)if(!( ((( transform ) != ((void*)0)) && (( transform )
->id != ((void*)0)) && (( transform )->id->klassSize
>= sizeof(xmlSecTransformKlass)) && (( transform )
->id->objSize >= sizeof(xmlSecTransform)) &&
(( transform )->id->name != ((void*)0))) ) ) { xmlSecError
("transforms.c",549,__FUNCTION__, ((void*)0), "xmlSecTransformIsValid(transform)"
, 100, " "); return(-1); }
;
550
551 if(ctx->first != NULL((void*)0)) {
552 ret = xmlSecTransformConnect(transform, ctx->first, ctx);
553 if(ret < 0) {
554 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",554,__FUNCTION__,
555 NULL((void*)0),
556 "xmlSecTransformConnect",
557 XMLSEC_ERRORS_R_XMLSEC_FAILED1,
558 "name=%s",
559 xmlSecErrorsSafeString(xmlSecTransformGetName(transform))(((((((( (transform) ) != ((void*)0)) && (( (transform
) )->id != ((void*)0)) && (( (transform) )->id->
klassSize >= sizeof(xmlSecTransformKlass)) && (( (
transform) )->id->objSize >= sizeof(xmlSecTransform)
) && (( (transform) )->id->name != ((void*)0)))
) ? ((((transform)->id)) ? (((transform)->id)->name)
: ((void*)0)) : ((void*)0))) != ((void*)0)) ? ((char*)((((((
(transform) ) != ((void*)0)) && (( (transform) )->
id != ((void*)0)) && (( (transform) )->id->klassSize
>= sizeof(xmlSecTransformKlass)) && (( (transform
) )->id->objSize >= sizeof(xmlSecTransform)) &&
(( (transform) )->id->name != ((void*)0)))) ? ((((transform
)->id)) ? (((transform)->id)->name) : ((void*)0)) : (
(void*)0)))) : (char*)"NULL")
);
560 return(-1);
561 }
562 } else {
563 xmlSecAssert2(ctx->last == NULL, -1)if(!( ctx->last == ((void*)0) ) ) { xmlSecError("transforms.c"
,563,__FUNCTION__, ((void*)0), "ctx->last == NULL", 100, " "
); return(-1); }
;
564 ctx->last = transform;
565 }
566 ctx->first = transform;
567
568 return(0);
569}
570
571/**
572 * xmlSecTransformCtxCreateAndAppend:
573 * @ctx: the pointer to transforms chain processing context.
574 * @id: the new transform klass.
575 *
576 * Creaeates new transform and connects it to the end of the chain of
577 * transforms in the @ctx (see #xmlSecTransformConnect function for details).
578 *
579 * Returns: pointer to newly created transform or NULL if an error occurs.
580 */
581xmlSecTransformPtr
582xmlSecTransformCtxCreateAndAppend(xmlSecTransformCtxPtr ctx, xmlSecTransformId id) {
583 xmlSecTransformPtr transform;
584 int ret;
585
586 xmlSecAssert2(ctx != NULL, NULL)if(!( ctx != ((void*)0) ) ) { xmlSecError("transforms.c",586,
__FUNCTION__, ((void*)0), "ctx != NULL", 100, " "); return(((
void*)0)); }
;
587 xmlSecAssert2(ctx->status == xmlSecTransformStatusNone, NULL)if(!( ctx->status == xmlSecTransformStatusNone ) ) { xmlSecError
("transforms.c",587,__FUNCTION__, ((void*)0), "ctx->status == xmlSecTransformStatusNone"
, 100, " "); return(((void*)0)); }
;
588 xmlSecAssert2(id != xmlSecTransformIdUnknown, NULL)if(!( id != ((xmlSecTransformId)((void*)0)) ) ) { xmlSecError
("transforms.c",588,__FUNCTION__, ((void*)0), "id != xmlSecTransformIdUnknown"
, 100, " "); return(((void*)0)); }
;
589
590 transform = xmlSecTransformCreate(id);
591 if(!xmlSecTransformIsValid(transform)((( transform ) != ((void*)0)) && (( transform )->
id != ((void*)0)) && (( transform )->id->klassSize
>= sizeof(xmlSecTransformKlass)) && (( transform )
->id->objSize >= sizeof(xmlSecTransform)) &&
(( transform )->id->name != ((void*)0)))
) {
592 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",592,__FUNCTION__,
593 NULL((void*)0),
594 "xmlSecTransformCreate",
595 XMLSEC_ERRORS_R_XMLSEC_FAILED1,
596 "transform=%s",
597 xmlSecErrorsSafeString(xmlSecTransformKlassGetName(id))((((((id)) ? ((id)->name) : ((void*)0))) != ((void*)0)) ? (
(char*)((((id)) ? ((id)->name) : ((void*)0)))) : (char*)"NULL"
)
);
598 return(NULL((void*)0));
599 }
600
601 ret = xmlSecTransformCtxAppend(ctx, transform);
602 if(ret < 0) {
603 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",603,__FUNCTION__,
604 NULL((void*)0),
605 "xmlSecTransformCtxAppend",
606 XMLSEC_ERRORS_R_XMLSEC_FAILED1,
607 "name=%s",
608 xmlSecErrorsSafeString(xmlSecTransformGetName(transform))(((((((( (transform) ) != ((void*)0)) && (( (transform
) )->id != ((void*)0)) && (( (transform) )->id->
klassSize >= sizeof(xmlSecTransformKlass)) && (( (
transform) )->id->objSize >= sizeof(xmlSecTransform)
) && (( (transform) )->id->name != ((void*)0)))
) ? ((((transform)->id)) ? (((transform)->id)->name)
: ((void*)0)) : ((void*)0))) != ((void*)0)) ? ((char*)((((((
(transform) ) != ((void*)0)) && (( (transform) )->
id != ((void*)0)) && (( (transform) )->id->klassSize
>= sizeof(xmlSecTransformKlass)) && (( (transform
) )->id->objSize >= sizeof(xmlSecTransform)) &&
(( (transform) )->id->name != ((void*)0)))) ? ((((transform
)->id)) ? (((transform)->id)->name) : ((void*)0)) : (
(void*)0)))) : (char*)"NULL")
);
609 xmlSecTransformDestroy(transform);
610 return(NULL((void*)0));
611 }
612
613 return(transform);
614}
615
616/**
617 * xmlSecTransformCtxCreateAndPrepend:
618 * @ctx: the pointer to transforms chain processing context.
619 * @id: the new transform klass.
620 *
621 * Creaeates new transform and connects it to the end of the chain of
622 * transforms in the @ctx (see #xmlSecTransformConnect function for details).
623 *
624 * Returns: pointer to newly created transform or NULL if an error occurs.
625 */
626xmlSecTransformPtr
627xmlSecTransformCtxCreateAndPrepend(xmlSecTransformCtxPtr ctx, xmlSecTransformId id) {
628 xmlSecTransformPtr transform;
629 int ret;
630
631 xmlSecAssert2(ctx != NULL, NULL)if(!( ctx != ((void*)0) ) ) { xmlSecError("transforms.c",631,
__FUNCTION__, ((void*)0), "ctx != NULL", 100, " "); return(((
void*)0)); }
;
632 xmlSecAssert2(ctx->status == xmlSecTransformStatusNone, NULL)if(!( ctx->status == xmlSecTransformStatusNone ) ) { xmlSecError
("transforms.c",632,__FUNCTION__, ((void*)0), "ctx->status == xmlSecTransformStatusNone"
, 100, " "); return(((void*)0)); }
;
633 xmlSecAssert2(id != xmlSecTransformIdUnknown, NULL)if(!( id != ((xmlSecTransformId)((void*)0)) ) ) { xmlSecError
("transforms.c",633,__FUNCTION__, ((void*)0), "id != xmlSecTransformIdUnknown"
, 100, " "); return(((void*)0)); }
;
634
635 transform = xmlSecTransformCreate(id);
636 if(!xmlSecTransformIsValid(transform)((( transform ) != ((void*)0)) && (( transform )->
id != ((void*)0)) && (( transform )->id->klassSize
>= sizeof(xmlSecTransformKlass)) && (( transform )
->id->objSize >= sizeof(xmlSecTransform)) &&
(( transform )->id->name != ((void*)0)))
) {
637 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",637,__FUNCTION__,
638 NULL((void*)0),
639 "xmlSecTransformCreate",
640 XMLSEC_ERRORS_R_XMLSEC_FAILED1,
641 "transform=%s",
642 xmlSecErrorsSafeString(xmlSecTransformKlassGetName(id))((((((id)) ? ((id)->name) : ((void*)0))) != ((void*)0)) ? (
(char*)((((id)) ? ((id)->name) : ((void*)0)))) : (char*)"NULL"
)
);
643 return(NULL((void*)0));
644 }
645
646 ret = xmlSecTransformCtxPrepend(ctx, transform);
647 if(ret < 0) {
648 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",648,__FUNCTION__,
649 NULL((void*)0),
650 "xmlSecTransformCtxPrepend",
651 XMLSEC_ERRORS_R_XMLSEC_FAILED1,
652 "name=%s",
653 xmlSecErrorsSafeString(xmlSecTransformGetName(transform))(((((((( (transform) ) != ((void*)0)) && (( (transform
) )->id != ((void*)0)) && (( (transform) )->id->
klassSize >= sizeof(xmlSecTransformKlass)) && (( (
transform) )->id->objSize >= sizeof(xmlSecTransform)
) && (( (transform) )->id->name != ((void*)0)))
) ? ((((transform)->id)) ? (((transform)->id)->name)
: ((void*)0)) : ((void*)0))) != ((void*)0)) ? ((char*)((((((
(transform) ) != ((void*)0)) && (( (transform) )->
id != ((void*)0)) && (( (transform) )->id->klassSize
>= sizeof(xmlSecTransformKlass)) && (( (transform
) )->id->objSize >= sizeof(xmlSecTransform)) &&
(( (transform) )->id->name != ((void*)0)))) ? ((((transform
)->id)) ? (((transform)->id)->name) : ((void*)0)) : (
(void*)0)))) : (char*)"NULL")
);
654 xmlSecTransformDestroy(transform);
655 return(NULL((void*)0));
656 }
657
658 return(transform);
659}
660
661/**
662 * xmlSecTransformCtxNodeRead:
663 * @ctx: the pointer to transforms chain processing context.
664 * @node: the pointer to transform's node.
665 * @usage: the transform's usage (signature, encryption, etc.).
666 *
667 * Reads the transform from the @node and appends it to the current chain
668 * of transforms in @ctx.
669 *
670 * Returns: pointer to newly created transform or NULL if an error occurs.
671 */
672xmlSecTransformPtr
673xmlSecTransformCtxNodeRead(xmlSecTransformCtxPtr ctx, xmlNodePtr node,
674 xmlSecTransformUsage usage) {
675 xmlSecTransformPtr transform;
676 int ret;
677
678 xmlSecAssert2(ctx != NULL, NULL)if(!( ctx != ((void*)0) ) ) { xmlSecError("transforms.c",678,
__FUNCTION__, ((void*)0), "ctx != NULL", 100, " "); return(((
void*)0)); }
;
679 xmlSecAssert2(ctx->status == xmlSecTransformStatusNone, NULL)if(!( ctx->status == xmlSecTransformStatusNone ) ) { xmlSecError
("transforms.c",679,__FUNCTION__, ((void*)0), "ctx->status == xmlSecTransformStatusNone"
, 100, " "); return(((void*)0)); }
;
680 xmlSecAssert2(node != NULL, NULL)if(!( node != ((void*)0) ) ) { xmlSecError("transforms.c",680
,__FUNCTION__, ((void*)0), "node != NULL", 100, " "); return(
((void*)0)); }
;
681
682 transform = xmlSecTransformNodeRead(node, usage, ctx);
683 if(transform == NULL((void*)0)) {
684 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",684,__FUNCTION__,
685 NULL((void*)0),
686 "xmlSecTransformNodeRead",
687 XMLSEC_ERRORS_R_XMLSEC_FAILED1,
688 "name=%s",
689 xmlSecErrorsSafeString(xmlSecNodeGetName(node))((((((node)) ? ((const char*)((node)->name)) : ((void*)0))
) != ((void*)0)) ? ((char*)((((node)) ? ((const char*)((node)
->name)) : ((void*)0)))) : (char*)"NULL")
);
690 return(NULL((void*)0));
691 }
692
693 ret = xmlSecTransformCtxAppend(ctx, transform);
694 if(ret < 0) {
695 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",695,__FUNCTION__,
696 NULL((void*)0),
697 "xmlSecTransformCtxAppend",
698 XMLSEC_ERRORS_R_XMLSEC_FAILED1,
699 "name=%s",
700 xmlSecErrorsSafeString(xmlSecTransformGetName(transform))(((((((( (transform) ) != ((void*)0)) && (( (transform
) )->id != ((void*)0)) && (( (transform) )->id->
klassSize >= sizeof(xmlSecTransformKlass)) && (( (
transform) )->id->objSize >= sizeof(xmlSecTransform)
) && (( (transform) )->id->name != ((void*)0)))
) ? ((((transform)->id)) ? (((transform)->id)->name)
: ((void*)0)) : ((void*)0))) != ((void*)0)) ? ((char*)((((((
(transform) ) != ((void*)0)) && (( (transform) )->
id != ((void*)0)) && (( (transform) )->id->klassSize
>= sizeof(xmlSecTransformKlass)) && (( (transform
) )->id->objSize >= sizeof(xmlSecTransform)) &&
(( (transform) )->id->name != ((void*)0)))) ? ((((transform
)->id)) ? (((transform)->id)->name) : ((void*)0)) : (
(void*)0)))) : (char*)"NULL")
);
701 xmlSecTransformDestroy(transform);
702 return(NULL((void*)0));
703 }
704
705 return(transform);
706}
707
708/**
709 * xmlSecTransformCtxNodesListRead:
710 * @ctx: the pointer to transforms chain processing context.
711 * @node: the pointer to <dsig:Transform/> nodes parent node.
712 * @usage: the transform's usage (signature, encryption, etc.).
713 *
714 * Reads transforms from the <dsig:Transform/> children of the @node and
715 * appends them to the current transforms chain in @ctx object.
716 *
717 * Returns: 0 on success or a negative value otherwise.
718 */
719int
720xmlSecTransformCtxNodesListRead(xmlSecTransformCtxPtr ctx, xmlNodePtr node, xmlSecTransformUsage usage) {
721 xmlSecTransformPtr transform;
722 xmlNodePtr cur;
723 int ret;
724
725 xmlSecAssert2(ctx != NULL, -1)if(!( ctx != ((void*)0) ) ) { xmlSecError("transforms.c",725,
__FUNCTION__, ((void*)0), "ctx != NULL", 100, " "); return(-1
); }
;
726 xmlSecAssert2(ctx->status == xmlSecTransformStatusNone, -1)if(!( ctx->status == xmlSecTransformStatusNone ) ) { xmlSecError
("transforms.c",726,__FUNCTION__, ((void*)0), "ctx->status == xmlSecTransformStatusNone"
, 100, " "); return(-1); }
;
727 xmlSecAssert2(node != NULL, -1)if(!( node != ((void*)0) ) ) { xmlSecError("transforms.c",727
,__FUNCTION__, ((void*)0), "node != NULL", 100, " "); return(
-1); }
;
728
729 cur = xmlSecGetNextElementNode(node->children);
730 while((cur != NULL((void*)0)) && xmlSecCheckNodeName(cur, xmlSecNodeTransform, xmlSecDSigNs)) {
731 transform = xmlSecTransformNodeRead(cur, usage, ctx);
732 if(transform == NULL((void*)0)) {
733 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",733,__FUNCTION__,
734 NULL((void*)0),
735 "xmlSecTransformNodeRead",
736 XMLSEC_ERRORS_R_XMLSEC_FAILED1,
737 "node=%s",
738 xmlSecErrorsSafeString(xmlSecNodeGetName(cur))((((((cur)) ? ((const char*)((cur)->name)) : ((void*)0))) !=
((void*)0)) ? ((char*)((((cur)) ? ((const char*)((cur)->name
)) : ((void*)0)))) : (char*)"NULL")
);
739 return(-1);
740 }
741
742 ret = xmlSecTransformCtxAppend(ctx, transform);
743 if(ret < 0) {
744 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",744,__FUNCTION__,
745 NULL((void*)0),
746 "xmlSecTransformCtxAppend",
747 XMLSEC_ERRORS_R_XMLSEC_FAILED1,
748 "node=%s",
749 xmlSecErrorsSafeString(xmlSecNodeGetName(cur))((((((cur)) ? ((const char*)((cur)->name)) : ((void*)0))) !=
((void*)0)) ? ((char*)((((cur)) ? ((const char*)((cur)->name
)) : ((void*)0)))) : (char*)"NULL")
);
750 xmlSecTransformDestroy(transform);
751 return(-1);
752 }
753 cur = xmlSecGetNextElementNode(cur->next);
754 }
755
756 if(cur != NULL((void*)0)) {
757 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",757,__FUNCTION__,
758 NULL((void*)0),
759 xmlSecErrorsSafeString(xmlSecNodeGetName(cur))((((((cur)) ? ((const char*)((cur)->name)) : ((void*)0))) !=
((void*)0)) ? ((char*)((((cur)) ? ((const char*)((cur)->name
)) : ((void*)0)))) : (char*)"NULL")
,
760 XMLSEC_ERRORS_R_UNEXPECTED_NODE27,
761 XMLSEC_ERRORS_NO_MESSAGE" ");
762 return(-1);
763 }
764 return(0);
765}
766
767/**
768 * xmlSecTransformCtxSetUri:
769 * @ctx: the pointer to transforms chain processing context.
770 * @uri: the URI.
771 * @hereNode: the pointer to "here" node required by some
772 * XML transforms (may be NULL).
773 *
774 * Parses uri and adds xpointer transforms if required.
775 *
776 * The following examples demonstrate what the URI attribute identifies and
777 * how it is dereferenced
778 * (http://www.w3.org/TR/xmldsig-core/#sec-ReferenceProcessingModel):
779 *
780 * - URI="http://example.com/bar.xml"
781 * identifies the octets that represent the external resource
782 * 'http://example.com/bar.xml', that is probably an XML document given
783 * its file extension.
784 *
785 * - URI="http://example.com/bar.xml#chapter1"
786 * identifies the element with ID attribute value 'chapter1' of the
787 * external XML resource 'http://example.com/bar.xml', provided as an
788 * octet stream. Again, for the sake of interoperability, the element
789 * identified as 'chapter1' should be obtained using an XPath transform
790 * rather than a URI fragment (barename XPointer resolution in external
791 * resources is not REQUIRED in this specification).
792 *
793 * - URI=""
794 * identifies the node-set (minus any comment nodes) of the XML resource
795 * containing the signature
796 *
797 * - URI="#chapter1"
798 * identifies a node-set containing the element with ID attribute value
799 * 'chapter1' of the XML resource containing the signature. XML Signature
800 * (and its applications) modify this node-set to include the element plus
801 * all descendents including namespaces and attributes -- but not comments.
802 *
803 * Returns: 0 on success or a negative value otherwise.
804 */
805int
806xmlSecTransformCtxSetUri(xmlSecTransformCtxPtr ctx, const xmlChar* uri, xmlNodePtr hereNode) {
807 xmlSecNodeSetType nodeSetType = xmlSecNodeSetTree;
808 const xmlChar* xptr;
809 xmlChar* buf = NULL((void*)0);
810 int useVisa3DHack = 0;
811 int ret;
812
813 xmlSecAssert2(ctx != NULL, -1)if(!( ctx != ((void*)0) ) ) { xmlSecError("transforms.c",813,
__FUNCTION__, ((void*)0), "ctx != NULL", 100, " "); return(-1
); }
;
814 xmlSecAssert2(ctx->uri == NULL, -1)if(!( ctx->uri == ((void*)0) ) ) { xmlSecError("transforms.c"
,814,__FUNCTION__, ((void*)0), "ctx->uri == NULL", 100, " "
); return(-1); }
;
815 xmlSecAssert2(ctx->xptrExpr == NULL, -1)if(!( ctx->xptrExpr == ((void*)0) ) ) { xmlSecError("transforms.c"
,815,__FUNCTION__, ((void*)0), "ctx->xptrExpr == NULL", 100
, " "); return(-1); }
;
816 xmlSecAssert2(ctx->status == xmlSecTransformStatusNone, -1)if(!( ctx->status == xmlSecTransformStatusNone ) ) { xmlSecError
("transforms.c",816,__FUNCTION__, ((void*)0), "ctx->status == xmlSecTransformStatusNone"
, 100, " "); return(-1); }
;
817 xmlSecAssert2(hereNode != NULL, -1)if(!( hereNode != ((void*)0) ) ) { xmlSecError("transforms.c"
,817,__FUNCTION__, ((void*)0), "hereNode != NULL", 100, " ");
return(-1); }
;
818
819 /* check uri */
820 if(xmlSecTransformUriTypeCheck(ctx->enabledUris, uri) != 1) {
821 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",821,__FUNCTION__,
822 NULL((void*)0),
823 NULL((void*)0),
824 XMLSEC_ERRORS_R_INVALID_URI_TYPE33,
825 "uri=%s",
826 xmlSecErrorsSafeString(uri)(((uri) != ((void*)0)) ? ((char*)(uri)) : (char*)"NULL"));
827 return(-1);
828 }
829
830 /* is it an empty uri? */
831 if((uri == NULL((void*)0)) || (xmlStrlen(uri) == 0)) {
832 return(0);
833 }
834
835 /* do we have barename or full xpointer? */
836 xptr = xmlStrchr(uri, '#');
837 if(xptr == NULL((void*)0)){
838 ctx->uri = xmlStrdup(uri);
839 if(ctx->uri == NULL((void*)0)) {
840 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",840,__FUNCTION__,
841 NULL((void*)0),
842 NULL((void*)0),
843 XMLSEC_ERRORS_R_STRDUP_FAILED3,
844 "size=%d", xmlStrlen(uri));
845 return(-1);
846 }
847 /* we are done */
848 return(0);
849 } else if(xmlStrcmp(uri, BAD_CAST(xmlChar *) "#xpointer(/)") == 0) {
850 ctx->xptrExpr = xmlStrdup(uri);
851 if(ctx->xptrExpr == NULL((void*)0)) {
852 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",852,__FUNCTION__,
853 NULL((void*)0),
854 NULL((void*)0),
855 XMLSEC_ERRORS_R_STRDUP_FAILED3,
856 "size=%d", xmlStrlen(uri));
857 return(-1);
858 }
859 /* we are done */
860 return(0);
861 }
862
863 ctx->uri = xmlStrndup(uri, xptr - uri);
864 if(ctx->uri == NULL((void*)0)) {
865 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",865,__FUNCTION__,
866 NULL((void*)0),
867 NULL((void*)0),
868 XMLSEC_ERRORS_R_STRDUP_FAILED3,
869 "size=%d", xptr - uri);
870 return(-1);
871 }
872
873 ctx->xptrExpr = xmlStrdup(xptr);
874 if(ctx->xptrExpr == NULL((void*)0)) {
875 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",875,__FUNCTION__,
876 NULL((void*)0),
877 NULL((void*)0),
878 XMLSEC_ERRORS_R_STRDUP_FAILED3,
879 "size=%d", xmlStrlen(xptr));
880 return(-1);
881 }
882
883 /* do we have barename or full xpointer? */
884 xmlSecAssert2(xptr != NULL, -1)if(!( xptr != ((void*)0) ) ) { xmlSecError("transforms.c",884
,__FUNCTION__, ((void*)0), "xptr != NULL", 100, " "); return(
-1); }
;
885 if((xmlStrncmp(xptr, BAD_CAST(xmlChar *) "#xpointer(", 10) == 0) || (xmlStrncmp(xptr, BAD_CAST(xmlChar *) "#xmlns(", 7) == 0)) {
886 ++xptr;
887 nodeSetType = xmlSecNodeSetTree;
888 } else if((ctx->flags & XMLSEC_TRANSFORMCTX_FLAGS_USE_VISA3D_HACK0x00000001) != 0) {
889 ++xptr;
890 nodeSetType = xmlSecNodeSetTreeWithoutComments;
891 useVisa3DHack = 1;
892 } else {
893 static const char tmpl[] = "xpointer(id(\'%s\'))";
894 xmlSecSizesize_t size;
895
896 /* we need to add "xpointer(id('..')) because otherwise we have
897 * problems with numeric ("111" and so on) and other "strange" ids */
898 size = xmlStrlen(BAD_CAST(xmlChar *) tmpl) + xmlStrlen(xptr) + 2;
899 buf = (xmlChar*)xmlMalloc(size * sizeof(xmlChar));
900 if(buf == NULL((void*)0)) {
901 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",901,__FUNCTION__,
902 NULL((void*)0),
903 NULL((void*)0),
904 XMLSEC_ERRORS_R_MALLOC_FAILED2,
905 "size=%d", size);
906 return(-1);
907 }
908 sprintf((char*)buf, tmpl, xptr + 1);
909 xptr = buf;
910 nodeSetType = xmlSecNodeSetTreeWithoutComments;
911 }
912
913 if(useVisa3DHack == 0) {
914 xmlSecTransformPtr transform;
915
916 /* we need to create XPonter transform to execute expr */
917 transform = xmlSecTransformCtxCreateAndPrepend(ctx, xmlSecTransformXPointerIdxmlSecTransformXPointerGetKlass());
918 if(!xmlSecTransformIsValid(transform)((( transform ) != ((void*)0)) && (( transform )->
id != ((void*)0)) && (( transform )->id->klassSize
>= sizeof(xmlSecTransformKlass)) && (( transform )
->id->objSize >= sizeof(xmlSecTransform)) &&
(( transform )->id->name != ((void*)0)))
) {
919 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",919,__FUNCTION__,
920 NULL((void*)0),
921 "xmlSecTransformCtxCreateAndPrepend",
922 XMLSEC_ERRORS_R_XMLSEC_FAILED1,
923 "transform=%s",
924 xmlSecErrorsSafeString(xmlSecTransformKlassGetName(xmlSecTransformXPointerId))((((((xmlSecTransformXPointerGetKlass())) ? ((xmlSecTransformXPointerGetKlass
())->name) : ((void*)0))) != ((void*)0)) ? ((char*)((((xmlSecTransformXPointerGetKlass
())) ? ((xmlSecTransformXPointerGetKlass())->name) : ((void
*)0)))) : (char*)"NULL")
);
925 return(-1);
926 }
927
928 ret = xmlSecTransformXPointerSetExpr(transform, xptr, nodeSetType, hereNode);
929 if(ret < 0) {
930 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",930,__FUNCTION__,
931 NULL((void*)0),
932 "xmlSecTransformXPointerSetExpr",
933 XMLSEC_ERRORS_R_XMLSEC_FAILED1,
934 "name=%s",
935 xmlSecErrorsSafeString(xmlSecTransformGetName(transform))(((((((( (transform) ) != ((void*)0)) && (( (transform
) )->id != ((void*)0)) && (( (transform) )->id->
klassSize >= sizeof(xmlSecTransformKlass)) && (( (
transform) )->id->objSize >= sizeof(xmlSecTransform)
) && (( (transform) )->id->name != ((void*)0)))
) ? ((((transform)->id)) ? (((transform)->id)->name)
: ((void*)0)) : ((void*)0))) != ((void*)0)) ? ((char*)((((((
(transform) ) != ((void*)0)) && (( (transform) )->
id != ((void*)0)) && (( (transform) )->id->klassSize
>= sizeof(xmlSecTransformKlass)) && (( (transform
) )->id->objSize >= sizeof(xmlSecTransform)) &&
(( (transform) )->id->name != ((void*)0)))) ? ((((transform
)->id)) ? (((transform)->id)->name) : ((void*)0)) : (
(void*)0)))) : (char*)"NULL")
);
936 if(buf != NULL((void*)0)) {
937 xmlFree(buf);
938 }
939 return(-1);
940 }
941 } else {
942 /* Visa3D protocol doesn't follow XML/XPointer/XMLDSig specs
943 * and allows invalid XPointer expressions (e.g. "#12345") in
944 * the URI attribute.
945 * Since we couldn't evaluate such expressions thru XPath/XPointer
946 * engine, we need to have this hack here
947 */
948 xmlSecTransformPtr transform;
949
950 transform = xmlSecTransformCtxCreateAndPrepend(ctx, xmlSecTransformVisa3DHackIdxmlSecTransformVisa3DHackGetKlass());
951 if(!xmlSecTransformIsValid(transform)((( transform ) != ((void*)0)) && (( transform )->
id != ((void*)0)) && (( transform )->id->klassSize
>= sizeof(xmlSecTransformKlass)) && (( transform )
->id->objSize >= sizeof(xmlSecTransform)) &&
(( transform )->id->name != ((void*)0)))
) {
952 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",952,__FUNCTION__,
953 NULL((void*)0),
954 "xmlSecTransformCtxCreateAndPrepend",
955 XMLSEC_ERRORS_R_XMLSEC_FAILED1,
956 "transform=%s",
957 xmlSecErrorsSafeString(xmlSecTransformKlassGetName(xmlSecTransformVisa3DHackId))((((((xmlSecTransformVisa3DHackGetKlass())) ? ((xmlSecTransformVisa3DHackGetKlass
())->name) : ((void*)0))) != ((void*)0)) ? ((char*)((((xmlSecTransformVisa3DHackGetKlass
())) ? ((xmlSecTransformVisa3DHackGetKlass())->name) : ((void
*)0)))) : (char*)"NULL")
);
958 return(-1);
959 }
960
961 ret = xmlSecTransformVisa3DHackSetID(transform, xptr);
962 if(ret < 0) {
963 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",963,__FUNCTION__,
964 NULL((void*)0),
965 "xmlSecTransformVisa3DHackSetID",
966 XMLSEC_ERRORS_R_XMLSEC_FAILED1,
967 "name=%s",
968 xmlSecErrorsSafeString(xmlSecTransformGetName(transform))(((((((( (transform) ) != ((void*)0)) && (( (transform
) )->id != ((void*)0)) && (( (transform) )->id->
klassSize >= sizeof(xmlSecTransformKlass)) && (( (
transform) )->id->objSize >= sizeof(xmlSecTransform)
) && (( (transform) )->id->name != ((void*)0)))
) ? ((((transform)->id)) ? (((transform)->id)->name)
: ((void*)0)) : ((void*)0))) != ((void*)0)) ? ((char*)((((((
(transform) ) != ((void*)0)) && (( (transform) )->
id != ((void*)0)) && (( (transform) )->id->klassSize
>= sizeof(xmlSecTransformKlass)) && (( (transform
) )->id->objSize >= sizeof(xmlSecTransform)) &&
(( (transform) )->id->name != ((void*)0)))) ? ((((transform
)->id)) ? (((transform)->id)->name) : ((void*)0)) : (
(void*)0)))) : (char*)"NULL")
);
969 if(buf != NULL((void*)0)) {
970 xmlFree(buf);
971 }
972 return(-1);
973 }
974 }
975 if(buf != NULL((void*)0)) {
976 xmlFree(buf);
977 }
978
979 return(0);
980}
981
982/**
983 * xmlSecTransformCtxPrepare:
984 * @ctx: the pointer to transforms chain processing context.
985 * @inputDataType: the expected input type.
986 *
987 * Prepares the transform context for processing data of @inputDataType.
988 *
989 * Returns: 0 on success or a negative value otherwise.
990 */
991int
992xmlSecTransformCtxPrepare(xmlSecTransformCtxPtr ctx, xmlSecTransformDataType inputDataType) {
993 xmlSecTransformDataType firstType;
994 xmlSecTransformPtr transform;
995 int ret;
996
997 xmlSecAssert2(ctx != NULL, -1)if(!( ctx != ((void*)0) ) ) { xmlSecError("transforms.c",997,
__FUNCTION__, ((void*)0), "ctx != NULL", 100, " "); return(-1
); }
;
998 xmlSecAssert2(ctx->result == NULL, -1)if(!( ctx->result == ((void*)0) ) ) { xmlSecError("transforms.c"
,998,__FUNCTION__, ((void*)0), "ctx->result == NULL", 100,
" "); return(-1); }
;
999 xmlSecAssert2(ctx->status == xmlSecTransformStatusNone, -1)if(!( ctx->status == xmlSecTransformStatusNone ) ) { xmlSecError
("transforms.c",999,__FUNCTION__, ((void*)0), "ctx->status == xmlSecTransformStatusNone"
, 100, " "); return(-1); }
;
1000
1001 /* add binary buffer to store result */
1002 transform = xmlSecTransformCtxCreateAndAppend(ctx, xmlSecTransformMemBufIdxmlSecTransformMemBufGetKlass());
1003 if(!xmlSecTransformIsValid(transform)((( transform ) != ((void*)0)) && (( transform )->
id != ((void*)0)) && (( transform )->id->klassSize
>= sizeof(xmlSecTransformKlass)) && (( transform )
->id->objSize >= sizeof(xmlSecTransform)) &&
(( transform )->id->name != ((void*)0)))
) {
1004 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",1004,__FUNCTION__,
1005 NULL((void*)0),
1006 "xmlSecTransformCreate",
1007 XMLSEC_ERRORS_R_XMLSEC_FAILED1,
1008 "transform=%s",
1009 xmlSecErrorsSafeString(xmlSecTransformKlassGetName(xmlSecTransformMemBufId))((((((xmlSecTransformMemBufGetKlass())) ? ((xmlSecTransformMemBufGetKlass
())->name) : ((void*)0))) != ((void*)0)) ? ((char*)((((xmlSecTransformMemBufGetKlass
())) ? ((xmlSecTransformMemBufGetKlass())->name) : ((void*
)0)))) : (char*)"NULL")
);
1010 return(-1);
1011 }
1012 ctx->result = xmlSecTransformMemBufGetBuffer(transform);
1013 if(ctx->result == NULL((void*)0)) {
1014 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",1014,__FUNCTION__,
1015 NULL((void*)0),
1016 "xmlSecTransformMemBufGetBuffer",
1017 XMLSEC_ERRORS_R_XMLSEC_FAILED1,
1018 "transform=%s",
1019 xmlSecErrorsSafeString(xmlSecTransformKlassGetName(xmlSecTransformMemBufId))((((((xmlSecTransformMemBufGetKlass())) ? ((xmlSecTransformMemBufGetKlass
())->name) : ((void*)0))) != ((void*)0)) ? ((char*)((((xmlSecTransformMemBufGetKlass
())) ? ((xmlSecTransformMemBufGetKlass())->name) : ((void*
)0)))) : (char*)"NULL")
);
1020 return(-1);
1021 }
1022
1023 firstType = xmlSecTransformGetDataType(ctx->first, xmlSecTransformModePush, ctx);
1024 if(((firstType & xmlSecTransformDataTypeBin0x0001) == 0) &&
1025 ((inputDataType & xmlSecTransformDataTypeBin0x0001) != 0)) {
1026
1027 /* need to add parser transform */
1028 transform = xmlSecTransformCtxCreateAndPrepend(ctx, xmlSecTransformXmlParserIdxmlSecTransformXmlParserGetKlass());
1029 if(transform == NULL((void*)0)) {
1030 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",1030,__FUNCTION__,
1031 NULL((void*)0),
1032 "xmlSecTransformCtxCreateAndPrepend",
1033 XMLSEC_ERRORS_R_XMLSEC_FAILED1,
1034 "transform=%s",
1035 xmlSecErrorsSafeString(xmlSecTransformKlassGetName(xmlSecTransformXmlParserId))((((((xmlSecTransformXmlParserGetKlass())) ? ((xmlSecTransformXmlParserGetKlass
())->name) : ((void*)0))) != ((void*)0)) ? ((char*)((((xmlSecTransformXmlParserGetKlass
())) ? ((xmlSecTransformXmlParserGetKlass())->name) : ((void
*)0)))) : (char*)"NULL")
);
1036 return(-1);
1037 }
1038 } else if(((firstType & xmlSecTransformDataTypeXml0x0002) == 0) &&
1039 ((inputDataType & xmlSecTransformDataTypeXml0x0002) != 0)) {
1040
1041 /* need to add c14n transform */
1042 transform = xmlSecTransformCtxCreateAndPrepend(ctx, xmlSecTransformInclC14NIdxmlSecTransformInclC14NGetKlass());
1043 if(transform == NULL((void*)0)) {
1044 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",1044,__FUNCTION__,
1045 NULL((void*)0),
1046 "xmlSecTransformCtxCreateAndPrepend",
1047 XMLSEC_ERRORS_R_XMLSEC_FAILED1,
1048 "transform=%s",
1049 xmlSecErrorsSafeString(xmlSecTransformKlassGetName(xmlSecTransformInclC14NId))((((((xmlSecTransformInclC14NGetKlass())) ? ((xmlSecTransformInclC14NGetKlass
())->name) : ((void*)0))) != ((void*)0)) ? ((char*)((((xmlSecTransformInclC14NGetKlass
())) ? ((xmlSecTransformInclC14NGetKlass())->name) : ((void
*)0)))) : (char*)"NULL")
);
1050 return(-1);
1051 }
1052 }
1053
1054 /* finally let application a chance to verify that it's ok to execte
1055 * this transforms chain */
1056 if(ctx->preExecCallback != NULL((void*)0)) {
1057 ret = (ctx->preExecCallback)(ctx);
1058 if(ret < 0) {
1059 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",1059,__FUNCTION__,
1060 NULL((void*)0),
1061 "ctx->preExecCallback",
1062 XMLSEC_ERRORS_R_XMLSEC_FAILED1,
1063 XMLSEC_ERRORS_NO_MESSAGE" ");
1064 return(-1);
1065 }
1066 }
1067
1068 ctx->status = xmlSecTransformStatusWorking;
1069 return(0);
1070}
1071
1072/**
1073 * xmlSecTransformCtxBinaryExecute:
1074 * @ctx: the pointer to transforms chain processing context.
1075 * @data: the input binary data buffer.
1076 * @dataSize: the input data size.
1077 *
1078 * Processes binary data using transforms chain in the @ctx.
1079 *
1080 * Returns: 0 on success or a negative value otherwise.
1081 */
1082int
1083xmlSecTransformCtxBinaryExecute(xmlSecTransformCtxPtr ctx,
1084 const xmlSecByteunsigned char* data, xmlSecSizesize_t dataSize) {
1085 int ret;
1086
1087 xmlSecAssert2(ctx != NULL, -1)if(!( ctx != ((void*)0) ) ) { xmlSecError("transforms.c",1087
,__FUNCTION__, ((void*)0), "ctx != NULL", 100, " "); return(-
1); }
;
1088 xmlSecAssert2(ctx->result == NULL, -1)if(!( ctx->result == ((void*)0) ) ) { xmlSecError("transforms.c"
,1088,__FUNCTION__, ((void*)0), "ctx->result == NULL", 100
, " "); return(-1); }
;
1089 xmlSecAssert2(ctx->status == xmlSecTransformStatusNone, -1)if(!( ctx->status == xmlSecTransformStatusNone ) ) { xmlSecError
("transforms.c",1089,__FUNCTION__, ((void*)0), "ctx->status == xmlSecTransformStatusNone"
, 100, " "); return(-1); }
;
1090 xmlSecAssert2(data != NULL, -1)if(!( data != ((void*)0) ) ) { xmlSecError("transforms.c",1090
,__FUNCTION__, ((void*)0), "data != NULL", 100, " "); return(
-1); }
;
1091 xmlSecAssert2(dataSize > 0, -1)if(!( dataSize > 0 ) ) { xmlSecError("transforms.c",1091,__FUNCTION__
, ((void*)0), "dataSize > 0", 100, " "); return(-1); }
;
1092
1093 /* we should not have uri stored in ctx */
1094 xmlSecAssert2(ctx->uri == NULL, -1)if(!( ctx->uri == ((void*)0) ) ) { xmlSecError("transforms.c"
,1094,__FUNCTION__, ((void*)0), "ctx->uri == NULL", 100, " "
); return(-1); }
;
1095
1096 ret = xmlSecTransformCtxPrepare(ctx, xmlSecTransformDataTypeBin0x0001);
1097 if(ret < 0) {
1098 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",1098,__FUNCTION__,
1099 NULL((void*)0),
1100 "xmlSecTransformCtxPrepare",
1101 XMLSEC_ERRORS_R_XMLSEC_FAILED1,
1102 "type=bin");
1103 return(-1);
1104 }
1105
1106 ret = xmlSecTransformPushBin(ctx->first, data, dataSize, 1, ctx);
1107 if(ret < 0) {
1108 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",1108,__FUNCTION__,
1109 NULL((void*)0),
1110 "xmlSecTransformCtxPushBin",
1111 XMLSEC_ERRORS_R_XMLSEC_FAILED1,
1112 "dataSize=%d", dataSize);
1113 return(-1);
1114 }
1115
1116 ctx->status = xmlSecTransformStatusFinished;
1117 return(0);
1118}
1119
1120/**
1121 * xmlSecTransformCtxUriExecute:
1122 * @ctx: the pointer to transforms chain processing context.
1123 * @uri: the URI.
1124 *
1125 * Process binary data from the URI using transforms chain in @ctx.
1126 *
1127 * Returns: 0 on success or a negative value otherwise.
1128 */
1129int
1130xmlSecTransformCtxUriExecute(xmlSecTransformCtxPtr ctx, const xmlChar* uri) {
1131 xmlSecTransformPtr uriTransform;
1132 int ret;
1133
1134 xmlSecAssert2(ctx != NULL, -1)if(!( ctx != ((void*)0) ) ) { xmlSecError("transforms.c",1134
,__FUNCTION__, ((void*)0), "ctx != NULL", 100, " "); return(-
1); }
;
1135 xmlSecAssert2(ctx->status == xmlSecTransformStatusNone, -1)if(!( ctx->status == xmlSecTransformStatusNone ) ) { xmlSecError
("transforms.c",1135,__FUNCTION__, ((void*)0), "ctx->status == xmlSecTransformStatusNone"
, 100, " "); return(-1); }
;
1136 xmlSecAssert2(uri != NULL, -1)if(!( uri != ((void*)0) ) ) { xmlSecError("transforms.c",1136
,__FUNCTION__, ((void*)0), "uri != NULL", 100, " "); return(-
1); }
;
1137
1138 /* we should not execute transform for a different uri */
1139 xmlSecAssert2((ctx->uri == NULL) || (uri == ctx->uri) || xmlStrEqual(uri, ctx->uri), -1)if(!( (ctx->uri == ((void*)0)) || (uri == ctx->uri) || xmlStrEqual
(uri, ctx->uri) ) ) { xmlSecError("transforms.c",1139,__FUNCTION__
, ((void*)0), "(ctx->uri == NULL) || (uri == ctx->uri) || xmlStrEqual(uri, ctx->uri)"
, 100, " "); return(-1); }
;
1140
1141 uriTransform = xmlSecTransformCtxCreateAndPrepend(ctx, xmlSecTransformInputURIIdxmlSecTransformInputURIGetKlass());
1142 if(uriTransform == NULL((void*)0)) {
1143 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",1143,__FUNCTION__,
1144 NULL((void*)0),
1145 "xmlSecTransformCtxCreateAndPrepend",
1146 XMLSEC_ERRORS_R_XMLSEC_FAILED1,
1147 "transform=%s",
1148 xmlSecErrorsSafeString(xmlSecTransformKlassGetName(xmlSecTransformInputURIId))((((((xmlSecTransformInputURIGetKlass())) ? ((xmlSecTransformInputURIGetKlass
())->name) : ((void*)0))) != ((void*)0)) ? ((char*)((((xmlSecTransformInputURIGetKlass
())) ? ((xmlSecTransformInputURIGetKlass())->name) : ((void
*)0)))) : (char*)"NULL")
);
1149 return(-1);
1150 }
1151
1152 ret = xmlSecTransformInputURIOpen(uriTransform, uri);
1153 if(ret < 0) {
1154 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",1154,__FUNCTION__,
1155 NULL((void*)0),
1156 "xmlSecTransformInputURIOpen",
1157 XMLSEC_ERRORS_R_XMLSEC_FAILED1,
1158 "uri=%s",
1159 xmlSecErrorsSafeString(uri)(((uri) != ((void*)0)) ? ((char*)(uri)) : (char*)"NULL"));
1160 return(-1);
1161 }
1162
1163 /* we do not need to do something special for this transform */
1164 ret = xmlSecTransformCtxPrepare(ctx, xmlSecTransformDataTypeUnknown0x0000);
1165 if(ret < 0) {
1166 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",1166,__FUNCTION__,
1167 NULL((void*)0),
1168 "xmlSecTransformCtxPrepare",
1169 XMLSEC_ERRORS_R_XMLSEC_FAILED1,
1170 "type=bin");
1171 return(-1);
1172 }
1173
1174 /* Now we have a choice: we either can push from first transform or pop
1175 * from last. Our C14N transforms prefers push, so push data!
1176 */
1177 ret = xmlSecTransformPump(uriTransform, uriTransform->next, ctx);
1178 if(ret < 0) {
1179 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",1179,__FUNCTION__,
1180 NULL((void*)0),
1181 "xmlSecTransformPump",
1182 XMLSEC_ERRORS_R_XMLSEC_FAILED1,
1183 "uri=%s",
1184 xmlSecErrorsSafeString(uri)(((uri) != ((void*)0)) ? ((char*)(uri)) : (char*)"NULL"));
1185 return(-1);
1186 }
1187
1188 ctx->status = xmlSecTransformStatusFinished;
1189 return(0);
1190}
1191
1192/**
1193 * xmlSecTransformCtxXmlExecute:
1194 * @ctx: the pointer to transforms chain processing context.
1195 * @nodes: the input node set.
1196 *
1197 * Process @nodes using transforms in the transforms chain in @ctx.
1198 *
1199 * Returns: 0 on success or a negative value otherwise.
1200 */
1201int
1202xmlSecTransformCtxXmlExecute(xmlSecTransformCtxPtr ctx, xmlSecNodeSetPtr nodes) {
1203 int ret;
1204
1205 xmlSecAssert2(ctx != NULL, -1)if(!( ctx != ((void*)0) ) ) { xmlSecError("transforms.c",1205
,__FUNCTION__, ((void*)0), "ctx != NULL", 100, " "); return(-
1); }
;
1206 xmlSecAssert2(ctx->result == NULL, -1)if(!( ctx->result == ((void*)0) ) ) { xmlSecError("transforms.c"
,1206,__FUNCTION__, ((void*)0), "ctx->result == NULL", 100
, " "); return(-1); }
;
1207 xmlSecAssert2(ctx->status == xmlSecTransformStatusNone, -1)if(!( ctx->status == xmlSecTransformStatusNone ) ) { xmlSecError
("transforms.c",1207,__FUNCTION__, ((void*)0), "ctx->status == xmlSecTransformStatusNone"
, 100, " "); return(-1); }
;
1208 xmlSecAssert2(nodes != NULL, -1)if(!( nodes != ((void*)0) ) ) { xmlSecError("transforms.c",1208
,__FUNCTION__, ((void*)0), "nodes != NULL", 100, " "); return
(-1); }
;
1209
1210 xmlSecAssert2((ctx->uri == NULL) || (xmlStrlen(ctx->uri) == 0), -1)if(!( (ctx->uri == ((void*)0)) || (xmlStrlen(ctx->uri) ==
0) ) ) { xmlSecError("transforms.c",1210,__FUNCTION__, ((void
*)0), "(ctx->uri == NULL) || (xmlStrlen(ctx->uri) == 0)"
, 100, " "); return(-1); }
;
1211
1212 ret = xmlSecTransformCtxPrepare(ctx, xmlSecTransformDataTypeXml0x0002);
1213 if(ret < 0) {
1214 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",1214,__FUNCTION__,
1215 NULL((void*)0),
1216 "xmlSecTransformCtxPrepare",
1217 XMLSEC_ERRORS_R_XMLSEC_FAILED1,
1218 "type=xml");
1219 return(-1);
1220 }
1221
1222 /* it's better to do push than pop because all XML transform
1223 * just don't care and c14n likes push more than pop */
1224 ret = xmlSecTransformPushXml(ctx->first, nodes, ctx);
1225 if(ret < 0) {
1226 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",1226,__FUNCTION__,
1227 NULL((void*)0),
1228 "xmlSecTransformPushXml",
1229 XMLSEC_ERRORS_R_XMLSEC_FAILED1,
1230 "transform=%s",
1231 xmlSecErrorsSafeString(xmlSecTransformGetName(ctx->first))(((((((( (ctx->first) ) != ((void*)0)) && (( (ctx->
first) )->id != ((void*)0)) && (( (ctx->first) )
->id->klassSize >= sizeof(xmlSecTransformKlass)) &&
(( (ctx->first) )->id->objSize >= sizeof(xmlSecTransform
)) && (( (ctx->first) )->id->name != ((void*
)0)))) ? ((((ctx->first)->id)) ? (((ctx->first)->
id)->name) : ((void*)0)) : ((void*)0))) != ((void*)0)) ? (
(char*)(((((( (ctx->first) ) != ((void*)0)) && (( (
ctx->first) )->id != ((void*)0)) && (( (ctx->
first) )->id->klassSize >= sizeof(xmlSecTransformKlass
)) && (( (ctx->first) )->id->objSize >= sizeof
(xmlSecTransform)) && (( (ctx->first) )->id->
name != ((void*)0)))) ? ((((ctx->first)->id)) ? (((ctx->
first)->id)->name) : ((void*)0)) : ((void*)0)))) : (char
*)"NULL")
);
1232 return(-1);
1233 }
1234
1235 ctx->status = xmlSecTransformStatusFinished;
1236 return(0);
1237}
1238
1239/**
1240 * xmlSecTransformCtxExecute:
1241 * @ctx: the pointer to transforms chain processing context.
1242 * @doc: the pointer to input document.
1243 *
1244 * Executes transforms chain in @ctx.
1245 *
1246 * Returns: 0 on success or a negative value otherwise.
1247 */
1248int
1249xmlSecTransformCtxExecute(xmlSecTransformCtxPtr ctx, xmlDocPtr doc) {
1250 int ret;
1251
1252 xmlSecAssert2(ctx != NULL, -1)if(!( ctx != ((void*)0) ) ) { xmlSecError("transforms.c",1252
,__FUNCTION__, ((void*)0), "ctx != NULL", 100, " "); return(-
1); }
;
1253 xmlSecAssert2(ctx->result == NULL, -1)if(!( ctx->result == ((void*)0) ) ) { xmlSecError("transforms.c"
,1253,__FUNCTION__, ((void*)0), "ctx->result == NULL", 100
, " "); return(-1); }
;
1254 xmlSecAssert2(ctx->status == xmlSecTransformStatusNone, -1)if(!( ctx->status == xmlSecTransformStatusNone ) ) { xmlSecError
("transforms.c",1254,__FUNCTION__, ((void*)0), "ctx->status == xmlSecTransformStatusNone"
, 100, " "); return(-1); }
;
1255 xmlSecAssert2(doc != NULL, -1)if(!( doc != ((void*)0) ) ) { xmlSecError("transforms.c",1255
,__FUNCTION__, ((void*)0), "doc != NULL", 100, " "); return(-
1); }
;
1256
1257 if((ctx->uri == NULL((void*)0)) || (xmlStrlen(ctx->uri) == 0)) {
1258 xmlSecNodeSetPtr nodes;
1259
1260 if((ctx->xptrExpr != NULL((void*)0)) && (xmlStrlen(ctx->xptrExpr) > 0)){
1261 /* our xpointer transform takes care of providing correct nodes set */
1262 nodes = xmlSecNodeSetCreate(doc, NULL((void*)0), xmlSecNodeSetNormal);
1263 if(nodes == NULL((void*)0)) {
1264 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",1264,__FUNCTION__,
1265 NULL((void*)0),
1266 "xmlSecNodeSetCreate",
1267 XMLSEC_ERRORS_R_XMLSEC_FAILED1,
1268 XMLSEC_ERRORS_NO_MESSAGE" ");
1269 return(-1);
1270 }
1271
1272 } else {
1273 /* we do not want to have comments for empty URI */
1274 nodes = xmlSecNodeSetGetChildren(doc, NULL((void*)0), 0, 0);
1275 if(nodes == NULL((void*)0)) {
1276 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",1276,__FUNCTION__,
1277 NULL((void*)0),
1278 "xmlSecNodeSetGetChildren",
1279 XMLSEC_ERRORS_R_XMLSEC_FAILED1,
1280 XMLSEC_ERRORS_NO_MESSAGE" ");
1281 return(-1);
1282 }
1283 }
1284 ret = xmlSecTransformCtxXmlExecute(ctx, nodes);
1285 if(ret < 0) {
1286 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",1286,__FUNCTION__,
1287 NULL((void*)0),
1288 "xmlSecTransformCtxXmlExecute",
1289 XMLSEC_ERRORS_R_XMLSEC_FAILED1,
1290 XMLSEC_ERRORS_NO_MESSAGE" ");
1291 xmlSecNodeSetDestroy(nodes);
1292 return(-1);
1293 }
1294 /* TODO: don't destroy nodes here */
1295 xmlSecNodeSetDestroy(nodes);
1296 } else {
1297 ret = xmlSecTransformCtxUriExecute(ctx, ctx->uri);
1298 if(ret < 0) {
1299 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",1299,__FUNCTION__,
1300 NULL((void*)0),
1301 "xmlSecTransformCtxUriExecute",
1302 XMLSEC_ERRORS_R_XMLSEC_FAILED1,
1303 XMLSEC_ERRORS_NO_MESSAGE" ");
1304 return(-1);
1305 }
1306 }
1307
1308 return(0);
1309}
1310
1311/**
1312 * xmlSecTransformCtxDebugDump:
1313 * @ctx: the pointer to transforms chain processing context.
1314 * @output: the pointer to output FILE.
1315 *
1316 * Prints transforms context debug information to @output.
1317 */
1318void
1319xmlSecTransformCtxDebugDump(xmlSecTransformCtxPtr ctx, FILE* output) {
1320 xmlSecTransformPtr transform;
1321
1322 xmlSecAssert(ctx != NULL)if(!( ctx != ((void*)0) ) ) { xmlSecError("transforms.c",1322
,__FUNCTION__, ((void*)0), "ctx != NULL", 100, " "); return; }
;
1323 xmlSecAssert(output != NULL)if(!( output != ((void*)0) ) ) { xmlSecError("transforms.c",1323
,__FUNCTION__, ((void*)0), "output != NULL", 100, " "); return
; }
;
1324
1325 fprintf(output, "== TRANSFORMS CTX (status=%d)\n", ctx->status);
1326
1327 fprintf(output, "== flags: 0x%08x\n", ctx->flags);
1328 fprintf(output, "== flags2: 0x%08x\n", ctx->flags2);
1329 if(xmlSecPtrListGetSize(&(ctx->enabledTransforms)) > 0) {
1330 fprintf(output, "== enabled transforms: ");
1331 xmlSecTransformIdListDebugDump(&(ctx->enabledTransforms), output);
1332 } else {
1333 fprintf(output, "== enabled transforms: all\n");
1334 }
1335
1336 fprintf(output, "=== uri: %s\n",
1337 (ctx->uri != NULL((void*)0)) ? ctx->uri : BAD_CAST(xmlChar *) "NULL");
1338 fprintf(output, "=== uri xpointer expr: %s\n",
1339 (ctx->xptrExpr != NULL((void*)0)) ? ctx->xptrExpr : BAD_CAST(xmlChar *) "NULL");
1340 for(transform = ctx->first; transform != NULL((void*)0); transform = transform->next) {
1341 xmlSecTransformDebugDump(transform, output);
1342 }
1343}
1344
1345/**
1346 * xmlSecTransformCtxDebugXmlDump:
1347 * @ctx: the pointer to transforms chain processing context.
1348 * @output: the pointer to output FILE.
1349 *
1350 * Prints transforms context debug information to @output in XML format.
1351 */
1352void
1353xmlSecTransformCtxDebugXmlDump(xmlSecTransformCtxPtr ctx, FILE* output) {
1354 xmlSecTransformPtr transform;
1355
1356 xmlSecAssert(ctx != NULL)if(!( ctx != ((void*)0) ) ) { xmlSecError("transforms.c",1356
,__FUNCTION__, ((void*)0), "ctx != NULL", 100, " "); return; }
;
1357 xmlSecAssert(output != NULL)if(!( output != ((void*)0) ) ) { xmlSecError("transforms.c",1357
,__FUNCTION__, ((void*)0), "output != NULL", 100, " "); return
; }
;
1358
1359 fprintf(output, "<TransformCtx status=\"%d\">\n", ctx->status);
1360
1361 fprintf(output, "<Flags>%08x</Flags>\n", ctx->flags);
1362 fprintf(output, "<Flags2>%08x</Flags2>\n", ctx->flags2);
1363 if(xmlSecPtrListGetSize(&(ctx->enabledTransforms)) > 0) {
1364 fprintf(output, "<EnabledTransforms>\n");
1365 xmlSecTransformIdListDebugXmlDump(&(ctx->enabledTransforms), output);
1366 fprintf(output, "</EnabledTransforms>\n");
1367 } else {
1368 fprintf(output, "<EnabledTransforms>all</EnabledTransforms>\n");
1369 }
1370
1371
1372 fprintf(output, "<Uri>");
1373 xmlSecPrintXmlString(output, ctx->uri);
1374 fprintf(output, "</Uri>\n");
1375
1376 fprintf(output, "<UriXPointer>");
1377 xmlSecPrintXmlString(output, ctx->xptrExpr);
1378 fprintf(output, "</UriXPointer>\n");
1379
1380 for(transform = ctx->first; transform != NULL((void*)0); transform = transform->next) {
1381 xmlSecTransformDebugXmlDump(transform, output);
1382 }
1383 fprintf(output, "</TransformCtx>\n");
1384}
1385
1386/**************************************************************************
1387 *
1388 * xmlSecTransform
1389 *
1390 *************************************************************************/
1391/**
1392 * xmlSecTransformCreate:
1393 * @id: the transform id to create.
1394 *
1395 * Creates new transform of the @id klass. The caller is responsible for
1396 * destroying returned tansform using #xmlSecTransformDestroy function.
1397 *
1398 * Returns: pointer to newly created transform or NULL if an error occurs.
1399 */
1400xmlSecTransformPtr
1401xmlSecTransformCreate(xmlSecTransformId id) {
1402 xmlSecTransformPtr transform;
1403 int ret;
1404
1405 xmlSecAssert2(id != NULL, NULL)if(!( id != ((void*)0) ) ) { xmlSecError("transforms.c",1405,
__FUNCTION__, ((void*)0), "id != NULL", 100, " "); return(((void
*)0)); }
;
1406 xmlSecAssert2(id->klassSize >= sizeof(xmlSecTransformKlass), NULL)if(!( id->klassSize >= sizeof(xmlSecTransformKlass) ) )
{ xmlSecError("transforms.c",1406,__FUNCTION__, ((void*)0), "id->klassSize >= sizeof(xmlSecTransformKlass)"
, 100, " "); return(((void*)0)); }
;
1407 xmlSecAssert2(id->objSize >= sizeof(xmlSecTransform), NULL)if(!( id->objSize >= sizeof(xmlSecTransform) ) ) { xmlSecError
("transforms.c",1407,__FUNCTION__, ((void*)0), "id->objSize >= sizeof(xmlSecTransform)"
, 100, " "); return(((void*)0)); }
;
1408 xmlSecAssert2(id->name != NULL, NULL)if(!( id->name != ((void*)0) ) ) { xmlSecError("transforms.c"
,1408,__FUNCTION__, ((void*)0), "id->name != NULL", 100, " "
); return(((void*)0)); }
;
1409
1410 /* Allocate a new xmlSecTransform and fill the fields. */
1411 transform = (xmlSecTransformPtr)xmlMalloc(id->objSize);
1412 if(transform == NULL((void*)0)) {
1413 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",1413,__FUNCTION__,
1414 NULL((void*)0),
1415 NULL((void*)0),
1416 XMLSEC_ERRORS_R_MALLOC_FAILED2,
1417 "size=%d", id->objSize);
1418 return(NULL((void*)0));
1419 }
1420 memset(transform, 0, id->objSize);
1421 transform->id = id;
1422
1423 if(id->initialize != NULL((void*)0)) {
1424 ret = (id->initialize)(transform);
1425 if(ret < 0) {
1426 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",1426,__FUNCTION__,
1427 xmlSecErrorsSafeString(xmlSecTransformGetName(transform))(((((((( (transform) ) != ((void*)0)) && (( (transform
) )->id != ((void*)0)) && (( (transform) )->id->
klassSize >= sizeof(xmlSecTransformKlass)) && (( (
transform) )->id->objSize >= sizeof(xmlSecTransform)
) && (( (transform) )->id->name != ((void*)0)))
) ? ((((transform)->id)) ? (((transform)->id)->name)
: ((void*)0)) : ((void*)0))) != ((void*)0)) ? ((char*)((((((
(transform) ) != ((void*)0)) && (( (transform) )->
id != ((void*)0)) && (( (transform) )->id->klassSize
>= sizeof(xmlSecTransformKlass)) && (( (transform
) )->id->objSize >= sizeof(xmlSecTransform)) &&
(( (transform) )->id->name != ((void*)0)))) ? ((((transform
)->id)) ? (((transform)->id)->name) : ((void*)0)) : (
(void*)0)))) : (char*)"NULL")
,
1428 "id->initialize",
1429 XMLSEC_ERRORS_R_XMLSEC_FAILED1,
1430 XMLSEC_ERRORS_NO_MESSAGE" ");
1431 xmlSecTransformDestroy(transform);
1432 return(NULL((void*)0));
1433 }
1434 }
1435
1436 ret = xmlSecBufferInitialize(&(transform->inBuf), 0);
1437 if(ret < 0) {
1438 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",1438,__FUNCTION__,
1439 xmlSecErrorsSafeString(xmlSecTransformGetName(transform))(((((((( (transform) ) != ((void*)0)) && (( (transform
) )->id != ((void*)0)) && (( (transform) )->id->
klassSize >= sizeof(xmlSecTransformKlass)) && (( (
transform) )->id->objSize >= sizeof(xmlSecTransform)
) && (( (transform) )->id->name != ((void*)0)))
) ? ((((transform)->id)) ? (((transform)->id)->name)
: ((void*)0)) : ((void*)0))) != ((void*)0)) ? ((char*)((((((
(transform) ) != ((void*)0)) && (( (transform) )->
id != ((void*)0)) && (( (transform) )->id->klassSize
>= sizeof(xmlSecTransformKlass)) && (( (transform
) )->id->objSize >= sizeof(xmlSecTransform)) &&
(( (transform) )->id->name != ((void*)0)))) ? ((((transform
)->id)) ? (((transform)->id)->name) : ((void*)0)) : (
(void*)0)))) : (char*)"NULL")
,
1440 "xmlSecBufferInitialize",
1441 XMLSEC_ERRORS_R_XMLSEC_FAILED1,
1442 "size=%d", 0);
1443 xmlSecTransformDestroy(transform);
1444 return(NULL((void*)0));
1445 }
1446
1447 ret = xmlSecBufferInitialize(&(transform->outBuf), 0);
1448 if(ret < 0) {
1449 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",1449,__FUNCTION__,
1450 xmlSecErrorsSafeString(xmlSecTransformGetName(transform))(((((((( (transform) ) != ((void*)0)) && (( (transform
) )->id != ((void*)0)) && (( (transform) )->id->
klassSize >= sizeof(xmlSecTransformKlass)) && (( (
transform) )->id->objSize >= sizeof(xmlSecTransform)
) && (( (transform) )->id->name != ((void*)0)))
) ? ((((transform)->id)) ? (((transform)->id)->name)
: ((void*)0)) : ((void*)0))) != ((void*)0)) ? ((char*)((((((
(transform) ) != ((void*)0)) && (( (transform) )->
id != ((void*)0)) && (( (transform) )->id->klassSize
>= sizeof(xmlSecTransformKlass)) && (( (transform
) )->id->objSize >= sizeof(xmlSecTransform)) &&
(( (transform) )->id->name != ((void*)0)))) ? ((((transform
)->id)) ? (((transform)->id)->name) : ((void*)0)) : (
(void*)0)))) : (char*)"NULL")
,
1451 "xmlSecBufferInitialize",
1452 XMLSEC_ERRORS_R_XMLSEC_FAILED1,
1453 "size=%d", 0);
1454 xmlSecTransformDestroy(transform);
1455 return(NULL((void*)0));
1456 }
1457
1458 return(transform);
1459}
1460
1461/**
1462 * xmlSecTransformDestroy:
1463 * @transform: the pointer to transform.
1464 *
1465 * Destroys transform created with #xmlSecTransformCreate function.
1466 */
1467void
1468xmlSecTransformDestroy(xmlSecTransformPtr transform) {
1469 xmlSecAssert(xmlSecTransformIsValid(transform))if(!( ((( transform ) != ((void*)0)) && (( transform )
->id != ((void*)0)) && (( transform )->id->klassSize
>= sizeof(xmlSecTransformKlass)) && (( transform )
->id->objSize >= sizeof(xmlSecTransform)) &&
(( transform )->id->name != ((void*)0))) ) ) { xmlSecError
("transforms.c",1469,__FUNCTION__, ((void*)0), "xmlSecTransformIsValid(transform)"
, 100, " "); return; }
;
1470 xmlSecAssert(transform->id->objSize > 0)if(!( transform->id->objSize > 0 ) ) { xmlSecError("transforms.c"
,1470,__FUNCTION__, ((void*)0), "transform->id->objSize > 0"
, 100, " "); return; }
;
1471
1472 /* first need to remove ourselves from chain */
1473 xmlSecTransformRemove(transform);
1474
1475 xmlSecBufferFinalize(&(transform->inBuf));
1476 xmlSecBufferFinalize(&(transform->outBuf));
1477
1478 /* we never destroy input nodes, output nodes
1479 * are destroyed if and only if they are different
1480 * from input nodes
1481 */
1482 if((transform->outNodes != NULL((void*)0)) && (transform->outNodes != transform->inNodes)) {
1483 xmlSecNodeSetDestroy(transform->outNodes);
1484 }
1485 if(transform->id->finalize != NULL((void*)0)) {
1486 (transform->id->finalize)(transform);
1487 }
1488 memset(transform, 0, transform->id->objSize);
1489 xmlFree(transform);
1490}
1491
1492/**
1493 * xmlSecTransformNodeRead:
1494 * @node: the pointer to the transform's node.
1495 * @usage: the transform usage (signature, encryption, ...).
1496 * @transformCtx: the transform's chaing processing context.
1497 *
1498 * Reads transform from the @node as follows:
1499 *
1500 * 1) reads "Algorithm" attribute;
1501 *
1502 * 2) checks the lists of known and allowed transforms;
1503 *
1504 * 3) calls transform's create method;
1505 *
1506 * 4) calls transform's read transform node method.
1507 *
1508 * Returns: pointer to newly created transform or NULL if an error occurs.
1509 */
1510xmlSecTransformPtr
1511xmlSecTransformNodeRead(xmlNodePtr node, xmlSecTransformUsage usage, xmlSecTransformCtxPtr transformCtx) {
1512 xmlSecTransformPtr transform;
1513 xmlSecTransformId id;
1514 xmlChar *href;
1515 int ret;
1516
1517 xmlSecAssert2(node != NULL, NULL)if(!( node != ((void*)0) ) ) { xmlSecError("transforms.c",1517
,__FUNCTION__, ((void*)0), "node != NULL", 100, " "); return(
((void*)0)); }
;
1518 xmlSecAssert2(transformCtx != NULL, NULL)if(!( transformCtx != ((void*)0) ) ) { xmlSecError("transforms.c"
,1518,__FUNCTION__, ((void*)0), "transformCtx != NULL", 100, " "
); return(((void*)0)); }
;
1519
1520 href = xmlGetProp(node, xmlSecAttrAlgorithm);
1521 if(href == NULL((void*)0)) {
1522 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",1522,__FUNCTION__,
1523 NULL((void*)0),
1524 xmlSecErrorsSafeString(xmlSecAttrAlgorithm)(((xmlSecAttrAlgorithm) != ((void*)0)) ? ((char*)(xmlSecAttrAlgorithm
)) : (char*)"NULL")
,
1525 XMLSEC_ERRORS_R_INVALID_NODE_ATTRIBUTE23,
1526 "node=%s",
1527 xmlSecErrorsSafeString(xmlSecNodeGetName(node))((((((node)) ? ((const char*)((node)->name)) : ((void*)0))
) != ((void*)0)) ? ((char*)((((node)) ? ((const char*)((node)
->name)) : ((void*)0)))) : (char*)"NULL")
);
1528 return(NULL((void*)0));
1529 }
1530
1531 id = xmlSecTransformIdListFindByHref(xmlSecTransformIdsGet(), href, usage);
1532 if(id == xmlSecTransformIdUnknown((xmlSecTransformId)((void*)0))) {
1533 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",1533,__FUNCTION__,
1534 NULL((void*)0),
1535 "xmlSecTransformIdListFindByHref",
1536 XMLSEC_ERRORS_R_XMLSEC_FAILED1,
1537 "href=%s",
1538 xmlSecErrorsSafeString(href)(((href) != ((void*)0)) ? ((char*)(href)) : (char*)"NULL"));
1539 xmlFree(href);
1540 return(NULL((void*)0));
1541 }
1542
1543 /* check with enabled transforms list */
1544 if((xmlSecPtrListGetSize(&(transformCtx->enabledTransforms)) > 0) &&
1545 (xmlSecTransformIdListFind(&(transformCtx->enabledTransforms), id) != 1)) {
1546 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",1546,__FUNCTION__,
1547 NULL((void*)0),
1548 xmlSecErrorsSafeString(xmlSecTransformKlassGetName(id))((((((id)) ? ((id)->name) : ((void*)0))) != ((void*)0)) ? (
(char*)((((id)) ? ((id)->name) : ((void*)0)))) : (char*)"NULL"
)
,
1549 XMLSEC_ERRORS_R_TRANSFORM_DISABLED35,
1550 "href=%s",
1551 xmlSecErrorsSafeString(href)(((href) != ((void*)0)) ? ((char*)(href)) : (char*)"NULL"));
1552 xmlFree(href);
1553 return(NULL((void*)0));
1554 }
1555
1556 transform = xmlSecTransformCreate(id);
1557 if(!xmlSecTransformIsValid(transform)((( transform ) != ((void*)0)) && (( transform )->
id != ((void*)0)) && (( transform )->id->klassSize
>= sizeof(xmlSecTransformKlass)) && (( transform )
->id->objSize >= sizeof(xmlSecTransform)) &&
(( transform )->id->name != ((void*)0)))
) {
1558 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",1558,__FUNCTION__,
1559 NULL((void*)0),
1560 "xmlSecTransformCreate",
1561 XMLSEC_ERRORS_R_XMLSEC_FAILED1,
1562 "transform=%s",
1563 xmlSecErrorsSafeString(xmlSecTransformKlassGetName(id))((((((id)) ? ((id)->name) : ((void*)0))) != ((void*)0)) ? (
(char*)((((id)) ? ((id)->name) : ((void*)0)))) : (char*)"NULL"
)
);
1564 xmlFree(href);
1565 return(NULL((void*)0));
1566 }
1567
1568 if(transform->id->readNode != NULL((void*)0)) {
1569 ret = transform->id->readNode(transform, node, transformCtx);
1570 if(ret < 0) {
1571 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",1571,__FUNCTION__,
1572 NULL((void*)0),
1573 "id->readNode",
1574 XMLSEC_ERRORS_R_XMLSEC_FAILED1,
1575 "transform=%s",
1576 xmlSecErrorsSafeString(xmlSecTransformGetName(transform))(((((((( (transform) ) != ((void*)0)) && (( (transform
) )->id != ((void*)0)) && (( (transform) )->id->
klassSize >= sizeof(xmlSecTransformKlass)) && (( (
transform) )->id->objSize >= sizeof(xmlSecTransform)
) && (( (transform) )->id->name != ((void*)0)))
) ? ((((transform)->id)) ? (((transform)->id)->name)
: ((void*)0)) : ((void*)0))) != ((void*)0)) ? ((char*)((((((
(transform) ) != ((void*)0)) && (( (transform) )->
id != ((void*)0)) && (( (transform) )->id->klassSize
>= sizeof(xmlSecTransformKlass)) && (( (transform
) )->id->objSize >= sizeof(xmlSecTransform)) &&
(( (transform) )->id->name != ((void*)0)))) ? ((((transform
)->id)) ? (((transform)->id)->name) : ((void*)0)) : (
(void*)0)))) : (char*)"NULL")
);
1577 xmlSecTransformDestroy(transform);
1578 xmlFree(href);
1579 return(NULL((void*)0));
1580 }
1581 }
1582
1583 /* finally remember the transform node */
1584 transform->hereNode = node;
1585 xmlFree(href);
1586 return(transform);
1587}
1588
1589/**
1590 * xmlSecTransformPump:
1591 * @left: the source pumping transform.
1592 * @right: the destination pumping transform.
1593 * @transformCtx: the transform's chaing processing context.
1594 *
1595 * Pops data from @left transform and pushes to @right transform until
1596 * no more data is available.
1597 *
1598 * Returns: 0 on success or a negative value if an error occurs.
1599 */
1600int
1601xmlSecTransformPump(xmlSecTransformPtr left, xmlSecTransformPtr right, xmlSecTransformCtxPtr transformCtx) {
1602 xmlSecTransformDataType leftType;
1603 xmlSecTransformDataType rightType;
1604 int ret;
1605
1606 xmlSecAssert2(xmlSecTransformIsValid(left), -1)if(!( ((( left ) != ((void*)0)) && (( left )->id !=
((void*)0)) && (( left )->id->klassSize >= sizeof
(xmlSecTransformKlass)) && (( left )->id->objSize
>= sizeof(xmlSecTransform)) && (( left )->id->
name != ((void*)0))) ) ) { xmlSecError("transforms.c",1606,__FUNCTION__
, ((void*)0), "xmlSecTransformIsValid(left)", 100, " "); return
(-1); }
;
1607 xmlSecAssert2(xmlSecTransformIsValid(right), -1)if(!( ((( right ) != ((void*)0)) && (( right )->id
!= ((void*)0)) && (( right )->id->klassSize >=
sizeof(xmlSecTransformKlass)) && (( right )->id->
objSize >= sizeof(xmlSecTransform)) && (( right )->
id->name != ((void*)0))) ) ) { xmlSecError("transforms.c",
1607,__FUNCTION__, ((void*)0), "xmlSecTransformIsValid(right)"
, 100, " "); return(-1); }
;
1608 xmlSecAssert2(transformCtx != NULL, -1)if(!( transformCtx != ((void*)0) ) ) { xmlSecError("transforms.c"
,1608,__FUNCTION__, ((void*)0), "transformCtx != NULL", 100, " "
); return(-1); }
;
1609
1610 leftType = xmlSecTransformGetDataType(left, xmlSecTransformModePop, transformCtx);
1611 rightType = xmlSecTransformGetDataType(right, xmlSecTransformModePush, transformCtx);
1612
1613 if(((leftType & xmlSecTransformDataTypeXml0x0002) != 0) &&
1614 ((rightType & xmlSecTransformDataTypeXml0x0002) != 0)) {
1615
1616 xmlSecNodeSetPtr nodes = NULL((void*)0);
1617
1618 ret = xmlSecTransformPopXml(left, &nodes, transformCtx);
1619 if(ret < 0) {
1620 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",1620,__FUNCTION__,
1621 xmlSecErrorsSafeString(xmlSecTransformGetName(left))(((((((( (left) ) != ((void*)0)) && (( (left) )->id
!= ((void*)0)) && (( (left) )->id->klassSize >=
sizeof(xmlSecTransformKlass)) && (( (left) )->id->
objSize >= sizeof(xmlSecTransform)) && (( (left) )
->id->name != ((void*)0)))) ? ((((left)->id)) ? (((left
)->id)->name) : ((void*)0)) : ((void*)0))) != ((void*)0
)) ? ((char*)(((((( (left) ) != ((void*)0)) && (( (left
) )->id != ((void*)0)) && (( (left) )->id->klassSize
>= sizeof(xmlSecTransformKlass)) && (( (left) )->
id->objSize >= sizeof(xmlSecTransform)) && (( (
left) )->id->name != ((void*)0)))) ? ((((left)->id))
? (((left)->id)->name) : ((void*)0)) : ((void*)0)))) :
(char*)"NULL")
,
1622 "xmlSecTransformPopXml",
1623 XMLSEC_ERRORS_R_XMLSEC_FAILED1,
1624 XMLSEC_ERRORS_NO_MESSAGE" ");
1625 return(-1);
1626 }
1627
1628 ret = xmlSecTransformPushXml(right, nodes, transformCtx);
1629 if(ret < 0) {
1630 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",1630,__FUNCTION__,
1631 xmlSecErrorsSafeString(xmlSecTransformGetName(right))(((((((( (right) ) != ((void*)0)) && (( (right) )->
id != ((void*)0)) && (( (right) )->id->klassSize
>= sizeof(xmlSecTransformKlass)) && (( (right) )->
id->objSize >= sizeof(xmlSecTransform)) && (( (
right) )->id->name != ((void*)0)))) ? ((((right)->id
)) ? (((right)->id)->name) : ((void*)0)) : ((void*)0)))
!= ((void*)0)) ? ((char*)(((((( (right) ) != ((void*)0)) &&
(( (right) )->id != ((void*)0)) && (( (right) )->
id->klassSize >= sizeof(xmlSecTransformKlass)) &&
(( (right) )->id->objSize >= sizeof(xmlSecTransform
)) && (( (right) )->id->name != ((void*)0)))) ?
((((right)->id)) ? (((right)->id)->name) : ((void*)
0)) : ((void*)0)))) : (char*)"NULL")
,
1632 "xmlSecTransformPushXml",
1633 XMLSEC_ERRORS_R_XMLSEC_FAILED1,
1634 XMLSEC_ERRORS_NO_MESSAGE" ");
1635 return(-1);
1636 }
1637 } else if(((leftType & xmlSecTransformDataTypeBin0x0001) != 0) &&
1638 ((rightType & xmlSecTransformDataTypeBin0x0001) != 0)) {
1639 xmlSecByteunsigned char buf[XMLSEC_TRANSFORM_BINARY_CHUNK64];
1640 xmlSecSizesize_t bufSize;
1641 int final;
1642
1643 do {
1644 ret = xmlSecTransformPopBin(left, buf, sizeof(buf), &bufSize, transformCtx);
1645 if(ret < 0) {
1646 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",1646,__FUNCTION__,
1647 xmlSecErrorsSafeString(xmlSecTransformGetName(left))(((((((( (left) ) != ((void*)0)) && (( (left) )->id
!= ((void*)0)) && (( (left) )->id->klassSize >=
sizeof(xmlSecTransformKlass)) && (( (left) )->id->
objSize >= sizeof(xmlSecTransform)) && (( (left) )
->id->name != ((void*)0)))) ? ((((left)->id)) ? (((left
)->id)->name) : ((void*)0)) : ((void*)0))) != ((void*)0
)) ? ((char*)(((((( (left) ) != ((void*)0)) && (( (left
) )->id != ((void*)0)) && (( (left) )->id->klassSize
>= sizeof(xmlSecTransformKlass)) && (( (left) )->
id->objSize >= sizeof(xmlSecTransform)) && (( (
left) )->id->name != ((void*)0)))) ? ((((left)->id))
? (((left)->id)->name) : ((void*)0)) : ((void*)0)))) :
(char*)"NULL")
,
1648 "xmlSecTransformPopBin",
1649 XMLSEC_ERRORS_R_XMLSEC_FAILED1,
1650 XMLSEC_ERRORS_NO_MESSAGE" ");
1651 return(-1);
1652 }
1653 final = (bufSize == 0) ? 1 : 0;
1654 ret = xmlSecTransformPushBin(right, buf, bufSize, final, transformCtx);
1655 if(ret < 0) {
1656 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",1656,__FUNCTION__,
1657 xmlSecErrorsSafeString(xmlSecTransformGetName(right))(((((((( (right) ) != ((void*)0)) && (( (right) )->
id != ((void*)0)) && (( (right) )->id->klassSize
>= sizeof(xmlSecTransformKlass)) && (( (right) )->
id->objSize >= sizeof(xmlSecTransform)) && (( (
right) )->id->name != ((void*)0)))) ? ((((right)->id
)) ? (((right)->id)->name) : ((void*)0)) : ((void*)0)))
!= ((void*)0)) ? ((char*)(((((( (right) ) != ((void*)0)) &&
(( (right) )->id != ((void*)0)) && (( (right) )->
id->klassSize >= sizeof(xmlSecTransformKlass)) &&
(( (right) )->id->objSize >= sizeof(xmlSecTransform
)) && (( (right) )->id->name != ((void*)0)))) ?
((((right)->id)) ? (((right)->id)->name) : ((void*)
0)) : ((void*)0)))) : (char*)"NULL")
,
1658 "xmlSecTransformPushBin",
1659 XMLSEC_ERRORS_R_XMLSEC_FAILED1,
1660 XMLSEC_ERRORS_NO_MESSAGE" ");
1661 return(-1);
1662 }
1663 } while(final == 0);
1664 } else {
1665 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",1665,__FUNCTION__,
1666 xmlSecErrorsSafeString(xmlSecTransformGetName(left))(((((((( (left) ) != ((void*)0)) && (( (left) )->id
!= ((void*)0)) && (( (left) )->id->klassSize >=
sizeof(xmlSecTransformKlass)) && (( (left) )->id->
objSize >= sizeof(xmlSecTransform)) && (( (left) )
->id->name != ((void*)0)))) ? ((((left)->id)) ? (((left
)->id)->name) : ((void*)0)) : ((void*)0))) != ((void*)0
)) ? ((char*)(((((( (left) ) != ((void*)0)) && (( (left
) )->id != ((void*)0)) && (( (left) )->id->klassSize
>= sizeof(xmlSecTransformKlass)) && (( (left) )->
id->objSize >= sizeof(xmlSecTransform)) && (( (
left) )->id->name != ((void*)0)))) ? ((((left)->id))
? (((left)->id)->name) : ((void*)0)) : ((void*)0)))) :
(char*)"NULL")
,
1667 xmlSecErrorsSafeString(xmlSecTransformGetName(right))(((((((( (right) ) != ((void*)0)) && (( (right) )->
id != ((void*)0)) && (( (right) )->id->klassSize
>= sizeof(xmlSecTransformKlass)) && (( (right) )->
id->objSize >= sizeof(xmlSecTransform)) && (( (
right) )->id->name != ((void*)0)))) ? ((((right)->id
)) ? (((right)->id)->name) : ((void*)0)) : ((void*)0)))
!= ((void*)0)) ? ((char*)(((((( (right) ) != ((void*)0)) &&
(( (right) )->id != ((void*)0)) && (( (right) )->
id->klassSize >= sizeof(xmlSecTransformKlass)) &&
(( (right) )->id->objSize >= sizeof(xmlSecTransform
)) && (( (right) )->id->name != ((void*)0)))) ?
((((right)->id)) ? (((right)->id)->name) : ((void*)
0)) : ((void*)0)))) : (char*)"NULL")
,
1668 XMLSEC_ERRORS_R_INVALID_TRANSFORM31,
1669 "transforms input/output data formats do not match");
1670 }
1671 return(0);
1672}
1673
1674
1675/**
1676 * xmlSecTransformSetKey:
1677 * @transform: the pointer to transform.
1678 * @key: the pointer to key.
1679 *
1680 * Sets the transform's key.
1681 *
1682 * Returns: 0 on success or a negative value otherwise.
1683 */
1684int
1685xmlSecTransformSetKey(xmlSecTransformPtr transform, xmlSecKeyPtr key) {
1686 xmlSecAssert2(xmlSecTransformIsValid(transform), -1)if(!( ((( transform ) != ((void*)0)) && (( transform )
->id != ((void*)0)) && (( transform )->id->klassSize
>= sizeof(xmlSecTransformKlass)) && (( transform )
->id->objSize >= sizeof(xmlSecTransform)) &&
(( transform )->id->name != ((void*)0))) ) ) { xmlSecError
("transforms.c",1686,__FUNCTION__, ((void*)0), "xmlSecTransformIsValid(transform)"
, 100, " "); return(-1); }
;
1687 xmlSecAssert2(key != NULL, -1)if(!( key != ((void*)0) ) ) { xmlSecError("transforms.c",1687
,__FUNCTION__, ((void*)0), "key != NULL", 100, " "); return(-
1); }
;
1688
1689 if(transform->id->setKey != NULL((void*)0)) {
1690 return((transform->id->setKey)(transform, key));
1691 }
1692 return(0);
1693}
1694
1695/**
1696 * xmlSecTransformSetKeyReq:
1697 * @transform: the pointer to transform.
1698 * @keyReq: the pointer to keys requirements object.
1699 *
1700 * Sets the key requirements for @transform in the @keyReq.
1701 *
1702 * Returns: 0 on success or a negative value otherwise.
1703 */
1704int
1705xmlSecTransformSetKeyReq(xmlSecTransformPtr transform, xmlSecKeyReqPtr keyReq) {
1706 xmlSecAssert2(xmlSecTransformIsValid(transform), -1)if(!( ((( transform ) != ((void*)0)) && (( transform )
->id != ((void*)0)) && (( transform )->id->klassSize
>= sizeof(xmlSecTransformKlass)) && (( transform )
->id->objSize >= sizeof(xmlSecTransform)) &&
(( transform )->id->name != ((void*)0))) ) ) { xmlSecError
("transforms.c",1706,__FUNCTION__, ((void*)0), "xmlSecTransformIsValid(transform)"
, 100, " "); return(-1); }
;
1707 xmlSecAssert2(keyReq != NULL, -1)if(!( keyReq != ((void*)0) ) ) { xmlSecError("transforms.c",1707
,__FUNCTION__, ((void*)0), "keyReq != NULL", 100, " "); return
(-1); }
;
1708
1709 keyReq->keyId = xmlSecKeyDataIdUnknown((xmlSecKeyDataId)((void*)0));
1710 keyReq->keyType = xmlSecKeyDataTypeUnknown0x0000;
1711 keyReq->keyUsage = xmlSecKeyUsageAny0xFFFFFFFF;
1712 keyReq->keyBitsSize = 0;
1713
1714 if(transform->id->setKeyReq != NULL((void*)0)) {
1715 return((transform->id->setKeyReq)(transform, keyReq));
1716 }
1717 return(0);
1718}
1719
1720/**
1721 * xmlSecTransformVerify:
1722 * @transform: the pointer to transform.
1723 * @data: the binary data for verification.
1724 * @dataSize: the data size.
1725 * @transformCtx: the transform's chaing processing context.
1726 *
1727 * Verifies the data with transform's processing results
1728 * (for digest, HMAC and signature transforms). The verification
1729 * result is stored in the #status member of #xmlSecTransform object.
1730 *
1731 * Returns: 0 on success or a negative value if an error occurs.
1732 */
1733int
1734xmlSecTransformVerify(xmlSecTransformPtr transform, const xmlSecByteunsigned char* data,
1735 xmlSecSizesize_t dataSize, xmlSecTransformCtxPtr transformCtx) {
1736 xmlSecAssert2(xmlSecTransformIsValid(transform), -1)if(!( ((( transform ) != ((void*)0)) && (( transform )
->id != ((void*)0)) && (( transform )->id->klassSize
>= sizeof(xmlSecTransformKlass)) && (( transform )
->id->objSize >= sizeof(xmlSecTransform)) &&
(( transform )->id->name != ((void*)0))) ) ) { xmlSecError
("transforms.c",1736,__FUNCTION__, ((void*)0), "xmlSecTransformIsValid(transform)"
, 100, " "); return(-1); }
;
1737 xmlSecAssert2(transform->id->verify != NULL, -1)if(!( transform->id->verify != ((void*)0) ) ) { xmlSecError
("transforms.c",1737,__FUNCTION__, ((void*)0), "transform->id->verify != NULL"
, 100, " "); return(-1); }
;
1738 xmlSecAssert2(transformCtx != NULL, -1)if(!( transformCtx != ((void*)0) ) ) { xmlSecError("transforms.c"
,1738,__FUNCTION__, ((void*)0), "transformCtx != NULL", 100, " "
); return(-1); }
;
1739
1740 return((transform->id->verify)(transform, data, dataSize, transformCtx));
1741}
1742
1743/**
1744 * xmlSecTransformVerifyNodeContent:
1745 * @transform: the pointer to transform.
1746 * @node: the pointer to node.
1747 * @transformCtx: the transform's chaing processing context.
1748 *
1749 * Gets the @node content, base64 decodes it and calls #xmlSecTransformVerify
1750 * function to verify binary results.
1751 *
1752 * Returns: 0 on success or a negative value if an error occurs.
1753 */
1754int
1755xmlSecTransformVerifyNodeContent(xmlSecTransformPtr transform, xmlNodePtr node,
1756 xmlSecTransformCtxPtr transformCtx) {
1757 xmlSecBuffer buffer;
1758 int ret;
1759
1760 xmlSecAssert2(xmlSecTransformIsValid(transform), -1)if(!( ((( transform ) != ((void*)0)) && (( transform )
->id != ((void*)0)) && (( transform )->id->klassSize
>= sizeof(xmlSecTransformKlass)) && (( transform )
->id->objSize >= sizeof(xmlSecTransform)) &&
(( transform )->id->name != ((void*)0))) ) ) { xmlSecError
("transforms.c",1760,__FUNCTION__, ((void*)0), "xmlSecTransformIsValid(transform)"
, 100, " "); return(-1); }
;
1761 xmlSecAssert2(node != NULL, -1)if(!( node != ((void*)0) ) ) { xmlSecError("transforms.c",1761
,__FUNCTION__, ((void*)0), "node != NULL", 100, " "); return(
-1); }
;
1762 xmlSecAssert2(transformCtx != NULL, -1)if(!( transformCtx != ((void*)0) ) ) { xmlSecError("transforms.c"
,1762,__FUNCTION__, ((void*)0), "transformCtx != NULL", 100, " "
); return(-1); }
;
1763
1764 ret = xmlSecBufferInitialize(&buffer, 0);
1765 if(ret < 0) {
1766 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",1766,__FUNCTION__,
1767 xmlSecErrorsSafeString(xmlSecTransformGetName(transform))(((((((( (transform) ) != ((void*)0)) && (( (transform
) )->id != ((void*)0)) && (( (transform) )->id->
klassSize >= sizeof(xmlSecTransformKlass)) && (( (
transform) )->id->objSize >= sizeof(xmlSecTransform)
) && (( (transform) )->id->name != ((void*)0)))
) ? ((((transform)->id)) ? (((transform)->id)->name)
: ((void*)0)) : ((void*)0))) != ((void*)0)) ? ((char*)((((((
(transform) ) != ((void*)0)) && (( (transform) )->
id != ((void*)0)) && (( (transform) )->id->klassSize
>= sizeof(xmlSecTransformKlass)) && (( (transform
) )->id->objSize >= sizeof(xmlSecTransform)) &&
(( (transform) )->id->name != ((void*)0)))) ? ((((transform
)->id)) ? (((transform)->id)->name) : ((void*)0)) : (
(void*)0)))) : (char*)"NULL")
,
1768 "xmlSecBufferInitialize",
1769 XMLSEC_ERRORS_R_XMLSEC_FAILED1,
1770 XMLSEC_ERRORS_NO_MESSAGE" ");
1771 return(-1);
1772 }
1773
1774 ret = xmlSecBufferBase64NodeContentRead(&buffer, node);
1775 if((ret < 0) || (xmlSecBufferGetData(&buffer) == NULL((void*)0))) {
1776 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",1776,__FUNCTION__,
1777 xmlSecErrorsSafeString(xmlSecTransformGetName(transform))(((((((( (transform) ) != ((void*)0)) && (( (transform
) )->id != ((void*)0)) && (( (transform) )->id->
klassSize >= sizeof(xmlSecTransformKlass)) && (( (
transform) )->id->objSize >= sizeof(xmlSecTransform)
) && (( (transform) )->id->name != ((void*)0)))
) ? ((((transform)->id)) ? (((transform)->id)->name)
: ((void*)0)) : ((void*)0))) != ((void*)0)) ? ((char*)((((((
(transform) ) != ((void*)0)) && (( (transform) )->
id != ((void*)0)) && (( (transform) )->id->klassSize
>= sizeof(xmlSecTransformKlass)) && (( (transform
) )->id->objSize >= sizeof(xmlSecTransform)) &&
(( (transform) )->id->name != ((void*)0)))) ? ((((transform
)->id)) ? (((transform)->id)->name) : ((void*)0)) : (
(void*)0)))) : (char*)"NULL")
,
1778 "xmlSecBufferBase64NodeContentRead",
1779 XMLSEC_ERRORS_R_XMLSEC_FAILED1,
1780 XMLSEC_ERRORS_NO_MESSAGE" ");
1781 xmlSecBufferFinalize(&buffer);
1782 return(-1);
1783 }
1784
1785 ret = xmlSecTransformVerify(transform, xmlSecBufferGetData(&buffer),
1786 xmlSecBufferGetSize(&buffer), transformCtx);
1787 if(ret < 0) {
1788 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",1788,__FUNCTION__,
1789 xmlSecErrorsSafeString(xmlSecTransformGetName(transform))(((((((( (transform) ) != ((void*)0)) && (( (transform
) )->id != ((void*)0)) && (( (transform) )->id->
klassSize >= sizeof(xmlSecTransformKlass)) && (( (
transform) )->id->objSize >= sizeof(xmlSecTransform)
) && (( (transform) )->id->name != ((void*)0)))
) ? ((((transform)->id)) ? (((transform)->id)->name)
: ((void*)0)) : ((void*)0))) != ((void*)0)) ? ((char*)((((((
(transform) ) != ((void*)0)) && (( (transform) )->
id != ((void*)0)) && (( (transform) )->id->klassSize
>= sizeof(xmlSecTransformKlass)) && (( (transform
) )->id->objSize >= sizeof(xmlSecTransform)) &&
(( (transform) )->id->name != ((void*)0)))) ? ((((transform
)->id)) ? (((transform)->id)->name) : ((void*)0)) : (
(void*)0)))) : (char*)"NULL")
,
1790 "xmlSecTransformVerify",
1791 XMLSEC_ERRORS_R_XMLSEC_FAILED1,
1792 XMLSEC_ERRORS_NO_MESSAGE" ");
1793 xmlSecBufferFinalize(&buffer);
1794 return(-1);
1795 }
1796
1797 xmlSecBufferFinalize(&buffer);
1798 return(0);
1799}
1800
1801/**
1802 * xmlSecTransformGetDataType:
1803 * @transform: the pointer to transform.
1804 * @mode: the data mode (push or pop).
1805 * @transformCtx: the transform's chaing processing context.
1806 *
1807 * Gets transform input (@mode is "push") or output (@mode is "pop") data
1808 * type (binary or XML).
1809 *
1810 * Returns: the transform's data type for the @mode operation.
1811 */
1812xmlSecTransformDataType
1813xmlSecTransformGetDataType(xmlSecTransformPtr transform, xmlSecTransformMode mode,
1814 xmlSecTransformCtxPtr transformCtx) {
1815 xmlSecAssert2(xmlSecTransformIsValid(transform), xmlSecTransformDataTypeUnknown)if(!( ((( transform ) != ((void*)0)) && (( transform )
->id != ((void*)0)) && (( transform )->id->klassSize
>= sizeof(xmlSecTransformKlass)) && (( transform )
->id->objSize >= sizeof(xmlSecTransform)) &&
(( transform )->id->name != ((void*)0))) ) ) { xmlSecError
("transforms.c",1815,__FUNCTION__, ((void*)0), "xmlSecTransformIsValid(transform)"
, 100, " "); return(0x0000); }
;
1816 xmlSecAssert2(transform->id->getDataType != NULL, xmlSecTransformDataTypeUnknown)if(!( transform->id->getDataType != ((void*)0) ) ) { xmlSecError
("transforms.c",1816,__FUNCTION__, ((void*)0), "transform->id->getDataType != NULL"
, 100, " "); return(0x0000); }
;
1817
1818 return((transform->id->getDataType)(transform, mode, transformCtx));
1819}
1820
1821/**
1822 * xmlSecTransformPushBin:
1823 * @transform: the pointer to transform object.
1824 * @data: the input binary data,
1825 * @dataSize: the input data size.
1826 * @final: the flag: if set to 1 then it's the last
1827 * data chunk.
1828 * @transformCtx: the pointer to transform context object.
1829 *
1830 * Process binary @data and pushes results to next transform.
1831 *
1832 * Returns: 0 on success or a negative value if an error occurs.
1833 */
1834int
1835xmlSecTransformPushBin(xmlSecTransformPtr transform, const xmlSecByteunsigned char* data,
1836 xmlSecSizesize_t dataSize, int final, xmlSecTransformCtxPtr transformCtx) {
1837 xmlSecAssert2(xmlSecTransformIsValid(transform), -1)if(!( ((( transform ) != ((void*)0)) && (( transform )
->id != ((void*)0)) && (( transform )->id->klassSize
>= sizeof(xmlSecTransformKlass)) && (( transform )
->id->objSize >= sizeof(xmlSecTransform)) &&
(( transform )->id->name != ((void*)0))) ) ) { xmlSecError
("transforms.c",1837,__FUNCTION__, ((void*)0), "xmlSecTransformIsValid(transform)"
, 100, " "); return(-1); }
;
1838 xmlSecAssert2(transform->id->pushBin != NULL, -1)if(!( transform->id->pushBin != ((void*)0) ) ) { xmlSecError
("transforms.c",1838,__FUNCTION__, ((void*)0), "transform->id->pushBin != NULL"
, 100, " "); return(-1); }
;
1839 xmlSecAssert2(transformCtx != NULL, -1)if(!( transformCtx != ((void*)0) ) ) { xmlSecError("transforms.c"
,1839,__FUNCTION__, ((void*)0), "transformCtx != NULL", 100, " "
); return(-1); }
;
1840
1841 return((transform->id->pushBin)(transform, data, dataSize, final, transformCtx));
1842}
1843
1844/**
1845 * xmlSecTransformPopBin:
1846 * @transform: the pointer to transform object.
1847 * @data: the buffer to store result data.
1848 * @maxDataSize: the size of the buffer #data.
1849 * @dataSize: the pointer to returned data size.
1850 * @transformCtx: the pointer to transform context object.
1851 *
1852 * Pops data from previous transform in the chain, processes data and
1853 * returns result in the @data buffer. The size of returned data is
1854 * placed in the @dataSize.
1855 *
1856 * Returns: 0 on success or a negative value if an error occurs.
1857 */
1858int
1859xmlSecTransformPopBin(xmlSecTransformPtr transform, xmlSecByteunsigned char* data,
1860 xmlSecSizesize_t maxDataSize, xmlSecSizesize_t* dataSize, xmlSecTransformCtxPtr transformCtx) {
1861 xmlSecAssert2(xmlSecTransformIsValid(transform), -1)if(!( ((( transform ) != ((void*)0)) && (( transform )
->id != ((void*)0)) && (( transform )->id->klassSize
>= sizeof(xmlSecTransformKlass)) && (( transform )
->id->objSize >= sizeof(xmlSecTransform)) &&
(( transform )->id->name != ((void*)0))) ) ) { xmlSecError
("transforms.c",1861,__FUNCTION__, ((void*)0), "xmlSecTransformIsValid(transform)"
, 100, " "); return(-1); }
;
1862 xmlSecAssert2(transform->id->popBin != NULL, -1)if(!( transform->id->popBin != ((void*)0) ) ) { xmlSecError
("transforms.c",1862,__FUNCTION__, ((void*)0), "transform->id->popBin != NULL"
, 100, " "); return(-1); }
;
1863 xmlSecAssert2(data != NULL, -1)if(!( data != ((void*)0) ) ) { xmlSecError("transforms.c",1863
,__FUNCTION__, ((void*)0), "data != NULL", 100, " "); return(
-1); }
;
1864 xmlSecAssert2(dataSize != NULL, -1)if(!( dataSize != ((void*)0) ) ) { xmlSecError("transforms.c"
,1864,__FUNCTION__, ((void*)0), "dataSize != NULL", 100, " ")
; return(-1); }
;
1865 xmlSecAssert2(transformCtx != NULL, -1)if(!( transformCtx != ((void*)0) ) ) { xmlSecError("transforms.c"
,1865,__FUNCTION__, ((void*)0), "transformCtx != NULL", 100, " "
); return(-1); }
;
1866
1867 return((transform->id->popBin)(transform, data, maxDataSize, dataSize, transformCtx));
1868}
1869
1870/**
1871 * xmlSecTransformPushXml:
1872 * @transform: the pointer to transform object.
1873 * @nodes: the input nodes.
1874 * @transformCtx: the pointer to transform context object.
1875 *
1876 * Processes @nodes and pushes result to the next transform in the chain.
1877 *
1878 * Returns: 0 on success or a negative value if an error occurs.
1879 */
1880int
1881xmlSecTransformPushXml(xmlSecTransformPtr transform, xmlSecNodeSetPtr nodes,
1882 xmlSecTransformCtxPtr transformCtx) {
1883 xmlSecAssert2(xmlSecTransformIsValid(transform), -1)if(!( ((( transform ) != ((void*)0)) && (( transform )
->id != ((void*)0)) && (( transform )->id->klassSize
>= sizeof(xmlSecTransformKlass)) && (( transform )
->id->objSize >= sizeof(xmlSecTransform)) &&
(( transform )->id->name != ((void*)0))) ) ) { xmlSecError
("transforms.c",1883,__FUNCTION__, ((void*)0), "xmlSecTransformIsValid(transform)"
, 100, " "); return(-1); }
;
1884 xmlSecAssert2(transform->id->pushXml != NULL, -1)if(!( transform->id->pushXml != ((void*)0) ) ) { xmlSecError
("transforms.c",1884,__FUNCTION__, ((void*)0), "transform->id->pushXml != NULL"
, 100, " "); return(-1); }
;
1885 xmlSecAssert2(transformCtx != NULL, -1)if(!( transformCtx != ((void*)0) ) ) { xmlSecError("transforms.c"
,1885,__FUNCTION__, ((void*)0), "transformCtx != NULL", 100, " "
); return(-1); }
;
1886
1887 return((transform->id->pushXml)(transform, nodes, transformCtx));
1888}
1889
1890/**
1891 * xmlSecTransformPopXml:
1892 * @transform: the pointer to transform object.
1893 * @nodes: the pointer to store popinter to result nodes.
1894 * @transformCtx: the pointer to transform context object.
1895 *
1896 * Pops data from previous transform in the chain, processes the data and
1897 * returns result in @nodes.
1898 *
1899 * Returns: 0 on success or a negative value if an error occurs.
1900 */
1901int
1902xmlSecTransformPopXml(xmlSecTransformPtr transform, xmlSecNodeSetPtr* nodes,
1903 xmlSecTransformCtxPtr transformCtx) {
1904 xmlSecAssert2(xmlSecTransformIsValid(transform), -1)if(!( ((( transform ) != ((void*)0)) && (( transform )
->id != ((void*)0)) && (( transform )->id->klassSize
>= sizeof(xmlSecTransformKlass)) && (( transform )
->id->objSize >= sizeof(xmlSecTransform)) &&
(( transform )->id->name != ((void*)0))) ) ) { xmlSecError
("transforms.c",1904,__FUNCTION__, ((void*)0), "xmlSecTransformIsValid(transform)"
, 100, " "); return(-1); }
;
1905 xmlSecAssert2(transform->id->popXml != NULL, -1)if(!( transform->id->popXml != ((void*)0) ) ) { xmlSecError
("transforms.c",1905,__FUNCTION__, ((void*)0), "transform->id->popXml != NULL"
, 100, " "); return(-1); }
;
1906 xmlSecAssert2(transformCtx != NULL, -1)if(!( transformCtx != ((void*)0) ) ) { xmlSecError("transforms.c"
,1906,__FUNCTION__, ((void*)0), "transformCtx != NULL", 100, " "
); return(-1); }
;
1907
1908 return((transform->id->popXml)(transform, nodes, transformCtx));
1909}
1910
1911/**
1912 * xmlSecTransformExecute:
1913 * @transform: the pointer to transform.
1914 * @last: the flag: if set to 1 then it's the last data chunk.
1915 * @transformCtx: the transform's chaing processing context.
1916 *
1917 * Executes transform (used by default popBin/pushBin/popXml/pushXml methods).
1918 *
1919 * Returns: 0 on success or a negative value if an error occurs.
1920 */
1921int
1922xmlSecTransformExecute(xmlSecTransformPtr transform, int last, xmlSecTransformCtxPtr transformCtx) {
1923 xmlSecAssert2(xmlSecTransformIsValid(transform), -1)if(!( ((( transform ) != ((void*)0)) && (( transform )
->id != ((void*)0)) && (( transform )->id->klassSize
>= sizeof(xmlSecTransformKlass)) && (( transform )
->id->objSize >= sizeof(xmlSecTransform)) &&
(( transform )->id->name != ((void*)0))) ) ) { xmlSecError
("transforms.c",1923,__FUNCTION__, ((void*)0), "xmlSecTransformIsValid(transform)"
, 100, " "); return(-1); }
;
1924 xmlSecAssert2(transform->id->execute != NULL, -1)if(!( transform->id->execute != ((void*)0) ) ) { xmlSecError
("transforms.c",1924,__FUNCTION__, ((void*)0), "transform->id->execute != NULL"
, 100, " "); return(-1); }
;
1925 xmlSecAssert2(transformCtx != NULL, -1)if(!( transformCtx != ((void*)0) ) ) { xmlSecError("transforms.c"
,1925,__FUNCTION__, ((void*)0), "transformCtx != NULL", 100, " "
); return(-1); }
;
1926
1927 return((transform->id->execute)(transform, last, transformCtx));
1928}
1929
1930/**
1931 * xmlSecTransformDebugDump:
1932 * @transform: the pointer to transform.
1933 * @output: the pointer to output FILE.
1934 *
1935 * Prints transform's debug information to @output.
1936 */
1937void
1938xmlSecTransformDebugDump(xmlSecTransformPtr transform, FILE* output) {
1939 xmlSecAssert(xmlSecTransformIsValid(transform))if(!( ((( transform ) != ((void*)0)) && (( transform )
->id != ((void*)0)) && (( transform )->id->klassSize
>= sizeof(xmlSecTransformKlass)) && (( transform )
->id->objSize >= sizeof(xmlSecTransform)) &&
(( transform )->id->name != ((void*)0))) ) ) { xmlSecError
("transforms.c",1939,__FUNCTION__, ((void*)0), "xmlSecTransformIsValid(transform)"
, 100, " "); return; }
;
1940 xmlSecAssert(output != NULL)if(!( output != ((void*)0) ) ) { xmlSecError("transforms.c",1940
,__FUNCTION__, ((void*)0), "output != NULL", 100, " "); return
; }
;
1941
1942 fprintf(output, "=== Transform: %s (href=%s)\n",
1943 xmlSecErrorsSafeString(transform->id->name)(((transform->id->name) != ((void*)0)) ? ((char*)(transform
->id->name)) : (char*)"NULL")
,
1944 xmlSecErrorsSafeString(transform->id->href)(((transform->id->href) != ((void*)0)) ? ((char*)(transform
->id->href)) : (char*)"NULL")
);
1945}
1946
1947/**
1948 * xmlSecTransformDebugXmlDump:
1949 * @transform: the pointer to transform.
1950 * @output: the pointer to output FILE.
1951 *
1952 * Prints transform's debug information to @output in XML format.
1953 */
1954void
1955xmlSecTransformDebugXmlDump(xmlSecTransformPtr transform, FILE* output) {
1956 xmlSecAssert(xmlSecTransformIsValid(transform))if(!( ((( transform ) != ((void*)0)) && (( transform )
->id != ((void*)0)) && (( transform )->id->klassSize
>= sizeof(xmlSecTransformKlass)) && (( transform )
->id->objSize >= sizeof(xmlSecTransform)) &&
(( transform )->id->name != ((void*)0))) ) ) { xmlSecError
("transforms.c",1956,__FUNCTION__, ((void*)0), "xmlSecTransformIsValid(transform)"
, 100, " "); return; }
;
1957 xmlSecAssert(output != NULL)if(!( output != ((void*)0) ) ) { xmlSecError("transforms.c",1957
,__FUNCTION__, ((void*)0), "output != NULL", 100, " "); return
; }
;
1958
1959 fprintf(output, "<Transform name=\"");
1960 xmlSecPrintXmlString(output,transform->id->name);
1961 fprintf(output, "\" href=\"");
1962 xmlSecPrintXmlString(output, transform->id->href);
1963 fprintf(output, "\" />\n");
1964}
1965
1966/************************************************************************
1967 *
1968 * Operations on transforms chain
1969 *
1970 ************************************************************************/
1971/**
1972 * xmlSecTransformConnect:
1973 * @left: the pointer to left (prev) transform.
1974 * @right: the pointer to right (next) transform.
1975 * @transformCtx: the transform's chaing processing context.
1976 *
1977 * If the data object is a node-set and the next transform requires octets,
1978 * the signature application MUST attempt to convert the node-set to an octet
1979 * stream using Canonical XML [XML-C14N].
1980 *
1981 * The story is different if the right transform is base64 decode
1982 * (http://www.w3.org/TR/xmldsig-core/#sec-Base-64):
1983 *
1984 * This transform requires an octet stream for input. If an XPath node-set
1985 * (or sufficiently functional alternative) is given as input, then it is
1986 * converted to an octet stream by performing operations logically equivalent
1987 * to 1) applying an XPath transform with expression self::text(), then 2)
1988 * taking the string-value of the node-set. Thus, if an XML element is
1989 * identified by a barename XPointer in the Reference URI, and its content
1990 * consists solely of base64 encoded character data, then this transform
1991 * automatically strips away the start and end tags of the identified element
1992 * and any of its descendant elements as well as any descendant comments and
1993 * processing instructions. The output of this transform is an octet stream.
1994 *
1995 * Returns: 0 on success or a negative value if an error occurs.
1996 */
1997int
1998xmlSecTransformConnect(xmlSecTransformPtr left, xmlSecTransformPtr right,
1999 xmlSecTransformCtxPtr transformCtx) {
2000 xmlSecTransformDataType leftType;
2001 xmlSecTransformDataType rightType;
2002 xmlSecTransformId middleId;
2003 xmlSecTransformPtr middle;
2004
2005 xmlSecAssert2(xmlSecTransformIsValid(left), -1)if(!( ((( left ) != ((void*)0)) && (( left )->id !=
((void*)0)) && (( left )->id->klassSize >= sizeof
(xmlSecTransformKlass)) && (( left )->id->objSize
>= sizeof(xmlSecTransform)) && (( left )->id->
name != ((void*)0))) ) ) { xmlSecError("transforms.c",2005,__FUNCTION__
, ((void*)0), "xmlSecTransformIsValid(left)", 100, " "); return
(-1); }
;
2006 xmlSecAssert2(xmlSecTransformIsValid(right), -1)if(!( ((( right ) != ((void*)0)) && (( right )->id
!= ((void*)0)) && (( right )->id->klassSize >=
sizeof(xmlSecTransformKlass)) && (( right )->id->
objSize >= sizeof(xmlSecTransform)) && (( right )->
id->name != ((void*)0))) ) ) { xmlSecError("transforms.c",
2006,__FUNCTION__, ((void*)0), "xmlSecTransformIsValid(right)"
, 100, " "); return(-1); }
;
2007 xmlSecAssert2(transformCtx != NULL, -1)if(!( transformCtx != ((void*)0) ) ) { xmlSecError("transforms.c"
,2007,__FUNCTION__, ((void*)0), "transformCtx != NULL", 100, " "
); return(-1); }
;
2008
2009 leftType = xmlSecTransformGetDataType(left, xmlSecTransformModePop, transformCtx);
2010 rightType = xmlSecTransformGetDataType(right, xmlSecTransformModePush, transformCtx);
2011
2012 /* happy case first: nothing need to be done */
2013 if((((leftType & xmlSecTransformDataTypeBin0x0001) != 0) &&
2014 ((rightType & xmlSecTransformDataTypeBin0x0001) != 0)) ||
2015 (((leftType & xmlSecTransformDataTypeXml0x0002) != 0) &&
2016 ((rightType & xmlSecTransformDataTypeXml0x0002) != 0))) {
2017
2018 left->next = right;
2019 right->prev = left;
2020 return(0);
2021 }
2022
2023 if(((leftType & xmlSecTransformDataTypeBin0x0001) != 0) &&
2024 ((rightType & xmlSecTransformDataTypeXml0x0002) != 0)) {
2025
2026 /* need to insert parser */
2027 middleId = xmlSecTransformXmlParserIdxmlSecTransformXmlParserGetKlass();
2028 } else if(((leftType & xmlSecTransformDataTypeXml0x0002) != 0) &&
2029 ((rightType & xmlSecTransformDataTypeBin0x0001) != 0)) {
2030
2031 /* need to insert c14n or special pre-base64 transform */
2032 if(xmlSecTransformCheckId(right, xmlSecTransformBase64Id)(((( ( right ) ) != ((void*)0)) && (( ( right ) )->
id != ((void*)0)) && (( ( right ) )->id->klassSize
>= sizeof(xmlSecTransformKlass)) && (( ( right ) )
->id->objSize >= sizeof(xmlSecTransform)) &&
(( ( right ) )->id->name != ((void*)0))) && ((
((const xmlSecTransformId) (( right )->id))) == ( xmlSecTransformBase64GetKlass
() )))
) {
2033 middleId = xmlSecTransformRemoveXmlTagsC14NIdxmlSecTransformRemoveXmlTagsC14NGetKlass();
2034 } else {
2035 middleId = xmlSecTransformInclC14NIdxmlSecTransformInclC14NGetKlass();
2036 }
2037 } else {
2038 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",2038,__FUNCTION__,
2039 xmlSecErrorsSafeString(xmlSecTransformGetName(left))(((((((( (left) ) != ((void*)0)) && (( (left) )->id
!= ((void*)0)) && (( (left) )->id->klassSize >=
sizeof(xmlSecTransformKlass)) && (( (left) )->id->
objSize >= sizeof(xmlSecTransform)) && (( (left) )
->id->name != ((void*)0)))) ? ((((left)->id)) ? (((left
)->id)->name) : ((void*)0)) : ((void*)0))) != ((void*)0
)) ? ((char*)(((((( (left) ) != ((void*)0)) && (( (left
) )->id != ((void*)0)) && (( (left) )->id->klassSize
>= sizeof(xmlSecTransformKlass)) && (( (left) )->
id->objSize >= sizeof(xmlSecTransform)) && (( (
left) )->id->name != ((void*)0)))) ? ((((left)->id))
? (((left)->id)->name) : ((void*)0)) : ((void*)0)))) :
(char*)"NULL")
,
2040 xmlSecErrorsSafeString(xmlSecTransformGetName(right))(((((((( (right) ) != ((void*)0)) && (( (right) )->
id != ((void*)0)) && (( (right) )->id->klassSize
>= sizeof(xmlSecTransformKlass)) && (( (right) )->
id->objSize >= sizeof(xmlSecTransform)) && (( (
right) )->id->name != ((void*)0)))) ? ((((right)->id
)) ? (((right)->id)->name) : ((void*)0)) : ((void*)0)))
!= ((void*)0)) ? ((char*)(((((( (right) ) != ((void*)0)) &&
(( (right) )->id != ((void*)0)) && (( (right) )->
id->klassSize >= sizeof(xmlSecTransformKlass)) &&
(( (right) )->id->objSize >= sizeof(xmlSecTransform
)) && (( (right) )->id->name != ((void*)0)))) ?
((((right)->id)) ? (((right)->id)->name) : ((void*)
0)) : ((void*)0)))) : (char*)"NULL")
,
2041 XMLSEC_ERRORS_R_INVALID_TRANSFORM31,
2042 "leftType=%d;rightType=%d",
2043 leftType, rightType);
2044 return(-1);
2045 }
2046
2047 /* insert transform */
2048 middle = xmlSecTransformCreate(middleId);
2049 if(middle == NULL((void*)0)) {
2050 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",2050,__FUNCTION__,
2051 xmlSecErrorsSafeString(xmlSecTransformGetName(left))(((((((( (left) ) != ((void*)0)) && (( (left) )->id
!= ((void*)0)) && (( (left) )->id->klassSize >=
sizeof(xmlSecTransformKlass)) && (( (left) )->id->
objSize >= sizeof(xmlSecTransform)) && (( (left) )
->id->name != ((void*)0)))) ? ((((left)->id)) ? (((left
)->id)->name) : ((void*)0)) : ((void*)0))) != ((void*)0
)) ? ((char*)(((((( (left) ) != ((void*)0)) && (( (left
) )->id != ((void*)0)) && (( (left) )->id->klassSize
>= sizeof(xmlSecTransformKlass)) && (( (left) )->
id->objSize >= sizeof(xmlSecTransform)) && (( (
left) )->id->name != ((void*)0)))) ? ((((left)->id))
? (((left)->id)->name) : ((void*)0)) : ((void*)0)))) :
(char*)"NULL")
,
2052 "xmlSecTransformCreate",
2053 XMLSEC_ERRORS_R_XMLSEC_FAILED1,
2054 "transform=%s",
2055 xmlSecErrorsSafeString(xmlSecTransformKlassGetName(middleId))((((((middleId)) ? ((middleId)->name) : ((void*)0))) != ((
void*)0)) ? ((char*)((((middleId)) ? ((middleId)->name) : (
(void*)0)))) : (char*)"NULL")
);
2056 return(-1);
2057 }
2058 left->next = middle;
2059 middle->prev = left;
2060 middle->next = right;
2061 right->prev = middle;
2062 return(0);
2063}
2064
2065/**
2066 * xmlSecTransformRemove:
2067 * @transform: the pointer to #xmlSecTransform structure.
2068 *
2069 * Removes @transform from the chain.
2070 */
2071void
2072xmlSecTransformRemove(xmlSecTransformPtr transform) {
2073 xmlSecAssert(xmlSecTransformIsValid(transform))if(!( ((( transform ) != ((void*)0)) && (( transform )
->id != ((void*)0)) && (( transform )->id->klassSize
>= sizeof(xmlSecTransformKlass)) && (( transform )
->id->objSize >= sizeof(xmlSecTransform)) &&
(( transform )->id->name != ((void*)0))) ) ) { xmlSecError
("transforms.c",2073,__FUNCTION__, ((void*)0), "xmlSecTransformIsValid(transform)"
, 100, " "); return; }
;
2074
2075 if(transform->next != NULL((void*)0)) {
2076 transform->next->prev = transform->prev;
2077 }
2078 if(transform->prev != NULL((void*)0)) {
2079 transform->prev->next = transform->next;
2080 }
2081 transform->next = transform->prev = NULL((void*)0);
2082}
2083
2084
2085/************************************************************************
2086 *
2087 * Default callbacks, most of the transforms can use them
2088 *
2089 ************************************************************************/
2090/**
2091 * xmlSecTransformDefaultGetDataType:
2092 * @transform: the pointer to transform.
2093 * @mode: the data mode (push or pop).
2094 * @transformCtx: the transform's chaing processing context.
2095 *
2096 * Gets transform input (@mode is "push") or output (@mode is "pop") data
2097 * type (binary or XML) by analyzing available pushBin/popBin/pushXml/popXml
2098 * methods.
2099 *
2100 * Returns: the transform's data type for the @mode operation.
2101 */
2102xmlSecTransformDataType
2103xmlSecTransformDefaultGetDataType(xmlSecTransformPtr transform, xmlSecTransformMode mode,
2104 xmlSecTransformCtxPtr transformCtx) {
2105 xmlSecTransformDataType type = xmlSecTransformDataTypeUnknown0x0000;
2106
2107 xmlSecAssert2(xmlSecTransformIsValid(transform), xmlSecTransformDataTypeUnknown)if(!( ((( transform ) != ((void*)0)) && (( transform )
->id != ((void*)0)) && (( transform )->id->klassSize
>= sizeof(xmlSecTransformKlass)) && (( transform )
->id->objSize >= sizeof(xmlSecTransform)) &&
(( transform )->id->name != ((void*)0))) ) ) { xmlSecError
("transforms.c",2107,__FUNCTION__, ((void*)0), "xmlSecTransformIsValid(transform)"
, 100, " "); return(0x0000); }
;
2108 xmlSecAssert2(transformCtx != NULL, xmlSecTransformDataTypeUnknown)if(!( transformCtx != ((void*)0) ) ) { xmlSecError("transforms.c"
,2108,__FUNCTION__, ((void*)0), "transformCtx != NULL", 100, " "
); return(0x0000); }
;
2109
2110 /* we'll try to guess the data type based on the handlers we have */
2111 switch(mode) {
2112 case xmlSecTransformModePush:
2113 if(transform->id->pushBin != NULL((void*)0)) {
2114 type |= xmlSecTransformDataTypeBin0x0001;
2115 }
2116 if(transform->id->pushXml != NULL((void*)0)) {
2117 type |= xmlSecTransformDataTypeXml0x0002;
2118 }
2119 break;
2120 case xmlSecTransformModePop:
2121 if(transform->id->popBin != NULL((void*)0)) {
2122 type |= xmlSecTransformDataTypeBin0x0001;
2123 }
2124 if(transform->id->popXml != NULL((void*)0)) {
2125 type |= xmlSecTransformDataTypeXml0x0002;
2126 }
2127 break;
2128 default:
2129 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",2129,__FUNCTION__,
2130 xmlSecErrorsSafeString(xmlSecTransformGetName(transform))(((((((( (transform) ) != ((void*)0)) && (( (transform
) )->id != ((void*)0)) && (( (transform) )->id->
klassSize >= sizeof(xmlSecTransformKlass)) && (( (
transform) )->id->objSize >= sizeof(xmlSecTransform)
) && (( (transform) )->id->name != ((void*)0)))
) ? ((((transform)->id)) ? (((transform)->id)->name)
: ((void*)0)) : ((void*)0))) != ((void*)0)) ? ((char*)((((((
(transform) ) != ((void*)0)) && (( (transform) )->
id != ((void*)0)) && (( (transform) )->id->klassSize
>= sizeof(xmlSecTransformKlass)) && (( (transform
) )->id->objSize >= sizeof(xmlSecTransform)) &&
(( (transform) )->id->name != ((void*)0)))) ? ((((transform
)->id)) ? (((transform)->id)->name) : ((void*)0)) : (
(void*)0)))) : (char*)"NULL")
,
2131 NULL((void*)0),
2132 XMLSEC_ERRORS_R_INVALID_DATA12,
2133 "mode=%d", mode);
2134 return(xmlSecTransformDataTypeUnknown0x0000);
2135 }
2136
2137 return(type);
2138}
2139
2140/**
2141 * xmlSecTransformDefaultPushBin:
2142 * @transform: the pointer to transform object.
2143 * @data: the input binary data,
2144 * @dataSize: the input data size.
2145 * @final: the flag: if set to 1 then it's the last
2146 * data chunk.
2147 * @transformCtx: the pointer to transform context object.
2148 *
2149 * Process binary @data by calling transform's execute method and pushes
2150 * results to next transform.
2151 *
2152 * Returns: 0 on success or a negative value if an error occurs.
2153 */
2154int
2155xmlSecTransformDefaultPushBin(xmlSecTransformPtr transform, const xmlSecByteunsigned char* data,
2156 xmlSecSizesize_t dataSize, int final, xmlSecTransformCtxPtr transformCtx) {
2157 xmlSecSizesize_t inSize = 0;
2158 xmlSecSizesize_t outSize = 0;
2159 int finalData = 0;
2160 int ret;
2161
2162 xmlSecAssert2(xmlSecTransformIsValid(transform), -1)if(!( ((( transform ) != ((void*)0)) && (( transform )
->id != ((void*)0)) && (( transform )->id->klassSize
>= sizeof(xmlSecTransformKlass)) && (( transform )
->id->objSize >= sizeof(xmlSecTransform)) &&
(( transform )->id->name != ((void*)0))) ) ) { xmlSecError
("transforms.c",2162,__FUNCTION__, ((void*)0), "xmlSecTransformIsValid(transform)"
, 100, " "); return(-1); }
;
2163 xmlSecAssert2(transformCtx != NULL, -1)if(!( transformCtx != ((void*)0) ) ) { xmlSecError("transforms.c"
,2163,__FUNCTION__, ((void*)0), "transformCtx != NULL", 100, " "
); return(-1); }
;
2164
2165 do {
2166 /* append data to input buffer */
2167 if(dataSize > 0) {
2168 xmlSecSizesize_t chunkSize;
2169
2170 xmlSecAssert2(data != NULL, -1)if(!( data != ((void*)0) ) ) { xmlSecError("transforms.c",2170
,__FUNCTION__, ((void*)0), "data != NULL", 100, " "); return(
-1); }
;
2171
2172 chunkSize = dataSize;
2173 if(chunkSize > XMLSEC_TRANSFORM_BINARY_CHUNK64) {
2174 chunkSize = XMLSEC_TRANSFORM_BINARY_CHUNK64;
2175 }
2176
2177 ret = xmlSecBufferAppend(&(transform->inBuf), data, chunkSize);
2178 if(ret < 0) {
2179 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",2179,__FUNCTION__,
2180 xmlSecErrorsSafeString(xmlSecTransformGetName(transform))(((((((( (transform) ) != ((void*)0)) && (( (transform
) )->id != ((void*)0)) && (( (transform) )->id->
klassSize >= sizeof(xmlSecTransformKlass)) && (( (
transform) )->id->objSize >= sizeof(xmlSecTransform)
) && (( (transform) )->id->name != ((void*)0)))
) ? ((((transform)->id)) ? (((transform)->id)->name)
: ((void*)0)) : ((void*)0))) != ((void*)0)) ? ((char*)((((((
(transform) ) != ((void*)0)) && (( (transform) )->
id != ((void*)0)) && (( (transform) )->id->klassSize
>= sizeof(xmlSecTransformKlass)) && (( (transform
) )->id->objSize >= sizeof(xmlSecTransform)) &&
(( (transform) )->id->name != ((void*)0)))) ? ((((transform
)->id)) ? (((transform)->id)->name) : ((void*)0)) : (
(void*)0)))) : (char*)"NULL")
,
2181 "xmlSecBufferAppend",
2182 XMLSEC_ERRORS_R_XMLSEC_FAILED1,
2183 "size=%d", chunkSize);
2184 return(-1);
2185 }
2186
2187 dataSize -= chunkSize;
2188 data += chunkSize;
2189 }
2190
2191 /* process data */
2192 inSize = xmlSecBufferGetSize(&(transform->inBuf));
Value stored to 'inSize' is never read
2193 outSize = xmlSecBufferGetSize(&(transform->outBuf));
2194 finalData = (((dataSize == 0) && (final != 0)) ? 1 : 0);
2195 ret = xmlSecTransformExecute(transform, finalData, transformCtx);
2196 if(ret < 0) {
2197 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",2197,__FUNCTION__,
2198 xmlSecErrorsSafeString(xmlSecTransformGetName(transform))(((((((( (transform) ) != ((void*)0)) && (( (transform
) )->id != ((void*)0)) && (( (transform) )->id->
klassSize >= sizeof(xmlSecTransformKlass)) && (( (
transform) )->id->objSize >= sizeof(xmlSecTransform)
) && (( (transform) )->id->name != ((void*)0)))
) ? ((((transform)->id)) ? (((transform)->id)->name)
: ((void*)0)) : ((void*)0))) != ((void*)0)) ? ((char*)((((((
(transform) ) != ((void*)0)) && (( (transform) )->
id != ((void*)0)) && (( (transform) )->id->klassSize
>= sizeof(xmlSecTransformKlass)) && (( (transform
) )->id->objSize >= sizeof(xmlSecTransform)) &&
(( (transform) )->id->name != ((void*)0)))) ? ((((transform
)->id)) ? (((transform)->id)->name) : ((void*)0)) : (
(void*)0)))) : (char*)"NULL")
,
2199 "xmlSecTransformExecute",
2200 XMLSEC_ERRORS_R_XMLSEC_FAILED1,
2201 "final=%d", final);
2202 return(-1);
2203 }
2204
2205 /* push data to the next transform */
2206 inSize = xmlSecBufferGetSize(&(transform->inBuf));
2207 outSize = xmlSecBufferGetSize(&(transform->outBuf));
2208 if(inSize > 0) {
2209 finalData = 0;
2210 }
2211
2212 /* we don't want to puch too much */
2213 if(outSize > XMLSEC_TRANSFORM_BINARY_CHUNK64) {
2214 outSize = XMLSEC_TRANSFORM_BINARY_CHUNK64;
2215 finalData = 0;
2216 }
2217 if((transform->next != NULL((void*)0)) && ((outSize > 0) || (finalData != 0))) {
2218 ret = xmlSecTransformPushBin(transform->next,
2219 xmlSecBufferGetData(&(transform->outBuf)),
2220 outSize,
2221 finalData,
2222 transformCtx);
2223 if(ret < 0) {
2224 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",2224,__FUNCTION__,
2225 xmlSecErrorsSafeString(xmlSecTransformGetName(transform->next))(((((((( (transform->next) ) != ((void*)0)) && (( (
transform->next) )->id != ((void*)0)) && (( (transform
->next) )->id->klassSize >= sizeof(xmlSecTransformKlass
)) && (( (transform->next) )->id->objSize >=
sizeof(xmlSecTransform)) && (( (transform->next) )
->id->name != ((void*)0)))) ? ((((transform->next)->
id)) ? (((transform->next)->id)->name) : ((void*)0))
: ((void*)0))) != ((void*)0)) ? ((char*)(((((( (transform->
next) ) != ((void*)0)) && (( (transform->next) )->
id != ((void*)0)) && (( (transform->next) )->id
->klassSize >= sizeof(xmlSecTransformKlass)) &&
(( (transform->next) )->id->objSize >= sizeof(xmlSecTransform
)) && (( (transform->next) )->id->name != ((
void*)0)))) ? ((((transform->next)->id)) ? (((transform
->next)->id)->name) : ((void*)0)) : ((void*)0)))) : (
char*)"NULL")
,
2226 "xmlSecTransformPushBin",
2227 XMLSEC_ERRORS_R_XMLSEC_FAILED1,
2228 "final=%d;outSize=%d", final, outSize);
2229 return(-1);
2230 }
2231 }
2232
2233 /* remove data anyway */
2234 if(outSize > 0) {
2235 ret = xmlSecBufferRemoveHead(&(transform->outBuf), outSize);
2236 if(ret < 0) {
2237 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",2237,__FUNCTION__,
2238 xmlSecErrorsSafeString(xmlSecTransformGetName(transform))(((((((( (transform) ) != ((void*)0)) && (( (transform
) )->id != ((void*)0)) && (( (transform) )->id->
klassSize >= sizeof(xmlSecTransformKlass)) && (( (
transform) )->id->objSize >= sizeof(xmlSecTransform)
) && (( (transform) )->id->name != ((void*)0)))
) ? ((((transform)->id)) ? (((transform)->id)->name)
: ((void*)0)) : ((void*)0))) != ((void*)0)) ? ((char*)((((((
(transform) ) != ((void*)0)) && (( (transform) )->
id != ((void*)0)) && (( (transform) )->id->klassSize
>= sizeof(xmlSecTransformKlass)) && (( (transform
) )->id->objSize >= sizeof(xmlSecTransform)) &&
(( (transform) )->id->name != ((void*)0)))) ? ((((transform
)->id)) ? (((transform)->id)->name) : ((void*)0)) : (
(void*)0)))) : (char*)"NULL")
,
2239 "xmlSecBufferAppend",
2240 XMLSEC_ERRORS_R_XMLSEC_FAILED1,
2241 "size=%d", outSize);
2242 return(-1);
2243 }
2244 }
2245 } while((dataSize > 0) || (outSize > 0));
2246
2247 return(0);
2248}
2249
2250/**
2251 * xmlSecTransformDefaultPopBin:
2252 * @transform: the pointer to transform object.
2253 * @data: the buffer to store result data.
2254 * @maxDataSize: the size of the buffer #data.
2255 * @dataSize: the pointer to returned data size.
2256 * @transformCtx: the pointer to transform context object.
2257 *
2258 * Pops data from previous transform in the chain, processes data by calling
2259 * transform's execute method and returns result in the @data buffer. The
2260 * size of returned data is placed in the @dataSize.
2261 *
2262 * Returns: 0 on success or a negative value if an error occurs.
2263 */
2264int
2265xmlSecTransformDefaultPopBin(xmlSecTransformPtr transform, xmlSecByteunsigned char* data,
2266 xmlSecSizesize_t maxDataSize, xmlSecSizesize_t* dataSize, xmlSecTransformCtxPtr transformCtx) {
2267 xmlSecSizesize_t outSize;
2268 int final = 0;
2269 int ret;
2270
2271 xmlSecAssert2(xmlSecTransformIsValid(transform), -1)if(!( ((( transform ) != ((void*)0)) && (( transform )
->id != ((void*)0)) && (( transform )->id->klassSize
>= sizeof(xmlSecTransformKlass)) && (( transform )
->id->objSize >= sizeof(xmlSecTransform)) &&
(( transform )->id->name != ((void*)0))) ) ) { xmlSecError
("transforms.c",2271,__FUNCTION__, ((void*)0), "xmlSecTransformIsValid(transform)"
, 100, " "); return(-1); }
;
2272 xmlSecAssert2(data != NULL, -1)if(!( data != ((void*)0) ) ) { xmlSecError("transforms.c",2272
,__FUNCTION__, ((void*)0), "data != NULL", 100, " "); return(
-1); }
;
2273 xmlSecAssert2(dataSize != NULL, -1)if(!( dataSize != ((void*)0) ) ) { xmlSecError("transforms.c"
,2273,__FUNCTION__, ((void*)0), "dataSize != NULL", 100, " ")
; return(-1); }
;
2274 xmlSecAssert2(transformCtx != NULL, -1)if(!( transformCtx != ((void*)0) ) ) { xmlSecError("transforms.c"
,2274,__FUNCTION__, ((void*)0), "transformCtx != NULL", 100, " "
); return(-1); }
;
2275
2276 while((xmlSecBufferGetSize(&(transform->outBuf)) == 0) && (final == 0)) {
2277 /* read data from previous transform if exist */
2278 if(transform->prev != NULL((void*)0)) {
2279 xmlSecSizesize_t inSize, chunkSize;
2280
2281 inSize = xmlSecBufferGetSize(&(transform->inBuf));
2282 chunkSize = XMLSEC_TRANSFORM_BINARY_CHUNK64;
2283
2284 /* ensure that we have space for at least one data chunk */
2285 ret = xmlSecBufferSetMaxSize(&(transform->inBuf), inSize + chunkSize);
2286 if(ret < 0) {
2287 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",2287,__FUNCTION__,
2288 xmlSecErrorsSafeString(xmlSecTransformGetName(transform))(((((((( (transform) ) != ((void*)0)) && (( (transform
) )->id != ((void*)0)) && (( (transform) )->id->
klassSize >= sizeof(xmlSecTransformKlass)) && (( (
transform) )->id->objSize >= sizeof(xmlSecTransform)
) && (( (transform) )->id->name != ((void*)0)))
) ? ((((transform)->id)) ? (((transform)->id)->name)
: ((void*)0)) : ((void*)0))) != ((void*)0)) ? ((char*)((((((
(transform) ) != ((void*)0)) && (( (transform) )->
id != ((void*)0)) && (( (transform) )->id->klassSize
>= sizeof(xmlSecTransformKlass)) && (( (transform
) )->id->objSize >= sizeof(xmlSecTransform)) &&
(( (transform) )->id->name != ((void*)0)))) ? ((((transform
)->id)) ? (((transform)->id)->name) : ((void*)0)) : (
(void*)0)))) : (char*)"NULL")
,
2289 "xmlSecBufferSetMaxSize",
2290 XMLSEC_ERRORS_R_XMLSEC_FAILED1,
2291 "size=%d", inSize + chunkSize);
2292 return(-1);
2293 }
2294
2295 /* get data from previous transform */
2296 ret = xmlSecTransformPopBin(transform->prev,
2297 xmlSecBufferGetData(&(transform->inBuf)) + inSize,
2298 chunkSize, &chunkSize, transformCtx);
2299 if(ret < 0) {
2300 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",2300,__FUNCTION__,
2301 xmlSecErrorsSafeString(xmlSecTransformGetName(transform->prev))(((((((( (transform->prev) ) != ((void*)0)) && (( (
transform->prev) )->id != ((void*)0)) && (( (transform
->prev) )->id->klassSize >= sizeof(xmlSecTransformKlass
)) && (( (transform->prev) )->id->objSize >=
sizeof(xmlSecTransform)) && (( (transform->prev) )
->id->name != ((void*)0)))) ? ((((transform->prev)->
id)) ? (((transform->prev)->id)->name) : ((void*)0))
: ((void*)0))) != ((void*)0)) ? ((char*)(((((( (transform->
prev) ) != ((void*)0)) && (( (transform->prev) )->
id != ((void*)0)) && (( (transform->prev) )->id
->klassSize >= sizeof(xmlSecTransformKlass)) &&
(( (transform->prev) )->id->objSize >= sizeof(xmlSecTransform
)) && (( (transform->prev) )->id->name != ((
void*)0)))) ? ((((transform->prev)->id)) ? (((transform
->prev)->id)->name) : ((void*)0)) : ((void*)0)))) : (
char*)"NULL")
,
2302 "xmlSecTransformPopBin",
2303 XMLSEC_ERRORS_R_XMLSEC_FAILED1,
2304 XMLSEC_ERRORS_NO_MESSAGE" ");
2305 return(-1);
2306 }
2307
2308 /* adjust our size if needed */
2309 if(chunkSize > 0) {
2310 ret = xmlSecBufferSetSize(&(transform->inBuf), inSize + chunkSize);
2311 if(ret < 0) {
2312 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",2312,__FUNCTION__,
2313 xmlSecErrorsSafeString(xmlSecTransformGetName(transform))(((((((( (transform) ) != ((void*)0)) && (( (transform
) )->id != ((void*)0)) && (( (transform) )->id->
klassSize >= sizeof(xmlSecTransformKlass)) && (( (
transform) )->id->objSize >= sizeof(xmlSecTransform)
) && (( (transform) )->id->name != ((void*)0)))
) ? ((((transform)->id)) ? (((transform)->id)->name)
: ((void*)0)) : ((void*)0))) != ((void*)0)) ? ((char*)((((((
(transform) ) != ((void*)0)) && (( (transform) )->
id != ((void*)0)) && (( (transform) )->id->klassSize
>= sizeof(xmlSecTransformKlass)) && (( (transform
) )->id->objSize >= sizeof(xmlSecTransform)) &&
(( (transform) )->id->name != ((void*)0)))) ? ((((transform
)->id)) ? (((transform)->id)->name) : ((void*)0)) : (
(void*)0)))) : (char*)"NULL")
,
2314 "xmlSecBufferSetSize",
2315 XMLSEC_ERRORS_R_XMLSEC_FAILED1,
2316 "size=%d", inSize + chunkSize);
2317 return(-1);
2318 }
2319 final = 0; /* the previous transform returned some data..*/
2320 } else {
2321 final = 1; /* no data returned from previous transform, we are done */
2322 }
2323 } else {
2324 final = 1; /* no previous transform, we are "permanently final" */
2325 }
2326
2327 /* execute our transform */
2328 ret = xmlSecTransformExecute(transform, final, transformCtx);
2329 if(ret < 0) {
2330 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",2330,__FUNCTION__,
2331 xmlSecErrorsSafeString(xmlSecTransformGetName(transform))(((((((( (transform) ) != ((void*)0)) && (( (transform
) )->id != ((void*)0)) && (( (transform) )->id->
klassSize >= sizeof(xmlSecTransformKlass)) && (( (
transform) )->id->objSize >= sizeof(xmlSecTransform)
) && (( (transform) )->id->name != ((void*)0)))
) ? ((((transform)->id)) ? (((transform)->id)->name)
: ((void*)0)) : ((void*)0))) != ((void*)0)) ? ((char*)((((((
(transform) ) != ((void*)0)) && (( (transform) )->
id != ((void*)0)) && (( (transform) )->id->klassSize
>= sizeof(xmlSecTransformKlass)) && (( (transform
) )->id->objSize >= sizeof(xmlSecTransform)) &&
(( (transform) )->id->name != ((void*)0)))) ? ((((transform
)->id)) ? (((transform)->id)->name) : ((void*)0)) : (
(void*)0)))) : (char*)"NULL")
,
2332 "xmlSecTransformExecute",
2333 XMLSEC_ERRORS_R_XMLSEC_FAILED1,
2334 XMLSEC_ERRORS_NO_MESSAGE" ");
2335 return(-1);
2336 }
2337 }
2338
2339 /* copy result (if any) */
2340 outSize = xmlSecBufferGetSize(&(transform->outBuf));
2341 if(outSize > maxDataSize) {
2342 outSize = maxDataSize;
2343 }
2344
2345 /* we don't want to put too much */
2346 if(outSize > XMLSEC_TRANSFORM_BINARY_CHUNK64) {
2347 outSize = XMLSEC_TRANSFORM_BINARY_CHUNK64;
2348 }
2349 if(outSize > 0) {
2350 xmlSecAssert2(xmlSecBufferGetData(&(transform->outBuf)), -1)if(!( xmlSecBufferGetData(&(transform->outBuf)) ) ) { xmlSecError
("transforms.c",2350,__FUNCTION__, ((void*)0), "xmlSecBufferGetData(&(transform->outBuf))"
, 100, " "); return(-1); }
;
2351
2352 memcpy(data, xmlSecBufferGetData(&(transform->outBuf)), outSize);
2353
2354 ret = xmlSecBufferRemoveHead(&(transform->outBuf), outSize);
2355 if(ret < 0) {
2356 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",2356,__FUNCTION__,
2357 xmlSecErrorsSafeString(xmlSecTransformGetName(transform))(((((((( (transform) ) != ((void*)0)) && (( (transform
) )->id != ((void*)0)) && (( (transform) )->id->
klassSize >= sizeof(xmlSecTransformKlass)) && (( (
transform) )->id->objSize >= sizeof(xmlSecTransform)
) && (( (transform) )->id->name != ((void*)0)))
) ? ((((transform)->id)) ? (((transform)->id)->name)
: ((void*)0)) : ((void*)0))) != ((void*)0)) ? ((char*)((((((
(transform) ) != ((void*)0)) && (( (transform) )->
id != ((void*)0)) && (( (transform) )->id->klassSize
>= sizeof(xmlSecTransformKlass)) && (( (transform
) )->id->objSize >= sizeof(xmlSecTransform)) &&
(( (transform) )->id->name != ((void*)0)))) ? ((((transform
)->id)) ? (((transform)->id)->name) : ((void*)0)) : (
(void*)0)))) : (char*)"NULL")
,
2358 "xmlSecBufferRemoveHead",
2359 XMLSEC_ERRORS_R_XMLSEC_FAILED1,
2360 "size=%d", outSize);
2361 return(-1);
2362 }
2363 }
2364
2365 /* set the result size */
2366 (*dataSize) = outSize;
2367 return(0);
2368}
2369
2370/**
2371 * xmlSecTransformDefaultPushXml:
2372 * @transform: the pointer to transform object.
2373 * @nodes: the input nodes.
2374 * @transformCtx: the pointer to transform context object.
2375 *
2376 * Processes @nodes by calling transform's execute method and pushes
2377 * result to the next transform in the chain.
2378 *
2379 * Returns: 0 on success or a negative value if an error occurs.
2380 */
2381int
2382xmlSecTransformDefaultPushXml(xmlSecTransformPtr transform, xmlSecNodeSetPtr nodes,
2383 xmlSecTransformCtxPtr transformCtx) {
2384 int ret;
2385
2386 xmlSecAssert2(xmlSecTransformIsValid(transform), -1)if(!( ((( transform ) != ((void*)0)) && (( transform )
->id != ((void*)0)) && (( transform )->id->klassSize
>= sizeof(xmlSecTransformKlass)) && (( transform )
->id->objSize >= sizeof(xmlSecTransform)) &&
(( transform )->id->name != ((void*)0))) ) ) { xmlSecError
("transforms.c",2386,__FUNCTION__, ((void*)0), "xmlSecTransformIsValid(transform)"
, 100, " "); return(-1); }
;
2387 xmlSecAssert2(transform->inNodes == NULL, -1)if(!( transform->inNodes == ((void*)0) ) ) { xmlSecError("transforms.c"
,2387,__FUNCTION__, ((void*)0), "transform->inNodes == NULL"
, 100, " "); return(-1); }
;
2388 xmlSecAssert2(transform->outNodes == NULL, -1)if(!( transform->outNodes == ((void*)0) ) ) { xmlSecError(
"transforms.c",2388,__FUNCTION__, ((void*)0), "transform->outNodes == NULL"
, 100, " "); return(-1); }
;
2389 xmlSecAssert2(transformCtx != NULL, -1)if(!( transformCtx != ((void*)0) ) ) { xmlSecError("transforms.c"
,2389,__FUNCTION__, ((void*)0), "transformCtx != NULL", 100, " "
); return(-1); }
;
2390
2391 /* execute our transform */
2392 transform->inNodes = nodes;
2393 ret = xmlSecTransformExecute(transform, 1, transformCtx);
2394 if(ret < 0) {
2395 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",2395,__FUNCTION__,
2396 xmlSecErrorsSafeString(xmlSecTransformGetName(transform))(((((((( (transform) ) != ((void*)0)) && (( (transform
) )->id != ((void*)0)) && (( (transform) )->id->
klassSize >= sizeof(xmlSecTransformKlass)) && (( (
transform) )->id->objSize >= sizeof(xmlSecTransform)
) && (( (transform) )->id->name != ((void*)0)))
) ? ((((transform)->id)) ? (((transform)->id)->name)
: ((void*)0)) : ((void*)0))) != ((void*)0)) ? ((char*)((((((
(transform) ) != ((void*)0)) && (( (transform) )->
id != ((void*)0)) && (( (transform) )->id->klassSize
>= sizeof(xmlSecTransformKlass)) && (( (transform
) )->id->objSize >= sizeof(xmlSecTransform)) &&
(( (transform) )->id->name != ((void*)0)))) ? ((((transform
)->id)) ? (((transform)->id)->name) : ((void*)0)) : (
(void*)0)))) : (char*)"NULL")
,
2397 "xmlSecTransformExecute",
2398 XMLSEC_ERRORS_R_XMLSEC_FAILED1,
2399 XMLSEC_ERRORS_NO_MESSAGE" ");
2400 return(-1);
2401 }
2402
2403 /* push result to the next transform (if exist) */
2404 if(transform->next != NULL((void*)0)) {
2405 ret = xmlSecTransformPushXml(transform->next, transform->outNodes, transformCtx);
2406 if(ret < 0) {
2407 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",2407,__FUNCTION__,
2408 xmlSecErrorsSafeString(xmlSecTransformGetName(transform))(((((((( (transform) ) != ((void*)0)) && (( (transform
) )->id != ((void*)0)) && (( (transform) )->id->
klassSize >= sizeof(xmlSecTransformKlass)) && (( (
transform) )->id->objSize >= sizeof(xmlSecTransform)
) && (( (transform) )->id->name != ((void*)0)))
) ? ((((transform)->id)) ? (((transform)->id)->name)
: ((void*)0)) : ((void*)0))) != ((void*)0)) ? ((char*)((((((
(transform) ) != ((void*)0)) && (( (transform) )->
id != ((void*)0)) && (( (transform) )->id->klassSize
>= sizeof(xmlSecTransformKlass)) && (( (transform
) )->id->objSize >= sizeof(xmlSecTransform)) &&
(( (transform) )->id->name != ((void*)0)))) ? ((((transform
)->id)) ? (((transform)->id)->name) : ((void*)0)) : (
(void*)0)))) : (char*)"NULL")
,
2409 "xmlSecTransformPushXml",
2410 XMLSEC_ERRORS_R_XMLSEC_FAILED1,
2411 XMLSEC_ERRORS_NO_MESSAGE" ");
2412 return(-1);
2413 }
2414 }
2415 return(0);
2416}
2417
2418/**
2419 * xmlSecTransformDefaultPopXml:
2420 * @transform: the pointer to transform object.
2421 * @nodes: the pointer to store popinter to result nodes.
2422 * @transformCtx: the pointer to transform context object.
2423 *
2424 * Pops data from previous transform in the chain, processes the data
2425 * by calling transform's execute method and returns result in @nodes.
2426 *
2427 * Returns: 0 on success or a negative value if an error occurs.
2428 */
2429int
2430xmlSecTransformDefaultPopXml(xmlSecTransformPtr transform, xmlSecNodeSetPtr* nodes,
2431 xmlSecTransformCtxPtr transformCtx) {
2432 int ret;
2433
2434 xmlSecAssert2(xmlSecTransformIsValid(transform), -1)if(!( ((( transform ) != ((void*)0)) && (( transform )
->id != ((void*)0)) && (( transform )->id->klassSize
>= sizeof(xmlSecTransformKlass)) && (( transform )
->id->objSize >= sizeof(xmlSecTransform)) &&
(( transform )->id->name != ((void*)0))) ) ) { xmlSecError
("transforms.c",2434,__FUNCTION__, ((void*)0), "xmlSecTransformIsValid(transform)"
, 100, " "); return(-1); }
;
2435 xmlSecAssert2(transform->inNodes == NULL, -1)if(!( transform->inNodes == ((void*)0) ) ) { xmlSecError("transforms.c"
,2435,__FUNCTION__, ((void*)0), "transform->inNodes == NULL"
, 100, " "); return(-1); }
;
2436 xmlSecAssert2(transform->outNodes == NULL, -1)if(!( transform->outNodes == ((void*)0) ) ) { xmlSecError(
"transforms.c",2436,__FUNCTION__, ((void*)0), "transform->outNodes == NULL"
, 100, " "); return(-1); }
;
2437 xmlSecAssert2(transformCtx != NULL, -1)if(!( transformCtx != ((void*)0) ) ) { xmlSecError("transforms.c"
,2437,__FUNCTION__, ((void*)0), "transformCtx != NULL", 100, " "
); return(-1); }
;
2438
2439 /* pop result from the prev transform (if exist) */
2440 if(transform->prev != NULL((void*)0)) {
2441 ret = xmlSecTransformPopXml(transform->prev, &(transform->inNodes), transformCtx);
2442 if(ret < 0) {
2443 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",2443,__FUNCTION__,
2444 xmlSecErrorsSafeString(xmlSecTransformGetName(transform))(((((((( (transform) ) != ((void*)0)) && (( (transform
) )->id != ((void*)0)) && (( (transform) )->id->
klassSize >= sizeof(xmlSecTransformKlass)) && (( (
transform) )->id->objSize >= sizeof(xmlSecTransform)
) && (( (transform) )->id->name != ((void*)0)))
) ? ((((transform)->id)) ? (((transform)->id)->name)
: ((void*)0)) : ((void*)0))) != ((void*)0)) ? ((char*)((((((
(transform) ) != ((void*)0)) && (( (transform) )->
id != ((void*)0)) && (( (transform) )->id->klassSize
>= sizeof(xmlSecTransformKlass)) && (( (transform
) )->id->objSize >= sizeof(xmlSecTransform)) &&
(( (transform) )->id->name != ((void*)0)))) ? ((((transform
)->id)) ? (((transform)->id)->name) : ((void*)0)) : (
(void*)0)))) : (char*)"NULL")
,
2445 "xmlSecTransformPopXml",
2446 XMLSEC_ERRORS_R_XMLSEC_FAILED1,
2447 XMLSEC_ERRORS_NO_MESSAGE" ");
2448 return(-1);
2449 }
2450 }
2451
2452 /* execute our transform */
2453 ret = xmlSecTransformExecute(transform, 1, transformCtx);
2454 if(ret < 0) {
2455 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",2455,__FUNCTION__,
2456 xmlSecErrorsSafeString(xmlSecTransformGetName(transform))(((((((( (transform) ) != ((void*)0)) && (( (transform
) )->id != ((void*)0)) && (( (transform) )->id->
klassSize >= sizeof(xmlSecTransformKlass)) && (( (
transform) )->id->objSize >= sizeof(xmlSecTransform)
) && (( (transform) )->id->name != ((void*)0)))
) ? ((((transform)->id)) ? (((transform)->id)->name)
: ((void*)0)) : ((void*)0))) != ((void*)0)) ? ((char*)((((((
(transform) ) != ((void*)0)) && (( (transform) )->
id != ((void*)0)) && (( (transform) )->id->klassSize
>= sizeof(xmlSecTransformKlass)) && (( (transform
) )->id->objSize >= sizeof(xmlSecTransform)) &&
(( (transform) )->id->name != ((void*)0)))) ? ((((transform
)->id)) ? (((transform)->id)->name) : ((void*)0)) : (
(void*)0)))) : (char*)"NULL")
,
2457 "xmlSecTransformExecute",
2458 XMLSEC_ERRORS_R_XMLSEC_FAILED1,
2459 XMLSEC_ERRORS_NO_MESSAGE" ");
2460 return(-1);
2461 }
2462
2463 /* return result if requested */
2464 if(nodes != NULL((void*)0)) {
2465 (*nodes) = transform->outNodes;
2466 }
2467
2468 return(0);
2469}
2470
2471/***********************************************************************
2472 *
2473 * Transform Ids list
2474 *
2475 **********************************************************************/
2476static xmlSecPtrListKlass xmlSecTransformIdListKlass = {
2477 BAD_CAST(xmlChar *) "transform-ids-list",
2478 NULL((void*)0), /* xmlSecPtrDuplicateItemMethod duplicateItem; */
2479 NULL((void*)0), /* xmlSecPtrDestroyItemMethod destroyItem; */
2480 NULL((void*)0), /* xmlSecPtrDebugDumpItemMethod debugDumpItem; */
2481 NULL((void*)0), /* xmlSecPtrDebugDumpItemMethod debugXmlDumpItem; */
2482};
2483
2484/**
2485 * xmlSecTransformIdListGetKlass:
2486 *
2487 * The transform id list klass.
2488 *
2489 * Returns: pointer to the transform id list klass.
2490 */
2491xmlSecPtrListId
2492xmlSecTransformIdListGetKlass(void) {
2493 return(&xmlSecTransformIdListKlass);
2494}
2495
2496/**
2497 * xmlSecTransformIdListFind:
2498 * @list: the pointer to transform ids list.
2499 * @transformId: the transform klass.
2500 *
2501 * Lookups @dataId in @list.
2502 *
2503 * Returns: 1 if @dataId is found in the @list, 0 if not and a negative
2504 * value if an error occurs.
2505 */
2506int
2507xmlSecTransformIdListFind(xmlSecPtrListPtr list, xmlSecTransformId transformId) {
2508 xmlSecSizesize_t i, size;
2509
2510 xmlSecAssert2(xmlSecPtrListCheckId(list, xmlSecTransformIdListId), -1)if(!( (((( ( list ) ) != ((void*)0)) && ((( ( list ) )
->id) != ((void*)0))) && ((( list )->id) == ( xmlSecTransformIdListGetKlass
() ))) ) ) { xmlSecError("transforms.c",2510,__FUNCTION__, ((
void*)0), "xmlSecPtrListCheckId(list, xmlSecTransformIdListId)"
, 100, " "); return(-1); }
;
2511 xmlSecAssert2(transformId != NULL, -1)if(!( transformId != ((void*)0) ) ) { xmlSecError("transforms.c"
,2511,__FUNCTION__, ((void*)0), "transformId != NULL", 100, " "
); return(-1); }
;
2512
2513 size = xmlSecPtrListGetSize(list);
2514 for(i = 0; i < size; ++i) {
2515 if((xmlSecTransformId)xmlSecPtrListGetItem(list, i) == transformId) {
2516 return(1);
2517 }
2518 }
2519 return(0);
2520}
2521
2522/**
2523 * xmlSecTransformIdListFindByHref:
2524 * @list: the pointer to transform ids list.
2525 * @href: the desired transform klass href.
2526 * @usage: the desired transform usage.
2527 *
2528 * Lookups data klass in the list with given @href and @usage in @list.
2529 *
2530 * Returns: transform klass is found and NULL otherwise.
2531 */
2532xmlSecTransformId
2533xmlSecTransformIdListFindByHref(xmlSecPtrListPtr list, const xmlChar* href,
2534 xmlSecTransformUsage usage) {
2535 xmlSecTransformId transformId;
2536 xmlSecSizesize_t i, size;
2537
2538 xmlSecAssert2(xmlSecPtrListCheckId(list, xmlSecTransformIdListId), xmlSecTransformIdUnknown)if(!( (((( ( list ) ) != ((void*)0)) && ((( ( list ) )
->id) != ((void*)0))) && ((( list )->id) == ( xmlSecTransformIdListGetKlass
() ))) ) ) { xmlSecError("transforms.c",2538,__FUNCTION__, ((
void*)0), "xmlSecPtrListCheckId(list, xmlSecTransformIdListId)"
, 100, " "); return(((xmlSecTransformId)((void*)0))); }
;
2539 xmlSecAssert2(href != NULL, xmlSecTransformIdUnknown)if(!( href != ((void*)0) ) ) { xmlSecError("transforms.c",2539
,__FUNCTION__, ((void*)0), "href != NULL", 100, " "); return(
((xmlSecTransformId)((void*)0))); }
;
2540
2541 size = xmlSecPtrListGetSize(list);
2542 for(i = 0; i < size; ++i) {
2543 transformId = (xmlSecTransformId)xmlSecPtrListGetItem(list, i);
2544 xmlSecAssert2(transformId != xmlSecTransformIdUnknown, xmlSecTransformIdUnknown)if(!( transformId != ((xmlSecTransformId)((void*)0)) ) ) { xmlSecError
("transforms.c",2544,__FUNCTION__, ((void*)0), "transformId != xmlSecTransformIdUnknown"
, 100, " "); return(((xmlSecTransformId)((void*)0))); }
;
2545
2546 if(((usage & transformId->usage) != 0) && (transformId->href != NULL((void*)0)) &&
2547 xmlStrEqual(href, transformId->href)) {
2548 return(transformId);
2549 }
2550 }
2551 return(xmlSecTransformIdUnknown((xmlSecTransformId)((void*)0)));
2552}
2553
2554/**
2555 * xmlSecTransformIdListFindByName:
2556 * @list: the pointer to transform ids list.
2557 * @name: the desired transform klass name.
2558 * @usage: the desired transform usage.
2559 *
2560 * Lookups data klass in the list with given @name and @usage in @list.
2561 *
2562 * Returns: transform klass is found and NULL otherwise.
2563 */
2564xmlSecTransformId
2565xmlSecTransformIdListFindByName(xmlSecPtrListPtr list, const xmlChar* name,
2566 xmlSecTransformUsage usage) {
2567 xmlSecTransformId transformId;
2568 xmlSecSizesize_t i, size;
2569
2570 xmlSecAssert2(xmlSecPtrListCheckId(list, xmlSecTransformIdListId), xmlSecTransformIdUnknown)if(!( (((( ( list ) ) != ((void*)0)) && ((( ( list ) )
->id) != ((void*)0))) && ((( list )->id) == ( xmlSecTransformIdListGetKlass
() ))) ) ) { xmlSecError("transforms.c",2570,__FUNCTION__, ((
void*)0), "xmlSecPtrListCheckId(list, xmlSecTransformIdListId)"
, 100, " "); return(((xmlSecTransformId)((void*)0))); }
;
2571 xmlSecAssert2(name != NULL, xmlSecTransformIdUnknown)if(!( name != ((void*)0) ) ) { xmlSecError("transforms.c",2571
,__FUNCTION__, ((void*)0), "name != NULL", 100, " "); return(
((xmlSecTransformId)((void*)0))); }
;
2572
2573 size = xmlSecPtrListGetSize(list);
2574 for(i = 0; i < size; ++i) {
2575 transformId = (xmlSecTransformId)xmlSecPtrListGetItem(list, i);
2576 xmlSecAssert2(transformId != xmlSecTransformIdUnknown, xmlSecTransformIdUnknown)if(!( transformId != ((xmlSecTransformId)((void*)0)) ) ) { xmlSecError
("transforms.c",2576,__FUNCTION__, ((void*)0), "transformId != xmlSecTransformIdUnknown"
, 100, " "); return(((xmlSecTransformId)((void*)0))); }
;
2577
2578 if(((usage & transformId->usage) != 0) && (transformId->name != NULL((void*)0)) &&
2579 xmlStrEqual(name, BAD_CAST(xmlChar *) transformId->name)) {
2580
2581 return(transformId);
2582 }
2583 }
2584 return(xmlSecTransformIdUnknown((xmlSecTransformId)((void*)0)));
2585}
2586
2587/**
2588 * xmlSecTransformIdListDebugDump:
2589 * @list: the pointer to transform ids list.
2590 * @output: the pointer to output FILE.
2591 *
2592 * Prints binary transform debug information to @output.
2593 */
2594void
2595xmlSecTransformIdListDebugDump(xmlSecPtrListPtr list, FILE* output) {
2596 xmlSecTransformId transformId;
2597 xmlSecSizesize_t i, size;
2598
2599 xmlSecAssert(xmlSecPtrListCheckId(list, xmlSecTransformIdListId))if(!( (((( ( list ) ) != ((void*)0)) && ((( ( list ) )
->id) != ((void*)0))) && ((( list )->id) == ( xmlSecTransformIdListGetKlass
() ))) ) ) { xmlSecError("transforms.c",2599,__FUNCTION__, ((
void*)0), "xmlSecPtrListCheckId(list, xmlSecTransformIdListId)"
, 100, " "); return; }
;
2600 xmlSecAssert(output != NULL)if(!( output != ((void*)0) ) ) { xmlSecError("transforms.c",2600
,__FUNCTION__, ((void*)0), "output != NULL", 100, " "); return
; }
;
2601
2602 size = xmlSecPtrListGetSize(list);
2603 for(i = 0; i < size; ++i) {
2604 transformId = (xmlSecTransformId)xmlSecPtrListGetItem(list, i);
2605 xmlSecAssert(transformId != NULL)if(!( transformId != ((void*)0) ) ) { xmlSecError("transforms.c"
,2605,__FUNCTION__, ((void*)0), "transformId != NULL", 100, " "
); return; }
;
2606 xmlSecAssert(transformId->name != NULL)if(!( transformId->name != ((void*)0) ) ) { xmlSecError("transforms.c"
,2606,__FUNCTION__, ((void*)0), "transformId->name != NULL"
, 100, " "); return; }
;
2607
2608 if(i > 0) {
2609 fprintf(output, ",\"%s\"", transformId->name);
2610 } else {
2611 fprintf(output, "\"%s\"", transformId->name);
2612 }
2613 }
2614 fprintf(output, "\n");
2615}
2616
2617/**
2618 * xmlSecTransformIdListDebugXmlDump:
2619 * @list: the pointer to transform ids list.
2620 * @output: the pointer to output FILE.
2621 *
2622 * Prints binary transform debug information to @output in XML format.
2623 */
2624void
2625xmlSecTransformIdListDebugXmlDump(xmlSecPtrListPtr list, FILE* output) {
2626 xmlSecTransformId transformId;
2627 xmlSecSizesize_t i, size;
2628
2629 xmlSecAssert(xmlSecPtrListCheckId(list, xmlSecTransformIdListId))if(!( (((( ( list ) ) != ((void*)0)) && ((( ( list ) )
->id) != ((void*)0))) && ((( list )->id) == ( xmlSecTransformIdListGetKlass
() ))) ) ) { xmlSecError("transforms.c",2629,__FUNCTION__, ((
void*)0), "xmlSecPtrListCheckId(list, xmlSecTransformIdListId)"
, 100, " "); return; }
;
2630 xmlSecAssert(output != NULL)if(!( output != ((void*)0) ) ) { xmlSecError("transforms.c",2630
,__FUNCTION__, ((void*)0), "output != NULL", 100, " "); return
; }
;
2631
2632 fprintf(output, "<TransformIdsList>\n");
2633 size = xmlSecPtrListGetSize(list);
2634 for(i = 0; i < size; ++i) {
2635 transformId = (xmlSecTransformId)xmlSecPtrListGetItem(list, i);
2636 xmlSecAssert(transformId != NULL)if(!( transformId != ((void*)0) ) ) { xmlSecError("transforms.c"
,2636,__FUNCTION__, ((void*)0), "transformId != NULL", 100, " "
); return; }
;
2637 xmlSecAssert(transformId->name != NULL)if(!( transformId->name != ((void*)0) ) ) { xmlSecError("transforms.c"
,2637,__FUNCTION__, ((void*)0), "transformId->name != NULL"
, 100, " "); return; }
;
2638
2639 fprintf(output, "<TransformId name=\"");
2640 xmlSecPrintXmlString(output, transformId->name);
2641 fprintf(output, "\" />");
2642 }
2643 fprintf(output, "</TransformIdsList>\n");
2644}
2645
2646/************************************************************************
2647 *
2648 * IO buffers for transforms
2649 *
2650 ************************************************************************/
2651typedef struct _xmlSecTransformIOBuffer xmlSecTransformIOBuffer,
2652 *xmlSecTransformIOBufferPtr;
2653typedef enum {
2654 xmlSecTransformIOBufferModeRead,
2655 xmlSecTransformIOBufferModeWrite
2656} xmlSecTransformIOBufferMode;
2657
2658struct _xmlSecTransformIOBuffer {
2659 xmlSecTransformIOBufferMode mode;
2660 xmlSecTransformPtr transform;
2661 xmlSecTransformCtxPtr transformCtx;
2662};
2663
2664static xmlSecTransformIOBufferPtr xmlSecTransformIOBufferCreate (xmlSecTransformIOBufferMode mode,
2665 xmlSecTransformPtr transform,
2666 xmlSecTransformCtxPtr transformCtx);
2667static void xmlSecTransformIOBufferDestroy (xmlSecTransformIOBufferPtr buffer);
2668static int xmlSecTransformIOBufferRead (xmlSecTransformIOBufferPtr buffer,
2669 xmlSecByteunsigned char *buf,
2670 xmlSecSizesize_t size);
2671static int xmlSecTransformIOBufferWrite (xmlSecTransformIOBufferPtr buffer,
2672 const xmlSecByteunsigned char *buf,
2673 xmlSecSizesize_t size);
2674static int xmlSecTransformIOBufferClose (xmlSecTransformIOBufferPtr buffer);
2675
2676
2677/**
2678 * xmlSecTransformCreateOutputBuffer:
2679 * @transform: the pointer to transform.
2680 * @transformCtx: the pointer to transform context object.
2681 *
2682 * Creates output buffer to write data to @transform.
2683 *
2684 * Returns: pointer to new output buffer or NULL if an error occurs.
2685 */
2686xmlOutputBufferPtr
2687xmlSecTransformCreateOutputBuffer(xmlSecTransformPtr transform, xmlSecTransformCtxPtr transformCtx) {
2688 xmlSecTransformIOBufferPtr buffer;
2689 xmlSecTransformDataType type;
2690 xmlOutputBufferPtr output;
2691
2692 xmlSecAssert2(xmlSecTransformIsValid(transform), NULL)if(!( ((( transform ) != ((void*)0)) && (( transform )
->id != ((void*)0)) && (( transform )->id->klassSize
>= sizeof(xmlSecTransformKlass)) && (( transform )
->id->objSize >= sizeof(xmlSecTransform)) &&
(( transform )->id->name != ((void*)0))) ) ) { xmlSecError
("transforms.c",2692,__FUNCTION__, ((void*)0), "xmlSecTransformIsValid(transform)"
, 100, " "); return(((void*)0)); }
;
2693 xmlSecAssert2(transformCtx != NULL, NULL)if(!( transformCtx != ((void*)0) ) ) { xmlSecError("transforms.c"
,2693,__FUNCTION__, ((void*)0), "transformCtx != NULL", 100, " "
); return(((void*)0)); }
;
2694
2695 /* check that we have binary push method for this transform */
2696 type = xmlSecTransformDefaultGetDataType(transform, xmlSecTransformModePush, transformCtx);
2697 if((type & xmlSecTransformDataTypeBin0x0001) == 0) {
2698 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",2698,__FUNCTION__,
2699 xmlSecErrorsSafeString(xmlSecTransformGetName(transform))(((((((( (transform) ) != ((void*)0)) && (( (transform
) )->id != ((void*)0)) && (( (transform) )->id->
klassSize >= sizeof(xmlSecTransformKlass)) && (( (
transform) )->id->objSize >= sizeof(xmlSecTransform)
) && (( (transform) )->id->name != ((void*)0)))
) ? ((((transform)->id)) ? (((transform)->id)->name)
: ((void*)0)) : ((void*)0))) != ((void*)0)) ? ((char*)((((((
(transform) ) != ((void*)0)) && (( (transform) )->
id != ((void*)0)) && (( (transform) )->id->klassSize
>= sizeof(xmlSecTransformKlass)) && (( (transform
) )->id->objSize >= sizeof(xmlSecTransform)) &&
(( (transform) )->id->name != ((void*)0)))) ? ((((transform
)->id)) ? (((transform)->id)->name) : ((void*)0)) : (
(void*)0)))) : (char*)"NULL")
,
2700 NULL((void*)0),
2701 XMLSEC_ERRORS_R_INVALID_TRANSFORM31,
2702 "push binary data not supported");
2703 return(NULL((void*)0));
2704 }
2705
2706 buffer = xmlSecTransformIOBufferCreate(xmlSecTransformIOBufferModeWrite, transform, transformCtx);
2707 if(buffer == NULL((void*)0)) {
2708 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",2708,__FUNCTION__,
2709 xmlSecErrorsSafeString(xmlSecTransformGetName(transform))(((((((( (transform) ) != ((void*)0)) && (( (transform
) )->id != ((void*)0)) && (( (transform) )->id->
klassSize >= sizeof(xmlSecTransformKlass)) && (( (
transform) )->id->objSize >= sizeof(xmlSecTransform)
) && (( (transform) )->id->name != ((void*)0)))
) ? ((((transform)->id)) ? (((transform)->id)->name)
: ((void*)0)) : ((void*)0))) != ((void*)0)) ? ((char*)((((((
(transform) ) != ((void*)0)) && (( (transform) )->
id != ((void*)0)) && (( (transform) )->id->klassSize
>= sizeof(xmlSecTransformKlass)) && (( (transform
) )->id->objSize >= sizeof(xmlSecTransform)) &&
(( (transform) )->id->name != ((void*)0)))) ? ((((transform
)->id)) ? (((transform)->id)->name) : ((void*)0)) : (
(void*)0)))) : (char*)"NULL")
,
2710 "xmlSecTransformIOBufferCreate",
2711 XMLSEC_ERRORS_R_XMLSEC_FAILED1,
2712 XMLSEC_ERRORS_NO_MESSAGE" ");
2713 return(NULL((void*)0));
2714 }
2715
2716 output = xmlOutputBufferCreateIO((xmlOutputWriteCallback)xmlSecTransformIOBufferWrite,
2717 (xmlOutputCloseCallback)xmlSecTransformIOBufferClose,
2718 buffer,
2719 NULL((void*)0));
2720 if(output == NULL((void*)0)) {
2721 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",2721,__FUNCTION__,
2722 xmlSecErrorsSafeString(xmlSecTransformGetName(transform))(((((((( (transform) ) != ((void*)0)) && (( (transform
) )->id != ((void*)0)) && (( (transform) )->id->
klassSize >= sizeof(xmlSecTransformKlass)) && (( (
transform) )->id->objSize >= sizeof(xmlSecTransform)
) && (( (transform) )->id->name != ((void*)0)))
) ? ((((transform)->id)) ? (((transform)->id)->name)
: ((void*)0)) : ((void*)0))) != ((void*)0)) ? ((char*)((((((
(transform) ) != ((void*)0)) && (( (transform) )->
id != ((void*)0)) && (( (transform) )->id->klassSize
>= sizeof(xmlSecTransformKlass)) && (( (transform
) )->id->objSize >= sizeof(xmlSecTransform)) &&
(( (transform) )->id->name != ((void*)0)))) ? ((((transform
)->id)) ? (((transform)->id)->name) : ((void*)0)) : (
(void*)0)))) : (char*)"NULL")
,
2723 "xmlOutputBufferCreateIO",
2724 XMLSEC_ERRORS_R_XML_FAILED5,
2725 XMLSEC_ERRORS_NO_MESSAGE" ");
2726 xmlSecTransformIOBufferDestroy(buffer);
2727 return(NULL((void*)0));
2728 }
2729
2730 return(output);
2731}
2732
2733/**
2734 * xmlSecTransformCreateInputBuffer:
2735 * @transform: the pointer to transform.
2736 * @transformCtx: the pointer to transform context object.
2737 *
2738 * Creates input buffer to read data from @transform.
2739 *
2740 * Returns: pointer to new input buffer or NULL if an error occurs.
2741 */
2742xmlParserInputBufferPtr
2743xmlSecTransformCreateInputBuffer(xmlSecTransformPtr transform, xmlSecTransformCtxPtr transformCtx) {
2744 xmlSecTransformIOBufferPtr buffer;
2745 xmlSecTransformDataType type;
2746 xmlParserInputBufferPtr input;
2747
2748 xmlSecAssert2(xmlSecTransformIsValid(transform), NULL)if(!( ((( transform ) != ((void*)0)) && (( transform )
->id != ((void*)0)) && (( transform )->id->klassSize
>= sizeof(xmlSecTransformKlass)) && (( transform )
->id->objSize >= sizeof(xmlSecTransform)) &&
(( transform )->id->name != ((void*)0))) ) ) { xmlSecError
("transforms.c",2748,__FUNCTION__, ((void*)0), "xmlSecTransformIsValid(transform)"
, 100, " "); return(((void*)0)); }
;
2749 xmlSecAssert2(transformCtx != NULL, NULL)if(!( transformCtx != ((void*)0) ) ) { xmlSecError("transforms.c"
,2749,__FUNCTION__, ((void*)0), "transformCtx != NULL", 100, " "
); return(((void*)0)); }
;
2750
2751 /* check that we have binary pop method for this transform */
2752 type = xmlSecTransformDefaultGetDataType(transform, xmlSecTransformModePop, transformCtx);
2753 if((type & xmlSecTransformDataTypeBin0x0001) == 0) {
2754 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",2754,__FUNCTION__,
2755 xmlSecErrorsSafeString(xmlSecTransformGetName(transform))(((((((( (transform) ) != ((void*)0)) && (( (transform
) )->id != ((void*)0)) && (( (transform) )->id->
klassSize >= sizeof(xmlSecTransformKlass)) && (( (
transform) )->id->objSize >= sizeof(xmlSecTransform)
) && (( (transform) )->id->name != ((void*)0)))
) ? ((((transform)->id)) ? (((transform)->id)->name)
: ((void*)0)) : ((void*)0))) != ((void*)0)) ? ((char*)((((((
(transform) ) != ((void*)0)) && (( (transform) )->
id != ((void*)0)) && (( (transform) )->id->klassSize
>= sizeof(xmlSecTransformKlass)) && (( (transform
) )->id->objSize >= sizeof(xmlSecTransform)) &&
(( (transform) )->id->name != ((void*)0)))) ? ((((transform
)->id)) ? (((transform)->id)->name) : ((void*)0)) : (
(void*)0)))) : (char*)"NULL")
,
2756 NULL((void*)0),
2757 XMLSEC_ERRORS_R_INVALID_TRANSFORM31,
2758 "pop binary data not supported");
2759 return(NULL((void*)0));
2760 }
2761
2762 buffer = xmlSecTransformIOBufferCreate(xmlSecTransformIOBufferModeRead, transform, transformCtx);
2763 if(buffer == NULL((void*)0)) {
2764 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",2764,__FUNCTION__,
2765 xmlSecErrorsSafeString(xmlSecTransformGetName(transform))(((((((( (transform) ) != ((void*)0)) && (( (transform
) )->id != ((void*)0)) && (( (transform) )->id->
klassSize >= sizeof(xmlSecTransformKlass)) && (( (
transform) )->id->objSize >= sizeof(xmlSecTransform)
) && (( (transform) )->id->name != ((void*)0)))
) ? ((((transform)->id)) ? (((transform)->id)->name)
: ((void*)0)) : ((void*)0))) != ((void*)0)) ? ((char*)((((((
(transform) ) != ((void*)0)) && (( (transform) )->
id != ((void*)0)) && (( (transform) )->id->klassSize
>= sizeof(xmlSecTransformKlass)) && (( (transform
) )->id->objSize >= sizeof(xmlSecTransform)) &&
(( (transform) )->id->name != ((void*)0)))) ? ((((transform
)->id)) ? (((transform)->id)->name) : ((void*)0)) : (
(void*)0)))) : (char*)"NULL")
,
2766 "xmlSecTransformIOBufferCreate",
2767 XMLSEC_ERRORS_R_XMLSEC_FAILED1,
2768 XMLSEC_ERRORS_NO_MESSAGE" ");
2769 return(NULL((void*)0));
2770 }
2771
2772 input = xmlParserInputBufferCreateIO((xmlInputReadCallback)xmlSecTransformIOBufferRead,
2773 (xmlInputCloseCallback)xmlSecTransformIOBufferClose,
2774 buffer,
2775 XML_CHAR_ENCODING_NONE);
2776 if(input == NULL((void*)0)) {
2777 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",2777,__FUNCTION__,
2778 xmlSecErrorsSafeString(xmlSecTransformGetName(transform))(((((((( (transform) ) != ((void*)0)) && (( (transform
) )->id != ((void*)0)) && (( (transform) )->id->
klassSize >= sizeof(xmlSecTransformKlass)) && (( (
transform) )->id->objSize >= sizeof(xmlSecTransform)
) && (( (transform) )->id->name != ((void*)0)))
) ? ((((transform)->id)) ? (((transform)->id)->name)
: ((void*)0)) : ((void*)0))) != ((void*)0)) ? ((char*)((((((
(transform) ) != ((void*)0)) && (( (transform) )->
id != ((void*)0)) && (( (transform) )->id->klassSize
>= sizeof(xmlSecTransformKlass)) && (( (transform
) )->id->objSize >= sizeof(xmlSecTransform)) &&
(( (transform) )->id->name != ((void*)0)))) ? ((((transform
)->id)) ? (((transform)->id)->name) : ((void*)0)) : (
(void*)0)))) : (char*)"NULL")
,
2779 "xmlParserInputBufferCreateIO",
2780 XMLSEC_ERRORS_R_XML_FAILED5,
2781 XMLSEC_ERRORS_NO_MESSAGE" ");
2782 xmlSecTransformIOBufferDestroy(buffer);
2783 return(NULL((void*)0));
2784 }
2785
2786 return(input);
2787}
2788
2789static xmlSecTransformIOBufferPtr
2790xmlSecTransformIOBufferCreate(xmlSecTransformIOBufferMode mode, xmlSecTransformPtr transform,
2791 xmlSecTransformCtxPtr transformCtx) {
2792 xmlSecTransformIOBufferPtr buffer;
2793
2794 xmlSecAssert2(xmlSecTransformIsValid(transform), NULL)if(!( ((( transform ) != ((void*)0)) && (( transform )
->id != ((void*)0)) && (( transform )->id->klassSize
>= sizeof(xmlSecTransformKlass)) && (( transform )
->id->objSize >= sizeof(xmlSecTransform)) &&
(( transform )->id->name != ((void*)0))) ) ) { xmlSecError
("transforms.c",2794,__FUNCTION__, ((void*)0), "xmlSecTransformIsValid(transform)"
, 100, " "); return(((void*)0)); }
;
2795 xmlSecAssert2(transformCtx != NULL, NULL)if(!( transformCtx != ((void*)0) ) ) { xmlSecError("transforms.c"
,2795,__FUNCTION__, ((void*)0), "transformCtx != NULL", 100, " "
); return(((void*)0)); }
;
2796
2797 buffer = (xmlSecTransformIOBufferPtr)xmlMalloc(sizeof(xmlSecTransformIOBuffer));
2798 if(buffer == NULL((void*)0)) {
2799 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",2799,__FUNCTION__,
2800 NULL((void*)0),
2801 NULL((void*)0),
2802 XMLSEC_ERRORS_R_MALLOC_FAILED2,
2803 "size=%d", sizeof(xmlSecTransformIOBuffer));
2804 return(NULL((void*)0));
2805 }
2806 memset(buffer, 0, sizeof(xmlSecTransformIOBuffer));
2807
2808 buffer->mode = mode;
2809 buffer->transform = transform;
2810 buffer->transformCtx = transformCtx;
2811
2812 return(buffer);
2813}
2814
2815static void
2816xmlSecTransformIOBufferDestroy(xmlSecTransformIOBufferPtr buffer) {
2817 xmlSecAssert(buffer != NULL)if(!( buffer != ((void*)0) ) ) { xmlSecError("transforms.c",2817
,__FUNCTION__, ((void*)0), "buffer != NULL", 100, " "); return
; }
;
2818
2819 memset(buffer, 0, sizeof(xmlSecTransformIOBuffer));
2820 xmlFree(buffer);
2821}
2822
2823static int
2824xmlSecTransformIOBufferRead(xmlSecTransformIOBufferPtr buffer,
2825 xmlSecByteunsigned char *buf, xmlSecSizesize_t size) {
2826 int ret;
2827
2828 xmlSecAssert2(buffer != NULL, -1)if(!( buffer != ((void*)0) ) ) { xmlSecError("transforms.c",2828
,__FUNCTION__, ((void*)0), "buffer != NULL", 100, " "); return
(-1); }
;
2829 xmlSecAssert2(buffer->mode == xmlSecTransformIOBufferModeRead, -1)if(!( buffer->mode == xmlSecTransformIOBufferModeRead ) ) {
xmlSecError("transforms.c",2829,__FUNCTION__, ((void*)0), "buffer->mode == xmlSecTransformIOBufferModeRead"
, 100, " "); return(-1); }
;
2830 xmlSecAssert2(xmlSecTransformIsValid(buffer->transform), -1)if(!( ((( buffer->transform ) != ((void*)0)) && ((
buffer->transform )->id != ((void*)0)) && (( buffer
->transform )->id->klassSize >= sizeof(xmlSecTransformKlass
)) && (( buffer->transform )->id->objSize >=
sizeof(xmlSecTransform)) && (( buffer->transform )
->id->name != ((void*)0))) ) ) { xmlSecError("transforms.c"
,2830,__FUNCTION__, ((void*)0), "xmlSecTransformIsValid(buffer->transform)"
, 100, " "); return(-1); }
;
2831 xmlSecAssert2(buffer->transformCtx != NULL, -1)if(!( buffer->transformCtx != ((void*)0) ) ) { xmlSecError
("transforms.c",2831,__FUNCTION__, ((void*)0), "buffer->transformCtx != NULL"
, 100, " "); return(-1); }
;
2832 xmlSecAssert2(buf != NULL, -1)if(!( buf != ((void*)0) ) ) { xmlSecError("transforms.c",2832
,__FUNCTION__, ((void*)0), "buf != NULL", 100, " "); return(-
1); }
;
2833
2834 ret = xmlSecTransformPopBin(buffer->transform, buf, size, &size, buffer->transformCtx);
2835 if(ret < 0) {
2836 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",2836,__FUNCTION__,
2837 xmlSecErrorsSafeString(xmlSecTransformGetName(buffer->transform))(((((((( (buffer->transform) ) != ((void*)0)) && (
( (buffer->transform) )->id != ((void*)0)) && (
( (buffer->transform) )->id->klassSize >= sizeof(
xmlSecTransformKlass)) && (( (buffer->transform) )
->id->objSize >= sizeof(xmlSecTransform)) &&
(( (buffer->transform) )->id->name != ((void*)0))))
? ((((buffer->transform)->id)) ? (((buffer->transform
)->id)->name) : ((void*)0)) : ((void*)0))) != ((void*)0
)) ? ((char*)(((((( (buffer->transform) ) != ((void*)0)) &&
(( (buffer->transform) )->id != ((void*)0)) &&
(( (buffer->transform) )->id->klassSize >= sizeof
(xmlSecTransformKlass)) && (( (buffer->transform) )
->id->objSize >= sizeof(xmlSecTransform)) &&
(( (buffer->transform) )->id->name != ((void*)0))))
? ((((buffer->transform)->id)) ? (((buffer->transform
)->id)->name) : ((void*)0)) : ((void*)0)))) : (char*)"NULL"
)
,
2838 "xmlSecTransformPopBin",
2839 XMLSEC_ERRORS_R_XMLSEC_FAILED1,
2840 XMLSEC_ERRORS_NO_MESSAGE" ");
2841 return(-1);
2842 }
2843 return(size);
2844}
2845
2846static int
2847xmlSecTransformIOBufferWrite(xmlSecTransformIOBufferPtr buffer,
2848 const xmlSecByteunsigned char *buf, xmlSecSizesize_t size) {
2849 int ret;
2850
2851 xmlSecAssert2(buffer != NULL, -1)if(!( buffer != ((void*)0) ) ) { xmlSecError("transforms.c",2851
,__FUNCTION__, ((void*)0), "buffer != NULL", 100, " "); return
(-1); }
;
2852 xmlSecAssert2(buffer->mode == xmlSecTransformIOBufferModeWrite, -1)if(!( buffer->mode == xmlSecTransformIOBufferModeWrite ) )
{ xmlSecError("transforms.c",2852,__FUNCTION__, ((void*)0), "buffer->mode == xmlSecTransformIOBufferModeWrite"
, 100, " "); return(-1); }
;
2853 xmlSecAssert2(xmlSecTransformIsValid(buffer->transform), -1)if(!( ((( buffer->transform ) != ((void*)0)) && ((
buffer->transform )->id != ((void*)0)) && (( buffer
->transform )->id->klassSize >= sizeof(xmlSecTransformKlass
)) && (( buffer->transform )->id->objSize >=
sizeof(xmlSecTransform)) && (( buffer->transform )
->id->name != ((void*)0))) ) ) { xmlSecError("transforms.c"
,2853,__FUNCTION__, ((void*)0), "xmlSecTransformIsValid(buffer->transform)"
, 100, " "); return(-1); }
;
2854 xmlSecAssert2(buffer->transformCtx != NULL, -1)if(!( buffer->transformCtx != ((void*)0) ) ) { xmlSecError
("transforms.c",2854,__FUNCTION__, ((void*)0), "buffer->transformCtx != NULL"
, 100, " "); return(-1); }
;
2855 xmlSecAssert2(buf != NULL, -1)if(!( buf != ((void*)0) ) ) { xmlSecError("transforms.c",2855
,__FUNCTION__, ((void*)0), "buf != NULL", 100, " "); return(-
1); }
;
2856
2857 ret = xmlSecTransformPushBin(buffer->transform, buf, size, 0, buffer->transformCtx);
2858 if(ret < 0) {
2859 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",2859,__FUNCTION__,
2860 xmlSecErrorsSafeString(xmlSecTransformGetName(buffer->transform))(((((((( (buffer->transform) ) != ((void*)0)) && (
( (buffer->transform) )->id != ((void*)0)) && (
( (buffer->transform) )->id->klassSize >= sizeof(
xmlSecTransformKlass)) && (( (buffer->transform) )
->id->objSize >= sizeof(xmlSecTransform)) &&
(( (buffer->transform) )->id->name != ((void*)0))))
? ((((buffer->transform)->id)) ? (((buffer->transform
)->id)->name) : ((void*)0)) : ((void*)0))) != ((void*)0
)) ? ((char*)(((((( (buffer->transform) ) != ((void*)0)) &&
(( (buffer->transform) )->id != ((void*)0)) &&
(( (buffer->transform) )->id->klassSize >= sizeof
(xmlSecTransformKlass)) && (( (buffer->transform) )
->id->objSize >= sizeof(xmlSecTransform)) &&
(( (buffer->transform) )->id->name != ((void*)0))))
? ((((buffer->transform)->id)) ? (((buffer->transform
)->id)->name) : ((void*)0)) : ((void*)0)))) : (char*)"NULL"
)
,
2861 "xmlSecTransformPushBin",
2862 XMLSEC_ERRORS_R_XMLSEC_FAILED1,
2863 XMLSEC_ERRORS_NO_MESSAGE" ");
2864 return(-1);
2865 }
2866 return(size);
2867}
2868
2869static int
2870xmlSecTransformIOBufferClose(xmlSecTransformIOBufferPtr buffer) {
2871 int ret;
2872
2873 xmlSecAssert2(buffer != NULL, -1)if(!( buffer != ((void*)0) ) ) { xmlSecError("transforms.c",2873
,__FUNCTION__, ((void*)0), "buffer != NULL", 100, " "); return
(-1); }
;
2874 xmlSecAssert2(xmlSecTransformIsValid(buffer->transform), -1)if(!( ((( buffer->transform ) != ((void*)0)) && ((
buffer->transform )->id != ((void*)0)) && (( buffer
->transform )->id->klassSize >= sizeof(xmlSecTransformKlass
)) && (( buffer->transform )->id->objSize >=
sizeof(xmlSecTransform)) && (( buffer->transform )
->id->name != ((void*)0))) ) ) { xmlSecError("transforms.c"
,2874,__FUNCTION__, ((void*)0), "xmlSecTransformIsValid(buffer->transform)"
, 100, " "); return(-1); }
;
2875 xmlSecAssert2(buffer->transformCtx != NULL, -1)if(!( buffer->transformCtx != ((void*)0) ) ) { xmlSecError
("transforms.c",2875,__FUNCTION__, ((void*)0), "buffer->transformCtx != NULL"
, 100, " "); return(-1); }
;
2876
2877 /* need to flush write buffer before destroing */
2878 if(buffer->mode == xmlSecTransformIOBufferModeWrite) {
2879 ret = xmlSecTransformPushBin(buffer->transform, NULL((void*)0), 0, 1, buffer->transformCtx);
2880 if(ret < 0) {
2881 xmlSecError(XMLSEC_ERRORS_HERE"transforms.c",2881,__FUNCTION__,
2882 xmlSecErrorsSafeString(xmlSecTransformGetName(buffer->transform))(((((((( (buffer->transform) ) != ((void*)0)) && (
( (buffer->transform) )->id != ((void*)0)) && (
( (buffer->transform) )->id->klassSize >= sizeof(
xmlSecTransformKlass)) && (( (buffer->transform) )
->id->objSize >= sizeof(xmlSecTransform)) &&
(( (buffer->transform) )->id->name != ((void*)0))))
? ((((buffer->transform)->id)) ? (((buffer->transform
)->id)->name) : ((void*)0)) : ((void*)0))) != ((void*)0
)) ? ((char*)(((((( (buffer->transform) ) != ((void*)0)) &&
(( (buffer->transform) )->id != ((void*)0)) &&
(( (buffer->transform) )->id->klassSize >= sizeof
(xmlSecTransformKlass)) && (( (buffer->transform) )
->id->objSize >= sizeof(xmlSecTransform)) &&
(( (buffer->transform) )->id->name != ((void*)0))))
? ((((buffer->transform)->id)) ? (((buffer->transform
)->id)->name) : ((void*)0)) : ((void*)0)))) : (char*)"NULL"
)
,
2883 "xmlSecTransformPushBin",
2884 XMLSEC_ERRORS_R_XMLSEC_FAILED1,
2885 XMLSEC_ERRORS_NO_MESSAGE" ");
2886 return(-1);
2887 }
2888 }
2889
2890 xmlSecTransformIOBufferDestroy(buffer);
2891 return(0);
2892}