1*e71b7053SJung-uk Kim /* 2*e71b7053SJung-uk Kim * Copyright 1998-2018 The OpenSSL Project Authors. All Rights Reserved. 3*e71b7053SJung-uk Kim * 4*e71b7053SJung-uk Kim * Licensed under the OpenSSL license (the "License"). You may not use 5*e71b7053SJung-uk Kim * this file except in compliance with the License. You can obtain a copy 6*e71b7053SJung-uk Kim * in the file LICENSE in the source distribution or at 7*e71b7053SJung-uk Kim * https://www.openssl.org/source/license.html 8*e71b7053SJung-uk Kim */ 9*e71b7053SJung-uk Kim 1074664626SKris Kennaway #include <stdio.h> 1174664626SKris Kennaway #include <stdlib.h> 1274664626SKris Kennaway #include <string.h> 1374664626SKris Kennaway #include <openssl/objects.h> 1474664626SKris Kennaway #include <openssl/comp.h> 15*e71b7053SJung-uk Kim #include <openssl/err.h> 16*e71b7053SJung-uk Kim #include "comp_lcl.h" 1774664626SKris Kennaway 1874664626SKris Kennaway COMP_CTX *COMP_CTX_new(COMP_METHOD *meth) 1974664626SKris Kennaway { 2074664626SKris Kennaway COMP_CTX *ret; 2174664626SKris Kennaway 22*e71b7053SJung-uk Kim if ((ret = OPENSSL_zalloc(sizeof(*ret))) == NULL) { 23*e71b7053SJung-uk Kim COMPerr(COMP_F_COMP_CTX_NEW, ERR_R_MALLOC_FAILURE); 24*e71b7053SJung-uk Kim return NULL; 2574664626SKris Kennaway } 2674664626SKris Kennaway ret->meth = meth; 276f9291ceSJung-uk Kim if ((ret->meth->init != NULL) && !ret->meth->init(ret)) { 28ddd58736SKris Kennaway OPENSSL_free(ret); 2974664626SKris Kennaway ret = NULL; 3074664626SKris Kennaway } 31*e71b7053SJung-uk Kim return ret; 32*e71b7053SJung-uk Kim } 33*e71b7053SJung-uk Kim 34*e71b7053SJung-uk Kim const COMP_METHOD *COMP_CTX_get_method(const COMP_CTX *ctx) 35*e71b7053SJung-uk Kim { 36*e71b7053SJung-uk Kim return ctx->meth; 37*e71b7053SJung-uk Kim } 38*e71b7053SJung-uk Kim 39*e71b7053SJung-uk Kim int COMP_get_type(const COMP_METHOD *meth) 40*e71b7053SJung-uk Kim { 41*e71b7053SJung-uk Kim return meth->type; 42*e71b7053SJung-uk Kim } 43*e71b7053SJung-uk Kim 44*e71b7053SJung-uk Kim const char *COMP_get_name(const COMP_METHOD *meth) 45*e71b7053SJung-uk Kim { 46*e71b7053SJung-uk Kim return meth->name; 4774664626SKris Kennaway } 4874664626SKris Kennaway 4974664626SKris Kennaway void COMP_CTX_free(COMP_CTX *ctx) 5074664626SKris Kennaway { 5174664626SKris Kennaway if (ctx == NULL) 5274664626SKris Kennaway return; 5374664626SKris Kennaway if (ctx->meth->finish != NULL) 5474664626SKris Kennaway ctx->meth->finish(ctx); 5574664626SKris Kennaway 56ddd58736SKris Kennaway OPENSSL_free(ctx); 5774664626SKris Kennaway } 5874664626SKris Kennaway 5974664626SKris Kennaway int COMP_compress_block(COMP_CTX *ctx, unsigned char *out, int olen, 6074664626SKris Kennaway unsigned char *in, int ilen) 6174664626SKris Kennaway { 6274664626SKris Kennaway int ret; 636f9291ceSJung-uk Kim if (ctx->meth->compress == NULL) { 64*e71b7053SJung-uk Kim return -1; 6574664626SKris Kennaway } 6674664626SKris Kennaway ret = ctx->meth->compress(ctx, out, olen, in, ilen); 676f9291ceSJung-uk Kim if (ret > 0) { 6874664626SKris Kennaway ctx->compress_in += ilen; 6974664626SKris Kennaway ctx->compress_out += ret; 7074664626SKris Kennaway } 71*e71b7053SJung-uk Kim return ret; 7274664626SKris Kennaway } 7374664626SKris Kennaway 7474664626SKris Kennaway int COMP_expand_block(COMP_CTX *ctx, unsigned char *out, int olen, 7574664626SKris Kennaway unsigned char *in, int ilen) 7674664626SKris Kennaway { 7774664626SKris Kennaway int ret; 7874664626SKris Kennaway 796f9291ceSJung-uk Kim if (ctx->meth->expand == NULL) { 80*e71b7053SJung-uk Kim return -1; 8174664626SKris Kennaway } 8274664626SKris Kennaway ret = ctx->meth->expand(ctx, out, olen, in, ilen); 836f9291ceSJung-uk Kim if (ret > 0) { 8474664626SKris Kennaway ctx->expand_in += ilen; 8574664626SKris Kennaway ctx->expand_out += ret; 8674664626SKris Kennaway } 87*e71b7053SJung-uk Kim return ret; 88*e71b7053SJung-uk Kim } 89*e71b7053SJung-uk Kim 90*e71b7053SJung-uk Kim int COMP_CTX_get_type(const COMP_CTX* comp) 91*e71b7053SJung-uk Kim { 92*e71b7053SJung-uk Kim return comp->meth ? comp->meth->type : NID_undef; 9374664626SKris Kennaway } 94