1*1dcdf01fSchristos /*
2*1dcdf01fSchristos  * Copyright 1998-2018 The OpenSSL Project Authors. All Rights Reserved.
3*1dcdf01fSchristos  *
4*1dcdf01fSchristos  * Licensed under the OpenSSL license (the "License").  You may not use
5*1dcdf01fSchristos  * this file except in compliance with the License.  You can obtain a copy
6*1dcdf01fSchristos  * in the file LICENSE in the source distribution or at
7*1dcdf01fSchristos  * https://www.openssl.org/source/license.html
8*1dcdf01fSchristos  */
9*1dcdf01fSchristos 
1060662d10Schristos #include <stdio.h>
1160662d10Schristos #include <stdlib.h>
1260662d10Schristos #include <string.h>
1360662d10Schristos #include <openssl/objects.h>
1460662d10Schristos #include <openssl/comp.h>
15*1dcdf01fSchristos #include <openssl/err.h>
16*1dcdf01fSchristos #include "comp_local.h"
1760662d10Schristos 
COMP_CTX_new(COMP_METHOD * meth)1860662d10Schristos COMP_CTX *COMP_CTX_new(COMP_METHOD *meth)
1960662d10Schristos {
2060662d10Schristos     COMP_CTX *ret;
2160662d10Schristos 
22*1dcdf01fSchristos     if ((ret = OPENSSL_zalloc(sizeof(*ret))) == NULL) {
23*1dcdf01fSchristos         COMPerr(COMP_F_COMP_CTX_NEW, ERR_R_MALLOC_FAILURE);
24*1dcdf01fSchristos         return NULL;
2560662d10Schristos     }
2660662d10Schristos     ret->meth = meth;
2760662d10Schristos     if ((ret->meth->init != NULL) && !ret->meth->init(ret)) {
2860662d10Schristos         OPENSSL_free(ret);
2960662d10Schristos         ret = NULL;
3060662d10Schristos     }
31*1dcdf01fSchristos     return ret;
32*1dcdf01fSchristos }
33*1dcdf01fSchristos 
COMP_CTX_get_method(const COMP_CTX * ctx)34*1dcdf01fSchristos const COMP_METHOD *COMP_CTX_get_method(const COMP_CTX *ctx)
35*1dcdf01fSchristos {
36*1dcdf01fSchristos     return ctx->meth;
37*1dcdf01fSchristos }
38*1dcdf01fSchristos 
COMP_get_type(const COMP_METHOD * meth)39*1dcdf01fSchristos int COMP_get_type(const COMP_METHOD *meth)
40*1dcdf01fSchristos {
41*1dcdf01fSchristos     return meth->type;
42*1dcdf01fSchristos }
43*1dcdf01fSchristos 
COMP_get_name(const COMP_METHOD * meth)44*1dcdf01fSchristos const char *COMP_get_name(const COMP_METHOD *meth)
45*1dcdf01fSchristos {
46*1dcdf01fSchristos     return meth->name;
4760662d10Schristos }
4860662d10Schristos 
COMP_CTX_free(COMP_CTX * ctx)4960662d10Schristos void COMP_CTX_free(COMP_CTX *ctx)
5060662d10Schristos {
5160662d10Schristos     if (ctx == NULL)
5260662d10Schristos         return;
5360662d10Schristos     if (ctx->meth->finish != NULL)
5460662d10Schristos         ctx->meth->finish(ctx);
5560662d10Schristos 
5660662d10Schristos     OPENSSL_free(ctx);
5760662d10Schristos }
5860662d10Schristos 
COMP_compress_block(COMP_CTX * ctx,unsigned char * out,int olen,unsigned char * in,int ilen)5960662d10Schristos int COMP_compress_block(COMP_CTX *ctx, unsigned char *out, int olen,
6060662d10Schristos                         unsigned char *in, int ilen)
6160662d10Schristos {
6260662d10Schristos     int ret;
6360662d10Schristos     if (ctx->meth->compress == NULL) {
64*1dcdf01fSchristos         return -1;
6560662d10Schristos     }
6660662d10Schristos     ret = ctx->meth->compress(ctx, out, olen, in, ilen);
6760662d10Schristos     if (ret > 0) {
6860662d10Schristos         ctx->compress_in += ilen;
6960662d10Schristos         ctx->compress_out += ret;
7060662d10Schristos     }
71*1dcdf01fSchristos     return ret;
7260662d10Schristos }
7360662d10Schristos 
COMP_expand_block(COMP_CTX * ctx,unsigned char * out,int olen,unsigned char * in,int ilen)7460662d10Schristos int COMP_expand_block(COMP_CTX *ctx, unsigned char *out, int olen,
7560662d10Schristos                       unsigned char *in, int ilen)
7660662d10Schristos {
7760662d10Schristos     int ret;
7860662d10Schristos 
7960662d10Schristos     if (ctx->meth->expand == NULL) {
80*1dcdf01fSchristos         return -1;
8160662d10Schristos     }
8260662d10Schristos     ret = ctx->meth->expand(ctx, out, olen, in, ilen);
8360662d10Schristos     if (ret > 0) {
8460662d10Schristos         ctx->expand_in += ilen;
8560662d10Schristos         ctx->expand_out += ret;
8660662d10Schristos     }
87*1dcdf01fSchristos     return ret;
88*1dcdf01fSchristos }
89*1dcdf01fSchristos 
COMP_CTX_get_type(const COMP_CTX * comp)90*1dcdf01fSchristos int COMP_CTX_get_type(const COMP_CTX* comp)
91*1dcdf01fSchristos {
92*1dcdf01fSchristos     return comp->meth ? comp->meth->type : NID_undef;
9360662d10Schristos }
94