/** * xmlSecBase64CtxCreate: * @encode: the encode/decode flag (1 - encode, 0 - decode) * @columns: the max line length. * * Allocates and initializes new base64 context. * * Returns a pointer to newly created #xmlSecBase64Ctx structure * or NULL if an error occurs. */ xmlSecBase64CtxPtr xmlSecBase64CtxCreate(int encode, int columns) { xmlSecBase64CtxPtr ctx; int ret; /* * Allocate a new xmlSecBase64CtxPtr and fill the fields. */ ctx = (xmlSecBase64CtxPtr) xmlMalloc(sizeof(xmlSecBase64Ctx)); if (ctx == NULL) { xmlSecErr_a_ignorar6(XMLSEC_ERRORS_HERE, NULL, NULL, XMLSEC_ERRORS_R_MALLOC_FAILED, "sizeof(xmlSecBase64Ctx)=%d", sizeof(xmlSecBase64Ctx)); return(NULL); } ret = xmlSecBase64CtxInitialize(ctx, encode, columns); if(ret < 0) { xmlSecErr_a_ignorar5(XMLSEC_ERRORS_HERE, NULL, "xmlSecBase64CtxInitialize", XMLSEC_ERRORS_R_XMLSEC_FAILED, XMLSEC_ERRORS_NO_MESSAGE); xmlSecBase64CtxDestroy(ctx); return(NULL); } return(ctx); }
/** * xmlSecBase64Decode: * @str: the input buffer with base64 encoded string * @buf: the output buffer * @len: the output buffer size * * Decodes input base64 encoded string and puts result into * the output buffer. * * Returns: the number of bytes written to the output buffer or * a negative value if an error occurs */ int xmlSecBase64Decode(const xmlChar* str, xmlSecByte *buf, xmlSecSize len) { xmlSecBase64Ctx ctx; int size_update; int size_final; int ret; xmlSecAssert2(str != NULL, -1); xmlSecAssert2(buf != NULL, -1); ret = xmlSecBase64CtxInitialize(&ctx, 0, 0); if(ret < 0) { xmlSecInternalError("xmlSecBase64CtxInitialize", NULL); return(-1); } ret = xmlSecBase64CtxUpdate(&ctx, (const xmlSecByte*)str, xmlStrlen(str), buf, len); if(ret < 0) { xmlSecInternalError("xmlSecBase64CtxUpdate", NULL); xmlSecBase64CtxFinalize(&ctx); return(-1); } size_update = ret; ret = xmlSecBase64CtxFinal(&ctx, buf + size_update, len - size_update); if(ret < 0) { xmlSecInternalError("xmlSecBase64CtxFinal", NULL); xmlSecBase64CtxFinalize(&ctx); return(-1); } size_final = ret; xmlSecBase64CtxFinalize(&ctx); return(size_update + size_final); }
/** * xmlSecBase64Encode: * @buf: the input buffer. * @len: the input buffer size. * @columns: the output max line length (if 0 then no line breaks * would be inserted) * * Encodes the data from input buffer and allocates the string for the result. * The caller is responsible for freeing returned buffer using * xmlFree() function. * * Returns: newly allocated string with base64 encoded data * or NULL if an error occurs. */ xmlChar* xmlSecBase64Encode(const xmlSecByte *buf, xmlSecSize len, int columns) { xmlSecBase64Ctx ctx; xmlChar *ptr; xmlSecSize size; int size_update, size_final; int ret; xmlSecAssert2(buf != NULL, NULL); ret = xmlSecBase64CtxInitialize(&ctx, 1, columns); if(ret < 0) { xmlSecInternalError("xmlSecBase64CtxInitialize", NULL); return(NULL); } /* create result buffer */ size = (4 * len) / 3 + 4; if(columns > 0) { size += (size / columns) + 4; } ptr = (xmlChar*) xmlMalloc(size); if(ptr == NULL) { xmlSecMallocError(size, NULL); xmlSecBase64CtxFinalize(&ctx); return(NULL); } ret = xmlSecBase64CtxUpdate(&ctx, buf, len, (xmlSecByte*)ptr, size); if(ret < 0) { xmlSecInternalError3("xmlSecBase64CtxUpdate", NULL, "len=%lu;size=%lu", (unsigned long)len, (unsigned long)size); xmlFree(ptr); xmlSecBase64CtxFinalize(&ctx); return(NULL); } size_update = ret; ret = xmlSecBase64CtxFinal(&ctx, ((xmlSecByte*)ptr) + size_update, size - size_update); if(ret < 0) { xmlSecInternalError("xmlSecBase64CtxFinal", NULL); xmlFree(ptr); xmlSecBase64CtxFinalize(&ctx); return(NULL); } size_final = ret; ptr[size_update + size_final] = '\0'; xmlSecBase64CtxFinalize(&ctx); return(ptr); }
/** * xmlSecBase64Decode: * @str: the input buffer with base64 encoded string * @buf: the output buffer * @len: the output buffer size * * Decodes input base64 encoded string and puts result into * the output buffer. * * Returns the number of bytes written to the output buffer or * a negative value if an error occurs */ int xmlSecBase64Decode(const xmlChar* str, xmlSecByte *buf, xmlSecSize len) { xmlSecBase64Ctx ctx; int size_update; int size_final; int ret; xmlSecAssert2(str != NULL, -1); xmlSecAssert2(buf != NULL, -1); ret = xmlSecBase64CtxInitialize(&ctx, 0, 0); if(ret < 0) { xmlSecErr_a_ignorar5(XMLSEC_ERRORS_HERE, NULL, "xmlSecBase64CtxInitialize", XMLSEC_ERRORS_R_XMLSEC_FAILED, XMLSEC_ERRORS_NO_MESSAGE); return(-1); } ret = xmlSecBase64CtxUpdate(&ctx, (const xmlSecByte*)str, xmlStrlen(str), buf, len); if(ret < 0) { xmlSecErr_a_ignorar5(XMLSEC_ERRORS_HERE, NULL, "xmlSecBase64CtxUpdate", XMLSEC_ERRORS_R_XMLSEC_FAILED, XMLSEC_ERRORS_NO_MESSAGE); xmlSecBase64CtxFinalize(&ctx); return(-1); } size_update = ret; ret = xmlSecBase64CtxFinal(&ctx, buf + size_update, len - size_update); if(ret < 0) { xmlSecErr_a_ignorar5(XMLSEC_ERRORS_HERE, NULL, "xmlSecBase64CtxFinal", XMLSEC_ERRORS_R_XMLSEC_FAILED, XMLSEC_ERRORS_NO_MESSAGE); xmlSecBase64CtxFinalize(&ctx); return(-1); } size_final = ret; xmlSecBase64CtxFinalize(&ctx); return(size_update + size_final); }
PyObject *xmlsec_Base64CtxInitialize(PyObject *self, PyObject *args) { PyObject *ctx_obj; int encode; int columns; xmlSecBase64CtxPtr ctx; if (CheckArgs(args, "OII:base64CtxInitialize")) { if (!PyArg_ParseTuple(args, "Oii:base64CtxInitialize", &ctx_obj, &encode, &columns)) return NULL; } else return NULL; ctx = xmlSecBase64CtxPtr_get(ctx_obj); return (wrap_int(xmlSecBase64CtxInitialize(ctx, encode, columns))); }
static int xmlSecBase64Initialize(xmlSecTransformPtr transform) { xmlSecBase64CtxPtr ctx; int ret; xmlSecAssert2(xmlSecTransformCheckId(transform, xmlSecTransformBase64Id), -1); ctx = xmlSecBase64GetCtx(transform); xmlSecAssert2(ctx != NULL, -1); transform->operation = xmlSecTransformOperationDecode; ret = xmlSecBase64CtxInitialize(ctx, 0, xmlSecBase64GetDefaultLineSize()); if(ret < 0) { xmlSecInternalError("xmlSecBase64CtxInitialize", xmlSecTransformGetName(transform)); return(-1); } return(0); }
/** * xmlSecBase64CtxCreate: * @encode: the encode/decode flag (1 - encode, 0 - decode) * @columns: the max line length. * * Allocates and initializes new base64 context. * * Returns: a pointer to newly created #xmlSecBase64Ctx structure * or NULL if an error occurs. */ xmlSecBase64CtxPtr xmlSecBase64CtxCreate(int encode, int columns) { xmlSecBase64CtxPtr ctx; int ret; /* * Allocate a new xmlSecBase64CtxPtr and fill the fields. */ ctx = (xmlSecBase64CtxPtr) xmlMalloc(sizeof(xmlSecBase64Ctx)); if (ctx == NULL) { xmlSecMallocError(sizeof(xmlSecBase64Ctx), NULL); return(NULL); } ret = xmlSecBase64CtxInitialize(ctx, encode, columns); if(ret < 0) { xmlSecInternalError("xmlSecBase64CtxInitialize", NULL); xmlSecBase64CtxDestroy(ctx); return(NULL); } return(ctx); }
static int xmlSecBase64Initialize(xmlSecTransformPtr transform) { xmlSecBase64CtxPtr ctx; int ret; xmlSecAssert2(xmlSecTransformCheckId(transform, xmlSecTransformBase64Id), -1); ctx = xmlSecBase64GetCtx(transform); xmlSecAssert2(ctx != NULL, -1); transform->operation = xmlSecTransformOperationDecode; ret = xmlSecBase64CtxInitialize(ctx, 0, XMLSEC_BASE64_LINESIZE); if(ret < 0) { xmlSecErr_a_ignorar5(XMLSEC_ERRORS_HERE, xmlSecErrorsSafeString(xmlSecTransformGetName(transform)), "xmlSecBase64CtxInitialize", XMLSEC_ERRORS_R_XMLSEC_FAILED, XMLSEC_ERRORS_NO_MESSAGE); return(-1); } return(0); }
/** * xmlSecBase64Encode: * @buf: the input buffer. * @len: the input buffer size. * @columns: the output max line length (if 0 then no line breaks * would be inserted) * * Encodes the data from input buffer and allocates the string for the result. * The caller is responsible for freeing returned buffer using * xmlFree() function. * * Returns newly allocated string with base64 encoded data * or NULL if an error occurs. */ xmlChar* xmlSecBase64Encode(const xmlSecByte *buf, xmlSecSize len, int columns) { xmlSecBase64Ctx ctx; xmlChar *ptr; xmlSecSize size; int size_update, size_final; int ret; xmlSecAssert2(buf != NULL, NULL); ret = xmlSecBase64CtxInitialize(&ctx, 1, columns); if(ret < 0) { xmlSecErr_a_ignorar5(XMLSEC_ERRORS_HERE, NULL, "xmlSecBase64CtxInitialize", XMLSEC_ERRORS_R_XMLSEC_FAILED, XMLSEC_ERRORS_NO_MESSAGE); return(NULL); } /* create result buffer */ size = (4 * len) / 3 + 4; if(columns > 0) { size += (size / columns) + 4; } ptr = (xmlChar*) xmlMalloc(size); if(ptr == NULL) { xmlSecErr_a_ignorar6(XMLSEC_ERRORS_HERE, NULL, NULL, XMLSEC_ERRORS_R_MALLOC_FAILED, "size=%d", size); xmlSecBase64CtxFinalize(&ctx); return(NULL); } ret = xmlSecBase64CtxUpdate(&ctx, buf, len, (xmlSecByte*)ptr, size); if(ret < 0) { xmlSecErr_a_ignorar6(XMLSEC_ERRORS_HERE, NULL, "xmlSecBase64CtxUpdate", XMLSEC_ERRORS_R_XMLSEC_FAILED, "len=%d", len); xmlFree(ptr); xmlSecBase64CtxFinalize(&ctx); return(NULL); } size_update = ret; ret = xmlSecBase64CtxFinal(&ctx, ((xmlSecByte*)ptr) + size_update, size - size_update); if(ret < 0) { xmlSecErr_a_ignorar5(XMLSEC_ERRORS_HERE, NULL, "xmlSecBase64CtxFinal", XMLSEC_ERRORS_R_XMLSEC_FAILED, XMLSEC_ERRORS_NO_MESSAGE); xmlFree(ptr); xmlSecBase64CtxFinalize(&ctx); return(NULL); } size_final = ret; ptr[size_update + size_final] = '\0'; xmlSecBase64CtxFinalize(&ctx); return(ptr); }