@@ -329,48 +329,55 @@ std::string EncodeExtKey(const CExtKey& key)
329329SpKey DecodeSpKey (const std::string& str)
330330{
331331 SpKey key;
332- std::vector<unsigned char > data;
333- const std::vector<unsigned char >& prefix = Params ().Base58Prefix (CChainParams::SP_SECRET_KEY);
334- if (DecodeBase58Check (str, data, prefix.size () + BIP352_SPKEY_SIZE)) {
335- if (data.size () == BIP352_SPKEY_SIZE + prefix.size () && std::equal (prefix.begin (), prefix.end (), data.begin ())) {
336- key.Decode (data.data () + prefix.size ());
337- }
332+ auto result = bech32::Decode (str, bech32::CharLimit::SILENT_PAYMENTS);
333+ bool isValid = result.encoding == bech32::Encoding::BECH32M && result.hrp == Params ().SilentPaymentKeyHRP (false );
334+ std::vector<unsigned char > data_out = {};
335+ data_out.reserve (BIP352_SPKEY_SIZE);
336+ isValid &= ConvertBits<5 , 8 , false >([&](unsigned char c) { data_out.push_back (c); }, result.data .begin (), result.data .end ());
337+ if (isValid) {
338+ key.Decode (data_out.data ());
338339 }
339340 return key;
340341}
341342
342343std::string EncodeSpKey (const SpKey& key)
343344{
344- std::vector<unsigned char > data = Params ().Base58Prefix (CChainParams::SP_SECRET_KEY);
345- size_t size = data.size ();
346- data.resize (size + BIP352_SPKEY_SIZE);
347- key.Encode (data.data () + size);
348- std::string ret = EncodeBase58Check (data);
345+ std::vector<unsigned char > data (BIP352_SPKEY_SIZE);
346+ key.Encode (data.data ());
347+ std::vector<unsigned char > data_out = {};
348+ data_out.reserve (((BIP352_SPKEY_SIZE * 8 ) / 5 )+1 );
349+ ConvertBits<8 , 5 , true >([&](unsigned char c) { data_out.push_back (c); }, data.begin (), data.end ());
350+ auto ret = bech32::Encode (bech32::Encoding::BECH32M, Params ().SilentPaymentKeyHRP (false ), data_out);
349351 memory_cleanse (data.data (), data.size ());
352+ memory_cleanse (data_out.data (), data_out.size ());
350353 return ret;
351354}
352355
353356SpPubKey DecodeSpPubKey (const std::string& str)
354357{
355358 SpPubKey key;
356- std::vector<unsigned char > data;
357- const std::vector<unsigned char >& prefix = Params ().Base58Prefix (CChainParams::SP_PUBLIC_KEY);
358- if (DecodeBase58Check (str, data, prefix.size () + BIP352_SPKEY_SIZE)) {
359- if (data.size () == BIP352_SPKEY_SIZE + prefix.size () && std::equal (prefix.begin (), prefix.end (), data.begin ())) {
360- key.Decode (data.data () + prefix.size ());
361- }
359+ auto result = bech32::Decode (str, bech32::CharLimit::SILENT_PAYMENTS);
360+ bool isValid = result.encoding == bech32::Encoding::BECH32M &&
361+ result.hrp == Params ().SilentPaymentKeyHRP ();
362+ std::vector<unsigned char > data_out = {};
363+ data_out.reserve (BIP352_SPKEY_SIZE);
364+ isValid &= ConvertBits<5 , 8 , false >([&](unsigned char c) { data_out.push_back (c); }, result.data .begin (), result.data .end ());
365+ if (isValid) {
366+ key.Decode (data_out.data ());
362367 }
363368 return key;
364369}
365370
366371std::string EncodeSpPubKey (const SpPubKey& key)
367372{
368- std::vector<unsigned char > data = Params ().Base58Prefix (CChainParams::SP_PUBLIC_KEY);
369- size_t size = data.size ();
370- data.resize (size + BIP352_SPKEY_SIZE);
371- key.Encode (data.data () + size);
372- std::string ret = EncodeBase58Check (data);
373+ std::vector<unsigned char > data (BIP352_SPKEY_SIZE);
374+ key.Encode (data.data ());
375+ std::vector<unsigned char > data_out = {};
376+ data_out.reserve (((BIP352_SPKEY_SIZE * 8 ) / 5 )+1 );
377+ ConvertBits<8 , 5 , true >([&](unsigned char c) { data_out.push_back (c); }, data.begin (), data.end ());
378+ auto ret = bech32::Encode (bech32::Encoding::BECH32M, Params ().SilentPaymentKeyHRP (), data_out);
373379 memory_cleanse (data.data (), data.size ());
380+ memory_cleanse (data_out.data (), data_out.size ());
374381 return ret;
375382}
376383
0 commit comments