xref: /freebsd/crypto/openssl/crypto/dsa/dsa_lib.c (revision ad991e4c)
1e71b7053SJung-uk Kim /*
2ad991e4cSEd Maste  * Copyright 1995-2023 The OpenSSL Project Authors. All Rights Reserved.
374664626SKris Kennaway  *
4b077aed3SPierre Pronchery  * Licensed under the Apache License 2.0 (the "License").  You may not use
5e71b7053SJung-uk Kim  * this file except in compliance with the License.  You can obtain a copy
6e71b7053SJung-uk Kim  * in the file LICENSE in the source distribution or at
7e71b7053SJung-uk Kim  * https://www.openssl.org/source/license.html
874664626SKris Kennaway  */
974664626SKris Kennaway 
10b077aed3SPierre Pronchery /*
11b077aed3SPierre Pronchery  * DSA low level APIs are deprecated for public use, but still ok for
12b077aed3SPierre Pronchery  * internal use.
13b077aed3SPierre Pronchery  */
14b077aed3SPierre Pronchery #include "internal/deprecated.h"
15b077aed3SPierre Pronchery 
16b077aed3SPierre Pronchery #include <openssl/bn.h>
17b077aed3SPierre Pronchery #ifndef FIPS_MODULE
18b077aed3SPierre Pronchery # include <openssl/engine.h>
19b077aed3SPierre Pronchery #endif
20e71b7053SJung-uk Kim #include "internal/cryptlib.h"
21e71b7053SJung-uk Kim #include "internal/refcount.h"
22b077aed3SPierre Pronchery #include "crypto/dsa.h"
23b077aed3SPierre Pronchery #include "crypto/dh.h" /* required by DSA_dup_DH() */
2417f01e99SJung-uk Kim #include "dsa_local.h"
25f579bf8eSKris Kennaway 
26b077aed3SPierre Pronchery static DSA *dsa_new_intern(ENGINE *engine, OSSL_LIB_CTX *libctx);
27f579bf8eSKris Kennaway 
28b077aed3SPierre Pronchery #ifndef FIPS_MODULE
29f579bf8eSKris Kennaway 
DSA_set_ex_data(DSA * d,int idx,void * arg)30f579bf8eSKris Kennaway int DSA_set_ex_data(DSA *d, int idx, void *arg)
31f579bf8eSKris Kennaway {
32e71b7053SJung-uk Kim     return CRYPTO_set_ex_data(&d->ex_data, idx, arg);
33f579bf8eSKris Kennaway }
34f579bf8eSKris Kennaway 
DSA_get_ex_data(const DSA * d,int idx)35b077aed3SPierre Pronchery void *DSA_get_ex_data(const DSA *d, int idx)
36f579bf8eSKris Kennaway {
37e71b7053SJung-uk Kim     return CRYPTO_get_ex_data(&d->ex_data, idx);
38e71b7053SJung-uk Kim }
39e71b7053SJung-uk Kim 
405c87c606SMark Murray # ifndef OPENSSL_NO_DH
DSA_dup_DH(const DSA * r)415c87c606SMark Murray DH *DSA_dup_DH(const DSA *r)
4274664626SKris Kennaway {
436f9291ceSJung-uk Kim     /*
44b077aed3SPierre Pronchery      * DSA has p, q, g, optional pub_key, optional priv_key.
45b077aed3SPierre Pronchery      * DH has p, optional length, g, optional pub_key,
46b077aed3SPierre Pronchery      * optional priv_key, optional q.
4774664626SKris Kennaway      */
4874664626SKris Kennaway     DH *ret = NULL;
49b077aed3SPierre Pronchery     BIGNUM *pub_key = NULL, *priv_key = NULL;
5074664626SKris Kennaway 
5174664626SKris Kennaway     if (r == NULL)
5274664626SKris Kennaway         goto err;
5374664626SKris Kennaway     ret = DH_new();
5474664626SKris Kennaway     if (ret == NULL)
5574664626SKris Kennaway         goto err;
56b077aed3SPierre Pronchery 
57b077aed3SPierre Pronchery     if (!ossl_ffc_params_copy(ossl_dh_get0_params(ret), &r->params))
581f13597dSJung-uk Kim         goto err;
59e71b7053SJung-uk Kim 
60e71b7053SJung-uk Kim     if (r->pub_key != NULL) {
61e71b7053SJung-uk Kim         pub_key = BN_dup(r->pub_key);
62e71b7053SJung-uk Kim         if (pub_key == NULL)
6374664626SKris Kennaway             goto err;
64e71b7053SJung-uk Kim         if (r->priv_key != NULL) {
65e71b7053SJung-uk Kim             priv_key = BN_dup(r->priv_key);
66e71b7053SJung-uk Kim             if (priv_key == NULL)
6774664626SKris Kennaway                 goto err;
68e71b7053SJung-uk Kim         }
69e71b7053SJung-uk Kim         if (!DH_set0_key(ret, pub_key, priv_key))
70e71b7053SJung-uk Kim             goto err;
71e71b7053SJung-uk Kim     } else if (r->priv_key != NULL) {
72e71b7053SJung-uk Kim         /* Shouldn't happen */
73e71b7053SJung-uk Kim         goto err;
74e71b7053SJung-uk Kim     }
7574664626SKris Kennaway 
7674664626SKris Kennaway     return ret;
7774664626SKris Kennaway 
7874664626SKris Kennaway  err:
79e71b7053SJung-uk Kim     BN_free(pub_key);
80e71b7053SJung-uk Kim     BN_free(priv_key);
8174664626SKris Kennaway     DH_free(ret);
8274664626SKris Kennaway     return NULL;
8374664626SKris Kennaway }
84b077aed3SPierre Pronchery # endif /*  OPENSSL_NO_DH */
85e71b7053SJung-uk Kim 
DSA_clear_flags(DSA * d,int flags)86e71b7053SJung-uk Kim void DSA_clear_flags(DSA *d, int flags)
87e71b7053SJung-uk Kim {
88e71b7053SJung-uk Kim     d->flags &= ~flags;
89e71b7053SJung-uk Kim }
90e71b7053SJung-uk Kim 
DSA_test_flags(const DSA * d,int flags)91e71b7053SJung-uk Kim int DSA_test_flags(const DSA *d, int flags)
92e71b7053SJung-uk Kim {
93e71b7053SJung-uk Kim     return d->flags & flags;
94e71b7053SJung-uk Kim }
95e71b7053SJung-uk Kim 
DSA_set_flags(DSA * d,int flags)96e71b7053SJung-uk Kim void DSA_set_flags(DSA *d, int flags)
97e71b7053SJung-uk Kim {
98e71b7053SJung-uk Kim     d->flags |= flags;
99e71b7053SJung-uk Kim }
100e71b7053SJung-uk Kim 
DSA_get0_engine(DSA * d)101e71b7053SJung-uk Kim ENGINE *DSA_get0_engine(DSA *d)
102e71b7053SJung-uk Kim {
103e71b7053SJung-uk Kim     return d->engine;
104e71b7053SJung-uk Kim }
105e71b7053SJung-uk Kim 
DSA_set_method(DSA * dsa,const DSA_METHOD * meth)106b077aed3SPierre Pronchery int DSA_set_method(DSA *dsa, const DSA_METHOD *meth)
107b077aed3SPierre Pronchery {
108b077aed3SPierre Pronchery     /*
109b077aed3SPierre Pronchery      * NB: The caller is specifically setting a method, so it's not up to us
110b077aed3SPierre Pronchery      * to deal with which ENGINE it comes from.
111b077aed3SPierre Pronchery      */
112b077aed3SPierre Pronchery     const DSA_METHOD *mtmp;
113b077aed3SPierre Pronchery     mtmp = dsa->meth;
114b077aed3SPierre Pronchery     if (mtmp->finish)
115b077aed3SPierre Pronchery         mtmp->finish(dsa);
116b077aed3SPierre Pronchery #ifndef OPENSSL_NO_ENGINE
117b077aed3SPierre Pronchery     ENGINE_finish(dsa->engine);
118b077aed3SPierre Pronchery     dsa->engine = NULL;
119b077aed3SPierre Pronchery #endif
120b077aed3SPierre Pronchery     dsa->meth = meth;
121b077aed3SPierre Pronchery     if (meth->init)
122b077aed3SPierre Pronchery         meth->init(dsa);
123b077aed3SPierre Pronchery     return 1;
124b077aed3SPierre Pronchery }
125b077aed3SPierre Pronchery #endif /* FIPS_MODULE */
126b077aed3SPierre Pronchery 
127b077aed3SPierre Pronchery 
DSA_get_method(DSA * d)128b077aed3SPierre Pronchery const DSA_METHOD *DSA_get_method(DSA *d)
129b077aed3SPierre Pronchery {
130b077aed3SPierre Pronchery     return d->meth;
131b077aed3SPierre Pronchery }
132b077aed3SPierre Pronchery 
dsa_new_intern(ENGINE * engine,OSSL_LIB_CTX * libctx)133b077aed3SPierre Pronchery static DSA *dsa_new_intern(ENGINE *engine, OSSL_LIB_CTX *libctx)
134b077aed3SPierre Pronchery {
135b077aed3SPierre Pronchery     DSA *ret = OPENSSL_zalloc(sizeof(*ret));
136b077aed3SPierre Pronchery 
137b077aed3SPierre Pronchery     if (ret == NULL) {
138b077aed3SPierre Pronchery         ERR_raise(ERR_LIB_DSA, ERR_R_MALLOC_FAILURE);
139b077aed3SPierre Pronchery         return NULL;
140b077aed3SPierre Pronchery     }
141b077aed3SPierre Pronchery 
142b077aed3SPierre Pronchery     ret->references = 1;
143b077aed3SPierre Pronchery     ret->lock = CRYPTO_THREAD_lock_new();
144b077aed3SPierre Pronchery     if (ret->lock == NULL) {
145b077aed3SPierre Pronchery         ERR_raise(ERR_LIB_DSA, ERR_R_MALLOC_FAILURE);
146b077aed3SPierre Pronchery         OPENSSL_free(ret);
147b077aed3SPierre Pronchery         return NULL;
148b077aed3SPierre Pronchery     }
149b077aed3SPierre Pronchery 
150b077aed3SPierre Pronchery     ret->libctx = libctx;
151b077aed3SPierre Pronchery     ret->meth = DSA_get_default_method();
152b077aed3SPierre Pronchery #if !defined(FIPS_MODULE) && !defined(OPENSSL_NO_ENGINE)
153b077aed3SPierre Pronchery     ret->flags = ret->meth->flags & ~DSA_FLAG_NON_FIPS_ALLOW; /* early default init */
154b077aed3SPierre Pronchery     if (engine) {
155b077aed3SPierre Pronchery         if (!ENGINE_init(engine)) {
156b077aed3SPierre Pronchery             ERR_raise(ERR_LIB_DSA, ERR_R_ENGINE_LIB);
157b077aed3SPierre Pronchery             goto err;
158b077aed3SPierre Pronchery         }
159b077aed3SPierre Pronchery         ret->engine = engine;
160b077aed3SPierre Pronchery     } else
161b077aed3SPierre Pronchery         ret->engine = ENGINE_get_default_DSA();
162b077aed3SPierre Pronchery     if (ret->engine) {
163b077aed3SPierre Pronchery         ret->meth = ENGINE_get_DSA(ret->engine);
164b077aed3SPierre Pronchery         if (ret->meth == NULL) {
165b077aed3SPierre Pronchery             ERR_raise(ERR_LIB_DSA, ERR_R_ENGINE_LIB);
166b077aed3SPierre Pronchery             goto err;
167b077aed3SPierre Pronchery         }
168b077aed3SPierre Pronchery     }
169b077aed3SPierre Pronchery #endif
170b077aed3SPierre Pronchery 
171b077aed3SPierre Pronchery     ret->flags = ret->meth->flags & ~DSA_FLAG_NON_FIPS_ALLOW;
172b077aed3SPierre Pronchery 
173b077aed3SPierre Pronchery #ifndef FIPS_MODULE
174b077aed3SPierre Pronchery     if (!ossl_crypto_new_ex_data_ex(libctx, CRYPTO_EX_INDEX_DSA, ret,
175b077aed3SPierre Pronchery                                     &ret->ex_data))
176b077aed3SPierre Pronchery         goto err;
177b077aed3SPierre Pronchery #endif
178b077aed3SPierre Pronchery 
179ad991e4cSEd Maste     ossl_ffc_params_init(&ret->params);
180ad991e4cSEd Maste 
181b077aed3SPierre Pronchery     if ((ret->meth->init != NULL) && !ret->meth->init(ret)) {
182b077aed3SPierre Pronchery         ERR_raise(ERR_LIB_DSA, ERR_R_INIT_FAIL);
183b077aed3SPierre Pronchery         goto err;
184b077aed3SPierre Pronchery     }
185b077aed3SPierre Pronchery 
186b077aed3SPierre Pronchery     return ret;
187b077aed3SPierre Pronchery 
188b077aed3SPierre Pronchery  err:
189b077aed3SPierre Pronchery     DSA_free(ret);
190b077aed3SPierre Pronchery     return NULL;
191b077aed3SPierre Pronchery }
192b077aed3SPierre Pronchery 
DSA_new_method(ENGINE * engine)193b077aed3SPierre Pronchery DSA *DSA_new_method(ENGINE *engine)
194b077aed3SPierre Pronchery {
195b077aed3SPierre Pronchery     return dsa_new_intern(engine, NULL);
196b077aed3SPierre Pronchery }
197b077aed3SPierre Pronchery 
ossl_dsa_new(OSSL_LIB_CTX * libctx)198b077aed3SPierre Pronchery DSA *ossl_dsa_new(OSSL_LIB_CTX *libctx)
199b077aed3SPierre Pronchery {
200b077aed3SPierre Pronchery     return dsa_new_intern(NULL, libctx);
201b077aed3SPierre Pronchery }
202b077aed3SPierre Pronchery 
203b077aed3SPierre Pronchery #ifndef FIPS_MODULE
DSA_new(void)204b077aed3SPierre Pronchery DSA *DSA_new(void)
205b077aed3SPierre Pronchery {
206b077aed3SPierre Pronchery     return dsa_new_intern(NULL, NULL);
207b077aed3SPierre Pronchery }
208b077aed3SPierre Pronchery #endif
209b077aed3SPierre Pronchery 
DSA_free(DSA * r)210b077aed3SPierre Pronchery void DSA_free(DSA *r)
211b077aed3SPierre Pronchery {
212b077aed3SPierre Pronchery     int i;
213b077aed3SPierre Pronchery 
214b077aed3SPierre Pronchery     if (r == NULL)
215b077aed3SPierre Pronchery         return;
216b077aed3SPierre Pronchery 
217b077aed3SPierre Pronchery     CRYPTO_DOWN_REF(&r->references, &i, r->lock);
218b077aed3SPierre Pronchery     REF_PRINT_COUNT("DSA", r);
219b077aed3SPierre Pronchery     if (i > 0)
220b077aed3SPierre Pronchery         return;
221b077aed3SPierre Pronchery     REF_ASSERT_ISNT(i < 0);
222b077aed3SPierre Pronchery 
223b077aed3SPierre Pronchery     if (r->meth != NULL && r->meth->finish != NULL)
224b077aed3SPierre Pronchery         r->meth->finish(r);
225b077aed3SPierre Pronchery #if !defined(FIPS_MODULE) && !defined(OPENSSL_NO_ENGINE)
226b077aed3SPierre Pronchery     ENGINE_finish(r->engine);
227b077aed3SPierre Pronchery #endif
228b077aed3SPierre Pronchery 
229b077aed3SPierre Pronchery #ifndef FIPS_MODULE
230b077aed3SPierre Pronchery     CRYPTO_free_ex_data(CRYPTO_EX_INDEX_DSA, r, &r->ex_data);
231b077aed3SPierre Pronchery #endif
232b077aed3SPierre Pronchery 
233b077aed3SPierre Pronchery     CRYPTO_THREAD_lock_free(r->lock);
234b077aed3SPierre Pronchery 
235b077aed3SPierre Pronchery     ossl_ffc_params_cleanup(&r->params);
236b077aed3SPierre Pronchery     BN_clear_free(r->pub_key);
237b077aed3SPierre Pronchery     BN_clear_free(r->priv_key);
238b077aed3SPierre Pronchery     OPENSSL_free(r);
239b077aed3SPierre Pronchery }
240b077aed3SPierre Pronchery 
DSA_up_ref(DSA * r)241b077aed3SPierre Pronchery int DSA_up_ref(DSA *r)
242b077aed3SPierre Pronchery {
243b077aed3SPierre Pronchery     int i;
244b077aed3SPierre Pronchery 
245b077aed3SPierre Pronchery     if (CRYPTO_UP_REF(&r->references, &i, r->lock) <= 0)
246b077aed3SPierre Pronchery         return 0;
247b077aed3SPierre Pronchery 
248b077aed3SPierre Pronchery     REF_PRINT_COUNT("DSA", r);
249b077aed3SPierre Pronchery     REF_ASSERT_ISNT(i < 2);
250b077aed3SPierre Pronchery     return ((i > 1) ? 1 : 0);
251b077aed3SPierre Pronchery }
252b077aed3SPierre Pronchery 
ossl_dsa_set0_libctx(DSA * d,OSSL_LIB_CTX * libctx)253b077aed3SPierre Pronchery void ossl_dsa_set0_libctx(DSA *d, OSSL_LIB_CTX *libctx)
254b077aed3SPierre Pronchery {
255b077aed3SPierre Pronchery     d->libctx = libctx;
256b077aed3SPierre Pronchery }
257b077aed3SPierre Pronchery 
DSA_get0_pqg(const DSA * d,const BIGNUM ** p,const BIGNUM ** q,const BIGNUM ** g)258b077aed3SPierre Pronchery void DSA_get0_pqg(const DSA *d,
259b077aed3SPierre Pronchery                   const BIGNUM **p, const BIGNUM **q, const BIGNUM **g)
260b077aed3SPierre Pronchery {
261b077aed3SPierre Pronchery     ossl_ffc_params_get0_pqg(&d->params, p, q, g);
262b077aed3SPierre Pronchery }
263b077aed3SPierre Pronchery 
DSA_set0_pqg(DSA * d,BIGNUM * p,BIGNUM * q,BIGNUM * g)264b077aed3SPierre Pronchery int DSA_set0_pqg(DSA *d, BIGNUM *p, BIGNUM *q, BIGNUM *g)
265b077aed3SPierre Pronchery {
266b077aed3SPierre Pronchery     /* If the fields p, q and g in d are NULL, the corresponding input
267b077aed3SPierre Pronchery      * parameters MUST be non-NULL.
268b077aed3SPierre Pronchery      */
269b077aed3SPierre Pronchery     if ((d->params.p == NULL && p == NULL)
270b077aed3SPierre Pronchery         || (d->params.q == NULL && q == NULL)
271b077aed3SPierre Pronchery         || (d->params.g == NULL && g == NULL))
272b077aed3SPierre Pronchery         return 0;
273b077aed3SPierre Pronchery 
274b077aed3SPierre Pronchery     ossl_ffc_params_set0_pqg(&d->params, p, q, g);
275b077aed3SPierre Pronchery     d->dirty_cnt++;
276b077aed3SPierre Pronchery 
277b077aed3SPierre Pronchery     return 1;
278b077aed3SPierre Pronchery }
279b077aed3SPierre Pronchery 
DSA_get0_p(const DSA * d)280b077aed3SPierre Pronchery const BIGNUM *DSA_get0_p(const DSA *d)
281b077aed3SPierre Pronchery {
282b077aed3SPierre Pronchery     return d->params.p;
283b077aed3SPierre Pronchery }
284b077aed3SPierre Pronchery 
DSA_get0_q(const DSA * d)285b077aed3SPierre Pronchery const BIGNUM *DSA_get0_q(const DSA *d)
286b077aed3SPierre Pronchery {
287b077aed3SPierre Pronchery     return d->params.q;
288b077aed3SPierre Pronchery }
289b077aed3SPierre Pronchery 
DSA_get0_g(const DSA * d)290b077aed3SPierre Pronchery const BIGNUM *DSA_get0_g(const DSA *d)
291b077aed3SPierre Pronchery {
292b077aed3SPierre Pronchery     return d->params.g;
293b077aed3SPierre Pronchery }
294b077aed3SPierre Pronchery 
DSA_get0_pub_key(const DSA * d)295b077aed3SPierre Pronchery const BIGNUM *DSA_get0_pub_key(const DSA *d)
296b077aed3SPierre Pronchery {
297b077aed3SPierre Pronchery     return d->pub_key;
298b077aed3SPierre Pronchery }
299b077aed3SPierre Pronchery 
DSA_get0_priv_key(const DSA * d)300b077aed3SPierre Pronchery const BIGNUM *DSA_get0_priv_key(const DSA *d)
301b077aed3SPierre Pronchery {
302b077aed3SPierre Pronchery     return d->priv_key;
303b077aed3SPierre Pronchery }
304b077aed3SPierre Pronchery 
DSA_get0_key(const DSA * d,const BIGNUM ** pub_key,const BIGNUM ** priv_key)305b077aed3SPierre Pronchery void DSA_get0_key(const DSA *d,
306b077aed3SPierre Pronchery                   const BIGNUM **pub_key, const BIGNUM **priv_key)
307b077aed3SPierre Pronchery {
308b077aed3SPierre Pronchery     if (pub_key != NULL)
309b077aed3SPierre Pronchery         *pub_key = d->pub_key;
310b077aed3SPierre Pronchery     if (priv_key != NULL)
311b077aed3SPierre Pronchery         *priv_key = d->priv_key;
312b077aed3SPierre Pronchery }
313b077aed3SPierre Pronchery 
DSA_set0_key(DSA * d,BIGNUM * pub_key,BIGNUM * priv_key)314b077aed3SPierre Pronchery int DSA_set0_key(DSA *d, BIGNUM *pub_key, BIGNUM *priv_key)
315b077aed3SPierre Pronchery {
316b077aed3SPierre Pronchery     if (pub_key != NULL) {
317b077aed3SPierre Pronchery         BN_free(d->pub_key);
318b077aed3SPierre Pronchery         d->pub_key = pub_key;
319b077aed3SPierre Pronchery     }
320b077aed3SPierre Pronchery     if (priv_key != NULL) {
321b077aed3SPierre Pronchery         BN_free(d->priv_key);
322b077aed3SPierre Pronchery         d->priv_key = priv_key;
323b077aed3SPierre Pronchery     }
324b077aed3SPierre Pronchery     d->dirty_cnt++;
325b077aed3SPierre Pronchery 
326b077aed3SPierre Pronchery     return 1;
327b077aed3SPierre Pronchery }
328b077aed3SPierre Pronchery 
DSA_security_bits(const DSA * d)329b077aed3SPierre Pronchery int DSA_security_bits(const DSA *d)
330b077aed3SPierre Pronchery {
331b077aed3SPierre Pronchery     if (d->params.p != NULL && d->params.q != NULL)
332b077aed3SPierre Pronchery         return BN_security_bits(BN_num_bits(d->params.p),
333b077aed3SPierre Pronchery                                 BN_num_bits(d->params.q));
334b077aed3SPierre Pronchery     return -1;
335b077aed3SPierre Pronchery }
336b077aed3SPierre Pronchery 
DSA_bits(const DSA * dsa)337e71b7053SJung-uk Kim int DSA_bits(const DSA *dsa)
338e71b7053SJung-uk Kim {
339b077aed3SPierre Pronchery     if (dsa->params.p != NULL)
340b077aed3SPierre Pronchery         return BN_num_bits(dsa->params.p);
341b077aed3SPierre Pronchery     return -1;
342b077aed3SPierre Pronchery }
343b077aed3SPierre Pronchery 
ossl_dsa_get0_params(DSA * dsa)344b077aed3SPierre Pronchery FFC_PARAMS *ossl_dsa_get0_params(DSA *dsa)
345b077aed3SPierre Pronchery {
346b077aed3SPierre Pronchery     return &dsa->params;
347b077aed3SPierre Pronchery }
348b077aed3SPierre Pronchery 
ossl_dsa_ffc_params_fromdata(DSA * dsa,const OSSL_PARAM params[])349b077aed3SPierre Pronchery int ossl_dsa_ffc_params_fromdata(DSA *dsa, const OSSL_PARAM params[])
350b077aed3SPierre Pronchery {
351b077aed3SPierre Pronchery     int ret;
352b077aed3SPierre Pronchery     FFC_PARAMS *ffc;
353b077aed3SPierre Pronchery 
354b077aed3SPierre Pronchery     if (dsa == NULL)
355b077aed3SPierre Pronchery         return 0;
356b077aed3SPierre Pronchery     ffc = ossl_dsa_get0_params(dsa);
357b077aed3SPierre Pronchery     if (ffc == NULL)
358b077aed3SPierre Pronchery         return 0;
359b077aed3SPierre Pronchery 
360b077aed3SPierre Pronchery     ret = ossl_ffc_params_fromdata(ffc, params);
361b077aed3SPierre Pronchery     if (ret)
362b077aed3SPierre Pronchery         dsa->dirty_cnt++;
363b077aed3SPierre Pronchery     return ret;
364e71b7053SJung-uk Kim }
365