xref: /optee_os/core/crypto.mk (revision 32b3180828fa15a49ccc86ecb4be9d274c140c89)
1CFG_CRYPTO ?= y
2# Select small code size in the crypto library if applicable (for instance
3# LibTomCrypt has -DLTC_SMALL_CODE)
4# Note: the compiler flag -Os is not set here but by CFG_CC_OPT_LEVEL
5CFG_CRYPTO_SIZE_OPTIMIZATION ?= y
6
7ifeq (y,$(CFG_CRYPTO))
8
9###############################################################
10# Platform crypto-driver configuration. It has a higher priority over the
11# generic crypto configuration below.
12###############################################################
13CRYPTO_MAKEFILES := $(sort $(wildcard core/drivers/crypto/*/crypto.mk))
14include $(CRYPTO_MAKEFILES)
15
16# Ciphers
17CFG_CRYPTO_AES ?= y
18CFG_CRYPTO_DES ?= y
19CFG_CRYPTO_SM4 ?= y
20
21# Cipher block modes
22CFG_CRYPTO_ECB ?= y
23CFG_CRYPTO_CBC ?= y
24CFG_CRYPTO_CTR ?= y
25CFG_CRYPTO_CTS ?= y
26CFG_CRYPTO_XTS ?= y
27
28# Message authentication codes
29CFG_CRYPTO_HMAC ?= y
30CFG_CRYPTO_CMAC ?= y
31CFG_CRYPTO_CBC_MAC ?= y
32# Instead of calling the AES CBC encryption function for each 16 byte block of
33# input, bundle a maximum of N blocks when possible. A maximum of N*16 bytes of
34# temporary data are allocated on the heap.
35# Minimum value is 1.
36CFG_CRYPTO_CBC_MAC_BUNDLE_BLOCKS ?= 64
37
38# Hashes
39CFG_CRYPTO_MD5 ?= y
40CFG_CRYPTO_SHA1 ?= y
41CFG_CRYPTO_SHA224 ?= y
42CFG_CRYPTO_SHA256 ?= y
43CFG_CRYPTO_SHA384 ?= y
44CFG_CRYPTO_SHA512 ?= y
45CFG_CRYPTO_SHA512_256 ?= y
46CFG_CRYPTO_SM3 ?= y
47CFG_CRYPTO_SHA3_224 ?= y
48CFG_CRYPTO_SHA3_256 ?= y
49CFG_CRYPTO_SHA3_384 ?= y
50CFG_CRYPTO_SHA3_512 ?= y
51
52# Extendable-Output Functions (XOF)
53CFG_CRYPTO_SHAKE128 ?= y
54CFG_CRYPTO_SHAKE256 ?= y
55
56# Asymmetric ciphers
57CFG_CRYPTO_DSA ?= y
58CFG_CRYPTO_RSA ?= y
59CFG_CRYPTO_DH ?= y
60# ECC includes ECDSA and ECDH
61CFG_CRYPTO_ECC ?= y
62CFG_CRYPTO_SM2_PKE ?= y
63CFG_CRYPTO_SM2_DSA ?= y
64CFG_CRYPTO_SM2_KEP ?= y
65CFG_CRYPTO_ED25519 ?= y
66CFG_CRYPTO_X25519 ?= y
67
68# Authenticated encryption
69CFG_CRYPTO_CCM ?= y
70CFG_CRYPTO_GCM ?= y
71# Default uses the OP-TEE internal AES-GCM implementation
72CFG_CRYPTO_AES_GCM_FROM_CRYPTOLIB ?= n
73
74endif
75
76# PRNG configuration
77# If CFG_WITH_SOFTWARE_PRNG is enabled, crypto provider provided
78# software PRNG implementation is used.
79# Otherwise, you need to implement hw_get_random_bytes() for your platform
80CFG_WITH_SOFTWARE_PRNG ?= y
81
82ifeq ($(CFG_WITH_PAGER),y)
83ifneq ($(CFG_CRYPTO_SHA256),y)
84$(warning Warning: Enabling CFG_CRYPTO_SHA256 [required by CFG_WITH_PAGER])
85CFG_CRYPTO_SHA256:=y
86endif
87endif
88
89$(eval $(call cryp-enable-all-depends,CFG_WITH_SOFTWARE_PRNG, AES ECB SHA256))
90
91ifeq ($(CFG_CRYPTO_WITH_CE82),y)
92$(call force,CFG_CRYPTO_WITH_CE,y,required with CFG_CRYPTO_WITH_CE82)
93CFG_CRYPTO_SHA512_ARM_CE ?= $(CFG_CRYPTO_SHA512)
94CFG_CORE_CRYPTO_SHA512_ACCEL ?= $(CFG_CRYPTO_SHA512_ARM_CE)
95CFG_CRYPTO_SHA3_ARM_CE ?= $(call cfg-one-enabled, CFG_CRYPTO_SHA3_224 \
96			    CFG_CRYPTO_SHA3_256 CFG_CRYPTO_SHA3_384 \
97			    CFG_CRYPTO_SHA3_512 CFG_CRYPTO_SHAKE128 \
98			    CFG_CRYPTO_SHAKE256)
99CFG_CORE_CRYPTO_SHA3_ACCEL ?= $(CFG_CRYPTO_SHA3_ARM_CE)
100CFG_CRYPTO_SM3_ARM_CE ?= $(CFG_CRYPTO_SM3)
101CFG_CORE_CRYPTO_SM3_ACCEL ?= $(CFG_CRYPTO_SM3_ARM_CE)
102
103# CFG_CRYPTO_SM4_ARM_CE defines whether we use SM4E to optimize SM4
104CFG_CRYPTO_SM4_ARM_CE ?= $(CFG_CRYPTO_SM4)
105CFG_CORE_CRYPTO_SM4_ACCEL ?= $(CFG_CRYPTO_SM4_ARM_CE)
106endif
107
108ifeq ($(CFG_CRYPTO_WITH_CE),y)
109
110$(call force,CFG_AES_GCM_TABLE_BASED,n,conflicts with CFG_CRYPTO_WITH_CE)
111
112# CFG_HWSUPP_PMULT_64 defines whether the CPU supports polynomial multiplies
113# of 64-bit values (Aarch64: PMULL/PMULL2 with the 1Q specifier; Aarch32:
114# VMULL.P64). These operations are part of the Cryptographic Extensions, so
115# assume they are implicitly contained in CFG_CRYPTO_WITH_CE=y.
116CFG_HWSUPP_PMULT_64 ?= y
117
118CFG_CRYPTO_SHA256_ARM_CE ?= $(CFG_CRYPTO_SHA256)
119CFG_CORE_CRYPTO_SHA256_ACCEL ?= $(CFG_CRYPTO_SHA256_ARM_CE)
120CFG_CRYPTO_SHA1_ARM_CE ?= $(CFG_CRYPTO_SHA1)
121CFG_CORE_CRYPTO_SHA1_ACCEL ?= $(CFG_CRYPTO_SHA1_ARM_CE)
122CFG_CRYPTO_AES_ARM_CE ?= $(CFG_CRYPTO_AES)
123CFG_CORE_CRYPTO_AES_ACCEL ?= $(CFG_CRYPTO_AES_ARM_CE)
124
125# CFG_CRYPTO_SM4_ARM_AESE defines whether we use AESE to optimize SM4
126CFG_CRYPTO_SM4_ARM_AESE ?= $(CFG_CRYPTO_SM4)
127CFG_CORE_CRYPTO_SM4_ACCEL ?= $(CFG_CRYPTO_SM4_ARM_AESE)
128else #CFG_CRYPTO_WITH_CE
129
130CFG_AES_GCM_TABLE_BASED ?= y
131
132endif #!CFG_CRYPTO_WITH_CE
133
134
135# Cryptographic extensions can only be used safely when OP-TEE knows how to
136# preserve the VFP context
137ifeq ($(CFG_CRYPTO_SHA256_ARM32_CE),y)
138$(call force,CFG_WITH_VFP,y,required by CFG_CRYPTO_SHA256_ARM32_CE)
139endif
140ifeq ($(CFG_CRYPTO_SHA256_ARM64_CE),y)
141$(call force,CFG_WITH_VFP,y,required by CFG_CRYPTO_SHA256_ARM64_CE)
142endif
143ifeq ($(CFG_CRYPTO_SHA1_ARM_CE),y)
144$(call force,CFG_WITH_VFP,y,required by CFG_CRYPTO_SHA1_ARM_CE)
145endif
146ifeq ($(CFG_CRYPTO_AES_ARM_CE),y)
147$(call force,CFG_WITH_VFP,y,required by CFG_CRYPTO_AES_ARM_CE)
148endif
149ifeq ($(CFG_CORE_CRYPTO_SM4_ACCEL),y)
150$(call force,CFG_WITH_VFP,y,required by CFG_CORE_CRYPTO_SM4_ACCEL)
151endif
152cryp-enable-all-depends = $(call cfg-enable-all-depends,$(strip $(1)),$(foreach v,$(2),CFG_CRYPTO_$(v)))
153$(eval $(call cryp-enable-all-depends,CFG_REE_FS, AES ECB CTR HMAC SHA256 GCM))
154$(eval $(call cryp-enable-all-depends,CFG_RPMB_FS, AES ECB CTR HMAC SHA256 GCM))
155
156# Dependency checks: warn and disable some features if dependencies are not met
157
158cryp-dep-one = $(call cfg-depends-one,CFG_CRYPTO_$(strip $(1)),$(patsubst %, CFG_CRYPTO_%,$(strip $(2))))
159cryp-dep-all = $(call cfg-depends-all,CFG_CRYPTO_$(strip $(1)),$(patsubst %, CFG_CRYPTO_%,$(strip $(2))))
160
161$(eval $(call cryp-dep-one, ECB, AES DES))
162$(eval $(call cryp-dep-one, CBC, AES DES))
163$(eval $(call cryp-dep-one, CTR, AES))
164# CTS is implemented with ECB and CBC
165$(eval $(call cryp-dep-all, CTS, AES ECB CBC))
166$(eval $(call cryp-dep-one, XTS, AES))
167$(eval $(call cryp-dep-one, HMAC, AES DES))
168$(eval $(call cryp-dep-one, HMAC, MD5 SHA1 SHA224 SHA256 SHA384 SHA512))
169$(eval $(call cryp-dep-one, CMAC, AES))
170$(eval $(call cryp-dep-one, CBC_MAC, AES DES))
171$(eval $(call cryp-dep-one, CCM, AES))
172$(eval $(call cryp-dep-one, GCM, AES))
173# If no AES cipher mode is left, disable AES
174$(eval $(call cryp-dep-one, AES, ECB CBC CTR CTS XTS))
175# If no DES cipher mode is left, disable DES
176$(eval $(call cryp-dep-one, DES, ECB CBC))
177# SM2 is Elliptic Curve Cryptography, it uses some generic ECC functions
178$(eval $(call cryp-dep-one, SM2_PKE, ECC))
179$(eval $(call cryp-dep-one, SM2_DSA, ECC))
180$(eval $(call cryp-dep-one, SM2_KEP, ECC))
181
182###############################################################
183# libtomcrypt (LTC) specifics, phase #1
184# LTC is only configured via _CFG_CORE_LTC_ prefixed variables
185#
186# _CFG_CORE_LTC_xxx_DESC means that LTC will only register the
187# descriptor of the algorithm, not provide a
188# crypt_xxx_alloc_ctx() function.
189###############################################################
190
191# If LTC is the cryptolib, pull configuration from CFG_CRYPTO_xxx
192ifeq ($(CFG_CRYPTOLIB_NAME),tomcrypt)
193# dsa_make_params() needs all three SHA-2 algorithms.
194# Disable DSA if any is missing.
195$(eval $(call cryp-dep-all, DSA, SHA256 SHA384 SHA512))
196
197# Assign _CFG_CORE_LTC_xxx based on CFG_CRYPTO_yyy
198core-ltc-vars = AES DES
199core-ltc-vars += ECB CBC CTR CTS XTS
200core-ltc-vars += MD5 SHA1 SHA224 SHA256 SHA384 SHA512 SHA512_256
201core-ltc-vars += SHA3_224 SHA3_256 SHA3_384 SHA3_512 SHAKE128 SHAKE256
202core-ltc-vars += HMAC CMAC CBC_MAC
203core-ltc-vars += CCM
204ifeq ($(CFG_CRYPTO_AES_GCM_FROM_CRYPTOLIB),y)
205core-ltc-vars += GCM
206endif
207core-ltc-vars += RSA DSA DH ECC
208core-ltc-vars += SIZE_OPTIMIZATION
209core-ltc-vars += SM2_PKE
210core-ltc-vars += SM2_DSA
211core-ltc-vars += SM2_KEP
212core-ltc-vars += ED25519 X25519
213# Assigned selected CFG_CRYPTO_xxx as _CFG_CORE_LTC_xxx
214$(foreach v, $(core-ltc-vars), $(eval _CFG_CORE_LTC_$(v) := $(CFG_CRYPTO_$(v))))
215_CFG_CORE_LTC_MPI := $(CFG_CORE_MBEDTLS_MPI)
216_CFG_CORE_LTC_AES_ACCEL := $(CFG_CORE_CRYPTO_AES_ACCEL)
217_CFG_CORE_LTC_SHA1_ACCEL := $(CFG_CORE_CRYPTO_SHA1_ACCEL)
218_CFG_CORE_LTC_SHA256_ACCEL := $(CFG_CORE_CRYPTO_SHA256_ACCEL)
219_CFG_CORE_LTC_SHA512_ACCEL := $(CFG_CORE_CRYPTO_SHA512_ACCEL)
220_CFG_CORE_LTC_SHA3_ACCEL := $(CFG_CORE_CRYPTO_SHA3_ACCEL)
221endif
222
223###############################################################
224# mbedtls specifics
225###############################################################
226
227ifeq ($(CFG_CRYPTOLIB_NAME),mbedtls)
228# mbedtls has to be complemented with some algorithms by LTC
229# Specify the algorithms here
230_CFG_CORE_LTC_DSA := $(CFG_CRYPTO_DSA)
231_CFG_CORE_LTC_MPI := $(CFG_CRYPTO_DSA)
232_CFG_CORE_LTC_SHA256_DESC := $(CFG_CRYPTO_DSA)
233_CFG_CORE_LTC_SHA384_DESC := $(CFG_CRYPTO_DSA)
234_CFG_CORE_LTC_SHA512_DESC := $(CFG_CRYPTO_DSA)
235_CFG_CORE_LTC_XTS := $(CFG_CRYPTO_XTS)
236_CFG_CORE_LTC_CCM := $(CFG_CRYPTO_CCM)
237_CFG_CORE_LTC_AES := $(call cfg-one-enabled, CFG_CRYPTO_XTS CFG_CRYPTO_CCM \
238					     CFG_CRYPTO_AES)
239_CFG_CORE_LTC_AES_ACCEL := $(CFG_CORE_CRYPTO_AES_ACCEL)
240_CFG_CORE_LTC_X25519 := $(CFG_CRYPTO_X25519)
241_CFG_CORE_LTC_ED25519 := $(CFG_CRYPTO_ED25519)
242_CFG_CORE_LTC_SHA3_224 := $(CFG_CRYPTO_SHA3_224)
243_CFG_CORE_LTC_SHA3_256 := $(CFG_CRYPTO_SHA3_256)
244_CFG_CORE_LTC_SHA3_384 := $(CFG_CRYPTO_SHA3_384)
245_CFG_CORE_LTC_SHA3_512 := $(CFG_CRYPTO_SHA3_512)
246_CFG_CORE_LTC_SHAKE128 := $(CFG_CRYPTO_SHAKE128)
247_CFG_CORE_LTC_SHAKE256 := $(CFG_CRYPTO_SHAKE256)
248endif
249
250###############################################################
251# libtomcrypt (LTC) specifics, phase #2
252###############################################################
253
254_CFG_CORE_LTC_MD5_DESC := $(call cfg-one-enabled, _CFG_CORE_LTC_MD5_DESC \
255						  _CFG_CORE_LTC_MD5)
256_CFG_CORE_LTC_SHA1_DESC := $(call cfg-one-enabled, _CFG_CORE_LTC_SHA1_DESC \
257						   _CFG_CORE_LTC_SHA1)
258_CFG_CORE_LTC_SHA224_DESC := $(call cfg-one-enabled, _CFG_CORE_LTC_SHA224_DESC \
259						     _CFG_CORE_LTC_SHA224)
260_CFG_CORE_LTC_SHA256_DESC := $(call cfg-one-enabled, _CFG_CORE_LTC_SHA256_DESC \
261						     _CFG_CORE_LTC_SHA224 \
262						     _CFG_CORE_LTC_SHA256)
263_CFG_CORE_LTC_SHA384_DESC := $(call cfg-one-enabled, _CFG_CORE_LTC_SHA384_DESC \
264						     _CFG_CORE_LTC_SHA384)
265_CFG_CORE_LTC_SHA512_DESC := $(call cfg-one-enabled, _CFG_CORE_LTC_SHA512_DESC \
266						     _CFG_CORE_LTC_SHA512_256 \
267						     _CFG_CORE_LTC_SHA512)
268_CFG_CORE_LTC_AES_DESC := $(call cfg-one-enabled, _CFG_CORE_LTC_AES_DESC \
269						  _CFG_CORE_LTC_AES)
270
271_CFG_CORE_LTC_SHA3_DESC := $(call cfg-one-enabled, _CFG_CORE_LTC_SHA3_224 \
272			     _CFG_CORE_LTC_SHA3_256 _CFG_CORE_LTC_SHA3_384 \
273			     _CFG_CORE_LTC_SHA3_512 _CFG_CORE_LTC_SHAKE128 \
274			     _CFG_CORE_LTC_SHAKE256)
275
276# Assign system variables
277_CFG_CORE_LTC_CE := $(CFG_CRYPTO_WITH_CE)
278_CFG_CORE_LTC_VFP := $(CFG_WITH_VFP)
279_CFG_CORE_LTC_BIGNUM_MAX_BITS := $(CFG_CORE_BIGNUM_MAX_BITS)
280_CFG_CORE_LTC_PAGER := $(CFG_WITH_PAGER)
281ifneq ($(CFG_NUM_THREADS),1)
282_CFG_CORE_LTC_OPTEE_THREAD := y
283else
284_CFG_CORE_LTC_OPTEE_THREAD := n
285endif
286_CFG_CORE_LTC_HWSUPP_PMULL := $(CFG_HWSUPP_PMULL)
287
288# Assign aggregated variables
289ltc-one-enabled = $(call cfg-one-enabled,$(foreach v,$(1),_CFG_CORE_LTC_$(v)))
290_CFG_CORE_LTC_ACIPHER := $(call ltc-one-enabled, RSA DSA DH ECC)
291_CFG_CORE_LTC_AUTHENC := $(and $(filter y,$(_CFG_CORE_LTC_AES_DESC)), \
292			       $(filter y,$(call ltc-one-enabled, CCM GCM)))
293_CFG_CORE_LTC_CIPHER := $(call ltc-one-enabled, AES_DESC DES)
294_CFG_CORE_LTC_HASH := $(call ltc-one-enabled, MD5 SHA1 SHA224 SHA256 SHA384 \
295					      SHA512 SHA3_224 SHA3_256 \
296					      SHA3_384 SHA3_512)
297ifeq ($(CFG_CRYPTO_HMAC),y)
298_CFG_CORE_LTC_HMAC := $(call ltc-one-enabled, MD5 SHA1 SHA224 SHA256 SHA384 \
299					      SHA512 SHA3_224 SHA3_256 \
300					      SHA3_384 SHA3_512)
301endif
302
303_CFG_CORE_LTC_MAC := $(call ltc-one-enabled, HMAC CMAC CBC_MAC)
304_CFG_CORE_LTC_CBC := $(call ltc-one-enabled, CBC CBC_MAC)
305_CFG_CORE_LTC_ASN1 := $(call ltc-one-enabled, RSA DSA ECC)
306_CFG_CORE_LTC_EC25519 := $(call ltc-one-enabled, ED25519 X25519)
307
308# Enable TEE_ALG_RSASSA_PKCS1_V1_5 algorithm for signing with PKCS#1 v1.5 EMSA
309# without ASN.1 around the hash.
310ifeq ($(CFG_CRYPTOLIB_NAME),tomcrypt)
311CFG_CRYPTO_RSASSA_NA1 ?= y
312endif
313