3 * @brief ecc library based on big number
5 * - Copyright : Samsung Electronics CO.LTD.,
8 * Author : Jiyoung Moon
9 * Dept : DRM Lab, Digital Media Laboratory
10 * Creation date : 2006/05/03
11 * Note : optimized by Jiyoung Moon & Jisoon Park, August,2006.
18 ////////////////////////////////////////////////////////////////////////////
19 // Include Header Files
20 ////////////////////////////////////////////////////////////////////////////
21 #include "CryptoCore.h"
22 #include "cc_bignum.h"
25 ////////////////////////////////////////////////////////////////////////////
27 ////////////////////////////////////////////////////////////////////////////
28 #define SDRM_MAX_DIMENSION_ECC 256
29 #define SDRM_SIZE_OF_ECC_KEY (SDRM_SIZE_OF_DWORD * SDRM_ECC_BN_BUFSIZE)
31 ////////////////////////////////////////////////////////////////////////////
33 ////////////////////////////////////////////////////////////////////////////
34 #define SDRM_EC_FREE(X) if (X) {free(X);}
36 #define SDRM_EC_SET_ZERO(A) do { \
37 memset((A), 0, sizeof(SDRM_EC_POINT) + SDRM_ECC_ALLOC_SIZE * 5); \
38 (A)->IsInfinity = 0; \
39 A->x = SDRM_BN_Alloc((cc_u8*)A + sizeof(SDRM_EC_POINT), SDRM_ECC_BN_BUFSIZE); \
40 A->y = SDRM_BN_Alloc((cc_u8*)A->x + SDRM_ECC_ALLOC_SIZE, SDRM_ECC_BN_BUFSIZE); \
41 A->z = SDRM_BN_Alloc((cc_u8*)A->y + SDRM_ECC_ALLOC_SIZE, SDRM_ECC_BN_BUFSIZE); \
42 A->z2 = SDRM_BN_Alloc((cc_u8*)A->z + SDRM_ECC_ALLOC_SIZE, SDRM_ECC_BN_BUFSIZE); \
43 A->z3 = SDRM_BN_Alloc((cc_u8*)A->z2 + SDRM_ECC_ALLOC_SIZE, SDRM_ECC_BN_BUFSIZE); \
46 #define SDRM_EC_CLR(A) SDRM_EC_SET_ZERO(A)
48 #define SDRM_ECC_Clr(A) do { \
49 SDRM_BN_Clr((A)->ECC_p); \
50 SDRM_BN_Clr((A)->ECC_A); \
51 SDRM_BN_Clr((A)->ECC_b); \
52 SDRM_BN_Clr((A)->ECC_n); \
53 SDRM_BN_Clr((A)->PRIV_KEY); \
55 EC_Clr((A)->PUBLIC_KEY); \
58 #define SDRM_ECC_FREE(X) do { \
60 SDRM_BN_FREE(X->ECC_a); \
61 SDRM_EC_FREE(X->ECC_G); \
62 SDRM_EC_FREE(X->PUBLIC_KEY); \
67 #define SDRM_EC_COPY(A, B) do { \
68 (A)->IsInfinity = (B)->IsInfinity; \
69 SDRM_BN_Copy((A)->x, (B)->x); \
70 SDRM_BN_Copy((A)->y, (B)->y); \
71 SDRM_BN_Copy((A)->z, (B)->z); \
72 SDRM_BN_Copy((A)->z2, (B)->z2); \
73 SDRM_BN_Copy((A)->z3, (B)->z3); \
77 ////////////////////////////////////////////////////////////////////////////
78 // Function Prototypes
79 ////////////////////////////////////////////////////////////////////////////
88 * @brief return SDRM_EC_POINT structure
90 * @return address of allocate structure
91 * \n NULL if memory allocation is failed
93 SDRM_EC_POINT *SDRM_ECC_Init(void);
97 * @brief return SDRM_ECC_CTX structure
99 * @return address of allocate structure
100 * \n NULL if memory allocation is failed
102 SDRM_ECC_CTX *SDRM_CURVE_Init(void);
104 ///// ECC Point ¿¬»êÇÔ¼ö
106 * @fn SDRM_CTX_EC_Chain
109 * signed window method : size of window = 4
110 * chain for addition/subtraction of k Using sliding window method
111 * @param chain [out]destination
112 * @param L_Src [in]byte-length of chain
113 * @param Len_Src [in]number of doubling in chain
114 * @param k [in]source
115 * @param window_size [in]size of window
117 * @return CRYPTO_SUCCESS if no error is occured
118 * \n CRYPTO_INVALID_ARGUMENT if given value is incorrect
120 int SDRM_CTX_EC_Chain(signed char *chain, cc_u32 *L_Src, cc_u32 *Len_Src, SDRM_BIG_NUM *k, int window_size);
124 * @brief get EC_Dst = kP by Montgomery Method
126 * @param ctx [in]ecc context
127 * @param EC_Dst [out]destination
128 * @param EC_Src [in]first element(P)
129 * @param k [in]second element(k)
131 * @return CRYPTO_SUCCESS if no error is occured
132 * \n CRYPTO_INVALID_ARGUMENT if the arguemnt represents a minus value
133 * \n CRYPTO_MEMORY_ALLOC_FAIL if memory allocation is failed
134 * \n CRYPTO_INFINITY_INPUT if the argument is a infinity value
136 int SDRM_CTX_EC_kP(SDRM_ECC_CTX *ctx, SDRM_EC_POINT* EC_Dst, SDRM_EC_POINT *EC_Src, SDRM_BIG_NUM *k);
139 * @fn SDRM_CTX_EC_2kP
140 * @brief get EC_Dst = k1*C1 + k2*C2
142 * @param ctx [in]ecc context
143 * @param EC_Dst [out]destination
144 * @param k1 [in]first element(k1)
145 * @param EC_Src1 [in]second element(C1)
146 * @param k2 [in]third element(k2)
147 * @param EC_Src2 [in]fourth element(C2)
149 * @return CRYPTO_SUCCESS if no error is occured
150 * \n CRYPTO_INVALID_ARGUMENT if the arguemnt represents a minus value
151 * \n CRYPTO_MEMORY_ALLOC_FAIL if memory allocation is failed
152 * \n CRYPTO_INFINITY_INPUT if the argument is a infinity value
154 int SDRM_CTX_EC_2kP(SDRM_ECC_CTX *ctx, SDRM_EC_POINT *EC_Dst, SDRM_BIG_NUM *k1, SDRM_EC_POINT *EC_Src1, SDRM_BIG_NUM *k2, SDRM_EC_POINT *EC_Src2);
156 ///// Functions of Converting Coordingate
158 * @fn SDRM_Mont_Jm2Jc
160 * Modified Jacobian => Chundnovsky Jacobian
162 * (A->z2) <= (A->z)^2
163 * (A->z3) <= (A->z)^3
165 * @param EC_Dst [out]destination
166 * @param new_a [in]first element
167 * @param new_b [in]second element
168 * @param Mont [in]montgomery context
170 * @return CRYPTO_SUCCESS if no error is occured
171 * \n CRYPTO_ERROR if evaluation is failed
173 int SDRM_Mont_Jm2Jc(SDRM_EC_POINT *EC_Dst, SDRM_BIG_NUM *new_a, SDRM_BIG_NUM *new_b, SDRM_BIG_MONT *Mont);
176 * @fn SDRM_Mont_Jc2Jm
178 * Chundnovsky Jacobian => Modified Jacobian
180 * (A->z2) <= new_a*(A->z)^4
181 * @param A [out]destination
182 * @param new_a [in]first element
183 * @param new_b [in]second element
184 * @param Mont [in]montgomery context
186 * @return CRYPTO_SUCCESS if no error is occured
187 * \n CRYPTO_ERROR if evaluation is failed
189 int SDRM_Mont_Jc2Jm(SDRM_EC_POINT *A, SDRM_BIG_NUM *new_a, SDRM_BIG_NUM *new_b, SDRM_BIG_MONT *Mont);
192 * @fn SDRM_CTX_EC_Add_Jc
193 * @brief Chundnovsky Jacobian coordinate
194 * using montgomery (A = B + C)
196 * @param EC_Dst [out]destination(A)
197 * @param EC_Src1 [in]first element(B)
198 * @param EC_Src2 [in]second element(C)
199 * @param new_a [in]ECC_A's montgomery value
200 * @param new_b [in]ECC_B's montgomery value
201 * @param Mont [in]montgomery context
203 * @return CRYPTO_SUCCESS if no error is occured
204 * \n CRYPTO_ERROR if evaluation is failed
205 * \n CRYPTO_MEMORY_ALLOC_FAIL if memory allocation is failed
207 int SDRM_CTX_EC_Add_Jc(SDRM_EC_POINT* EC_Dst, SDRM_EC_POINT *EC_Src1, SDRM_EC_POINT *EC_Src2, SDRM_BIG_NUM *new_a, SDRM_BIG_NUM *new_b, SDRM_BIG_MONT *Mont);
210 * @fn SDRM_CTX_EC_Double_Jc
211 * @brief Chundnovsky Jacobian coordinate
212 * montgomery (A = 2B)
214 * @param EC_Dst [out]destination(A)
215 * @param EC_Src1 [in]first element(B)
216 * @param new_a [in]ECC_A's montgomery value
217 * @param new_b [in]ECC_B's montgomery value
218 * @param Mont [in]montgomery context
220 * @return CRYPTO_SUCCESS if no error is occured
221 * \n CRYPTO_ERROR if evaluation is failed
222 * \n CRYPTO_MEMORY_ALLOC_FAIL if memory allocation is failed
224 int SDRM_CTX_EC_Double_Jc(SDRM_EC_POINT *EC_Dst, SDRM_EC_POINT *EC_Src1, SDRM_BIG_NUM *new_a, SDRM_BIG_NUM *new_b, SDRM_BIG_MONT *Mont);
227 * @fn SDRM_CTX_EC_Double_Jm
228 * @brief Modified Jacobian coordinate
229 * montgomery (A = 2B)
231 * @param EC_Dst [out]destination(A)
232 * @param EC_Src1 [in]first element(B)
233 * @param new_a [in]ECC_A's montgomery value
234 * @param new_b [in]ECC_B's montgomery value
235 * @param Mont [in]montgomery context
237 * @return CRYPTO_SUCCESS if no error is occured
238 * \n CRYPTO_ERROR if evaluation is failed
239 * \n CRYPTO_MEMORY_ALLOC_FAIL if memory allocation is failed
241 int SDRM_CTX_EC_Double_Jm(SDRM_EC_POINT *EC_Dst, SDRM_EC_POINT *EC_Src1, SDRM_BIG_NUM *new_a, SDRM_BIG_NUM *new_b, SDRM_BIG_MONT *Mont);
249 /***************************** End of File *****************************/