1 /*
2  * Copyright (c) 2020 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 
16 #ifndef __PAKE_SERVER_H__
17 #define __PAKE_SERVER_H__
18 
19 enum pake_message_type {
20     PAKE_START_MSG = 1,
21     PAKE_END_MSG,
22 };
23 
24 #include "hichain.h"
25 #include "base.h"
26 
27 #if !(defined(_CUT_PAKE_) || defined(_CUT_PAKE_SERVER_))
28 
29 #include "key_agreement_server.h"
30 
31 #define KCF_BUFF_LENGTH             16
32 #define PAKE_SESSION_KEY_LENGTH     16
33 #define PAKE_HMAC_KEY_LENGTH        32
34 #define PAKE_SHARED_SECRET_LENGTH   HC_BIG_PRIME_MAX_LEN
35 #define PAKE_EPK_LENGTH             HC_BIG_PRIME_MAX_LEN
36 #if !defined(_SCANTY_MEMORY_)
37 #define PAKE_ESK_LENGTH             32
38 #else /* _SCANTY_MEMORY_ */
39 #define PAKE_ESK_LENGTH             28
40 #endif /* _SCANTY_MEMORY_ */
41 #define PAKE_ESK_SHORT_LENGTH       28
42 
43 struct pake_hmac_key {
44     uint32_t length;
45     uint8_t key[PAKE_HMAC_KEY_LENGTH];
46 };
47 
48 struct pake_session_key {
49     uint32_t length;
50     uint8_t key[PAKE_SESSION_KEY_LENGTH];
51 };
52 
53 struct pake_shared_secret {
54     uint32_t length;
55     uint8_t shared_secret[PAKE_SHARED_SECRET_LENGTH];
56 };
57 
58 struct epk {
59     uint32_t length;
60     uint8_t epk[PAKE_EPK_LENGTH];
61 };
62 
63 struct esk {
64     uint32_t length;
65     uint8_t esk[PAKE_ESK_LENGTH];
66 };
67 
68 struct pake_server {
69     struct key_agreement_server server_info;
70     uint32_t key_length;
71     struct hc_pin pin;
72     struct hc_salt salt;
73     struct hc_auth_id self_id;
74     struct hc_auth_id peer_id;
75     struct challenge self_challenge;
76     struct challenge peer_challenge;
77     struct esk self_esk;
78     struct pake_session_key session_key;
79     struct pake_hmac_key hmac_key;
80     struct hc_session_key service_key;
81     enum large_prime_number_type prime_type;
82 };
83 
84 struct kcf_key {
85     uint32_t length;
86     uint8_t kcf[KCF_BUFF_LENGTH];
87 };
88 
89 struct pake_start_request_data {
90     struct key_agreement_version peer_version;
91     struct key_agreement_version peer_support_version;
92     int32_t operation_code;
93     int32_t epk_len;
94 };
95 
96 struct pake_start_response_data {
97     struct key_agreement_version self_version;
98     struct key_agreement_version self_support_version;
99     struct challenge challenge;
100     struct hc_salt salt;
101     struct epk epk;
102 };
103 
104 struct pake_end_request_data {
105     struct challenge challenge;
106     struct epk epk;
107     struct hmac kcf_data;
108 };
109 
110 struct pake_end_response_data {
111     struct hmac kcf_data;
112 };
113 
pake_server_sn(struct pake_server * server)114 static inline uint32_t pake_server_sn(struct pake_server *server)
115 {
116     return server->server_info.protocol_base_info.sn;
117 }
118 
119 
120 #else /* _CUT_XXX_ */
121 
122 struct pake_server {
123     char rsv;
124 };
125 
126 #endif /* _CUT_XXX_ */
127 
128 void destroy_pake_server(struct pake_server *pake_server);
129 
130 #endif /* __PAKE_SERVER_H__ */
131