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