Files
2026-07-30 11:19:44 +05:30

404 lines
12 KiB
C

/****************************************************************************
* sec2_sctrMap.c - scatter buffer pointer marker
****************************************************************************
* Copyright (c) 2004-2005 Freescale Semiconductor
* All Rights Reserved. Proprietary and Confidential.
*
* NOTICE: The information contained in this file is proprietary
* to Freescale Semiconductor, and is being made available to
* Freescale's customers under strict license agreements.
* Use or disclosure of this information is permissible only
* under the terms of the existing license agreement.
***************************************************************************/
/*
* 1.2 Jan 27,2005 sec - change some obsolete names
*/
#include "Sec2Driver.h"
typedef struct _scatter_assoc
{
unsigned long offset;
unsigned long pos;
} SCATTER_ASSOC;
static const SCATTER_ASSOC SCTMAP_RNG[] =
{
{offsetof(RNG_REQ, rngData), 0x10},
{0, 0}
};
static const SCATTER_ASSOC SCTMAP_DES_CBC_CTX[] =
{
{offsetof(DES_CBC_CRYPT_REQ, inIvData), 0x02},
{offsetof(DES_CBC_CRYPT_REQ, keyData), 0x04},
{offsetof(DES_CBC_CRYPT_REQ, inData), 0x08},
{offsetof(DES_CBC_CRYPT_REQ, outData), 0x10},
{offsetof(DES_CBC_CRYPT_REQ, outIvData), 0x20},
{0, 0}
};
static const SCATTER_ASSOC SCTMAP_DES_ECB[] =
{
{offsetof(DES_CRYPT_REQ, keyData), 0x04},
{offsetof(DES_CRYPT_REQ, inData), 0x08},
{offsetof(DES_CRYPT_REQ, outData), 0x10},
{0, 0}
};
static const SCATTER_ASSOC SCTMAP_RC4_LDCTX_CRYPT_ULCTX[] =
{
{offsetof(ARC4_LOADCTX_CRYPT_REQ, inCtxData), 0x02},
{offsetof(ARC4_LOADCTX_CRYPT_REQ, inData), 0x08},
{offsetof(ARC4_LOADCTX_CRYPT_REQ, outData), 0x10},
{offsetof(ARC4_LOADCTX_CRYPT_REQ, outCtxData), 0x20},
{0, 0}
};
static const SCATTER_ASSOC SCTMAP_RC4_LDKEY_CRYPT_ULCTX[] =
{
{offsetof(ARC4_LOADKEY_CRYPT_UNLOADCTX_REQ, keyData), 0x04},
{offsetof(ARC4_LOADKEY_CRYPT_UNLOADCTX_REQ, inData), 0x08},
{offsetof(ARC4_LOADKEY_CRYPT_UNLOADCTX_REQ, outData), 0x10},
{offsetof(ARC4_LOADKEY_CRYPT_UNLOADCTX_REQ, outCtxData), 0x20},
{0, 0}
};
static const SCATTER_ASSOC SCTMAP_HASH_LDCTX_HASH_ULCTX[] =
{
{offsetof(HASH_REQ, ctxData), 0x02},
{offsetof(HASH_REQ, inData), 0x08},
{offsetof(HASH_REQ, outData), 0x20},
{0, 0}
};
static const SCATTER_ASSOC SCTMAP_HASH_LDCTX_HASH_PAD_ULCTX[] =
{
{offsetof(HASH_REQ, ctxData), 0x02},
{offsetof(HASH_REQ, inData), 0x08},
{offsetof(HASH_REQ, outData), 0x20},
{0, 0}
};
static const SCATTER_ASSOC SCTMAP_HASH_LDCTX_HMAC_ULCTX[] =
{
{offsetof(HMAC_PAD_REQ, keyData), 0x04},
{offsetof(HMAC_PAD_REQ, inData), 0x08},
{offsetof(HMAC_PAD_REQ, outData), 0x20},
{0, 0}
};
static const SCATTER_ASSOC SCTMAP_MM_LDCTX_EXP_ULCTX[] =
{
{offsetof(MOD_EXP_REQ, aData), 0x02},
{offsetof(MOD_EXP_REQ, expData), 0x04},
{offsetof(MOD_EXP_REQ, modData), 0x08},
{offsetof(MOD_EXP_REQ, outData), 0x10},
{0, 0}
};
static const SCATTER_ASSOC SCTMAP_MM_SS_RSA_EXP[] =
{
{offsetof(MOD_SS_EXP_REQ, modData), 0x01},
{offsetof(MOD_SS_EXP_REQ, aData), 0x04},
{offsetof(MOD_SS_EXP_REQ, expData), 0x08},
{offsetof(MOD_SS_EXP_REQ, bData), 0x10},
{0, 0}
};
static const SCATTER_ASSOC SCTMAP_MM_LDCTX_R2MODN_ULCTX[] =
{
{offsetof(MOD_R2MODN_REQ, modData), 0x08},
{offsetof(MOD_R2MODN_REQ, outData), 0x10},
{0, 0}
};
static const SCATTER_ASSOC SCTMAP_MM_LDCTX_RRMODP_ULCTX[] =
{
{offsetof(MOD_RRMODP_REQ, pData), 0x01},
{offsetof(MOD_RRMODP_REQ, nBytes), 0x08},
{offsetof(MOD_RRMODP_REQ, outData), 0x10},
{0, 0}
};
static const SCATTER_ASSOC SCTMAP_MOD_LDCTX_2OP_ULCTX[] =
{
{offsetof(MOD_2OP_REQ, modData), 0x01},
{offsetof(MOD_2OP_REQ, bData), 0x02},
{offsetof(MOD_2OP_REQ, aData), 0x04},
{offsetof(MOD_2OP_REQ, outData), 0x10},
{0, 0}
};
static const SCATTER_ASSOC SCTMAP_EC_LDCTX_kP_ULCTX[] =
{
{offsetof(ECC_POINT_REQ, nData), 0x01},
{offsetof(ECC_POINT_REQ, eData), 0x02},
{offsetof(ECC_POINT_REQ, buildData), 0x04},
{offsetof(ECC_POINT_REQ, b1Data), 0x08},
{offsetof(ECC_POINT_REQ, b2Data), 0x10},
{offsetof(ECC_POINT_REQ, b3Data), 0x20},
{0, 0}
};
static const SCATTER_ASSOC SCTMAP_EC_SPKBUILD_ULCTX[] =
{
{offsetof(ECC_SPKBUILD_REQ, a0Data), 0x01},
{offsetof(ECC_SPKBUILD_REQ, a1Data), 0x02},
{offsetof(ECC_SPKBUILD_REQ, a2Data), 0x04},
{offsetof(ECC_SPKBUILD_REQ, a3Data), 0x08},
{offsetof(ECC_SPKBUILD_REQ, b0Data), 0x10},
{offsetof(ECC_SPKBUILD_REQ, b1Data), 0x20},
{offsetof(ECC_SPKBUILD_REQ, buildData), 0x40},
{0, 0}
};
static const SCATTER_ASSOC SCTMAP_EC_2OP[] =
{
{offsetof(ECC_2OP_REQ, bData), 0x01},
{offsetof(ECC_2OP_REQ, aData), 0x02},
{offsetof(ECC_2OP_REQ, modData), 0x04},
{offsetof(ECC_2OP_REQ, outData), 0x08},
{0, 0}
};
static const SCATTER_ASSOC SCTMAP_IPSEC_CBC[] =
{
{offsetof(IPSEC_CBC_REQ, hashKeyData), 0x01},
{offsetof(IPSEC_CBC_REQ, hashInData), 0x02},
{offsetof(IPSEC_CBC_REQ, cryptKeyData), 0x04},
{offsetof(IPSEC_CBC_REQ, cryptCtxInData), 0x08},
{offsetof(IPSEC_CBC_REQ, inData), 0x10},
{offsetof(IPSEC_CBC_REQ, cryptDataOut), 0x20},
{offsetof(IPSEC_CBC_REQ, hashDataOut), 0x40},
{0, 0}
};
static const SCATTER_ASSOC SCTMAP_IPSEC_ESP[] =
{
{offsetof(IPSEC_ESP_REQ, hashKeyData), 0x01},
{offsetof(IPSEC_ESP_REQ, hashInData), 0x02},
{offsetof(IPSEC_ESP_REQ, cryptCtxInData), 0x04},
{offsetof(IPSEC_ESP_REQ, cryptKeyData), 0x08},
{offsetof(IPSEC_ESP_REQ, inData), 0x10},
{offsetof(IPSEC_ESP_REQ, cryptDataOut), 0x20},
{offsetof(IPSEC_ESP_REQ, cryptCtxOutData), 0x40},
{0, 0}
};
static const SCATTER_ASSOC SCTMAP_IPSEC_STATIC_CBC[] =
{
{offsetof(IPSEC_CBC_REQ, hashKeyData), 0x01},
{offsetof(IPSEC_CBC_REQ, hashInData), 0x02},
{offsetof(IPSEC_CBC_REQ, cryptKeyData), 0x04},
{offsetof(IPSEC_CBC_REQ, cryptCtxInData), 0x08},
{offsetof(IPSEC_CBC_REQ, inData), 0x10},
{offsetof(IPSEC_CBC_REQ, cryptDataOut), 0x20},
{offsetof(IPSEC_CBC_REQ, hashDataOut), 0x40},
{0, 0}
};
static const SCATTER_ASSOC SCTMAP_IPSEC_ECB[] =
{
{offsetof(IPSEC_ECB_REQ, hashKeyData), 0x02},
{offsetof(IPSEC_ECB_REQ, cryptKeyData), 0x04},
{offsetof(IPSEC_ECB_REQ, hashInData), 0x08},
{offsetof(IPSEC_ECB_REQ, inData), 0x10},
{offsetof(IPSEC_ECB_REQ, cryptDataOut), 0x20},
{0, 0}
};
static const SCATTER_ASSOC SCTMAP_IPSEC_AES_CBC[] =
{
{offsetof(IPSEC_AES_CBC_REQ, hashKeyData), 0x01},
{offsetof(IPSEC_AES_CBC_REQ, hashInData), 0x02},
{offsetof(IPSEC_AES_CBC_REQ, cryptKeyData), 0x04},
{offsetof(IPSEC_AES_CBC_REQ, cryptCtxInData), 0x08},
{offsetof(IPSEC_AES_CBC_REQ, inData), 0x10},
{offsetof(IPSEC_AES_CBC_REQ, cryptDataOut), 0x20},
{offsetof(IPSEC_AES_CBC_REQ, hashDataOut), 0x40},
{0, 0}
};
static const SCATTER_ASSOC SCTMAP_IPSEC_AES_ECB[] =
{
{offsetof(IPSEC_AES_ECB_REQ, hashKeyData), 0x01},
{offsetof(IPSEC_AES_ECB_REQ, hashInData), 0x02},
{offsetof(IPSEC_AES_ECB_REQ, cryptKeyData), 0x04},
{offsetof(IPSEC_AES_ECB_REQ, inData), 0x10},
{offsetof(IPSEC_AES_ECB_REQ, cryptDataOut), 0x20},
{offsetof(IPSEC_AES_ECB_REQ, hashDataOut), 0x40},
{0, 0}
};
static const SCATTER_ASSOC SCTMAP_AESA_CRYPT[] =
{
{offsetof(AESA_CRYPT_REQ, inIvData), 0x02},
{offsetof(AESA_CRYPT_REQ, keyData), 0x04},
{offsetof(AESA_CRYPT_REQ, inData), 0x08},
{offsetof(AESA_CRYPT_REQ, outData), 0x10},
{offsetof(AESA_CRYPT_REQ, outCtxData), 0x20},
{0, 0}
};
static const SCATTER_ASSOC SCTMAP_CCMP[] =
{
{offsetof(CCMP_REQ, context), 0x02},
{offsetof(CCMP_REQ, keyData), 0x04},
{offsetof(CCMP_REQ, AADData), 0x08},
{offsetof(CCMP_REQ, FrameData), 0x10},
{offsetof(CCMP_REQ, cryptDataOut), 0x20},
{offsetof(CCMP_REQ, MICData), 0x40},
{0, 0}
};
static const SCATTER_ASSOC SCTMAP_SRTP[] =
{
{offsetof(SRTP_REQ, hashKeyData), 0x01},
{offsetof(SRTP_REQ, ivData), 0x02},
{offsetof(SRTP_REQ, keyData), 0x04},
{offsetof(SRTP_REQ, inData), 0x08},
{offsetof(SRTP_REQ, cryptDataOut), 0x10},
{offsetof(SRTP_REQ, digestData), 0x20},
{offsetof(SRTP_REQ, outIvData), 0x40},
{0, 0}
};
static unsigned char locate(SCATTER_ASSOC *assoc,
unsigned long offset)
{
int i = 0;
while(assoc[i].offset)
if (assoc[i].offset == offset)
return(assoc[i].pos);
else
i++;
return(0);
}
/* Locate a pointer field within a request struct, look it up, and mark the */
/* scatter buffer mask if it is such */
int MarkScatterBuffer(void *request, void *buffer)
{
GENERIC_REQ *rq;
unsigned long offs;
rq = (GENERIC_REQ *)request;
offs = (unsigned long)buffer - (unsigned long)request;
switch (rq->opId & DESC_TYPE_MASK)
{
case DPD_RNG_GROUP:
rq->scatterBufs |= locate((SCATTER_ASSOC *)SCTMAP_RNG, offs);
break;
case DPD_DES_CBC_GROUP:
rq->scatterBufs |= locate((SCATTER_ASSOC *)SCTMAP_DES_CBC_CTX, offs);
break;
case DPD_DES_ECB_GROUP:
rq->scatterBufs |= locate((SCATTER_ASSOC *)SCTMAP_DES_ECB, offs);
break;
case DPD_RC4_LDCTX_CRYPT_ULCTX_GROUP:
rq->scatterBufs |= locate((SCATTER_ASSOC *)SCTMAP_RC4_LDCTX_CRYPT_ULCTX, offs);
break;
case DPD_RC4_LDKEY_CRYPT_ULCTX_GROUP:
rq->scatterBufs |= locate((SCATTER_ASSOC *)SCTMAP_RC4_LDKEY_CRYPT_ULCTX, offs);
break;
case DPD_HASH_LDCTX_HASH_ULCTX_GROUP:
rq->scatterBufs |= locate((SCATTER_ASSOC *)SCTMAP_HASH_LDCTX_HASH_ULCTX, offs);
break;
case DPD_HASH_LDCTX_HASH_PAD_ULCTX_GROUP:
rq->scatterBufs |= locate((SCATTER_ASSOC *)SCTMAP_HASH_LDCTX_HASH_PAD_ULCTX, offs);
break;
case DPD_HASH_LDCTX_HMAC_ULCTX_GROUP:
rq->scatterBufs |= locate((SCATTER_ASSOC *)SCTMAP_HASH_LDCTX_HMAC_ULCTX, offs);
break;
case DPD_MM_LDCTX_EXP_ULCTX_GROUP:
rq->scatterBufs |= locate((SCATTER_ASSOC *)SCTMAP_MM_LDCTX_EXP_ULCTX, offs);
break;
case DPD_MM_SS_EXP_GROUP:
rq->scatterBufs |= locate((SCATTER_ASSOC *)SCTMAP_MM_SS_RSA_EXP, offs);
break;
case DPD_MM_LDCTX_R2MODN_ULCTX_GROUP:
rq->scatterBufs |= locate((SCATTER_ASSOC *)SCTMAP_MM_LDCTX_R2MODN_ULCTX, offs);
break;
case DPD_MM_LDCTX_RRMODP_ULCTX_GROUP:
rq->scatterBufs |= locate((SCATTER_ASSOC *)SCTMAP_MM_LDCTX_RRMODP_ULCTX, offs);
break;
case DPD_MOD_LDCTX_2OP_ULCTX_GROUP:
rq->scatterBufs |= locate((SCATTER_ASSOC *)SCTMAP_MOD_LDCTX_2OP_ULCTX, offs);
break;
case DPD_EC_LDCTX_kP_ULCTX_GROUP:
rq->scatterBufs |= locate((SCATTER_ASSOC *)SCTMAP_EC_LDCTX_kP_ULCTX, offs);
break;
case DPD_EC_2OP_GROUP:
rq->scatterBufs |= locate((SCATTER_ASSOC *)SCTMAP_EC_2OP, offs);
break;
case DPD_IPSEC_CBC_GROUP:
rq->scatterBufs |= locate((SCATTER_ASSOC *)SCTMAP_IPSEC_CBC, offs);
break;
case DPD_IPSEC_ECB_GROUP:
rq->scatterBufs |= locate((SCATTER_ASSOC *)SCTMAP_IPSEC_ECB, offs);
break;
case DPD_IPSEC_AES_CBC_GROUP:
rq->scatterBufs |= locate((SCATTER_ASSOC *)SCTMAP_IPSEC_AES_CBC, offs);
break;
case DPD_IPSEC_AES_ECB_GROUP:
rq->scatterBufs |= locate((SCATTER_ASSOC *)SCTMAP_IPSEC_AES_ECB, offs);
break;
case DPD_AESA_CRYPT_GROUP:
rq->scatterBufs |= locate((SCATTER_ASSOC *)SCTMAP_AESA_CRYPT, offs);
break;
case DPD_IPSEC_ESP_GROUP:
rq->scatterBufs |= locate((SCATTER_ASSOC *)SCTMAP_IPSEC_ESP, offs);
break;
case DPD_CCMP_GROUP:
rq->scatterBufs |= locate((SCATTER_ASSOC *)SCTMAP_CCMP, offs);
break;
case DPD_SRTP_GROUP:
rq->scatterBufs |= locate((SCATTER_ASSOC *)SCTMAP_SRTP, offs);
break;
}
return 0;
}