1f878e438660d93f8689b864165230492e7a412d4Kenny Root/* 2f878e438660d93f8689b864165230492e7a412d4Kenny Root * Copyright (C) 2014 The Android Open Source Project 3f878e438660d93f8689b864165230492e7a412d4Kenny Root * 4f878e438660d93f8689b864165230492e7a412d4Kenny Root * Licensed under the Apache License, Version 2.0 (the "License"); 5f878e438660d93f8689b864165230492e7a412d4Kenny Root * you may not use this file except in compliance with the License. 6f878e438660d93f8689b864165230492e7a412d4Kenny Root * You may obtain a copy of the License at 7f878e438660d93f8689b864165230492e7a412d4Kenny Root * 8f878e438660d93f8689b864165230492e7a412d4Kenny Root * http://www.apache.org/licenses/LICENSE-2.0 9f878e438660d93f8689b864165230492e7a412d4Kenny Root * 10f878e438660d93f8689b864165230492e7a412d4Kenny Root * Unless required by applicable law or agreed to in writing, software 11f878e438660d93f8689b864165230492e7a412d4Kenny Root * distributed under the License is distributed on an "AS IS" BASIS, 12f878e438660d93f8689b864165230492e7a412d4Kenny Root * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f878e438660d93f8689b864165230492e7a412d4Kenny Root * See the License for the specific language governing permissions and 14f878e438660d93f8689b864165230492e7a412d4Kenny Root * limitations under the License. 15f878e438660d93f8689b864165230492e7a412d4Kenny Root */ 16f878e438660d93f8689b864165230492e7a412d4Kenny Root 17f878e438660d93f8689b864165230492e7a412d4Kenny Rootpackage org.conscrypt; 18f878e438660d93f8689b864165230492e7a412d4Kenny Root 19f878e438660d93f8689b864165230492e7a412d4Kenny Rootimport java.io.IOException; 20f878e438660d93f8689b864165230492e7a412d4Kenny Rootimport java.io.InputStream; 21f878e438660d93f8689b864165230492e7a412d4Kenny Rootimport java.nio.ByteBuffer; 22f878e438660d93f8689b864165230492e7a412d4Kenny Root 23f878e438660d93f8689b864165230492e7a412d4Kenny Rootpublic final class OpenSSLBIOSource { 24f878e438660d93f8689b864165230492e7a412d4Kenny Root private OpenSSLBIOInputStream source; 25f878e438660d93f8689b864165230492e7a412d4Kenny Root 26f878e438660d93f8689b864165230492e7a412d4Kenny Root public static OpenSSLBIOSource wrap(ByteBuffer buffer) { 27f878e438660d93f8689b864165230492e7a412d4Kenny Root return new OpenSSLBIOSource(new OpenSSLBIOInputStream(new ByteBufferInputStream(buffer))); 28f878e438660d93f8689b864165230492e7a412d4Kenny Root } 29f878e438660d93f8689b864165230492e7a412d4Kenny Root 30f878e438660d93f8689b864165230492e7a412d4Kenny Root public OpenSSLBIOSource(OpenSSLBIOInputStream source) { 31f878e438660d93f8689b864165230492e7a412d4Kenny Root this.source = source; 32f878e438660d93f8689b864165230492e7a412d4Kenny Root } 33f878e438660d93f8689b864165230492e7a412d4Kenny Root 34f878e438660d93f8689b864165230492e7a412d4Kenny Root public long getContext() { 35f878e438660d93f8689b864165230492e7a412d4Kenny Root return source.getBioContext(); 36f878e438660d93f8689b864165230492e7a412d4Kenny Root } 37f878e438660d93f8689b864165230492e7a412d4Kenny Root 38f878e438660d93f8689b864165230492e7a412d4Kenny Root public synchronized void release() { 39f878e438660d93f8689b864165230492e7a412d4Kenny Root if (source != null) { 40f878e438660d93f8689b864165230492e7a412d4Kenny Root NativeCrypto.BIO_free_all(source.getBioContext()); 41f878e438660d93f8689b864165230492e7a412d4Kenny Root source = null; 42f878e438660d93f8689b864165230492e7a412d4Kenny Root } 43f878e438660d93f8689b864165230492e7a412d4Kenny Root } 44f878e438660d93f8689b864165230492e7a412d4Kenny Root 45f878e438660d93f8689b864165230492e7a412d4Kenny Root @Override 46f878e438660d93f8689b864165230492e7a412d4Kenny Root protected void finalize() throws Throwable { 47f878e438660d93f8689b864165230492e7a412d4Kenny Root try { 48f878e438660d93f8689b864165230492e7a412d4Kenny Root release(); 49f878e438660d93f8689b864165230492e7a412d4Kenny Root } finally { 50f878e438660d93f8689b864165230492e7a412d4Kenny Root super.finalize(); 51f878e438660d93f8689b864165230492e7a412d4Kenny Root } 52f878e438660d93f8689b864165230492e7a412d4Kenny Root } 53f878e438660d93f8689b864165230492e7a412d4Kenny Root 54f878e438660d93f8689b864165230492e7a412d4Kenny Root private static class ByteBufferInputStream extends InputStream { 55f878e438660d93f8689b864165230492e7a412d4Kenny Root private final ByteBuffer source; 56f878e438660d93f8689b864165230492e7a412d4Kenny Root 57f878e438660d93f8689b864165230492e7a412d4Kenny Root public ByteBufferInputStream(ByteBuffer source) { 58f878e438660d93f8689b864165230492e7a412d4Kenny Root this.source = source; 59f878e438660d93f8689b864165230492e7a412d4Kenny Root } 60f878e438660d93f8689b864165230492e7a412d4Kenny Root 61f878e438660d93f8689b864165230492e7a412d4Kenny Root @Override 62f878e438660d93f8689b864165230492e7a412d4Kenny Root public int read() throws IOException { 63f878e438660d93f8689b864165230492e7a412d4Kenny Root if (source.remaining() > 0) { 64f878e438660d93f8689b864165230492e7a412d4Kenny Root return source.get(); 65f878e438660d93f8689b864165230492e7a412d4Kenny Root } else { 66f878e438660d93f8689b864165230492e7a412d4Kenny Root return -1; 67f878e438660d93f8689b864165230492e7a412d4Kenny Root } 68f878e438660d93f8689b864165230492e7a412d4Kenny Root } 69f878e438660d93f8689b864165230492e7a412d4Kenny Root 70f878e438660d93f8689b864165230492e7a412d4Kenny Root @Override 71f878e438660d93f8689b864165230492e7a412d4Kenny Root public int available() throws IOException { 72f878e438660d93f8689b864165230492e7a412d4Kenny Root return source.limit() - source.position(); 73f878e438660d93f8689b864165230492e7a412d4Kenny Root } 74f878e438660d93f8689b864165230492e7a412d4Kenny Root 75f878e438660d93f8689b864165230492e7a412d4Kenny Root @Override 76f878e438660d93f8689b864165230492e7a412d4Kenny Root public int read(byte[] buffer) throws IOException { 77f878e438660d93f8689b864165230492e7a412d4Kenny Root int originalPosition = source.position(); 78f878e438660d93f8689b864165230492e7a412d4Kenny Root source.get(buffer); 79f878e438660d93f8689b864165230492e7a412d4Kenny Root return source.position() - originalPosition; 80f878e438660d93f8689b864165230492e7a412d4Kenny Root } 81f878e438660d93f8689b864165230492e7a412d4Kenny Root 82f878e438660d93f8689b864165230492e7a412d4Kenny Root @Override 83f878e438660d93f8689b864165230492e7a412d4Kenny Root public int read(byte[] buffer, int byteOffset, int byteCount) throws IOException { 84f878e438660d93f8689b864165230492e7a412d4Kenny Root int toRead = Math.min(source.remaining(), byteCount); 85f878e438660d93f8689b864165230492e7a412d4Kenny Root int originalPosition = source.position(); 86f878e438660d93f8689b864165230492e7a412d4Kenny Root source.get(buffer, byteOffset, toRead); 87f878e438660d93f8689b864165230492e7a412d4Kenny Root return source.position() - originalPosition; 88f878e438660d93f8689b864165230492e7a412d4Kenny Root } 89f878e438660d93f8689b864165230492e7a412d4Kenny Root 90f878e438660d93f8689b864165230492e7a412d4Kenny Root @Override 91f878e438660d93f8689b864165230492e7a412d4Kenny Root public void reset() throws IOException { 92f878e438660d93f8689b864165230492e7a412d4Kenny Root source.reset(); 93f878e438660d93f8689b864165230492e7a412d4Kenny Root } 94f878e438660d93f8689b864165230492e7a412d4Kenny Root 95f878e438660d93f8689b864165230492e7a412d4Kenny Root @Override 96f878e438660d93f8689b864165230492e7a412d4Kenny Root public long skip(long byteCount) throws IOException { 97f878e438660d93f8689b864165230492e7a412d4Kenny Root int originalPosition = source.position(); 98f878e438660d93f8689b864165230492e7a412d4Kenny Root source.position((int) (originalPosition + byteCount)); 99f878e438660d93f8689b864165230492e7a412d4Kenny Root return source.position() - originalPosition; 100f878e438660d93f8689b864165230492e7a412d4Kenny Root } 101f878e438660d93f8689b864165230492e7a412d4Kenny Root } 102f878e438660d93f8689b864165230492e7a412d4Kenny Root} 103