| 120 | |
| 121 | template <bool Required, class AutoPtr> |
| 122 | bool getJwkBigNumMember(Arena& arena, |
| 123 | std::conditional_t<Required, StringRef, Optional<StringRef>> const& b64Member, |
| 124 | AutoPtr& ptr, |
| 125 | char const* memberName, |
| 126 | char const* algorithm, |
| 127 | int keyIndex) { |
| 128 | if constexpr (!Required) { |
| 129 | if (!b64Member.present()) |
| 130 | return true; |
| 131 | } |
| 132 | auto data = StringRef(); |
| 133 | if constexpr (Required) { |
| 134 | data = b64Member; |
| 135 | } else { |
| 136 | data = b64Member.get(); |
| 137 | } |
| 138 | auto decoded = base64url::decode(arena, data); |
| 139 | if (!decoded.present()) { |
| 140 | JWK_PARSE_ERROR("Base64URL decoding for parameter failed") |
| 141 | .detail("Algorithm", algorithm) |
| 142 | .detail("Parameter", memberName); |
| 143 | return false; |
| 144 | } |
| 145 | data = decoded.get(); |
| 146 | auto bn = ::BN_bin2bn(data.begin(), data.size(), nullptr); |
| 147 | if (!bn) { |
| 148 | JWK_PARSE_ERROR_OSSL("BN_bin2bn"); |
| 149 | return false; |
| 150 | } |
| 151 | ptr.reset(bn); |
| 152 | return true; |
| 153 | } |
| 154 | |
| 155 | #define DECL_DECODED_BN_MEMBER_REQUIRED(member, algo) \ |
| 156 | auto member = AutoCPointer(nullptr, &::BN_free); \ |