Author: mturk Date: Sat Sep 24 14:53:50 2011 New Revision: 1175173 URL: http://svn.apache.org/viewvc?rev=1175173&view=rev Log: Add store files
Added: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/ssl/SSLCAStore.java (with props) commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/ssl/SSLCRLStore.java (with props) commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/ssl/SSLCannotDecryptException.java (with props) commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/ssl/SSLStore.java (with props) Modified: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/ssl/LocalStrings.properties commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/ssl/SSLCertificate.java commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/ssl/SSLContext.java commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/ssl/SSLKey.java commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/util/Ascii.java commons/sandbox/runtime/trunk/src/main/native/include/acr/error.h commons/sandbox/runtime/trunk/src/main/native/include/acr/ssl.h commons/sandbox/runtime/trunk/src/main/native/modules/openssl/cert.c commons/sandbox/runtime/trunk/src/main/native/modules/openssl/ctx.c commons/sandbox/runtime/trunk/src/main/native/modules/openssl/key.c commons/sandbox/runtime/trunk/src/main/native/modules/openssl/util.c commons/sandbox/runtime/trunk/src/main/native/shared/error.c commons/sandbox/runtime/trunk/src/main/test/org/apache/commons/runtime/TestOpenSSL.java Modified: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/ssl/LocalStrings.properties URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/ssl/LocalStrings.properties?rev=1175173&r1=1175172&r2=1175173&view=diff ============================================================================== --- commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/ssl/LocalStrings.properties (original) +++ commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/ssl/LocalStrings.properties Sat Sep 24 14:53:50 2011 @@ -19,4 +19,6 @@ fips.ENOTIMPL=FIPS was not available at password.PROMPT=Some of your private key files are encrypted for security reasons.\ \nIn order to read them you have to provide the pass phrases.\ \nEnter password : -sslctx.ENOCRLLOC=At least one of CARevocationFile or CARevocationPath must be configured. +sslctx.ENOCRLLOC=At least one of CARevocationFile or CARevocationPath must be configured +store.ENOTREG=File '{0}' does not exist or is empty +store.ENOTDIR=Path '{0}' is not directory Added: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/ssl/SSLCAStore.java URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/ssl/SSLCAStore.java?rev=1175173&view=auto ============================================================================== --- commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/ssl/SSLCAStore.java (added) +++ commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/ssl/SSLCAStore.java Sat Sep 24 14:53:50 2011 @@ -0,0 +1,35 @@ +/* Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.commons.runtime.ssl; + +/** + * Represents the SSL Certificate Authority (CA). + */ +public class SSLCAStore extends SSLStore +{ + + public SSLCAStore() + { + } + + @Override + public final void dispose() + { + // Nothing since we don't have + // native object wrapped. + } +} Propchange: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/ssl/SSLCAStore.java ------------------------------------------------------------------------------ svn:eol-style = native Added: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/ssl/SSLCRLStore.java URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/ssl/SSLCRLStore.java?rev=1175173&view=auto ============================================================================== --- commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/ssl/SSLCRLStore.java (added) +++ commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/ssl/SSLCRLStore.java Sat Sep 24 14:53:50 2011 @@ -0,0 +1,35 @@ +/* Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.commons.runtime.ssl; + +/** + * Represents the SSL Certificate Revocation Lists (CRL) store. + */ +public class SSLCRLStore extends SSLStore +{ + + public SSLCRLStore() + { + } + + @Override + public final void dispose() + { + // Nothing since we don't have + // native object wrapped. + } +} Propchange: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/ssl/SSLCRLStore.java ------------------------------------------------------------------------------ svn:eol-style = native Added: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/ssl/SSLCannotDecryptException.java URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/ssl/SSLCannotDecryptException.java?rev=1175173&view=auto ============================================================================== --- commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/ssl/SSLCannotDecryptException.java (added) +++ commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/ssl/SSLCannotDecryptException.java Sat Sep 24 14:53:50 2011 @@ -0,0 +1,40 @@ +/* Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.commons.runtime.ssl; +import org.apache.commons.runtime.InvalidDataException; + +/** + * Reports a bad SSL decryption attempt. + * Normally, this indicates invalid passphrase provided to + * the key or certificate. + * + * @since Runtime 1.0 + */ + +public class SSLCannotDecryptException extends InvalidDataException +{ + + public SSLCannotDecryptException() + { + super(); + } + + public SSLCannotDecryptException(String msg) + { + super(msg); + } +} Propchange: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/ssl/SSLCannotDecryptException.java ------------------------------------------------------------------------------ svn:eol-style = native Modified: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/ssl/SSLCertificate.java URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/ssl/SSLCertificate.java?rev=1175173&r1=1175172&r2=1175173&view=diff ============================================================================== --- commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/ssl/SSLCertificate.java (original) +++ commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/ssl/SSLCertificate.java Sat Sep 24 14:53:50 2011 @@ -31,9 +31,9 @@ public final class SSLCertificate extend private SSLCertificateFormat format; private static native long load0(String file, String desc, int format, long pcb) - throws SSLInvalidCertificateException; + throws SSLCannotDecryptException, SSLInvalidCertificateException; private static native long load1(String file, int format, String password) - throws SSLInvalidCertificateException; + throws SSLCannotDecryptException, SSLInvalidCertificateException; private static native void free0(long cert); /** @@ -55,7 +55,9 @@ public final class SSLCertificate extend } public synchronized void load(String file, SSLCertificateFormat format, PasswordCallback cb) - throws IllegalStateException, SSLInvalidCertificateException + throws IllegalStateException, + SSLCannotDecryptException, + SSLInvalidCertificateException { if (super.pointer != 0L) { // Already loaded @@ -66,7 +68,9 @@ public final class SSLCertificate extend } public synchronized void load(String file, SSLCertificateFormat format) - throws IllegalStateException, SSLInvalidCertificateException + throws IllegalStateException, + SSLCannotDecryptException, + SSLInvalidCertificateException { if (super.pointer != 0L) { // Already loaded @@ -77,7 +81,9 @@ public final class SSLCertificate extend } public synchronized void load(String file, SSLCertificateFormat format, String password) - throws IllegalStateException, SSLInvalidCertificateException + throws IllegalStateException, + SSLCannotDecryptException, + SSLInvalidCertificateException { if (super.pointer != 0L) { // Already loaded Modified: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/ssl/SSLContext.java URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/ssl/SSLContext.java?rev=1175173&r1=1175172&r2=1175173&view=diff ============================================================================== --- commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/ssl/SSLContext.java (original) +++ commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/ssl/SSLContext.java Sat Sep 24 14:53:50 2011 @@ -25,7 +25,6 @@ import org.apache.commons.runtime.Status import org.apache.commons.runtime.SystemException; import java.io.File; -import java.nio.ByteBuffer; /** * Contains the context structure for global default values for @@ -41,7 +40,6 @@ public final class SSLContext extends Na private final long pointer = 0L; private SSLKey[] keys; private SSLCertificate[] cert; - private boolean has_crlset = false; private static native long new0(int protocol, int mode) throws OperationNotImplementedException; @@ -53,11 +51,11 @@ public final class SSLContext extends Na private static native void setpasscb0(long ctx, long cb); private static native void setvmode0(long ctx, int mode, int depth); - private static final int SET_CTX_CA_CERT_FILE = 1; - private static final int SET_CTX_CA_CERT_PATH = 2; - private static final int SET_CTX_CRL_FILE = 3; - private static final int SET_CTX_CRL_PATH = 4; - private static final int SET_CTX_CIPHER_SUITE = 5; + private static final int SET_CTX_CA_CERT_FILE = 1; + private static final int SET_CTX_CA_CERT_PATH = 2; + private static final int SET_CTX_CRL_FILE = 3; + private static final int SET_CTX_CRL_PATH = 4; + private static final int SET_CTX_CIPHER_SUITE = 5; private static native void setstropt0(long ctx, int opt, String val); @@ -128,15 +126,25 @@ public final class SSLContext extends Na * which can be used e.g. for descriptions of the certificates. * * @param path PEM format file of CA's. + * + * @throws InvalidArgumentException if the file does not exist or is empty. + * @throws ObjectNotInitializedException if context is invalid + * @throws SecurityException if security manager denies access + * to the file */ public synchronized void setCACertificateFile(String path) - throws SSLException, ObjectNotInitializedException + throws InvalidArgumentException, + ObjectNotInitializedException, + SecurityException { if (super.pointer == 0L) throw new ObjectNotInitializedException(); if (path == null) throw new NullPointerException(); - setstropt0(super.pointer, SET_CTX_CA_CERT_FILE, path); + File file = new File(path); + if (!file.isFile() || file.length() == 0L) + throw new InvalidArgumentException(Local.sm.get("file.ENOTREG", path)); + setstropt0(super.pointer, SET_CTX_CA_CERT_FILE, file.getPath()); } /** @@ -158,17 +166,26 @@ public final class SSLContext extends Na * the verification of a peer certificate. * </p> * @param path PEM format directory of CA's. + * + * @throws InvalidArgumentException if the path does not exist or is not + * an directory. * @throws ObjectNotInitializedException if context is invalid - * @throws SSLException if path cannot be set + * @throws SecurityException if security manager denies access + * to the path */ public synchronized void setCACertificatePath(String path) - throws SSLException, ObjectNotInitializedException + throws InvalidArgumentException, + ObjectNotInitializedException, + SecurityException { if (super.pointer == 0L) throw new ObjectNotInitializedException(); if (path == null) throw new NullPointerException(); - setstropt0(super.pointer, SET_CTX_CA_CERT_PATH, path); + File file = new File(path); + if (!file.isDirectory()) + throw new InvalidArgumentException(Local.sm.get("file.ENOTDIR", path)); + setstropt0(super.pointer, SET_CTX_CA_CERT_PATH, file.getPath()); } /** @@ -185,13 +202,18 @@ public final class SSLContext extends Na * @throws SSLException if path cannot be set. */ public synchronized void setCARevocationFile(String path) - throws SSLException, ObjectNotInitializedException + throws InvalidArgumentException, + ObjectNotInitializedException, + SecurityException { if (super.pointer == 0L) throw new ObjectNotInitializedException(); if (path == null) throw new NullPointerException(); - setstropt0(super.pointer, SET_CTX_CRL_FILE, path); + File file = new File(path); + if (!file.isFile() || file.length() == 0L) + throw new InvalidArgumentException(Local.sm.get("file.ENOTREG", path)); + setstropt0(super.pointer, SET_CTX_CRL_FILE, file.getPath()); } /** @@ -205,13 +227,18 @@ public final class SSLContext extends Na * @throws SSLException if path cannot be set. */ public synchronized void setCARevocationPath(String path) - throws SSLException, ObjectNotInitializedException + throws InvalidArgumentException, + ObjectNotInitializedException, + SecurityException { if (super.pointer == 0L) throw new ObjectNotInitializedException(); if (path == null) throw new NullPointerException(); - setstropt0(super.pointer, SET_CTX_CRL_PATH, path); + File file = new File(path); + if (!file.isDirectory()) + throw new InvalidArgumentException(Local.sm.get("file.ENOTDIR", path)); + setstropt0(super.pointer, SET_CTX_CRL_PATH, file.getPath()); } /** @@ -230,8 +257,6 @@ public final class SSLContext extends Na { if (super.pointer == 0L) throw new ObjectNotInitializedException(); - if (!has_crlset) - throw new IllegalStateException(Local.sm.get("sslctx.ENOCRLLOC")); setcrlcheck0(super.pointer, mode.valueOf()); } Modified: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/ssl/SSLKey.java URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/ssl/SSLKey.java?rev=1175173&r1=1175172&r2=1175173&view=diff ============================================================================== --- commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/ssl/SSLKey.java (original) +++ commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/ssl/SSLKey.java Sat Sep 24 14:53:50 2011 @@ -30,9 +30,9 @@ public final class SSLKey extends Native private final String desc; private SSLKeyFormat format; private static native long load0(String file, String desc, int format, long pcb) - throws SSLInvalidKeyException; + throws SSLCannotDecryptException, SSLInvalidKeyException; private static native long load1(String file, int format, String password) - throws SSLInvalidKeyException; + throws SSLCannotDecryptException, SSLInvalidKeyException; private static native void free0(long key); /** @@ -54,7 +54,9 @@ public final class SSLKey extends Native } public synchronized void load(String file, SSLKeyFormat format, PasswordCallback cb) - throws IllegalStateException, SSLInvalidKeyException + throws IllegalStateException, + SSLCannotDecryptException, + SSLInvalidKeyException { if (super.pointer != 0L) { // Already loaded @@ -65,7 +67,9 @@ public final class SSLKey extends Native } public synchronized void load(String file, SSLKeyFormat format, String password) - throws IllegalStateException, SSLInvalidKeyException + throws IllegalStateException, + SSLCannotDecryptException, + SSLInvalidKeyException { if (super.pointer != 0L) { // Already loaded @@ -76,7 +80,9 @@ public final class SSLKey extends Native } public synchronized void load(String file, SSLKeyFormat format) - throws IllegalStateException, SSLInvalidKeyException + throws IllegalStateException, + SSLCannotDecryptException, + SSLInvalidKeyException { if (super.pointer != 0L) { // Already loaded @@ -87,7 +93,9 @@ public final class SSLKey extends Native } public void load(String file) - throws IllegalStateException, SSLInvalidKeyException + throws IllegalStateException, + SSLCannotDecryptException, + SSLInvalidKeyException { load(file, SSLKeyFormat.PEM); } Added: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/ssl/SSLStore.java URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/ssl/SSLStore.java?rev=1175173&view=auto ============================================================================== --- commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/ssl/SSLStore.java (added) +++ commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/ssl/SSLStore.java Sat Sep 24 14:53:50 2011 @@ -0,0 +1,97 @@ +/* Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.commons.runtime.ssl; + +import org.apache.commons.runtime.Disposable; +import org.apache.commons.runtime.InvalidArgumentException; +import org.apache.commons.runtime.InvalidDataException; + +import java.io.File; +import java.io.IOException; + +/** + * Abstract OpenSSL store. + */ +public abstract class SSLStore implements Disposable +{ + private File file; + private File path; + + protected SSLStore() + { + file = null; + path = null; + } + + /** + * Set this store file. + * + * @throws InvalidArgumentException if the file does not exist or is empty. + * @throws SecurityException if security manager denies access + * to the file + */ + public synchronized void setFile(String file) + throws InvalidArgumentException, + SecurityException + { + if (file == null) + throw new NullPointerException(); + this.file = new File(file); + if (!this.file.isFile() || this.file.length() == 0L) + throw new InvalidArgumentException(Local.sm.get("store.ENOTREG", path)); + } + + /** + * Set this store directory path. + * + * @throws InvalidArgumentException if the path does not exist or is not + * an directory. + * @throws SecurityException if security manager denies access + * to the file + */ + public synchronized void setPath(String path) + throws InvalidArgumentException, + SecurityException + { + if (path == null) + throw new NullPointerException(); + this.path = new File(path); + if (!this.path.isDirectory()) + throw new InvalidArgumentException(Local.sm.get("store.ENOTDIR", path)); + + } + + /** + * Get this store file path. + * + * @return file path or {@code null} if it wasn't set. + */ + public String getFile() + { + return file == null ? null : file.getPath(); + } + + /** + * Get this store directory path. + * + * @return directory path or {@code null} if it wasn't set. + */ + public String getPath() + { + return path == null ? null : path.getPath(); + } +} Propchange: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/ssl/SSLStore.java ------------------------------------------------------------------------------ svn:eol-style = native Modified: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/util/Ascii.java URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/util/Ascii.java?rev=1175173&r1=1175172&r2=1175173&view=diff ============================================================================== --- commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/util/Ascii.java (original) +++ commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/util/Ascii.java Sat Sep 24 14:53:50 2011 @@ -246,13 +246,25 @@ public final class Ascii } public static void tolower(byte[] arr, int srcPos, int len) + throws NullPointerException, + IndexOutOfBoundsException { + if (arr == null) + throw new NullPointerException(); + if (len < 0 || srcPos < 0 || srcPos + len > arr.length) + throw new IndexOutOfBoundsException(); for (int i = srcPos; i < len; i++) arr[i] = (byte)ccs_clower[(int)arr[i] & 0xff]; } public static void toupper(byte[] arr, int srcPos, int len) + throws NullPointerException, + IndexOutOfBoundsException { + if (arr == null) + throw new NullPointerException(); + if (len < 0 || srcPos < 0 || srcPos + len > arr.length) + throw new IndexOutOfBoundsException(); for (int i = srcPos; i < len; i++) arr[i] = (byte)ccs_cupper[(int)arr[i] & 0xff]; } @@ -271,19 +283,31 @@ public final class Ascii * @param base number base to use {@code (2 - 36)} or {@code 0} for guess. * * @return integer value of the {@code Ascii} string pointed by {@code arr}. + * + * @throws NullPointerException if {@code arr} is {@code null}. + * @throws IndexOutOfBoundsException if conversion would cause access + * outside array bounds. + * @throws NumberFormatException if input data cannot be converted. */ public static int atoi(byte[] arr, int srcPos, int len, int base) + throws NullPointerException, + IndexOutOfBoundsException, + NumberFormatException { - int acc; - int val; + int acc = 0; + int val = 0; + int any = 0; int neg; - int any; int i = srcPos; int c; + if (arr == null) + throw new NullPointerException(); + if (len < 0 || srcPos < 0 || srcPos + len > arr.length) + throw new IndexOutOfBoundsException(); + if (len == 0) + throw new NumberFormatException(); // Skip leading spaces - if (len < 1) - return 0; do { c = arr[i++]; } while (isspace(c) && i < len); @@ -294,16 +318,17 @@ public final class Ascii c = arr[i++]; else { // EINVAL - return 0; + throw new NumberFormatException(); } - } else { + } + else { neg = 0; if (c == '+') { if (i < len) c = arr[i++]; else { // EINVAL - return 0; + throw new NumberFormatException(); } } } @@ -316,17 +341,15 @@ public final class Ascii } else { // EINVAL - return 0; + throw new NumberFormatException(); } } if (base == 0) base = c == '0' ? 8 : 10; - acc = any = 0; if (base < 2 || base > 36) { // EINVAL - return acc; + throw new NumberFormatException(); } - val = 0; while (i <= len) { if (c >= '0' && c <= '9') c -= '0'; @@ -339,12 +362,13 @@ public final class Ascii if (c >= base) break; val *= base; - if ((any < 0) || /* already noted an over/under flow - short circuit */ - (neg != 0 && (val > acc || (val -= c) > acc)) || /* underflow */ - (neg == 0 && (val < acc || (val += c) < acc))) { /* overflow */ - any = -1; /* once noted, over/underflows never go away */ + if ((any < 0) || // already noted an over/under flow - short circuit + (neg != 0 && (val > acc || (val -= c) > acc)) || // underflow + (neg == 0 && (val < acc || (val += c) < acc))) { // overflow + any = -1; // once noted, over/underflows never go away break; - } else { + } + else { acc = val; any = 1; } @@ -355,8 +379,10 @@ public final class Ascii if (any < 0) { acc = neg == 0 ? Integer.MAX_VALUE : Integer.MIN_VALUE; - } else if (any == 0) { + } + else if (any == 0) { // EINVAL + throw new NumberFormatException(); } return acc; } @@ -375,19 +401,31 @@ public final class Ascii * @param base number base to use {@code (2 - 36)} or {@code 0} for guess. * * @return long value of the {@code Ascii} string pointed by {@code arr}. + * + * @throws NullPointerException if {@code arr} is {@code null}. + * @throws IndexOutOfBoundsException if conversion would cause access + * outside array bounds. + * @throws NumberFormatException if input data cannot be converted. */ public static long atol(byte[] arr, int srcPos, int len, int base) + throws NullPointerException, + IndexOutOfBoundsException, + NumberFormatException { - long acc; - long val; + long acc = 0L; + long val = 0L; + int any = 0; int neg; - int any; int i = srcPos; int c; + if (arr == null) + throw new NullPointerException(); + if (len < 0 || srcPos < 0 || srcPos + len > arr.length) + throw new IndexOutOfBoundsException(); + if (len == 0) + throw new NumberFormatException(); // Skip leading spaces - if (len < 1) - return 0; do { c = arr[i++]; } while (isspace(c) && i < len); @@ -398,16 +436,17 @@ public final class Ascii c = arr[i++]; else { // EINVAL - return 0; + throw new NumberFormatException(); } - } else { + } + else { neg = 0; if (c == '+') { if (i < len) c = arr[i++]; else { // EINVAL - return 0; + throw new NumberFormatException(); } } } @@ -420,17 +459,15 @@ public final class Ascii } else { // EINVAL - return 0; + throw new NumberFormatException(); } } if (base == 0) base = c == '0' ? 8 : 10; - acc = any = 0; if (base < 2 || base > 36) { // EINVAL - return acc; + throw new NumberFormatException(); } - val = 0; while (i <= len) { if (c >= '0' && c <= '9') c -= '0'; @@ -443,12 +480,13 @@ public final class Ascii if (c >= base) break; val *= base; - if ((any < 0) || /* already noted an over/under flow - short circuit */ - (neg != 0 && (val > acc || (val -= c) > acc)) || /* underflow */ - (neg == 0 && (val < acc || (val += c) < acc))) { /* overflow */ - any = -1; /* once noted, over/underflows never go away */ + if ((any < 0) || // already noted an over/under flow - short circuit + (neg != 0 && (val > acc || (val -= c) > acc)) || // underflow + (neg == 0 && (val < acc || (val += c) < acc))) { // overflow + any = -1; // once noted, over/underflows never go away break; - } else { + } + else { acc = val; any = 1; } @@ -458,9 +496,12 @@ public final class Ascii } if (any < 0) { + // EOVERFLOW acc = neg == 0 ? Long.MAX_VALUE : Long.MIN_VALUE; - } else if (any == 0) { + } + else if (any == 0) { // EINVAL + throw new NumberFormatException(); } return acc; } Modified: commons/sandbox/runtime/trunk/src/main/native/include/acr/error.h URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/include/acr/error.h?rev=1175173&r1=1175172&r2=1175173&view=diff ============================================================================== --- commons/sandbox/runtime/trunk/src/main/native/include/acr/error.h (original) +++ commons/sandbox/runtime/trunk/src/main/native/include/acr/error.h Sat Sep 24 14:53:50 2011 @@ -69,6 +69,7 @@ enum { ACR_EX_ECONNABORTED, /* ConnectionAbortedException */ ACR_EX_ECONNRESET, /* ConnectionResetException */ ACR_EX_ESSL, /* SSLException */ + ACR_EX_ESSLBADDEC, /* SSLCannotDecryptException */ ACR_EX_ESSLBADCERT, /* SSLInvalidCertificateException */ ACR_EX_ESSLBADKEY, /* SSLInvalidKeyException */ ACR_EX_LEN Modified: commons/sandbox/runtime/trunk/src/main/native/include/acr/ssl.h URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/include/acr/ssl.h?rev=1175173&r1=1175172&r2=1175173&view=diff ============================================================================== --- commons/sandbox/runtime/trunk/src/main/native/include/acr/ssl.h (original) +++ commons/sandbox/runtime/trunk/src/main/native/include/acr/ssl.h Sat Sep 24 14:53:50 2011 @@ -323,7 +323,7 @@ typedef struct acr_ssl_srv_t acr_ssl_ typedef struct acr_ssl_ctx_t { acr_refcount_t refs; int inited; - /* acr_ssl_obj_t */ + SSL_CTX *ctx; /* Pointer to the context verify store */ X509_STORE *store; @@ -482,6 +482,7 @@ void ssl_throw_errno(JNI_STDENV, void ssl_throw_errno_ex(JNI_STDENV, int cls, const char *fmt, ...); int ssl_obj_release(ssl_obj_t *); ssl_obj_t *ssl_obj_new(JNI_STDENV, int, void *); +void *ssl_obj_detach(ssl_obj_t *, int); #endif #endif /* _ACR_SSL_H_ */ Modified: commons/sandbox/runtime/trunk/src/main/native/modules/openssl/cert.c URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/modules/openssl/cert.c?rev=1175173&r1=1175172&r2=1175173&view=diff ============================================================================== --- commons/sandbox/runtime/trunk/src/main/native/modules/openssl/cert.c (original) +++ commons/sandbox/runtime/trunk/src/main/native/modules/openssl/cert.c Sat Sep 24 14:53:50 2011 @@ -85,8 +85,13 @@ ACR_SSL_EXPORT(jlong, SSLCertificate, lo WITH_CSTR(desc) { /* Load key */ cert = load_cert(cb, format, J2S(file), J2S(desc)); - if (cert == 0) - ssl_throw_errno(env, ACR_EX_ESSLBADCERT); + if (cert == 0) { + int reason = ERR_GET_REASON(ERR_peek_error()); + if (reason == EVP_R_BAD_DECRYPT) + ssl_throw_errno(env, ACR_EX_ESSLBADDEC); + else + ssl_throw_errno(env, ACR_EX_ESSLBADKEY); + } } DONE_WITH_STR(desc); } DONE_WITH_STR(file); @@ -108,8 +113,13 @@ ACR_SSL_EXPORT(jlong, SSLCertificate, lo } /* Load key */ cert = load_cert(&cb, format, J2S(file), 0); - if (cert == 0) - ssl_throw_errno(env, ACR_EX_ESSLBADCERT); + if (cert == 0) { + int reason = ERR_GET_REASON(ERR_peek_error()); + if (reason == EVP_R_BAD_DECRYPT) + ssl_throw_errno(env, ACR_EX_ESSLBADDEC); + else + ssl_throw_errno(env, ACR_EX_ESSLBADKEY); + } } DONE_WITH_STR(password); } DONE_WITH_STR(file); Modified: commons/sandbox/runtime/trunk/src/main/native/modules/openssl/ctx.c URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/modules/openssl/ctx.c?rev=1175173&r1=1175172&r2=1175173&view=diff ============================================================================== --- commons/sandbox/runtime/trunk/src/main/native/modules/openssl/ctx.c (original) +++ commons/sandbox/runtime/trunk/src/main/native/modules/openssl/ctx.c Sat Sep 24 14:53:50 2011 @@ -456,3 +456,4 @@ ACR_SSL_EXPORT(void, SSLContext, setscac else SSL_CTX_sess_set_cache_size(c->ctx, size); } + Modified: commons/sandbox/runtime/trunk/src/main/native/modules/openssl/key.c URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/modules/openssl/key.c?rev=1175173&r1=1175172&r2=1175173&view=diff ============================================================================== --- commons/sandbox/runtime/trunk/src/main/native/modules/openssl/key.c (original) +++ commons/sandbox/runtime/trunk/src/main/native/modules/openssl/key.c Sat Sep 24 14:53:50 2011 @@ -86,8 +86,13 @@ ACR_SSL_EXPORT(jlong, SSLKey, load0)(JNI WITH_CSTR(desc) { /* Load key */ key = load_key(cb, format, J2S(file), J2S(desc)); - if (key == 0) - ssl_throw_errno(env, ACR_EX_ESSLBADKEY); + if (key == 0) { + int reason = ERR_GET_REASON(ERR_peek_error()); + if (reason == EVP_R_BAD_DECRYPT) + ssl_throw_errno(env, ACR_EX_ESSLBADDEC); + else + ssl_throw_errno(env, ACR_EX_ESSLBADKEY); + } } DONE_WITH_STR(desc); } DONE_WITH_STR(file); @@ -109,8 +114,13 @@ ACR_SSL_EXPORT(jlong, SSLKey, load1)(JNI } /* Load key */ key = load_key(&cb, format, J2S(file), 0); - if (key == 0) - ssl_throw_errno(env, ACR_EX_ESSLBADKEY); + if (key == 0) { + int reason = ERR_GET_REASON(ERR_peek_error()); + if (reason == EVP_R_BAD_DECRYPT) + ssl_throw_errno(env, ACR_EX_ESSLBADDEC); + else + ssl_throw_errno(env, ACR_EX_ESSLBADKEY); + } } DONE_WITH_STR(password); } DONE_WITH_STR(file); Modified: commons/sandbox/runtime/trunk/src/main/native/modules/openssl/util.c URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/modules/openssl/util.c?rev=1175173&r1=1175172&r2=1175173&view=diff ============================================================================== --- commons/sandbox/runtime/trunk/src/main/native/modules/openssl/util.c (original) +++ commons/sandbox/runtime/trunk/src/main/native/modules/openssl/util.c Sat Sep 24 14:53:50 2011 @@ -507,3 +507,16 @@ ssl_obj_t *ssl_obj_new(JNI_STDENV, int t } return o; } + +void *ssl_obj_detach(ssl_obj_t *o, int destroy) +{ + void *p; + if (o == 0) + return 0; + p = o->u.any; + o->u.any = 0; + if (destroy) + ssl_obj_release(o); + return p; +} + Modified: commons/sandbox/runtime/trunk/src/main/native/shared/error.c URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/shared/error.c?rev=1175173&r1=1175172&r2=1175173&view=diff ============================================================================== --- commons/sandbox/runtime/trunk/src/main/native/shared/error.c (original) +++ commons/sandbox/runtime/trunk/src/main/native/shared/error.c Sat Sep 24 14:53:50 2011 @@ -63,6 +63,8 @@ static struct { { 0, ACR_NET_CP "ConnectionAbortedException" }, /* ECONNABORTED */ { 0, ACR_NET_CP "ConnectionResetException" }, /* ECONNRESET */ { 0, ACR_SSL_CP "SSLException" }, /* ESSL */ + { 0, ACR_SSL_CP "SSLCannotDecryptException" }, /* ESSLBADDEC */ + { 0, ACR_SSL_CP "SSLInvalidCertificateException" }, /* ESSLBADCERT */ { 0, ACR_SSL_CP "SSLInvalidKeyException" } /* ESSLBADKEY */ }; Modified: commons/sandbox/runtime/trunk/src/main/test/org/apache/commons/runtime/TestOpenSSL.java URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/test/org/apache/commons/runtime/TestOpenSSL.java?rev=1175173&r1=1175172&r2=1175173&view=diff ============================================================================== --- commons/sandbox/runtime/trunk/src/main/test/org/apache/commons/runtime/TestOpenSSL.java (original) +++ commons/sandbox/runtime/trunk/src/main/test/org/apache/commons/runtime/TestOpenSSL.java Sat Sep 24 14:53:50 2011 @@ -49,17 +49,26 @@ public class TestOpenSSL extends Assert } } - public class TestPointer extends NativePointer + public abstract class AbstractTestPointer extends NativePointer { // Hide NativePointer private final long pointer = 0L; - public TestPointer() + public AbstractTestPointer() { super.pointer = 1234L; } + } + + public class TestPointer extends AbstractTestPointer + { + public TestPointer() + { + ((NativePointer)this).pointer = 5678L; + } + public void dispose() { - super.pointer = 0L; + ((NativePointer)this).pointer = 0L; } } @@ -84,7 +93,7 @@ public class TestOpenSSL extends Assert public void nativePointer() { TestPointer p = new TestPointer(); - assertEquals(((NativePointer)p).pointer, 1234L); + assertEquals(((NativePointer)p).pointer, 5678L); ((NativePointer)p).pointer = 0L; assertEquals(((NativePointer)p).pointer, 0L); }