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 int32_t send_pake_start_response(struct pake_server *pake_server, struct message *receive, struct message *send);
120 int32_t send_pake_end_response(struct pake_server *pake_server, struct message *receive, struct message *send);
121
122 #else /* _CUT_XXX_ */
123
124 struct pake_server {
125 char rsv;
126 };
127
128 #endif /* _CUT_XXX_ */
129
130 struct pake_server *build_pake_server(const struct hc_pin *pin, uint32_t key_length, const struct hc_auth_id *client,
131 const struct hc_auth_id *server);
132 void destroy_pake_server(struct pake_server *pake_server);
133
134 #endif /* __PAKE_SERVER_H__ */
135