19f80aec4d0a3986bb4506bbb1b51842a9a36f940Nathan Mittler/* 29f80aec4d0a3986bb4506bbb1b51842a9a36f940Nathan Mittler * Copyright (C) 2017 The Android Open Source Project 39f80aec4d0a3986bb4506bbb1b51842a9a36f940Nathan Mittler * 49f80aec4d0a3986bb4506bbb1b51842a9a36f940Nathan Mittler * Licensed under the Apache License, Version 2.0 (the "License"); 59f80aec4d0a3986bb4506bbb1b51842a9a36f940Nathan Mittler * you may not use this file except in compliance with the License. 69f80aec4d0a3986bb4506bbb1b51842a9a36f940Nathan Mittler * You may obtain a copy of the License at 79f80aec4d0a3986bb4506bbb1b51842a9a36f940Nathan Mittler * 89f80aec4d0a3986bb4506bbb1b51842a9a36f940Nathan Mittler * http://www.apache.org/licenses/LICENSE-2.0 99f80aec4d0a3986bb4506bbb1b51842a9a36f940Nathan Mittler * 109f80aec4d0a3986bb4506bbb1b51842a9a36f940Nathan Mittler * Unless required by applicable law or agreed to in writing, software 119f80aec4d0a3986bb4506bbb1b51842a9a36f940Nathan Mittler * distributed under the License is distributed on an "AS IS" BASIS, 129f80aec4d0a3986bb4506bbb1b51842a9a36f940Nathan Mittler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139f80aec4d0a3986bb4506bbb1b51842a9a36f940Nathan Mittler * See the License for the specific language governing permissions and 149f80aec4d0a3986bb4506bbb1b51842a9a36f940Nathan Mittler * limitations under the License. 159f80aec4d0a3986bb4506bbb1b51842a9a36f940Nathan Mittler */ 169f80aec4d0a3986bb4506bbb1b51842a9a36f940Nathan Mittler 179f80aec4d0a3986bb4506bbb1b51842a9a36f940Nathan Mittler#ifndef CONSCRYPT_SCOPEDSSLBIO_H_ 189f80aec4d0a3986bb4506bbb1b51842a9a36f940Nathan Mittler#define CONSCRYPT_SCOPEDSSLBIO_H_ 199f80aec4d0a3986bb4506bbb1b51842a9a36f940Nathan Mittler 209f80aec4d0a3986bb4506bbb1b51842a9a36f940Nathan Mittler#include <openssl/ssl.h> 219f80aec4d0a3986bb4506bbb1b51842a9a36f940Nathan Mittler 229f80aec4d0a3986bb4506bbb1b51842a9a36f940Nathan Mittlernamespace conscrypt { 239f80aec4d0a3986bb4506bbb1b51842a9a36f940Nathan Mittler 249f80aec4d0a3986bb4506bbb1b51842a9a36f940Nathan Mittler/* 259f80aec4d0a3986bb4506bbb1b51842a9a36f940Nathan Mittler * Sets the read and write BIO for an SSL connection and removes it when it goes out of scope. 269f80aec4d0a3986bb4506bbb1b51842a9a36f940Nathan Mittler * We hang on to BIO with a JNI GlobalRef and we want to remove them as soon as possible. 279f80aec4d0a3986bb4506bbb1b51842a9a36f940Nathan Mittler */ 289f80aec4d0a3986bb4506bbb1b51842a9a36f940Nathan Mittlerclass ScopedSslBio { 299f80aec4d0a3986bb4506bbb1b51842a9a36f940Nathan Mittlerpublic: 30c1e64b936526491fdc1836e7b0913f7514cdc378Kenny Root ScopedSslBio(SSL* ssl, BIO* rbio, BIO* wbio) : ssl_(ssl) { 319f80aec4d0a3986bb4506bbb1b51842a9a36f940Nathan Mittler SSL_set_bio(ssl_, rbio, wbio); 329f80aec4d0a3986bb4506bbb1b51842a9a36f940Nathan Mittler BIO_up_ref(rbio); 339f80aec4d0a3986bb4506bbb1b51842a9a36f940Nathan Mittler BIO_up_ref(wbio); 349f80aec4d0a3986bb4506bbb1b51842a9a36f940Nathan Mittler } 359f80aec4d0a3986bb4506bbb1b51842a9a36f940Nathan Mittler 369f80aec4d0a3986bb4506bbb1b51842a9a36f940Nathan Mittler ~ScopedSslBio() { 379f80aec4d0a3986bb4506bbb1b51842a9a36f940Nathan Mittler SSL_set_bio(ssl_, nullptr, nullptr); 389f80aec4d0a3986bb4506bbb1b51842a9a36f940Nathan Mittler } 399f80aec4d0a3986bb4506bbb1b51842a9a36f940Nathan Mittler 409f80aec4d0a3986bb4506bbb1b51842a9a36f940Nathan Mittlerprivate: 419f80aec4d0a3986bb4506bbb1b51842a9a36f940Nathan Mittler SSL* const ssl_; 429f80aec4d0a3986bb4506bbb1b51842a9a36f940Nathan Mittler}; 439f80aec4d0a3986bb4506bbb1b51842a9a36f940Nathan Mittler 44c1e64b936526491fdc1836e7b0913f7514cdc378Kenny Root} // namespace conscrypt 459f80aec4d0a3986bb4506bbb1b51842a9a36f940Nathan Mittler 469f80aec4d0a3986bb4506bbb1b51842a9a36f940Nathan Mittler#endif // CONSCRYPT_SCOPEDSSLBIO_H_ 47