Packages
hackney
3.0.1
4.7.2
4.7.1
4.7.0
4.6.1
4.6.0
4.5.2
4.5.1
4.5.0
4.4.5
4.4.3
4.4.2
4.4.1
4.4.0
4.3.0
4.2.3
4.2.2
4.2.1
4.2.0
4.1.0
4.0.3
4.0.2
4.0.1
4.0.0
3.2.1
3.2.0
3.1.2
3.1.1
3.1.0
3.0.3
3.0.2
3.0.1
3.0.0
retired
2.0.1
2.0.0
2.0.0-beta.1
1.25.0
1.24.1
1.24.0
1.23.0
1.22.0
1.21.0
1.20.1
1.20.0
1.19.1
1.19.0
1.18.2
1.18.1
1.18.0
1.17.4
1.17.3
1.17.2
1.17.1
1.17.0
1.16.0
1.15.2
1.15.1
1.15.0
1.14.3
1.14.2
1.14.0
1.13.0
1.12.1
1.12.0
1.11.0
1.10.1
1.10.0
1.9.0
1.8.6
1.8.5
1.8.4
1.8.3
1.8.2
1.8.0
1.7.1
1.7.0
1.6.6
retired
1.6.5
1.6.4
retired
1.6.3
1.6.2
1.6.1
1.6.0
1.5.7
1.5.6
1.5.5
1.5.4
1.5.3
1.5.2
1.5.1
1.5.0
1.4.10
1.4.8
1.4.7
1.4.6
1.4.5
1.4.4
1.4.3
1.4.2
1.4.1
1.4.0
1.3.2
1.3.1
1.3.0
1.2.0
1.1.0
1.0.6
1.0.5
1.0.2
1.0.1
0.15.2
0.15.0
0.14.3
0.14.2
0.14.1
0.14.0
0.13.1
Simple HTTP client with HTTP/1.1, HTTP/2, and HTTP/3 support
Security advisory:
This version has known vulnerabilities.
View advisories
Current section
Files
Jump to
Current section
Files
c_src/boringssl/crypto/fipsmodule/bn/ctx.cc.inc
// Copyright 2000-2016 The OpenSSL Project Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include <openssl/bn.h>
#include <assert.h>
#include <string.h>
#include <utility>
#include <openssl/err.h>
#include <openssl/mem.h>
#include "../../mem_internal.h"
struct bignum_ctx {
~bignum_ctx() {
// All |BN_CTX_start| calls must be matched with |BN_CTX_end|, otherwise the
// function may use more memory than expected, potentially without bound if
// done in a loop. Assert that all |BIGNUM|s have been released.
assert(used_ == 0 || error_);
}
// bignums_ is the stack of |BIGNUM|s managed by this |BN_CTX|.
bssl::Vector<bssl::UniquePtr<BIGNUM>> bignums_;
// stack_ is the stack of |BN_CTX_start| frames. It is the value of |used_| at
// the time |BN_CTX_start| was called.
bssl::Vector<size_t> stack_;
// used_ is the number of |BIGNUM|s from |bignums_| that have been used.
size_t used_ = 0;
// error_ is whether any operation on this |BN_CTX| failed. All subsequent
// operations will fail.
bool error_ = false;
// defer_error_ is whether an operation on this |BN_CTX| has failed, but no
// error has been pushed to the queue yet. This is used to defer errors from
// |BN_CTX_start| to |BN_CTX_get|.
bool defer_error_ = false;
} /* BN_CTX */;
BN_CTX *BN_CTX_new(void) { return bssl::New<BN_CTX>(); }
void BN_CTX_free(BN_CTX *ctx) { bssl::Delete(ctx); }
void BN_CTX_start(BN_CTX *ctx) {
if (ctx->error_) {
// Once an operation has failed, |ctx->stack| no longer matches the number
// of |BN_CTX_end| calls to come. Do nothing.
return;
}
if (!ctx->stack_.Push(ctx->used_)) {
ctx->error_ = true;
// |BN_CTX_start| cannot fail, so defer the error to |BN_CTX_get|.
ctx->defer_error_ = true;
ERR_clear_error();
}
}
BIGNUM *BN_CTX_get(BN_CTX *ctx) {
// Once any operation has failed, they all do.
if (ctx->error_) {
if (ctx->defer_error_) {
OPENSSL_PUT_ERROR(BN, BN_R_TOO_MANY_TEMPORARY_VARIABLES);
ctx->defer_error_ = false;
}
return nullptr;
}
if (ctx->used_ == ctx->bignums_.size()) {
bssl::UniquePtr<BIGNUM> bn(BN_new());
if (bn == nullptr || !ctx->bignums_.Push(std::move(bn))) {
OPENSSL_PUT_ERROR(BN, BN_R_TOO_MANY_TEMPORARY_VARIABLES);
ctx->error_ = true;
return nullptr;
}
}
BIGNUM *ret = ctx->bignums_[ctx->used_].get();
BN_zero(ret);
// This is bounded by |ctx->bignums_.size()|, so it cannot overflow.
ctx->used_++;
return ret;
}
void BN_CTX_end(BN_CTX *ctx) {
if (ctx->error_) {
// Once an operation has failed, |ctx->stack_| no longer matches the number
// of |BN_CTX_end| calls to come. Do nothing.
return;
}
assert(!ctx->stack_.empty());
ctx->used_ = ctx->stack_.back();
ctx->stack_.pop_back();
}