196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project/* 296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * Copyright (C) 2014 The Android Open Source Project 396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * 496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * you may not use this file except in compliance with the License. 696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * You may obtain a copy of the License at 796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * 896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * 1096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 1196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 1296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * See the License for the specific language governing permissions and 1496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project * limitations under the License. 1596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project */ 1696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 1796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Projectpackage org.conscrypt; 1896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 1996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Projectimport java.io.ByteArrayOutputStream; 2096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 2196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Projectpublic final class OpenSSLBIOSink { 2296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project private final long ctx; 2396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project private final ByteArrayOutputStream buffer; 2496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project private int position; 2596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 2696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project public static OpenSSLBIOSink create() { 2796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project ByteArrayOutputStream buffer = new ByteArrayOutputStream(); 2896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project return new OpenSSLBIOSink(buffer); 2996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 3096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 3196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project private OpenSSLBIOSink(ByteArrayOutputStream buffer) { 3296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project ctx = NativeCrypto.create_BIO_OutputStream(buffer); 3396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project this.buffer = buffer; 3496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 3596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 3696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project public int available() { 3796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project return buffer.size() - position; 3896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 3996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 4096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project public void reset() { 4196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project buffer.reset(); 4296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project position = 0; 4396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 4496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 4596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project public long skip(long byteCount) { 4696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project int maxLength = Math.min(available(), (int) byteCount); 4796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project position += maxLength; 4896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project if (position == buffer.size()) { 4996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project reset(); 5096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 5196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project return maxLength; 5296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 5396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 5496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project public long getContext() { 5596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project return ctx; 5696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 5796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 5896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project public byte[] toByteArray() { 5996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project return buffer.toByteArray(); 6096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 6196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 6296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project public int position() { 6396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project return position; 6496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 6596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project 6696b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project @Override 6796b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project protected void finalize() throws Throwable { 6896b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project try { 6996b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project NativeCrypto.BIO_free_all(ctx); 7096b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } finally { 7196b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project super.finalize(); 7296b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 7396b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project } 7496b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project} 7596b00fec6cd6068c1c5ae09de0358340c0ec499eThe Android Open Source Project