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)114static 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