secmod_signatures.c (7944B)
1 /* 2 This file is part of TALER 3 Copyright (C) 2020, 2021 Taler Systems SA 4 5 TALER is free software; you can redistribute it and/or modify it under the 6 terms of the GNU General Public License as published by the Free Software 7 Foundation; either version 3, or (at your option) any later version. 8 9 TALER is distributed in the hope that it will be useful, but WITHOUT ANY 10 WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR 11 A PARTICULAR PURPOSE. See the GNU General Public License for more details. 12 13 You should have received a copy of the GNU General Public License along with 14 TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/> 15 */ 16 /** 17 * @file secmod_signatures.c 18 * @brief Utility functions for Taler security module signatures 19 * @author Christian Grothoff 20 */ 21 #include "taler/platform.h" 22 #include "taler/taler_util.h" 23 #include "taler/taler_signatures.h" 24 25 26 /** 27 * @brief format used by the signing crypto helper when affirming 28 * that it created an exchange signing key. 29 */ 30 struct TALER_SigningKeyAnnouncementPS 31 { 32 33 /** 34 * Purpose must be #TALER_SIGNATURE_SM_SIGNING_KEY. 35 * Used with an EdDSA signature of a `struct TALER_SecurityModulePublicKeyP`. 36 */ 37 struct GNUNET_CRYPTO_SignaturePurpose purpose; 38 39 /** 40 * Public signing key of the exchange this is about. 41 */ 42 struct TALER_ExchangePublicKeyP exchange_pub; 43 44 /** 45 * When does the key become available? 46 */ 47 struct GNUNET_TIME_TimestampNBO anchor_time; 48 49 /** 50 * How long is the key available after @e anchor_time? 51 */ 52 struct GNUNET_TIME_RelativeNBO duration; 53 54 }; 55 56 57 void 58 TALER_exchange_secmod_eddsa_sign ( 59 const struct TALER_ExchangePublicKeyP *exchange_pub, 60 struct GNUNET_TIME_Timestamp start_sign, 61 struct GNUNET_TIME_Relative duration, 62 const struct TALER_SecurityModulePrivateKeyP *secm_priv, 63 struct TALER_SecurityModuleSignatureP *secm_sig) 64 { 65 struct TALER_SigningKeyAnnouncementPS ska = { 66 .purpose.purpose = htonl (TALER_SIGNATURE_SM_SIGNING_KEY), 67 .purpose.size = htonl (sizeof (ska)), 68 .exchange_pub = *exchange_pub, 69 .anchor_time = GNUNET_TIME_timestamp_hton (start_sign), 70 .duration = GNUNET_TIME_relative_hton (duration) 71 }; 72 73 GNUNET_CRYPTO_eddsa_sign (&secm_priv->eddsa_priv, 74 &ska, 75 &secm_sig->eddsa_signature); 76 } 77 78 79 enum GNUNET_GenericReturnValue 80 TALER_exchange_secmod_eddsa_verify ( 81 const struct TALER_ExchangePublicKeyP *exchange_pub, 82 struct GNUNET_TIME_Timestamp start_sign, 83 struct GNUNET_TIME_Relative duration, 84 const struct TALER_SecurityModulePublicKeyP *secm_pub, 85 const struct TALER_SecurityModuleSignatureP *secm_sig) 86 { 87 struct TALER_SigningKeyAnnouncementPS ska = { 88 .purpose.purpose = htonl (TALER_SIGNATURE_SM_SIGNING_KEY), 89 .purpose.size = htonl (sizeof (ska)), 90 .exchange_pub = *exchange_pub, 91 .anchor_time = GNUNET_TIME_timestamp_hton (start_sign), 92 .duration = GNUNET_TIME_relative_hton (duration) 93 }; 94 95 return 96 GNUNET_CRYPTO_eddsa_verify (TALER_SIGNATURE_SM_SIGNING_KEY, 97 &ska, 98 &secm_sig->eddsa_signature, 99 &secm_pub->eddsa_pub); 100 } 101 102 103 /** 104 * @brief format used by the denomination crypto helper when affirming 105 * that it created a denomination key. 106 */ 107 struct TALER_DenominationKeyAnnouncementPS 108 { 109 110 /** 111 * Purpose must be #TALER_SIGNATURE_SM_RSA_DENOMINATION_KEY. 112 * Used with an EdDSA signature of a `struct TALER_SecurityModulePublicKeyP`. 113 */ 114 struct GNUNET_CRYPTO_SignaturePurpose purpose; 115 116 /** 117 * Hash of the denomination public key. 118 */ 119 struct TALER_DenominationHashP h_denom; 120 121 /** 122 * Hash of the section name in the configuration of this denomination. 123 */ 124 struct GNUNET_HashCode h_section_name; 125 126 /** 127 * When does the key become available? 128 */ 129 struct GNUNET_TIME_TimestampNBO anchor_time; 130 131 /** 132 * How long is the key available after @e anchor_time? 133 */ 134 struct GNUNET_TIME_RelativeNBO duration_withdraw; 135 136 }; 137 138 void 139 TALER_exchange_secmod_rsa_sign ( 140 const struct TALER_RsaPubHashP *h_rsa, 141 const char *section_name, 142 struct GNUNET_TIME_Timestamp start_sign, 143 struct GNUNET_TIME_Relative duration, 144 const struct TALER_SecurityModulePrivateKeyP *secm_priv, 145 struct TALER_SecurityModuleSignatureP *secm_sig) 146 { 147 struct TALER_DenominationKeyAnnouncementPS dka = { 148 .purpose.purpose = htonl (TALER_SIGNATURE_SM_RSA_DENOMINATION_KEY), 149 .purpose.size = htonl (sizeof (dka)), 150 .h_denom.hash = h_rsa->hash, 151 .anchor_time = GNUNET_TIME_timestamp_hton (start_sign), 152 .duration_withdraw = GNUNET_TIME_relative_hton (duration) 153 }; 154 155 GNUNET_CRYPTO_hash (section_name, 156 strlen (section_name) + 1, 157 &dka.h_section_name); 158 GNUNET_CRYPTO_eddsa_sign (&secm_priv->eddsa_priv, 159 &dka, 160 &secm_sig->eddsa_signature); 161 162 } 163 164 165 enum GNUNET_GenericReturnValue 166 TALER_exchange_secmod_rsa_verify ( 167 const struct TALER_RsaPubHashP *h_rsa, 168 const char *section_name, 169 struct GNUNET_TIME_Timestamp start_sign, 170 struct GNUNET_TIME_Relative duration, 171 const struct TALER_SecurityModulePublicKeyP *secm_pub, 172 const struct TALER_SecurityModuleSignatureP *secm_sig) 173 { 174 struct TALER_DenominationKeyAnnouncementPS dka = { 175 .purpose.purpose = htonl (TALER_SIGNATURE_SM_RSA_DENOMINATION_KEY), 176 .purpose.size = htonl (sizeof (dka)), 177 .h_denom.hash = h_rsa->hash, 178 .anchor_time = GNUNET_TIME_timestamp_hton (start_sign), 179 .duration_withdraw = GNUNET_TIME_relative_hton (duration) 180 }; 181 182 GNUNET_CRYPTO_hash (section_name, 183 strlen (section_name) + 1, 184 &dka.h_section_name); 185 return 186 GNUNET_CRYPTO_eddsa_verify (TALER_SIGNATURE_SM_RSA_DENOMINATION_KEY, 187 &dka, 188 &secm_sig->eddsa_signature, 189 &secm_pub->eddsa_pub); 190 } 191 192 193 void 194 TALER_exchange_secmod_cs_sign ( 195 const struct TALER_CsPubHashP *h_cs, 196 const char *section_name, 197 struct GNUNET_TIME_Timestamp start_sign, 198 struct GNUNET_TIME_Relative duration, 199 const struct TALER_SecurityModulePrivateKeyP *secm_priv, 200 struct TALER_SecurityModuleSignatureP *secm_sig) 201 { 202 struct TALER_DenominationKeyAnnouncementPS dka = { 203 .purpose.purpose = htonl (TALER_SIGNATURE_SM_CS_DENOMINATION_KEY), 204 .purpose.size = htonl (sizeof (dka)), 205 .h_denom.hash = h_cs->hash, 206 .anchor_time = GNUNET_TIME_timestamp_hton (start_sign), 207 .duration_withdraw = GNUNET_TIME_relative_hton (duration) 208 }; 209 210 GNUNET_CRYPTO_hash (section_name, 211 strlen (section_name) + 1, 212 &dka.h_section_name); 213 GNUNET_CRYPTO_eddsa_sign (&secm_priv->eddsa_priv, 214 &dka, 215 &secm_sig->eddsa_signature); 216 217 } 218 219 220 enum GNUNET_GenericReturnValue 221 TALER_exchange_secmod_cs_verify ( 222 const struct TALER_CsPubHashP *h_cs, 223 const char *section_name, 224 struct GNUNET_TIME_Timestamp start_sign, 225 struct GNUNET_TIME_Relative duration, 226 const struct TALER_SecurityModulePublicKeyP *secm_pub, 227 const struct TALER_SecurityModuleSignatureP *secm_sig) 228 { 229 struct TALER_DenominationKeyAnnouncementPS dka = { 230 .purpose.purpose = htonl (TALER_SIGNATURE_SM_CS_DENOMINATION_KEY), 231 .purpose.size = htonl (sizeof (dka)), 232 .h_denom.hash = h_cs->hash, 233 .anchor_time = GNUNET_TIME_timestamp_hton (start_sign), 234 .duration_withdraw = GNUNET_TIME_relative_hton (duration) 235 }; 236 237 GNUNET_CRYPTO_hash (section_name, 238 strlen (section_name) + 1, 239 &dka.h_section_name); 240 return 241 GNUNET_CRYPTO_eddsa_verify (TALER_SIGNATURE_SM_CS_DENOMINATION_KEY, 242 &dka, 243 &secm_sig->eddsa_signature, 244 &secm_pub->eddsa_pub); 245 } 246 247 248 /* end of secmod_signatures.c */