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