3 * @brief implementation of EC Diffie-Hellman Key Exchange Protocol
5 * - Copyright : Samsung Electronics CO.LTD.,
9 * Dept : DRM Lab, Digital Media Laboratory
10 * Creation date : 2006/11/27
13 ////////////////////////////////////////////////////////////////////////////
14 // Include Header Files
15 ////////////////////////////////////////////////////////////////////////////
17 #include "cc_ANSI_x931.h"
20 ////////////////////////////////////////////////////////////////////////////
22 ////////////////////////////////////////////////////////////////////////////
24 * @fn SDRM_generateDH1stPhaseKey
25 * @brief generate Xk and its Xv
27 * @param crt [in]crypto context
28 * @param pchXk [out]Generated Random Number
29 * @param pchXv [out]DH 1st phase value
31 * @return CRYPTO_SUCCESS if no error is occured
33 int SDRM_generateDH1stPhaseKey(CryptoCoreContainer *crt, cc_u8 *pchXk, cc_u8 *pchXv)
35 cc_u8 Si_ANSI_X9_31[SDRM_X931_SEED_SIZ];
37 SDRM_BIG_NUM *BN_Xk, *BN_Temp;
42 if ((crt == NULL) || (crt->ctx == NULL) || (crt->ctx->ecdhctx == NULL) || (pchXk == NULL) || (pchXv == NULL))
44 return CRYPTO_NULL_POINTER;
47 ctx = crt->ctx->ecdhctx;
49 for (i = 0; i < SDRM_X931_SEED_SIZ; i++)
51 Si_ANSI_X9_31[i] = ((rand() << 16) + rand()) & 0xff;
55 BN_Temp = SDRM_BN_Init(crt->ctx->ecdsactx->uDimension >> 3);
58 return CRYPTO_MEMORY_ALLOC_FAIL;
61 BN_Xk = SDRM_BN_Init(crt->ctx->ecdsactx->uDimension >> 3);
65 return CRYPTO_MEMORY_ALLOC_FAIL;
68 SDRM_BN_Sub(BN_Temp, ctx->ECC_n, BN_One);
70 SDRM_RNG_X931(Si_ANSI_X9_31, crt->ctx->ecdsactx->uDimension, pchXk);
71 SDRM_OS2BN(pchXk, crt->ctx->ecdsactx->uDimension >> 3, BN_Xk);
73 while ((SDRM_BN_Cmp(BN_Xk, BN_One) < 0) || (SDRM_BN_Cmp(BN_Xk, BN_Temp) > 0));
81 return CRYPTO_MEMORY_ALLOC_FAIL;
84 if (SDRM_CTX_EC_kP(ctx, kP, ctx->ECC_G, BN_Xk) == CRYPTO_MEMORY_ALLOC_FAIL)
90 return CRYPTO_MEMORY_ALLOC_FAIL;
93 SDRM_BN2OS(kP->x, crt->ctx->ecdsactx->uDimension >> 3, pchXv);
94 SDRM_BN2OS(kP->y, crt->ctx->ecdsactx->uDimension >> 3, pchXv + (crt->ctx->ecdsactx->uDimension >> 3));
100 return CRYPTO_SUCCESS;
104 * @fn SDRM_generateDHKey
105 * @brief genenrate auth key with Xk and Yv
107 * @param crt [in]crypto context
108 * @param pchXk [in]Generated Random Number
109 * @param pchYv [in]DH 1st phase value
110 * @param pchKauth [out]authentication key
112 * @return CRYPTO_SUCCESS if no error is occured
114 int SDRM_generateDHKey(CryptoCoreContainer *crt, cc_u8* pchXk, cc_u8* pchYv, cc_u8* pchKauth)
117 SDRM_EC_POINT *kP, *EC_Yv;
121 if ((crt == NULL) || (crt->ctx == NULL) || (crt->ctx->ecdhctx == NULL) || (pchXk == NULL) || (pchYv == NULL) || (pchKauth == NULL))
123 return CRYPTO_NULL_POINTER;
126 ctx = crt->ctx->ecdhctx;
128 BN_Xk = SDRM_BN_Init(crt->ctx->ecdsactx->uDimension >> 3);
131 return CRYPTO_MEMORY_ALLOC_FAIL;
134 retVal = SDRM_OS2BN(pchXk, crt->ctx->ecdsactx->uDimension >> 3, BN_Xk);
135 if (retVal != CRYPTO_SUCCESS)
141 kP = SDRM_ECC_Init();
145 return CRYPTO_MEMORY_ALLOC_FAIL;
148 EC_Yv = SDRM_ECC_Init();
154 return CRYPTO_MEMORY_ALLOC_FAIL;
158 retVal = SDRM_OS2BN(pchYv, crt->ctx->ecdsactx->uDimension >> 3, EC_Yv->x);
159 if (retVal != CRYPTO_SUCCESS)
165 return CRYPTO_MEMORY_ALLOC_FAIL;
168 retVal = SDRM_OS2BN(pchYv + (crt->ctx->ecdsactx->uDimension >> 3), crt->ctx->ecdsactx->uDimension >> 3, EC_Yv->y);
169 if (retVal != CRYPTO_SUCCESS)
175 return CRYPTO_MEMORY_ALLOC_FAIL;
178 if (SDRM_CTX_EC_kP(ctx, kP, EC_Yv, BN_Xk) == CRYPTO_MEMORY_ALLOC_FAIL)
184 return CRYPTO_MEMORY_ALLOC_FAIL;
187 retVal = SDRM_BN2OS(kP->x, crt->ctx->ecdsactx->uDimension >> 3, pchKauth);
188 if (retVal != CRYPTO_SUCCESS)
201 return CRYPTO_SUCCESS;
204 /***************************** End of File *****************************/