Upgrade to 4.4.50-rt62
[kvmfornfv.git] / kernel / drivers / crypto / ccp / ccp-crypto-aes-cmac.c
index d89f20c..60fc0fa 100644 (file)
@@ -220,6 +220,42 @@ static int ccp_aes_cmac_digest(struct ahash_request *req)
        return ccp_aes_cmac_finup(req);
 }
 
+static int ccp_aes_cmac_export(struct ahash_request *req, void *out)
+{
+       struct ccp_aes_cmac_req_ctx *rctx = ahash_request_ctx(req);
+       struct ccp_aes_cmac_exp_ctx state;
+
+       /* Don't let anything leak to 'out' */
+       memset(&state, 0, sizeof(state));
+
+       state.null_msg = rctx->null_msg;
+       memcpy(state.iv, rctx->iv, sizeof(state.iv));
+       state.buf_count = rctx->buf_count;
+       memcpy(state.buf, rctx->buf, sizeof(state.buf));
+
+       /* 'out' may not be aligned so memcpy from local variable */
+       memcpy(out, &state, sizeof(state));
+
+       return 0;
+}
+
+static int ccp_aes_cmac_import(struct ahash_request *req, const void *in)
+{
+       struct ccp_aes_cmac_req_ctx *rctx = ahash_request_ctx(req);
+       struct ccp_aes_cmac_exp_ctx state;
+
+       /* 'in' may not be aligned so memcpy to local variable */
+       memcpy(&state, in, sizeof(state));
+
+       memset(rctx, 0, sizeof(*rctx));
+       rctx->null_msg = state.null_msg;
+       memcpy(rctx->iv, state.iv, sizeof(rctx->iv));
+       rctx->buf_count = state.buf_count;
+       memcpy(rctx->buf, state.buf, sizeof(rctx->buf));
+
+       return 0;
+}
+
 static int ccp_aes_cmac_setkey(struct crypto_ahash *tfm, const u8 *key,
                               unsigned int key_len)
 {
@@ -352,10 +388,13 @@ int ccp_register_aes_cmac_algs(struct list_head *head)
        alg->final = ccp_aes_cmac_final;
        alg->finup = ccp_aes_cmac_finup;
        alg->digest = ccp_aes_cmac_digest;
+       alg->export = ccp_aes_cmac_export;
+       alg->import = ccp_aes_cmac_import;
        alg->setkey = ccp_aes_cmac_setkey;
 
        halg = &alg->halg;
        halg->digestsize = AES_BLOCK_SIZE;
+       halg->statesize = sizeof(struct ccp_aes_cmac_exp_ctx);
 
        base = &halg->base;
        snprintf(base->cra_name, CRYPTO_MAX_ALG_NAME, "cmac(aes)");