Line data Source code
1 : /**
2 : * XML Security Library (http://www.aleksey.com/xmlsec).
3 : *
4 : * Memory buffer transform
5 : *
6 : * This is free software; see Copyright file in the source
7 : * distribution for preciese wording.
8 : *
9 : * Copyright (C) 2002-2003 Aleksey Sanin <aleksey@aleksey.com>
10 : */
11 : #include "globals.h"
12 :
13 : #include <stdlib.h>
14 : #include <string.h>
15 :
16 : #include <libxml/tree.h>
17 :
18 : #include <xmlsec/xmlsec.h>
19 : #include <xmlsec/buffer.h>
20 : #include <xmlsec/keys.h>
21 : #include <xmlsec/transforms.h>
22 : #include <xmlsec/keys.h>
23 : #include <xmlsec/base64.h>
24 : #include <xmlsec/membuf.h>
25 : #include <xmlsec/errors.h>
26 :
27 :
28 : /*****************************************************************************
29 : *
30 : * Memory Buffer Transform
31 : *
32 : * xmlSecBuffer is located after xmlSecTransform
33 : *
34 : ****************************************************************************/
35 : #define xmlSecTransformMemBufSize \
36 : (sizeof(xmlSecTransform) + sizeof(xmlSecBuffer))
37 : #define xmlSecTransformMemBufGetBuf(transform) \
38 : ((xmlSecTransformCheckSize((transform), xmlSecTransformMemBufSize)) ? \
39 : (xmlSecBufferPtr)(((xmlSecByte*)(transform)) + sizeof(xmlSecTransform)) : \
40 : (xmlSecBufferPtr)NULL)
41 :
42 : static int xmlSecTransformMemBufInitialize (xmlSecTransformPtr transform);
43 : static void xmlSecTransformMemBufFinalize (xmlSecTransformPtr transform);
44 : static int xmlSecTransformMemBufExecute (xmlSecTransformPtr transform,
45 : int last,
46 : xmlSecTransformCtxPtr transformCtx);
47 : static xmlSecTransformKlass xmlSecTransformMemBufKlass = {
48 : /* klass/object sizes */
49 : sizeof(xmlSecTransformKlass), /* xmlSecSize klassSize */
50 : xmlSecTransformMemBufSize, /* xmlSecSize objSize */
51 :
52 : xmlSecNameMemBuf, /* const xmlChar* name; */
53 : NULL, /* const xmlChar* href; */
54 : 0, /* xmlSecAlgorithmUsage usage; */
55 :
56 : xmlSecTransformMemBufInitialize, /* xmlSecTransformInitializeMethod initialize; */
57 : xmlSecTransformMemBufFinalize, /* xmlSecTransformFianlizeMethod finalize; */
58 : NULL, /* xmlSecTransformNodeReadMethod readNode; */
59 : NULL, /* xmlSecTransformNodeWriteMethod writeNode; */
60 : NULL, /* xmlSecTransformSetKeyReqMethod setKeyReq; */
61 : NULL, /* xmlSecTransformSetKeyMethod setKey; */
62 : NULL, /* xmlSecTransformValidateMethod validate; */
63 : xmlSecTransformDefaultGetDataType, /* xmlSecTransformGetDataTypeMethod getDataType; */
64 : xmlSecTransformDefaultPushBin, /* xmlSecTransformPushBinMethod pushBin; */
65 : xmlSecTransformDefaultPopBin, /* xmlSecTransformPopBinMethod popBin; */
66 : NULL, /* xmlSecTransformPushXmlMethod pushXml; */
67 : NULL, /* xmlSecTransformPopXmlMethod popXml; */
68 : xmlSecTransformMemBufExecute, /* xmlSecTransformExecuteMethod execute; */
69 :
70 : NULL, /* void* reserved0; */
71 : NULL, /* void* reserved1; */
72 : };
73 :
74 : /**
75 : * xmlSecTransformMemBufGetKlass:
76 : *
77 : * The memory buffer transorm (used to store the data that go through it).
78 : *
79 : * Returns: memory buffer transform klass.
80 : */
81 : xmlSecTransformId
82 0 : xmlSecTransformMemBufGetKlass(void) {
83 0 : return(&xmlSecTransformMemBufKlass);
84 : }
85 :
86 : /**
87 : * xmlSecTransformMemBufGetBuffer:
88 : * @transform: the pointer to memory buffer transform.
89 : *
90 : * Gets the pointer to memory buffer transform buffer.
91 : *
92 : * Returns: pointer to the transform's #xmlSecBuffer.
93 : */
94 : xmlSecBufferPtr
95 0 : xmlSecTransformMemBufGetBuffer(xmlSecTransformPtr transform) {
96 : xmlSecBufferPtr buffer;
97 :
98 0 : xmlSecAssert2(xmlSecTransformCheckId(transform, xmlSecTransformMemBufId), NULL);
99 :
100 0 : buffer = xmlSecTransformMemBufGetBuf(transform);
101 0 : xmlSecAssert2(buffer != NULL, NULL);
102 :
103 0 : return(buffer);
104 : }
105 :
106 : static int
107 0 : xmlSecTransformMemBufInitialize(xmlSecTransformPtr transform) {
108 : xmlSecBufferPtr buffer;
109 : int ret;
110 :
111 0 : xmlSecAssert2(xmlSecTransformCheckId(transform, xmlSecTransformMemBufId), -1);
112 :
113 0 : buffer = xmlSecTransformMemBufGetBuf(transform);
114 0 : xmlSecAssert2(buffer != NULL, -1);
115 :
116 0 : ret = xmlSecBufferInitialize(buffer, 0);
117 0 : if(ret < 0) {
118 0 : xmlSecError(XMLSEC_ERRORS_HERE,
119 0 : xmlSecErrorsSafeString(xmlSecTransformGetName(transform)),
120 : "xmlSecBufferInitialize",
121 : XMLSEC_ERRORS_R_XMLSEC_FAILED,
122 : XMLSEC_ERRORS_NO_MESSAGE);
123 0 : return(-1);
124 : }
125 0 : return(0);
126 : }
127 :
128 : static void
129 0 : xmlSecTransformMemBufFinalize(xmlSecTransformPtr transform) {
130 : xmlSecBufferPtr buffer;
131 :
132 0 : xmlSecAssert(xmlSecTransformCheckId(transform, xmlSecTransformMemBufId));
133 :
134 0 : buffer = xmlSecTransformMemBufGetBuf(transform);
135 0 : xmlSecAssert(buffer != NULL);
136 :
137 0 : xmlSecBufferFinalize(xmlSecTransformMemBufGetBuf(transform));
138 : }
139 :
140 : static int
141 0 : xmlSecTransformMemBufExecute(xmlSecTransformPtr transform, int last, xmlSecTransformCtxPtr transformCtx) {
142 : xmlSecBufferPtr buffer;
143 : xmlSecBufferPtr in, out;
144 : xmlSecSize inSize;
145 : int ret;
146 :
147 0 : xmlSecAssert2(xmlSecTransformCheckId(transform, xmlSecTransformMemBufId), -1);
148 0 : xmlSecAssert2(transformCtx != NULL, -1);
149 :
150 0 : buffer = xmlSecTransformMemBufGetBuf(transform);
151 0 : xmlSecAssert2(buffer != NULL, -1);
152 :
153 0 : in = &(transform->inBuf);
154 0 : out = &(transform->outBuf);
155 0 : inSize = xmlSecBufferGetSize(in);
156 :
157 0 : if(transform->status == xmlSecTransformStatusNone) {
158 0 : transform->status = xmlSecTransformStatusWorking;
159 : }
160 :
161 0 : if(transform->status == xmlSecTransformStatusWorking) {
162 : /* just copy everything from in to our buffer and out */
163 0 : ret = xmlSecBufferAppend(buffer, xmlSecBufferGetData(in), inSize);
164 0 : if(ret < 0) {
165 0 : xmlSecError(XMLSEC_ERRORS_HERE,
166 0 : xmlSecErrorsSafeString(xmlSecTransformGetName(transform)),
167 : "xmlSecBufferAppend",
168 : XMLSEC_ERRORS_R_XMLSEC_FAILED,
169 : "size=%d", inSize);
170 0 : return(-1);
171 : }
172 :
173 0 : ret = xmlSecBufferAppend(out, xmlSecBufferGetData(in), inSize);
174 0 : if(ret < 0) {
175 0 : xmlSecError(XMLSEC_ERRORS_HERE,
176 0 : xmlSecErrorsSafeString(xmlSecTransformGetName(transform)),
177 : "xmlSecBufferAppend",
178 : XMLSEC_ERRORS_R_XMLSEC_FAILED,
179 : "size=%d", inSize);
180 0 : return(-1);
181 : }
182 :
183 0 : ret = xmlSecBufferRemoveHead(in, inSize);
184 0 : if(ret < 0) {
185 0 : xmlSecError(XMLSEC_ERRORS_HERE,
186 0 : xmlSecErrorsSafeString(xmlSecTransformGetName(transform)),
187 : "xmlSecBufferRemoveHead",
188 : XMLSEC_ERRORS_R_XMLSEC_FAILED,
189 : "size=%d", inSize);
190 0 : return(-1);
191 : }
192 :
193 0 : if(last != 0) {
194 0 : transform->status = xmlSecTransformStatusFinished;
195 : }
196 0 : } else if(transform->status == xmlSecTransformStatusFinished) {
197 : /* the only way we can get here is if there is no input */
198 0 : xmlSecAssert2(inSize == 0, -1);
199 : } else {
200 0 : xmlSecError(XMLSEC_ERRORS_HERE,
201 0 : xmlSecErrorsSafeString(xmlSecTransformGetName(transform)),
202 : NULL,
203 : XMLSEC_ERRORS_R_INVALID_STATUS,
204 0 : "status=%d", transform->status);
205 0 : return(-1);
206 : }
207 0 : return(0);
208 : }
209 :
|