• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022-2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 #ifndef __HVB_CRYPTO_H_
16 #define __HVB_CRYPTO_H_
17 
18 #include <stdint.h>
19 
20 #define HASH_OK     0
21 #define VERIFY_OK   0x5A5A
22 
23 #define BLK_WORD_SIZE_SHA256 16
24 #define BLK_BYTE_SIZE_SHA256 (BLK_WORD_SIZE_SHA256 * sizeof(uint32_t))
25 
26 #define IV_WORD_SIZE_SHA256  8
27 #define IV_BYTE_SIZE_SHA256  (IV_WORD_SIZE_SHA256 * sizeof(uint32_t))
28 
29 #define HVB_SHA256_DIGEST_BYTES 32
30 #define HVB_SHA512_DIGEST_BYTES 64
31 /* sha512 is 64 bytes */
32 #define HVB_HASH_MAX_BYTES      64
33 
34 struct hvb_rsa_pubkey {
35     uint32_t width;
36     uint32_t e;
37     uint8_t *pn;
38     uint32_t nlen;
39     uint8_t *p_rr;
40     uint32_t rlen;
41     uint64_t n_n0_i;
42 };
43 
44 enum hash_alg_type {
45     HASH_ALG_SHA256,
46 };
47 
48 struct hash_ctx_t {
49     uint32_t alg_type;
50 
51     uint32_t buf_len;
52     uint32_t total_len;
53 
54     uint32_t iv[IV_BYTE_SIZE_SHA256];
55 
56     uint8_t  blk_buf[BLK_BYTE_SIZE_SHA256];
57 };
58 
59 int hash_ctx_init(struct hash_ctx_t *hash_ctx, enum hash_alg_type);
60 
61 int hash_calc_update(struct hash_ctx_t *hash_ctx, const void *msg, uint32_t msg_len);
62 
63 int hash_calc_do_final(struct hash_ctx_t *hash_ctx, const void *msg, uint32_t msg_len, uint8_t *out, uint32_t out_len);
64 
65 int hash_sha256_single(const void *msg, uint32_t msg_len, uint8_t *out, uint32_t out_len);
66 
67 /*
68 * Use the key provided in the |pkey| to verify the correctness
69 * of the RSA |psign| with the length of |signlen| against an
70 * expected |pdigest| of length |digestlen|.
71 *
72 * The data in |pkey| must match the format defined in |hvb_rsa_pubkey|.
73 *
74 * Return VERIFY_OK if verification success, error code otherwise.
75 */
76 int hvb_rsa_verify_pss(const struct hvb_rsa_pubkey *pkey, const uint8_t *pdigest,
77                        uint32_t digestlen, uint8_t *psign,
78                        uint32_t signlen, uint32_t saltlen);
79 
80 #endif