# HG changeset patch # User lana # Date 1406055327 25200 # Node ID b08ff6ffcc26e87f07532da15d6b14e6969c3fc2 # Parent d9ce05f36ffec3e5e8af62a92455c1c66a63c320# Parent 0646dc563d47e78b80326b6bf309fc20252f2f45 Merge diff -r d9ce05f36ffe -r b08ff6ffcc26 jdk/src/share/classes/com/sun/jndi/toolkit/corba/CorbaUtils.java --- a/jdk/src/share/classes/com/sun/jndi/toolkit/corba/CorbaUtils.java Wed Jul 05 19:51:30 2017 +0200 +++ b/jdk/src/share/classes/com/sun/jndi/toolkit/corba/CorbaUtils.java Tue Jul 22 11:55:27 2014 -0700 @@ -55,7 +55,6 @@ * Returns the CORBA object reference associated with a Remote * object by using the javax.rmi.CORBA package. *

- * Use reflection to avoid hard dependencies on javax.rmi.CORBA package. * This method effective does the following: *

       * java.lang.Object stub;
diff -r d9ce05f36ffe -r b08ff6ffcc26 jdk/src/share/classes/com/sun/security/auth/module/Krb5LoginModule.java
--- a/jdk/src/share/classes/com/sun/security/auth/module/Krb5LoginModule.java	Wed Jul 05 19:51:30 2017 +0200
+++ b/jdk/src/share/classes/com/sun/security/auth/module/Krb5LoginModule.java	Tue Jul 22 11:55:27 2014 -0700
@@ -33,7 +33,10 @@
 import java.util.*;
 
 import javax.security.auth.*;
-import javax.security.auth.kerberos.*;
+import javax.security.auth.kerberos.KerberosTicket;
+import javax.security.auth.kerberos.KerberosPrincipal;
+import javax.security.auth.kerberos.KerberosKey;
+import javax.security.auth.kerberos.KeyTab;
 import javax.security.auth.callback.*;
 import javax.security.auth.login.*;
 import javax.security.auth.spi.*;
diff -r d9ce05f36ffe -r b08ff6ffcc26 jdk/src/share/classes/com/sun/security/jgss/ExtendedGSSContext.java
--- a/jdk/src/share/classes/com/sun/security/jgss/ExtendedGSSContext.java	Wed Jul 05 19:51:30 2017 +0200
+++ b/jdk/src/share/classes/com/sun/security/jgss/ExtendedGSSContext.java	Tue Jul 22 11:55:27 2014 -0700
@@ -36,33 +36,7 @@
 public interface ExtendedGSSContext extends GSSContext {
     /**
      * Return the mechanism-specific attribute associated with {@code type}.
-     * 

- * For each supported attribute type, the type for the output are - * defined below. - *
    - *
  1. {@code KRB5_GET_TKT_FLAGS}: - * the returned object is a boolean array for the service ticket flags, - * which is long enough to contain all true bits. This means if - * the user wants to get the n'th bit but the length of the - * returned array is less than n, it is regarded as false. - *
  2. {@code KRB5_GET_SESSION_KEY}: - * the returned object is an instance of {@link java.security.Key}, - * which has the following properties: - *
      - *
    • Algorithm: enctype as a string, where - * enctype is defined in RFC 3961, section 8. - *
    • Format: "RAW" - *
    • Encoded form: the raw key bytes, not in any ASN.1 encoding - *
    - *
  3. {@code KRB5_GET_AUTHZ_DATA}: - * the returned object is an array of - * {@link com.sun.security.jgss.AuthorizationDataEntry}, or null if the - * optional field is missing in the service ticket. - *
  4. {@code KRB5_GET_AUTHTIME}: - * the returned object is a String object in the standard KerberosTime - * format defined in RFC 4120 5.2.3 - *
- * + *

* If there is a security manager, an {@link InquireSecContextPermission} * with the name {@code type.mech} must be granted. Otherwise, this could * result in a {@link SecurityException}.

@@ -97,6 +71,7 @@ * @throws SecurityException if a security manager exists and a proper * {@link InquireSecContextPermission} is not granted. * @see InquireSecContextPermission + * @see InquireType */ public Object inquireSecContext(InquireType type) throws GSSException; diff -r d9ce05f36ffe -r b08ff6ffcc26 jdk/src/share/classes/com/sun/security/jgss/InquireType.java --- a/jdk/src/share/classes/com/sun/security/jgss/InquireType.java Wed Jul 05 19:51:30 2017 +0200 +++ b/jdk/src/share/classes/com/sun/security/jgss/InquireType.java Tue Jul 22 11:55:27 2014 -0700 @@ -32,13 +32,38 @@ @jdk.Exported public enum InquireType { /** - * Attribute type for retrieving the session key of an - * established Kerberos 5 security context. + * Attribute type for retrieving the session key of an established + * Kerberos 5 security context. The returned object is an instance of + * {@link java.security.Key}, which has the following properties: + *

+ * @deprecated as of 1.9, replaced by {@link #KRB5_GET_SESSION_KEY_EX} + * which returns an instance of + * {@link sun.security.jgss.krb5.Krb5Context.EncryptionKey} + * that implements the {@link javax.crypto.SecretKey} interface and + * has similar methods with {@link javax.security.auth.kerberos.KerberosKey}. */ + @Deprecated KRB5_GET_SESSION_KEY, /** + * Attribute type for retrieving the session key of an + * established Kerberos 5 security context. The return value is an + * instance of {@link javax.security.auth.kerberos.EncryptionKey}. + * + * @since 1.9 + */ + KRB5_GET_SESSION_KEY_EX, + /** * Attribute type for retrieving the service ticket flags of an - * established Kerberos 5 security context. + * established Kerberos 5 security context. The returned object is + * a boolean array for the service ticket flags, which is long enough + * to contain all true bits. This means if the user wants to get the + * n'th bit but the length of the returned array is less than + * n, it is regarded as false. */ KRB5_GET_TKT_FLAGS, /** @@ -49,7 +74,17 @@ KRB5_GET_AUTHZ_DATA, /** * Attribute type for retrieving the authtime in the service ticket - * of an established Kerberos 5 security context. + * of an established Kerberos 5 security context. The returned object + * is a String object in the standard KerberosTime format defined in + * RFC 4120 Section 5.2.3. */ - KRB5_GET_AUTHTIME + KRB5_GET_AUTHTIME, + /** + * Attribute type for retrieving the KRB_CRED message that an initiator + * is about to send to an acceptor. The return type is an instance of + * {@link javax.security.auth.kerberos.KerberosCredMessage}. + * + * @since 1.9 + */ + KRB5_GET_KRB_CRED, } diff -r d9ce05f36ffe -r b08ff6ffcc26 jdk/src/share/classes/java/lang/Integer.java --- a/jdk/src/share/classes/java/lang/Integer.java Wed Jul 05 19:51:30 2017 +0200 +++ b/jdk/src/share/classes/java/lang/Integer.java Tue Jul 22 11:55:27 2014 -0700 @@ -26,6 +26,7 @@ package java.lang; import java.lang.annotation.Native; +import java.util.Objects; /** * The {@code Integer} class wraps a value of the primitive type @@ -319,24 +320,27 @@ } /** - * Format a long (treated as unsigned) into a character buffer. + * Format an {@code int} (treated as unsigned) into a character buffer. If + * {@code len} exceeds the formatted ASCII representation of {@code val}, + * {@code buf} will be padded with leading zeroes. + * * @param val the unsigned int to format * @param shift the log2 of the base to format in (4 for hex, 3 for octal, 1 for binary) * @param buf the character buffer to write to * @param offset the offset in the destination buffer to start at * @param len the number of characters to write - * @return the lowest character location used */ - static int formatUnsignedInt(int val, int shift, char[] buf, int offset, int len) { - int charPos = len; + static void formatUnsignedInt(int val, int shift, char[] buf, int offset, int len) { + // assert shift > 0 && shift <=5 : "Illegal shift value"; + // assert offset >= 0 && offset < buf.length : "illegal offset"; + // assert len > 0 && (offset + len) <= buf.length : "illegal length"; + int charPos = offset + len; int radix = 1 << shift; int mask = radix - 1; do { - buf[offset + --charPos] = Integer.digits[val & mask]; + buf[--charPos] = Integer.digits[val & mask]; val >>>= shift; - } while (val != 0 && charPos > 0); - - return charPos; + } while (charPos > offset); } final static char [] DigitTens = { @@ -549,12 +553,9 @@ " greater than Character.MAX_RADIX"); } - int result = 0; boolean negative = false; int i = 0, len = s.length(); int limit = -Integer.MAX_VALUE; - int multmin; - int digit; if (len > 0) { char firstChar = s.charAt(0); @@ -562,21 +563,21 @@ if (firstChar == '-') { negative = true; limit = Integer.MIN_VALUE; - } else if (firstChar != '+') + } else if (firstChar != '+') { throw NumberFormatException.forInputString(s); + } - if (len == 1) // Cannot have lone "+" or "-" + if (len == 1) { // Cannot have lone "+" or "-" throw NumberFormatException.forInputString(s); + } i++; } - multmin = limit / radix; + int multmin = limit / radix; + int result = 0; while (i < len) { // Accumulating negatively avoids surprises near MAX_VALUE - digit = Character.digit(s.charAt(i++),radix); - if (digit < 0) { - throw NumberFormatException.forInputString(s); - } - if (result < multmin) { + int digit = Character.digit(s.charAt(i++), radix); + if (digit < 0 || result < multmin) { throw NumberFormatException.forInputString(s); } result *= radix; @@ -585,10 +586,126 @@ } result -= digit; } + return negative ? result : -result; } else { throw NumberFormatException.forInputString(s); } - return negative ? result : -result; + } + + /** + * Parses the {@link CharSequence} argument as a signed {@code int} in the + * specified {@code radix}, beginning at the specified {@code beginIndex} + * and extending to the end of the sequence. + * + *

The method does not take steps to guard against the + * {@code CharSequence} being mutated while parsing. + * + * @param s the {@code CharSequence} containing the {@code int} + * representation to be parsed + * @param radix the radix to be used while parsing {@code s}. + * @param beginIndex the beginning index, inclusive. + * @return the signed {@code int} represented by the subsequence in + * the specified radix. + * @throws NullPointerException if {@code s} is null. + * @throws IndexOutOfBoundsException if {@code beginIndex} is + * negative, or if {@code beginIndex} is greater than + * {@code s.length()}. + * @throws NumberFormatException if the {@code CharSequence} does not + * contain a parsable {@code int} in the specified + * {@code radix}, or if {@code radix} is either smaller than + * {@link java.lang.Character#MIN_RADIX} or larger than + * {@link java.lang.Character#MAX_RADIX}. + * @since 1.9 + */ + public static int parseInt(CharSequence s, int radix, int beginIndex) + throws NumberFormatException { + // forces an implicit null check of s + return parseInt(s, radix, beginIndex, s.length()); + } + + /** + * Parses the {@link CharSequence} argument as a signed {@code int} in the + * specified {@code radix}, beginning at the specified {@code beginIndex} + * and extending to {@code endIndex - 1}. + * + *

The method does not take steps to guard against the + * {@code CharSequence} being mutated while parsing. + * + * @param s the {@code CharSequence} containing the {@code int} + * representation to be parsed + * @param radix the radix to be used while parsing {@code s}. + * @param beginIndex the beginning index, inclusive. + * @param endIndex the ending index, exclusive. + * @return the signed {@code int} represented by the subsequence in + * the specified radix. + * @throws NullPointerException if {@code s} is null. + * @throws IndexOutOfBoundsException if {@code beginIndex} is + * negative, or if {@code beginIndex} is greater than + * {@code endIndex} or if {@code endIndex} is greater than + * {@code s.length()}. + * @throws NumberFormatException if the {@code CharSequence} does not + * contain a parsable {@code int} in the specified + * {@code radix}, or if {@code radix} is either smaller than + * {@link java.lang.Character#MIN_RADIX} or larger than + * {@link java.lang.Character#MAX_RADIX}. + * @since 1.9 + */ + public static int parseInt(CharSequence s, int radix, int beginIndex, int endIndex) + throws NumberFormatException { + s = Objects.requireNonNull(s); + + if (beginIndex < 0 || beginIndex > endIndex || endIndex > s.length()) { + throw new IndexOutOfBoundsException(); + } + if (radix < Character.MIN_RADIX) { + throw new NumberFormatException("radix " + radix + + " less than Character.MIN_RADIX"); + } + if (radix > Character.MAX_RADIX) { + throw new NumberFormatException("radix " + radix + + " greater than Character.MAX_RADIX"); + } + + boolean negative = false; + int i = beginIndex; + int limit = -Integer.MAX_VALUE; + + if (i < endIndex) { + char firstChar = s.charAt(i); + if (firstChar < '0') { // Possible leading "+" or "-" + if (firstChar == '-') { + negative = true; + limit = Integer.MIN_VALUE; + } else if (firstChar != '+') { + throw NumberFormatException.forCharSequence(s, beginIndex, + endIndex, i); + } + i++; + if (i == endIndex) { // Cannot have lone "+" or "-" + throw NumberFormatException.forCharSequence(s, beginIndex, + endIndex, i); + } + } + int multmin = limit / radix; + int result = 0; + while (i < endIndex) { + // Accumulating negatively avoids surprises near MAX_VALUE + int digit = Character.digit(s.charAt(i++), radix); + if (digit < 0 || result < multmin) { + throw NumberFormatException.forCharSequence(s, beginIndex, + endIndex, i); + } + result *= radix; + if (result < limit + digit) { + throw NumberFormatException.forCharSequence(s, beginIndex, + endIndex, i); + } + result -= digit; + } + return negative ? result : -result; + } else { + throw NumberFormatException.forInputString(""); + } } /** @@ -689,6 +806,99 @@ } /** + * Parses the {@link CharSequence} argument as an unsigned {@code int} in + * the specified {@code radix}, beginning at the specified + * {@code beginIndex} and extending to the end of the sequence. + * + *

The method does not take steps to guard against the + * {@code CharSequence} being mutated while parsing. + * + * @param s the {@code CharSequence} containing the unsigned + * {@code int} representation to be parsed + * @param radix the radix to be used while parsing {@code s}. + * @param beginIndex the beginning index, inclusive. + * @return the unsigned {@code int} represented by the subsequence in + * the specified radix. + * @throws NullPointerException if {@code s} is null. + * @throws IndexOutOfBoundsException if {@code beginIndex} is + * negative, or if {@code beginIndex} is greater than + * {@code s.length()}. + * @throws NumberFormatException if the {@code CharSequence} does not + * contain a parsable unsigned {@code int} in the specified + * {@code radix}, or if {@code radix} is either smaller than + * {@link java.lang.Character#MIN_RADIX} or larger than + * {@link java.lang.Character#MAX_RADIX}. + * @since 1.9 + */ + public static int parseUnsignedInt(CharSequence s, int radix, int beginIndex) + throws NumberFormatException { + // forces an implicit null check of s + return parseUnsignedInt(s, radix, beginIndex, s.length()); + } + + /** + * Parses the {@link CharSequence} argument as an unsigned {@code int} in + * the specified {@code radix}, beginning at the specified + * {@code beginIndex} and extending to {@code endIndex - 1}. + * + *

The method does not take steps to guard against the + * {@code CharSequence} being mutated while parsing. + * + * @param s the {@code CharSequence} containing the unsigned + * {@code int} representation to be parsed + * @param radix the radix to be used while parsing {@code s}. + * @param beginIndex the beginning index, inclusive. + * @param endIndex the ending index, exclusive. + * @return the unsigned {@code int} represented by the subsequence in + * the specified radix. + * @throws NullPointerException if {@code s} is null. + * @throws IndexOutOfBoundsException if {@code beginIndex} is + * negative, or if {@code beginIndex} is greater than + * {@code endIndex} or if {@code endIndex} is greater than + * {@code s.length()}. + * @throws NumberFormatException if the {@code CharSequence} does not + * contain a parsable unsigned {@code int} in the specified + * {@code radix}, or if {@code radix} is either smaller than + * {@link java.lang.Character#MIN_RADIX} or larger than + * {@link java.lang.Character#MAX_RADIX}. + * @since 1.9 + */ + public static int parseUnsignedInt(CharSequence s, int radix, int beginIndex, int endIndex) + throws NumberFormatException { + s = Objects.requireNonNull(s); + + if (beginIndex < 0 || beginIndex > endIndex || endIndex > s.length()) { + throw new IndexOutOfBoundsException(); + } + int start = beginIndex, len = endIndex - beginIndex; + + if (len > 0) { + char firstChar = s.charAt(start); + if (firstChar == '-') { + throw new + NumberFormatException(String.format("Illegal leading minus sign " + + "on unsigned string %s.", s)); + } else { + if (len <= 5 || // Integer.MAX_VALUE in Character.MAX_RADIX is 6 digits + (radix == 10 && len <= 9)) { // Integer.MAX_VALUE in base 10 is 10 digits + return parseInt(s, radix, start, start + len); + } else { + long ell = Long.parseLong(s, radix, start, start + len); + if ((ell & 0xffff_ffff_0000_0000L) == 0) { + return (int) ell; + } else { + throw new + NumberFormatException(String.format("String value %s exceeds " + + "range of unsigned int.", s)); + } + } + } + } else { + throw new NumberFormatException(""); + } + } + + /** * Parses the string argument as an unsigned decimal integer. The * characters in the string must all be decimal digits, except * that the first character may be an an ASCII plus sign {@code diff -r d9ce05f36ffe -r b08ff6ffcc26 jdk/src/share/classes/java/lang/Long.java --- a/jdk/src/share/classes/java/lang/Long.java Wed Jul 05 19:51:30 2017 +0200 +++ b/jdk/src/share/classes/java/lang/Long.java Tue Jul 22 11:55:27 2014 -0700 @@ -27,6 +27,7 @@ import java.lang.annotation.Native; import java.math.*; +import java.util.Objects; /** @@ -360,24 +361,27 @@ } /** - * Format a long (treated as unsigned) into a character buffer. + * Format a long (treated as unsigned) into a character buffer. If + * {@code len} exceeds the formatted ASCII representation of {@code val}, + * {@code buf} will be padded with leading zeroes. + * * @param val the unsigned long to format * @param shift the log2 of the base to format in (4 for hex, 3 for octal, 1 for binary) * @param buf the character buffer to write to * @param offset the offset in the destination buffer to start at * @param len the number of characters to write - * @return the lowest character location used */ - static int formatUnsignedLong(long val, int shift, char[] buf, int offset, int len) { - int charPos = len; + static void formatUnsignedLong(long val, int shift, char[] buf, int offset, int len) { + // assert shift > 0 && shift <=5 : "Illegal shift value"; + // assert offset >= 0 && offset < buf.length : "illegal offset"; + // assert len > 0 && (offset + len) <= buf.length : "illegal length"; + int charPos = offset + len; int radix = 1 << shift; int mask = radix - 1; do { - buf[offset + --charPos] = Integer.digits[((int) val) & mask]; + buf[--charPos] = Integer.digits[((int) val) & mask]; val >>>= shift; - } while (val != 0 && charPos > 0); - - return charPos; + } while (charPos > offset); } /** @@ -561,12 +565,9 @@ " greater than Character.MAX_RADIX"); } - long result = 0; boolean negative = false; int i = 0, len = s.length(); long limit = -Long.MAX_VALUE; - long multmin; - int digit; if (len > 0) { char firstChar = s.charAt(0); @@ -574,21 +575,21 @@ if (firstChar == '-') { negative = true; limit = Long.MIN_VALUE; - } else if (firstChar != '+') + } else if (firstChar != '+') { throw NumberFormatException.forInputString(s); + } - if (len == 1) // Cannot have lone "+" or "-" + if (len == 1) { // Cannot have lone "+" or "-" throw NumberFormatException.forInputString(s); + } i++; } - multmin = limit / radix; + long multmin = limit / radix; + long result = 0; while (i < len) { // Accumulating negatively avoids surprises near MAX_VALUE - digit = Character.digit(s.charAt(i++),radix); - if (digit < 0) { - throw NumberFormatException.forInputString(s); - } - if (result < multmin) { + int digit = Character.digit(s.charAt(i++),radix); + if (digit < 0 || result < multmin) { throw NumberFormatException.forInputString(s); } result *= radix; @@ -597,10 +598,126 @@ } result -= digit; } + return negative ? result : -result; } else { throw NumberFormatException.forInputString(s); } - return negative ? result : -result; + } + + /** + * Parses the {@link CharSequence} argument as a signed {@code long} in + * the specified {@code radix}, beginning at the specified {@code beginIndex} + * and extending to the end of the sequence. + * + *

The method does not take steps to guard against the + * {@code CharSequence} being mutated while parsing. + * + * @param s the {@code CharSequence} containing the {@code long} + * representation to be parsed + * @param radix the radix to be used while parsing {@code s}. + * @param beginIndex the beginning index, inclusive. + * @return the signed {@code long} represented by the subsequence in + * the specified radix. + * @throws NullPointerException if {@code s} is null. + * @throws IndexOutOfBoundsException if {@code beginIndex} is + * negative, or if {@code beginIndex} is greater than + * {@code s.length()}. + * @throws NumberFormatException if the {@code CharSequence} does not + * contain a parsable {@code long} in the specified + * {@code radix}, or if {@code radix} is either smaller than + * {@link java.lang.Character#MIN_RADIX} or larger than + * {@link java.lang.Character#MAX_RADIX}. + * @since 1.9 + */ + public static long parseLong(CharSequence s, int radix, int beginIndex) + throws NumberFormatException { + // forces a null check of s + return parseLong(s, radix, beginIndex, s.length()); + } + + /** + * Parses the {@link CharSequence} argument as a signed {@code long} in + * the specified {@code radix}, beginning at the specified + * {@code beginIndex} and extending to {@code endIndex - 1}. + * + *

The method does not take steps to guard against the + * {@code CharSequence} being mutated while parsing. + * + * @param s the {@code CharSequence} containing the {@code long} + * representation to be parsed + * @param radix the radix to be used while parsing {@code s}. + * @param beginIndex the beginning index, inclusive. + * @param endIndex the ending index, exclusive. + * @return the signed {@code long} represented by the subsequence in + * the specified radix. + * @throws NullPointerException if {@code s} is null. + * @throws IndexOutOfBoundsException if {@code beginIndex} is + * negative, or if {@code beginIndex} is greater than + * {@code endIndex} or if {@code endIndex} is greater than + * {@code s.length()}. + * @throws NumberFormatException if the {@code CharSequence} does not + * contain a parsable {@code int} in the specified + * {@code radix}, or if {@code radix} is either smaller than + * {@link java.lang.Character#MIN_RADIX} or larger than + * {@link java.lang.Character#MAX_RADIX}. + * @since 1.9 + */ + public static long parseLong(CharSequence s, int radix, int beginIndex, int endIndex) + throws NumberFormatException { + s = Objects.requireNonNull(s); + + if (beginIndex < 0 || beginIndex > endIndex || endIndex > s.length()) { + throw new IndexOutOfBoundsException(); + } + if (radix < Character.MIN_RADIX) { + throw new NumberFormatException("radix " + radix + + " less than Character.MIN_RADIX"); + } + if (radix > Character.MAX_RADIX) { + throw new NumberFormatException("radix " + radix + + " greater than Character.MAX_RADIX"); + } + + boolean negative = false; + int i = beginIndex; + long limit = -Long.MAX_VALUE; + + if (i < endIndex) { + char firstChar = s.charAt(i); + if (firstChar < '0') { // Possible leading "+" or "-" + if (firstChar == '-') { + negative = true; + limit = Long.MIN_VALUE; + } else if (firstChar != '+') { + throw NumberFormatException.forCharSequence(s, beginIndex, + endIndex, i); + } + i++; + } + if (i >= endIndex) { // Cannot have lone "+", "-" or "" + throw NumberFormatException.forCharSequence(s, beginIndex, + endIndex, i); + } + long multmin = limit / radix; + long result = 0; + while (i < endIndex) { + // Accumulating negatively avoids surprises near MAX_VALUE + int digit = Character.digit(s.charAt(i++), radix); + if (digit < 0 || result < multmin) { + throw NumberFormatException.forCharSequence(s, beginIndex, + endIndex, i); + } + result *= radix; + if (result < limit + digit) { + throw NumberFormatException.forCharSequence(s, beginIndex, + endIndex, i); + } + result -= digit; + } + return negative ? result : -result; + } else { + throw new NumberFormatException(""); + } } /** @@ -694,7 +811,7 @@ } // No need for range checks on len due to testing above. - long first = parseLong(s.substring(0, len - 1), radix); + long first = parseLong(s, radix, 0, len - 1); int second = Character.digit(s.charAt(len - 1), radix); if (second < 0) { throw new NumberFormatException("Bad digit at end of " + s); @@ -764,6 +881,155 @@ } /** + * Parses the {@link CharSequence} argument as an unsigned {@code long} in + * the specified {@code radix}, beginning at the specified + * {@code beginIndex} and extending to the end of the sequence. + * + *

The method does not take steps to guard against the + * {@code CharSequence} being mutated while parsing. + * + * @param s the {@code CharSequence} containing the unsigned + * {@code long} representation to be parsed + * @param radix the radix to be used while parsing {@code s}. + * @param beginIndex the beginning index, inclusive. + * @return the unsigned {@code long} represented by the subsequence in + * the specified radix. + * @throws NullPointerException if {@code s} is null. + * @throws IndexOutOfBoundsException if {@code beginIndex} is + * negative, or if {@code beginIndex} is greater than + * {@code s.length()}. + * @throws NumberFormatException if the {@code CharSequence} does not + * contain a parsable unsigned {@code long} in the specified + * {@code radix}, or if {@code radix} is either smaller than + * {@link java.lang.Character#MIN_RADIX} or larger than + * {@link java.lang.Character#MAX_RADIX}. + * @since 1.9 + */ + public static long parseUnsignedLong(CharSequence s, int radix, int beginIndex) + throws NumberFormatException { + // forces a null check of s + return parseUnsignedLong(s, radix, beginIndex, s.length()); + } + + /** + * Parses the {@link CharSequence} argument as an unsigned {@code long} in + * the specified {@code radix}, beginning at the specified + * {@code beginIndex} and extending to {@code endIndex - 1}. + * + *

The method does not take steps to guard against the + * {@code CharSequence} being mutated while parsing. + * + * @param s the {@code CharSequence} containing the unsigned + * {@code long} representation to be parsed + * @param radix the radix to be used while parsing {@code s}. + * @param beginIndex the beginning index, inclusive. + * @param endIndex the ending index, exclusive. + * @return the unsigned {@code long} represented by the subsequence in + * the specified radix. + * @throws NullPointerException if {@code s} is null. + * @throws IndexOutOfBoundsException if {@code beginIndex} is + * negative, or if {@code beginIndex} is greater than + * {@code endIndex} or if {@code endIndex} is greater than + * {@code s.length()}. + * @throws NumberFormatException if the {@code CharSequence} does not + * contain a parsable unsigned {@code long} in the specified + * {@code radix}, or if {@code radix} is either smaller than + * {@link java.lang.Character#MIN_RADIX} or larger than + * {@link java.lang.Character#MAX_RADIX}. + * @since 1.9 + */ + public static long parseUnsignedLong(CharSequence s, int radix, int beginIndex, int endIndex) + throws NumberFormatException { + s = Objects.requireNonNull(s); + + if (beginIndex < 0 || beginIndex > endIndex || endIndex > s.length()) { + throw new IndexOutOfBoundsException(); + } + int start = beginIndex, len = endIndex - beginIndex; + + if (len > 0) { + char firstChar = s.charAt(start); + if (firstChar == '-') { + throw new NumberFormatException(String.format("Illegal leading minus sign " + + "on unsigned string %s.", s.subSequence(start, start + len))); + } else { + if (len <= 12 || // Long.MAX_VALUE in Character.MAX_RADIX is 13 digits + (radix == 10 && len <= 18) ) { // Long.MAX_VALUE in base 10 is 19 digits + return parseLong(s, radix, start, start + len); + } + + // No need for range checks on end due to testing above. + long first = parseLong(s, radix, start, start + len - 1); + int second = Character.digit(s.charAt(start + len - 1), radix); + if (second < 0) { + throw new NumberFormatException("Bad digit at end of " + + s.subSequence(start, start + len)); + } + long result = first * radix + second; + + /* + * Test leftmost bits of multiprecision extension of first*radix + * for overflow. The number of bits needed is defined by + * GUARD_BIT = ceil(log2(Character.MAX_RADIX)) + 1 = 7. Then + * int guard = radix*(int)(first >>> (64 - GUARD_BIT)) and + * overflow is tested by splitting guard in the ranges + * guard < 92, 92 <= guard < 128, and 128 <= guard, where + * 92 = 128 - Character.MAX_RADIX. Note that guard cannot take + * on a value which does not include a prime factor in the legal + * radix range. + */ + int guard = radix * (int) (first >>> 57); + if (guard >= 128 || + (result >= 0 && guard >= 128 - Character.MAX_RADIX)) { + /* + * For purposes of exposition, the programmatic statements + * below should be taken to be multi-precision, i.e., not + * subject to overflow. + * + * A) Condition guard >= 128: + * If guard >= 128 then first*radix >= 2^7 * 2^57 = 2^64 + * hence always overflow. + * + * B) Condition guard < 92: + * Define left7 = first >>> 57. + * Given first = (left7 * 2^57) + (first & (2^57 - 1)) then + * result <= (radix*left7)*2^57 + radix*(2^57 - 1) + second. + * Thus if radix*left7 < 92, radix <= 36, and second < 36, + * then result < 92*2^57 + 36*(2^57 - 1) + 36 = 2^64 hence + * never overflow. + * + * C) Condition 92 <= guard < 128: + * first*radix + second >= radix*left7*2^57 + second + * so that first*radix + second >= 92*2^57 + 0 > 2^63 + * + * D) Condition guard < 128: + * radix*first <= (radix*left7) * 2^57 + radix*(2^57 - 1) + * so + * radix*first + second <= (radix*left7) * 2^57 + radix*(2^57 - 1) + 36 + * thus + * radix*first + second < 128 * 2^57 + 36*2^57 - radix + 36 + * whence + * radix*first + second < 2^64 + 2^6*2^57 = 2^64 + 2^63 + * + * E) Conditions C, D, and result >= 0: + * C and D combined imply the mathematical result + * 2^63 < first*radix + second < 2^64 + 2^63. The lower + * bound is therefore negative as a signed long, but the + * upper bound is too small to overflow again after the + * signed long overflows to positive above 2^64 - 1. Hence + * result >= 0 implies overflow given C and D. + */ + throw new NumberFormatException(String.format("String value %s exceeds " + + "range of unsigned long.", s.subSequence(start, start + len))); + } + return result; + } + } else { + throw NumberFormatException.forInputString(""); + } + } + + /** * Parses the string argument as an unsigned decimal {@code long}. The * characters in the string must all be decimal digits, except * that the first character may be an an ASCII plus sign {@code diff -r d9ce05f36ffe -r b08ff6ffcc26 jdk/src/share/classes/java/lang/NumberFormatException.java --- a/jdk/src/share/classes/java/lang/NumberFormatException.java Wed Jul 05 19:51:30 2017 +0200 +++ b/jdk/src/share/classes/java/lang/NumberFormatException.java Tue Jul 22 11:55:27 2014 -0700 @@ -56,7 +56,7 @@ } /** - * Factory method for making a NumberFormatException + * Factory method for making a {@code NumberFormatException} * given the specified input which caused the error. * * @param s the input causing the error @@ -64,4 +64,20 @@ static NumberFormatException forInputString(String s) { return new NumberFormatException("For input string: \"" + s + "\""); } + + /** + * Factory method for making a {@code NumberFormatException} + * given the specified input which caused the error. + * + * @param s the input causing the error + * @param beginIndex the beginning index, inclusive. + * @param endIndex the ending index, exclusive. + * @param errorIndex the index of the first error in s + */ + static NumberFormatException forCharSequence(CharSequence s, + int beginIndex, int endIndex, int errorIndex) { + return new NumberFormatException("Error at index " + + (errorIndex - beginIndex) + " in: \"" + + s.subSequence(beginIndex, endIndex) + "\""); + } } diff -r d9ce05f36ffe -r b08ff6ffcc26 jdk/src/share/classes/java/lang/String.java --- a/jdk/src/share/classes/java/lang/String.java Wed Jul 05 19:51:30 2017 +0200 +++ b/jdk/src/share/classes/java/lang/String.java Tue Jul 22 11:55:27 2014 -0700 @@ -2580,7 +2580,8 @@ } for (int i = first; i < len; i++) { int cp = (int)value[i]; - if (cp == '\u03A3') { // GREEK CAPITAL LETTER SIGMA + if (cp == '\u03A3' || // GREEK CAPITAL LETTER SIGMA + Character.isSurrogate((char)cp)) { return toLowerCaseEx(result, i, locale, false); } if (cp == '\u0130') { // LATIN CAPITAL LETTER I WITH DOT ABOVE @@ -2742,7 +2743,11 @@ return toUpperCaseEx(result, first, locale, false); } for (int i = first; i < len; i++) { - int cp = Character.toUpperCaseEx((int)value[i]); + int cp = (int)value[i]; + if (Character.isSurrogate((char)cp)) { + return toUpperCaseEx(result, i, locale, false); + } + cp = Character.toUpperCaseEx(cp); if (!Character.isBmpCodePoint(cp)) { // Character.ERROR is not bmp return toUpperCaseEx(result, i, locale, false); } diff -r d9ce05f36ffe -r b08ff6ffcc26 jdk/src/share/classes/java/lang/System.java --- a/jdk/src/share/classes/java/lang/System.java Wed Jul 05 19:51:30 2017 +0200 +++ b/jdk/src/share/classes/java/lang/System.java Tue Jul 22 11:55:27 2014 -0700 @@ -1263,6 +1263,12 @@ public void invokeFinalize(Object o) throws Throwable { o.finalize(); } + public void formatUnsignedLong(long val, int shift, char[] buf, int offset, int len) { + Long.formatUnsignedLong(val, shift, buf, offset, len); + } + public void formatUnsignedInt(int val, int shift, char[] buf, int offset, int len) { + Integer.formatUnsignedInt(val, shift, buf, offset, len); + } }); } } diff -r d9ce05f36ffe -r b08ff6ffcc26 jdk/src/share/classes/java/nio/StringCharBuffer.java --- a/jdk/src/share/classes/java/nio/StringCharBuffer.java Wed Jul 05 19:51:30 2017 +0200 +++ b/jdk/src/share/classes/java/nio/StringCharBuffer.java Tue Jul 22 11:55:27 2014 -0700 @@ -100,7 +100,7 @@ } final String toString(int start, int end) { - return str.toString().substring(start + offset, end + offset); + return str.subSequence(start + offset, end + offset).toString(); } public final CharBuffer subSequence(int start, int end) { diff -r d9ce05f36ffe -r b08ff6ffcc26 jdk/src/share/classes/javax/security/auth/kerberos/EncryptionKey.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/javax/security/auth/kerberos/EncryptionKey.java Tue Jul 22 11:55:27 2014 -0700 @@ -0,0 +1,208 @@ +/* + * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package javax.security.auth.kerberos; + +import java.util.Arrays; +import java.util.Objects; +import javax.crypto.SecretKey; +import javax.security.auth.DestroyFailedException; + +/** + * This class encapsulates an EncryptionKey used in Kerberos.

+ * + * An EncryptionKey is defined in Section 4.2.9 of the Kerberos Protocol + * Specification (RFC 4120) as: + *

+ *     EncryptionKey   ::= SEQUENCE {
+ *             keytype         [0] Int32 -- actually encryption type --,
+ *             keyvalue        [1] OCTET STRING
+ *     }
+ * 
+ * The key material of an {@code EncryptionKey} is defined as the value + * of the {@code keyValue} above.

+ * + * @since 1.9 + */ +public final class EncryptionKey implements SecretKey { + + private static final long serialVersionUID = 9L; + + /** + * {@code KeyImpl} is serialized by writing out the ASN.1 encoded bytes + * of the encryption key. + * + * @serial + */ + final private KeyImpl key; + + private transient boolean destroyed = false; + + /** + * Constructs a {@code EncryptionKey} from the given bytes and + * the key type. + *

+ * The contents of the byte array are copied; subsequent modification of + * the byte array does not affect the newly created key. + * + * @param keyBytes the key material for the key + * @param keyType the key type for the key as defined by the + * Kerberos protocol specification. + * @throws NullPointerException if keyBytes is null + */ + public EncryptionKey(byte[] keyBytes, int keyType) { + key = new KeyImpl(Objects.requireNonNull(keyBytes), keyType); + } + + /** + * Returns the key type for this key. + * + * @return the key type. + * @throws IllegalStateException if the key is destroyed + */ + public int getKeyType() { + // KeyImpl already checked if destroyed + return key.getKeyType(); + } + + /* + * Methods from java.security.Key + */ + + /** + * Returns the standard algorithm name for this key. The algorithm names + * are the encryption type string defined on the IANA + * Kerberos Encryption Type Numbers + * page. + *

+ * This method can return the following value not defined on the IANA page: + *

    + *
  1. none: for etype equal to 0
  2. + *
  3. unknown: for etype greater than 0 but unsupported by + * the implementation
  4. + *
  5. private: for etype smaller than 0
  6. + *
+ * + * @return the name of the algorithm associated with this key. + * @throws IllegalStateException if the key is destroyed + */ + @Override + public String getAlgorithm() { + // KeyImpl already checked if destroyed + return key.getAlgorithm(); + } + + /** + * Returns the name of the encoding format for this key. + * + * @return the String "RAW" + * @throws IllegalStateException if the key is destroyed + */ + @Override + public String getFormat() { + // KeyImpl already checked if destroyed + return key.getFormat(); + } + + /** + * Returns the key material of this key. + * + * @return a newly allocated byte array that contains the key material + * @throws IllegalStateException if the key is destroyed + */ + @Override + public byte[] getEncoded() { + // KeyImpl already checked if destroyed + return key.getEncoded(); + } + + /** + * Destroys this key by clearing out the key material of this key. + * + * @throws DestroyFailedException if some error occurs while destorying + * this key. + */ + @Override + public void destroy() throws DestroyFailedException { + if (!destroyed) { + key.destroy(); + destroyed = true; + } + } + + + @Override + public boolean isDestroyed() { + return destroyed; + } + + @Override + public String toString() { + if (destroyed) { + return "Destroyed EncryptionKey"; + } + return "key " + key.toString(); + } + + @Override + public int hashCode() { + int result = 17; + if (isDestroyed()) { + return result; + } + result = 37 * result + Arrays.hashCode(getEncoded()); + return 37 * result + getKeyType(); + } + + /** + * Compares the specified Object with this key for equality. + * Returns true if the given object is also a + * {@code EncryptionKey} and the two + * {@code EncryptionKey} instances are equivalent. + * + * @param other the Object to compare to + * @return true if the specified object is equal to this EncryptionKey, + * false otherwise. NOTE: Returns false if either of the EncryptionKey + * objects has been destroyed. + */ + @Override + public boolean equals(Object other) { + + if (other == this) + return true; + + if (! (other instanceof EncryptionKey)) { + return false; + } + + EncryptionKey otherKey = ((EncryptionKey) other); + if (isDestroyed() || otherKey.isDestroyed()) { + return false; + } + + return getKeyType() == otherKey.getKeyType() + && Arrays.equals(getEncoded(), otherKey.getEncoded()); + } +} diff -r d9ce05f36ffe -r b08ff6ffcc26 jdk/src/share/classes/javax/security/auth/kerberos/KerberosCredMessage.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/share/classes/javax/security/auth/kerberos/KerberosCredMessage.java Tue Jul 22 11:55:27 2014 -0700 @@ -0,0 +1,171 @@ +/* + * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package javax.security.auth.kerberos; + +import javax.security.auth.Destroyable; +import java.util.Arrays; +import java.util.Base64; +import java.util.Objects; + +/** + * This class encapsulates a Kerberos 5 KRB_CRED message which can be used to + * send Kerberos credentials from one principal to another.

+ * + * A KRB_CRED message is defined in Section 5.8.1 of the Kerberos Protocol + * Specification (RFC 4120) as: + *

+ *    KRB-CRED        ::= [APPLICATION 22] SEQUENCE {
+ *            pvno            [0] INTEGER (5),
+ *            msg-type        [1] INTEGER (22),
+ *            tickets         [2] SEQUENCE OF Ticket,
+ *            enc-part        [3] EncryptedData -- EncKrbCredPart
+ *    }
+ * 

+ * + * @since 1.9 + */ +public final class KerberosCredMessage implements Destroyable { + + final private KerberosPrincipal sender; + final private KerberosPrincipal recipient; + final private byte[] message; + + private boolean destroyed = false; + + /** + * Constructs a {@code KerberosCredMessage} object. + *

+ * The contents of the {@code message} argument are copied; subsequent + * modification of the byte array does not affect the newly created object. + * + * @param sender the sender of the message + * @param recipient the recipient of the message + * @param message the DER encoded KRB_CRED message + * @throws NullPointerException if any of sender, recipient + * or message is null + */ + public KerberosCredMessage(KerberosPrincipal sender, + KerberosPrincipal recipient, + byte[] message) { + this.sender = Objects.requireNonNull(sender); + this.recipient = Objects.requireNonNull(recipient); + this.message = Objects.requireNonNull(message).clone(); + } + + /** + * Returns the DER encoded form of the KRB_CRED message. + * + * @return a newly allocated byte array that contains the encoded form + * @throws IllegalStateException if the object is destroyed + */ + public byte[] getEncoded() { + if (destroyed) { + throw new IllegalStateException("This object is no longer valid"); + } + return message.clone(); + } + + /** + * Returns the sender of this message. + * + * @return the sender + * @throws IllegalStateException if the object is destroyed + */ + public KerberosPrincipal getSender() { + if (destroyed) { + throw new IllegalStateException("This object is no longer valid"); + } + return sender; + } + + /** + * Returns the recipient of this message. + * + * @return the recipient + * @throws IllegalStateException if the object is destroyed + */ + public KerberosPrincipal getRecipient() { + if (destroyed) { + throw new IllegalStateException("This object is no longer valid"); + } + return recipient; + } + + /** + * Destroys this object by clearing out the message. + */ + @Override + public void destroy() { + if (!destroyed) { + Arrays.fill(message, (byte)0); + destroyed = true; + } + } + + @Override + public boolean isDestroyed() { + return destroyed; + } + + @Override + public String toString() { + if (destroyed) { + return "Destroyed KerberosCredMessage"; + } else { + return "KRB_CRED from " + sender + " to " + recipient + ":\n" + + Base64.getUrlEncoder().encodeToString(message); + } + } + + @Override + public int hashCode() { + if (isDestroyed()) { + return -1; + } else { + return Objects.hash(sender, recipient, Arrays.hashCode(message)); + } + } + + @Override + public boolean equals(Object other) { + if (other == this) { + return true; + } + + if (! (other instanceof KerberosCredMessage)) { + return false; + } + + KerberosCredMessage otherMessage = ((KerberosCredMessage) other); + if (isDestroyed() || otherMessage.isDestroyed()) { + return false; + } + + return Objects.equals(sender, otherMessage.sender) + && Objects.equals(recipient, otherMessage.recipient) + && Arrays.equals(message, otherMessage.message); + } +} diff -r d9ce05f36ffe -r b08ff6ffcc26 jdk/src/share/classes/javax/security/auth/kerberos/KerberosKey.java --- a/jdk/src/share/classes/javax/security/auth/kerberos/KerberosKey.java Wed Jul 05 19:51:30 2017 +0200 +++ b/jdk/src/share/classes/javax/security/auth/kerberos/KerberosKey.java Tue Jul 22 11:55:27 2014 -0700 @@ -27,13 +27,27 @@ import java.util.Arrays; import javax.crypto.SecretKey; -import javax.security.auth.Destroyable; import javax.security.auth.DestroyFailedException; /** * This class encapsulates a long term secret key for a Kerberos * principal.

* + * A {@code KerberosKey} object includes an EncryptionKey, a + * {@link KerberosPrincipal} as its owner, and the version number + * of the key.

+ * + * An EncryptionKey is defined in Section 4.2.9 of the Kerberos Protocol + * Specification (RFC 4120) as: + *

+ *     EncryptionKey   ::= SEQUENCE {
+ *             keytype         [0] Int32 -- actually encryption type --,
+ *             keyvalue        [1] OCTET STRING
+ *     }
+ * 
+ * The key material of a {@code KerberosKey} is defined as the value + * of the {@code keyValue} above.

+ * * All Kerberos JAAS login modules that obtain a principal's password and * generate the secret key from it should use this class. * Sometimes, such as when authenticating a server in @@ -70,7 +84,7 @@ * @author Mayank Upadhyay * @since 1.4 */ -public class KerberosKey implements SecretKey, Destroyable { +public class KerberosKey implements SecretKey { private static final long serialVersionUID = -4625402278148246993L; @@ -89,15 +103,8 @@ private final int versionNum; /** - * {@code KeyImpl} is serialized by writing out the ASN1 Encoded bytes + * {@code KeyImpl} is serialized by writing out the ASN.1 encoded bytes * of the encryption key. - * The ASN1 encoding is defined in RFC4120 and as follows: - *

-    * EncryptionKey   ::= SEQUENCE {
-    *           keytype   [0] Int32 -- actually encryption type --,
-    *           keyvalue  [1] OCTET STRING
-    * }
-    * 
* * @serial */ @@ -111,7 +118,7 @@ * key information from a Kerberos "keytab". * * @param principal the principal that this secret key belongs to - * @param keyBytes the raw bytes for the secret key + * @param keyBytes the key material for the secret key * @param keyType the key type for the secret key as defined by the * Kerberos protocol specification. * @param versionNum the version number of this secret key @@ -153,10 +160,12 @@ * Returns the principal that this key belongs to. * * @return the principal this key belongs to. + * @throws IllegalStateException if the key is destroyed */ public final KerberosPrincipal getPrincipal() { - if (destroyed) + if (destroyed) { throw new IllegalStateException("This key is no longer valid"); + } return principal; } @@ -164,10 +173,12 @@ * Returns the key version number. * * @return the key version number. + * @throws IllegalStateException if the key is destroyed */ public final int getVersionNumber() { - if (destroyed) + if (destroyed) { throw new IllegalStateException("This key is no longer valid"); + } return versionNum; } @@ -175,10 +186,10 @@ * Returns the key type for this long-term key. * * @return the key type. + * @throws IllegalStateException if the key is destroyed */ public final int getKeyType() { - if (destroyed) - throw new IllegalStateException("This key is no longer valid"); + // KeyImpl already checked if destroyed return key.getKeyType(); } @@ -201,10 +212,10 @@ * * * @return the name of the algorithm associated with this key. + * @throws IllegalStateException if the key is destroyed */ public final String getAlgorithm() { - if (destroyed) - throw new IllegalStateException("This key is no longer valid"); + // KeyImpl already checked if destroyed return key.getAlgorithm(); } @@ -212,10 +223,10 @@ * Returns the name of the encoding format for this secret key. * * @return the String "RAW" + * @throws IllegalStateException if the key is destroyed */ public final String getFormat() { - if (destroyed) - throw new IllegalStateException("This key is no longer valid"); + // KeyImpl already checked if destroyed return key.getFormat(); } @@ -223,16 +234,15 @@ * Returns the key material of this secret key. * * @return the key material + * @throws IllegalStateException if the key is destroyed */ public final byte[] getEncoded() { - if (destroyed) - throw new IllegalStateException("This key is no longer valid"); + // KeyImpl already checked if destroyed return key.getEncoded(); } /** - * Destroys this key. A call to any of its other methods after this - * will cause an IllegalStateException to be thrown. + * Destroys this key by clearing out the key material of this secret key. * * @throws DestroyFailedException if some error occurs while destorying * this key. @@ -253,9 +263,9 @@ public String toString() { if (destroyed) { - return "Destroyed Principal"; + return "Destroyed KerberosKey"; } - return "Kerberos Principal " + principal.toString() + + return "Kerberos Principal " + principal + "Key Version " + versionNum + "key " + key.toString(); } @@ -293,8 +303,9 @@ */ public boolean equals(Object other) { - if (other == this) + if (other == this) { return true; + } if (! (other instanceof KerberosKey)) { return false; diff -r d9ce05f36ffe -r b08ff6ffcc26 jdk/src/share/classes/javax/security/auth/kerberos/KerberosTicket.java --- a/jdk/src/share/classes/javax/security/auth/kerberos/KerberosTicket.java Wed Jul 05 19:51:30 2017 +0200 +++ b/jdk/src/share/classes/javax/security/auth/kerberos/KerberosTicket.java Tue Jul 22 11:55:27 2014 -0700 @@ -35,9 +35,6 @@ import javax.security.auth.RefreshFailedException; import javax.security.auth.DestroyFailedException; import sun.misc.HexDumpEncoder; -import sun.security.krb5.EncryptionKey; -import sun.security.krb5.Asn1Exception; -import sun.security.util.*; /** * This class encapsulates a Kerberos ticket and associated @@ -253,9 +250,10 @@ Date endTime, Date renewTill, InetAddress[] clientAddresses) { - if (sessionKey == null) - throw new IllegalArgumentException("Session key for ticket" - + " cannot be null"); + if (sessionKey == null) { + throw new IllegalArgumentException("Session key for ticket" + + " cannot be null"); + } init(asn1Encoding, client, server, new KeyImpl(sessionKey, keyType), flags, authTime, startTime, endTime, renewTill, clientAddresses); @@ -271,41 +269,46 @@ Date endTime, Date renewTill, InetAddress[] clientAddresses) { - if (asn1Encoding == null) - throw new IllegalArgumentException("ASN.1 encoding of ticket" - + " cannot be null"); + if (asn1Encoding == null) { + throw new IllegalArgumentException("ASN.1 encoding of ticket" + + " cannot be null"); + } this.asn1Encoding = asn1Encoding.clone(); - if (client == null) - throw new IllegalArgumentException("Client name in ticket" - + " cannot be null"); + if (client == null) { + throw new IllegalArgumentException("Client name in ticket" + + " cannot be null"); + } this.client = client; - if (server == null) - throw new IllegalArgumentException("Server name in ticket" - + " cannot be null"); + if (server == null) { + throw new IllegalArgumentException("Server name in ticket" + + " cannot be null"); + } this.server = server; // Caller needs to make sure `sessionKey` will not be null this.sessionKey = sessionKey; if (flags != null) { - if (flags.length >= NUM_FLAGS) - this.flags = flags.clone(); - else { + if (flags.length >= NUM_FLAGS) { + this.flags = flags.clone(); + } else { this.flags = new boolean[NUM_FLAGS]; // Fill in whatever we have - for (int i = 0; i < flags.length; i++) + for (int i = 0; i < flags.length; i++) { this.flags[i] = flags[i]; + } } - } else - this.flags = new boolean[NUM_FLAGS]; + } else { + this.flags = new boolean[NUM_FLAGS]; + } if (this.flags[RENEWABLE_TICKET_FLAG]) { - if (renewTill == null) - throw new IllegalArgumentException("The renewable period " + if (renewTill == null) { + throw new IllegalArgumentException("The renewable period " + "end time cannot be null for renewable tickets."); - + } this.renewTill = new Date(renewTill.getTime()); } @@ -318,13 +321,15 @@ this.startTime = this.authTime; } - if (endTime == null) - throw new IllegalArgumentException("End time for ticket validity" - + " cannot be null"); + if (endTime == null) { + throw new IllegalArgumentException("End time for ticket validity" + + " cannot be null"); + } this.endTime = new Date(endTime.getTime()); - if (clientAddresses != null) - this.clientAddresses = clientAddresses.clone(); + if (clientAddresses != null) { + this.clientAddresses = clientAddresses.clone(); + } } /** @@ -346,14 +351,17 @@ } /** - * Returns the session key associated with this ticket. + * Returns the session key associated with this ticket. The return value + * is always a {@link EncryptionKey} object. * * @return the session key. */ public final SecretKey getSessionKey() { - if (destroyed) + if (destroyed) { throw new IllegalStateException("This ticket is no longer valid"); - return sessionKey; + } + return new EncryptionKey( + sessionKey.getEncoded(), sessionKey.getKeyType()); } /** @@ -366,8 +374,9 @@ * @see #getSessionKey() */ public final int getSessionKeyType() { - if (destroyed) + if (destroyed) { throw new IllegalStateException("This ticket is no longer valid"); + } return sessionKey.getKeyType(); } @@ -508,8 +517,9 @@ * @return an ASN.1 encoding of the entire ticket. */ public final byte[] getEncoded() { - if (destroyed) + if (destroyed) { throw new IllegalStateException("This ticket is no longer valid"); + } return asn1Encoding.clone(); } @@ -539,16 +549,17 @@ */ public void refresh() throws RefreshFailedException { - if (destroyed) + if (destroyed) { throw new RefreshFailedException("A destroyed ticket " - + "cannot be renewd."); - - if (!isRenewable()) + + "cannot be renewd."); + } + if (!isRenewable()) { throw new RefreshFailedException("This ticket is not renewable"); - - if (System.currentTimeMillis() > getRenewTill().getTime()) + } + if (System.currentTimeMillis() > getRenewTill().getTime()) { throw new RefreshFailedException("This ticket is past " - + "its last renewal time."); + + "its last renewal time."); + } Throwable e = null; sun.security.krb5.Credentials krb5Creds = null; @@ -634,8 +645,9 @@ } public String toString() { - if (destroyed) - throw new IllegalStateException("This ticket is no longer valid"); + if (destroyed) { + return "Destroyed KerberosTicket"; + } StringBuilder caddrString = new StringBuilder(); if (clientAddresses != null) { for (int i = 0; i < clientAddresses.length; i++) { @@ -715,8 +727,9 @@ */ public boolean equals(Object other) { - if (other == this) + if (other == this) { return true; + } if (! (other instanceof KerberosTicket)) { return false; @@ -731,7 +744,7 @@ !endTime.equals(otherTicket.getEndTime()) || !server.equals(otherTicket.getServer()) || !client.equals(otherTicket.getClient()) || - !sessionKey.equals(otherTicket.getSessionKey()) || + !sessionKey.equals(otherTicket.sessionKey) || !Arrays.equals(clientAddresses, otherTicket.getClientAddresses()) || !Arrays.equals(flags, otherTicket.getFlags())) { return false; @@ -739,35 +752,41 @@ // authTime may be null if (authTime == null) { - if (otherTicket.getAuthTime() != null) + if (otherTicket.getAuthTime() != null) { return false; + } } else { - if (!authTime.equals(otherTicket.getAuthTime())) + if (!authTime.equals(otherTicket.getAuthTime())) { return false; + } } // startTime may be null if (startTime == null) { - if (otherTicket.getStartTime() != null) + if (otherTicket.getStartTime() != null) { return false; + } } else { - if (!startTime.equals(otherTicket.getStartTime())) + if (!startTime.equals(otherTicket.getStartTime())) { return false; + } } if (renewTill == null) { - if (otherTicket.getRenewTill() != null) + if (otherTicket.getRenewTill() != null) { return false; + } } else { - if (!renewTill.equals(otherTicket.getRenewTill())) + if (!renewTill.equals(otherTicket.getRenewTill())) { return false; + } } return true; } private void readObject(ObjectInputStream s) - throws IOException, ClassNotFoundException { + throws IOException, ClassNotFoundException { s.defaultReadObject(); if (sessionKey == null) { throw new InvalidObjectException("Session key cannot be null"); diff -r d9ce05f36ffe -r b08ff6ffcc26 jdk/src/share/classes/sun/misc/JavaLangAccess.java --- a/jdk/src/share/classes/sun/misc/JavaLangAccess.java Wed Jul 05 19:51:30 2017 +0200 +++ b/jdk/src/share/classes/sun/misc/JavaLangAccess.java Tue Jul 22 11:55:27 2014 -0700 @@ -132,4 +132,14 @@ * Invokes the finalize method of the given object. */ void invokeFinalize(Object o) throws Throwable; + + /** + * Invokes Long.formatUnsignedLong(long val, int shift, char[] buf, int offset, int len) + */ + void formatUnsignedLong(long val, int shift, char[] buf, int offset, int len); + + /** + * Invokes Integer.formatUnsignedInt(long val, int shift, char[] buf, int offset, int len) + */ + void formatUnsignedInt(int val, int shift, char[] buf, int offset, int len); } diff -r d9ce05f36ffe -r b08ff6ffcc26 jdk/src/share/classes/sun/nio/cs/ext/ExtendedCharsets.java --- a/jdk/src/share/classes/sun/nio/cs/ext/ExtendedCharsets.java Wed Jul 05 19:51:30 2017 +0200 +++ b/jdk/src/share/classes/sun/nio/cs/ext/ExtendedCharsets.java Tue Jul 22 11:55:27 2014 -0700 @@ -1173,8 +1173,7 @@ if (!sun.misc.VM.isBooted()) return; - String map = AccessController.doPrivileged( - (PrivilegedAction) () -> System.getProperty("sun.nio.cs.map")); + String map = getProperty("sun.nio.cs.map"); boolean sjisIsMS932 = false; boolean iso2022jpIsMS50221 = false; boolean iso2022jpIsMS50220 = false; @@ -1294,8 +1293,7 @@ } } - String osName = AccessController.doPrivileged( - (PrivilegedAction) () -> System.getProperty("os.name")); + String osName = getProperty("os.name"); if ("SunOS".equals(osName) || "Linux".equals(osName) || "AIX".equals(osName) || osName.contains("OS X")) { charset("x-COMPOUND_TEXT", "COMPOUND_TEXT", @@ -1308,6 +1306,18 @@ initialized = true; } + private static String getProperty(String key) { + // this method may be called during initialization of + // system class loader and thus not using lambda + return AccessController.doPrivileged( + new PrivilegedAction() { + @Override + public String run() { + return System.getProperty(key); + } + }); + } + public static String[] aliasesFor(String charsetName) { if (instance == null) return null; diff -r d9ce05f36ffe -r b08ff6ffcc26 jdk/src/share/classes/sun/security/jgss/krb5/Krb5Context.java --- a/jdk/src/share/classes/sun/security/jgss/krb5/Krb5Context.java Wed Jul 05 19:51:30 2017 +0200 +++ b/jdk/src/share/classes/sun/security/jgss/krb5/Krb5Context.java Tue Jul 22 11:55:27 2014 -0700 @@ -40,11 +40,13 @@ import java.security.AccessController; import java.security.AccessControlContext; import java.security.Key; +import java.security.PrivilegedActionException; import java.security.PrivilegedExceptionAction; -import java.security.PrivilegedActionException; -import javax.crypto.Cipher; import javax.security.auth.Subject; -import javax.security.auth.kerberos.*; +import javax.security.auth.kerberos.ServicePermission; +import javax.security.auth.kerberos.KerberosCredMessage; +import javax.security.auth.kerberos.KerberosPrincipal; +import javax.security.auth.kerberos.KerberosTicket; import sun.security.krb5.internal.Ticket; /** @@ -118,6 +120,7 @@ // XXX See if the required info from these can be extracted and // stored elsewhere + private Credentials tgt; private Credentials serviceCreds; private KrbApReq apReq; Ticket serviceTicket; @@ -616,7 +619,6 @@ "No TGT available"); } myName = (Krb5NameElement) myCred.getName(); - Credentials tgt; final Krb5ProxyCredential second; if (myCred instanceof Krb5InitCredential) { second = null; @@ -750,7 +752,6 @@ // No need to write anything; // just validate the incoming token new AcceptSecContextToken(this, serviceCreds, apReq, is); - serviceCreds = null; apReq = null; state = STATE_DONE; } else { @@ -1304,6 +1305,9 @@ public final void dispose() throws GSSException { state = STATE_DELETED; delegatedCred = null; + tgt = null; + serviceCreds = null; + key = null; } public final Provider getProvider() { @@ -1424,6 +1428,9 @@ switch (type) { case KRB5_GET_SESSION_KEY: return new KerberosSessionKey(key); + case KRB5_GET_SESSION_KEY_EX: + return new javax.security.auth.kerberos.EncryptionKey( + key.getBytes(), key.getEType()); case KRB5_GET_TKT_FLAGS: return tktFlags.clone(); case KRB5_GET_AUTHZ_DATA: @@ -1435,6 +1442,26 @@ } case KRB5_GET_AUTHTIME: return authTime; + case KRB5_GET_KRB_CRED: + if (!isInitiator()) { + throw new GSSException(GSSException.UNAVAILABLE, -1, + "KRB_CRED not available on acceptor side."); + } + KerberosPrincipal sender = new KerberosPrincipal( + myName.getKrb5PrincipalName().getName()); + KerberosPrincipal recipient = new KerberosPrincipal( + peerName.getKrb5PrincipalName().getName()); + try { + byte[] krbCred = new KrbCred(tgt, serviceCreds, key) + .getMessage(); + return new KerberosCredMessage( + sender, recipient, krbCred); + } catch (KrbException | IOException e) { + GSSException gsse = new GSSException(GSSException.UNAVAILABLE, -1, + "KRB_CRED not generated correctly."); + gsse.initCause(e); + throw gsse; + } } throw new GSSException(GSSException.UNAVAILABLE, -1, "Inquire type not supported."); @@ -1456,4 +1483,5 @@ public void setAuthzData(com.sun.security.jgss.AuthorizationDataEntry[] authzData) { this.authzData = authzData; } + } diff -r d9ce05f36ffe -r b08ff6ffcc26 jdk/src/share/classes/sun/security/jgss/krb5/Krb5InitCredential.java --- a/jdk/src/share/classes/sun/security/jgss/krb5/Krb5InitCredential.java Wed Jul 05 19:51:30 2017 +0200 +++ b/jdk/src/share/classes/sun/security/jgss/krb5/Krb5InitCredential.java Tue Jul 22 11:55:27 2014 -0700 @@ -29,8 +29,8 @@ import sun.security.jgss.GSSCaller; import sun.security.jgss.spi.*; import sun.security.krb5.*; -import sun.security.krb5.Config; -import javax.security.auth.kerberos.*; +import javax.security.auth.kerberos.KerberosTicket; +import javax.security.auth.kerberos.KerberosPrincipal; import java.net.InetAddress; import java.io.IOException; import java.util.Date; diff -r d9ce05f36ffe -r b08ff6ffcc26 jdk/src/share/classes/sun/security/jgss/spnego/SpNegoContext.java --- a/jdk/src/share/classes/sun/security/jgss/spnego/SpNegoContext.java Wed Jul 05 19:51:30 2017 +0200 +++ b/jdk/src/share/classes/sun/security/jgss/spnego/SpNegoContext.java Tue Jul 22 11:55:27 2014 -0700 @@ -523,13 +523,6 @@ valid = false; } - // get the mechanism token - byte[] mechToken = initToken.getMechToken(); - if (mechToken == null) { - throw new GSSException(GSSException.FAILURE, -1, - "mechToken is missing"); - } - /* * Select the best match between the list of mechs * that the initiator requested and the list that @@ -545,7 +538,19 @@ internal_mech = mech_wanted; // get the token for mechanism - byte[] accept_token = GSS_acceptSecContext(mechToken); + byte[] accept_token; + + if (mechList[0].equals(mech_wanted)) { + // get the mechanism token + byte[] mechToken = initToken.getMechToken(); + if (mechToken == null) { + throw new GSSException(GSSException.FAILURE, -1, + "mechToken is missing"); + } + accept_token = GSS_acceptSecContext(mechToken); + } else { + accept_token = null; + } // verify MIC if (!GSSUtil.useMSInterop() && valid) { @@ -594,9 +599,27 @@ retVal = targToken.getEncoded(); } else if (state == STATE_IN_PROCESS) { + // read data + byte[] token = new byte[is.available()]; + SpNegoToken.readFully(is, token); + if (DEBUG) { + System.out.println("SpNegoContext.acceptSecContext: " + + "receiving token = " + + SpNegoToken.getHexBytes(token)); + } + + // read the SPNEGO token + // token will be validated when parsing + NegTokenTarg inputToken = new NegTokenTarg(token); + + if (DEBUG) { + System.out.println("SpNegoContext.acceptSecContext: " + + "received token of type = " + + SpNegoToken.getTokenName(inputToken.getType())); + } + // read the token - byte[] client_token = new byte[is.available()]; - SpNegoToken.readFully(is, client_token); + byte[] client_token = inputToken.getResponseToken(); byte[] accept_token = GSS_acceptSecContext(client_token); if (accept_token == null) { valid = false; @@ -1055,7 +1078,7 @@ * This is only valid on the acceptor side of the context. * @return GSSCredentialSpi object for the delegated credential * @exception GSSException - * @see GSSContext#getDelegCredState + * @see GSSContext#getCredDelegState */ public final GSSCredentialSpi getDelegCred() throws GSSException { if (state != STATE_IN_PROCESS && state != STATE_DONE) diff -r d9ce05f36ffe -r b08ff6ffcc26 jdk/src/windows/native/sun/tools/attach/WindowsVirtualMachine.c --- a/jdk/src/windows/native/sun/tools/attach/WindowsVirtualMachine.c Wed Jul 05 19:51:30 2017 +0200 +++ b/jdk/src/windows/native/sun/tools/attach/WindowsVirtualMachine.c Tue Jul 22 11:55:27 2014 -0700 @@ -388,6 +388,7 @@ if (argsLen > 0) { if (argsLen > MAX_ARGS) { JNU_ThrowInternalError(env, "Too many arguments"); + return; } for (i=0; iGetObjectArrayElement(env, args, i); @@ -423,6 +424,8 @@ stubLen = (DWORD)(*env)->GetArrayLength(env, stub); stubCode = (*env)->GetByteArrayElements(env, stub, &isCopy); + if ((*env)->ExceptionOccurred(env)) return; + pCode = (PDWORD) VirtualAllocEx( hProcess, 0, stubLen, MEM_COMMIT, PAGE_EXECUTE_READWRITE ); if (pCode == NULL) { JNU_ThrowIOExceptionWithLastError(env, "VirtualAllocEx failed"); @@ -592,6 +595,8 @@ cstr[0] = '\0'; } else { str = JNU_GetStringPlatformChars(env, jstr, &isCopy); + if ((*env)->ExceptionOccurred(env)) return; + strncpy(cstr, str, len); cstr[len-1] = '\0'; if (isCopy) { diff -r d9ce05f36ffe -r b08ff6ffcc26 jdk/test/java/lang/Integer/ParsingTest.java --- a/jdk/test/java/lang/Integer/ParsingTest.java Wed Jul 05 19:51:30 2017 +0200 +++ b/jdk/test/java/lang/Integer/ParsingTest.java Tue Jul 22 11:55:27 2014 -0700 @@ -23,29 +23,37 @@ /* * @test - * @bug 5017980 6576055 + * @bug 5017980 6576055 8041972 * @summary Test parsing methods * @author Joseph D. Darcy */ +import java.lang.IllegalArgumentException; +import java.lang.IndexOutOfBoundsException; +import java.lang.NullPointerException; +import java.lang.RuntimeException; /** - * There are six methods in java.lang.Integer which transform strings + * There are eight methods in java.lang.Integer which transform strings * into an int or Integer value: * * public Integer(String s) * public static Integer decode(String nm) + * public static int parseInt(CharSequence s, int radix, int beginIndex, int endIndex) + * public static int parseInt(CharSequence s, int radix, int beginIndex) * public static int parseInt(String s, int radix) * public static int parseInt(String s) * public static Integer valueOf(String s, int radix) * public static Integer valueOf(String s) * * Besides decode, all the methods and constructor call down into - * parseInt(String, int) to do the actual work. Therefore, the - * behavior of parseInt(String, int) will be tested here. + * parseInt(CharSequence, int, int, int) to do the actual work. Therefore, the + * behavior of parseInt(CharSequence, int, int, int) will be tested here. + * */ public class ParsingTest { + public static void main(String... argv) { check("+100", +100); check("-100", -100); @@ -55,10 +63,14 @@ check("+00000", 0); check("-00000", 0); + check("+00000", 0, 0, 6); + check("-00000", 0, 0, 6); + check("0", 0); check("1", 1); check("9", 9); + checkFailure(""); checkFailure("\u0000"); checkFailure("\u002f"); checkFailure("+"); @@ -72,12 +84,45 @@ checkFailure("+-6"); checkFailure("-+6"); checkFailure("*100"); + + check("test-00000", 0, 4, 10); + check("test-12345", -12345, 4, 10); + check("xx12345yy", 12345, 2, 7); + + checkNumberFormatException("", 10, 0); + checkNumberFormatException("100", 10, 3); + checkNumberFormatException("+1000000", 10, 8); + checkNumberFormatException("-1000000", 10, 8); + + checkNumberFormatException("", 10, 0, 0); + checkNumberFormatException("+-6", 10, 0, 3); + checkNumberFormatException("1000000", 10, 7); + checkNumberFormatException("1000000", 10, 7, 7); + checkNumberFormatException("1000000", Character.MAX_RADIX + 1, 0, 2); + checkNumberFormatException("1000000", Character.MIN_RADIX - 1, 0, 2); + + checkIndexOutOfBoundsException("1000000", 10, 8); + checkIndexOutOfBoundsException("1000000", 10, -1); + checkIndexOutOfBoundsException("1000000", 10, 10, 4); + checkIndexOutOfBoundsException("1000000", Character.MAX_RADIX + 1, -1, 2); + checkIndexOutOfBoundsException("1000000", Character.MIN_RADIX - 1, -1, 2); + checkIndexOutOfBoundsException("1000000", Character.MAX_RADIX + 1, 10, 2); + checkIndexOutOfBoundsException("1000000", Character.MIN_RADIX - 1, 10, 2); + checkIndexOutOfBoundsException("-1", 10, 0, 3); + checkIndexOutOfBoundsException("-1", 10, 2, 3); + checkIndexOutOfBoundsException("-1", 10, -1, 2); + + checkNull(10, 0, 1); + checkNull(10, -1, 0); + checkNull(10, 0, 0); + checkNull(10, 0, -1); + checkNull(-1, -1, -1); } private static void check(String val, int expected) { int n = Integer.parseInt(val); if (n != expected) - throw new RuntimeException("Integer.parsedInt failed. String:" + + throw new RuntimeException("Integer.parseInt failed. String:" + val + " Result:" + n); } @@ -91,4 +136,71 @@ ; // Expected } } + + private static void checkNumberFormatException(String val, int radix, int start) { + int n = 0; + try { + n = Integer.parseInt(val, radix, start); + System.err.println("parseInt(" + val + ", " + radix + ", " + start + + ") incorrectly returned " + n); + throw new RuntimeException(); + } catch (NumberFormatException nfe) { + ; // Expected + } + } + + private static void checkNumberFormatException(String val, int radix, int start, int end) { + int n = 0; + try { + n = Integer.parseInt(val, radix, start, end); + System.err.println("parseInt(" + val + ", " + radix + ", " + start + ", " + end + + ") incorrectly returned " + n); + throw new RuntimeException(); + } catch (NumberFormatException nfe) { + ; // Expected + } + } + + private static void checkIndexOutOfBoundsException(String val, int radix, int start) { + int n = 0; + try { + n = Integer.parseInt(val, radix, start); + System.err.println("parseInt(" + val + ", " + radix + ", " + start + + ") incorrectly returned " + n); + throw new RuntimeException(); + } catch (IndexOutOfBoundsException ioob) { + ; // Expected + } + } + + private static void checkIndexOutOfBoundsException(String val, int radix, int start, int end) { + int n = 0; + try { + n = Integer.parseInt(val, radix, start, end); + System.err.println("parseInt(" + val + ", " + radix + ", " + start + ", " + end + + ") incorrectly returned " + n); + throw new RuntimeException(); + } catch (IndexOutOfBoundsException ioob) { + ; // Expected + } + } + + private static void checkNull(int radix, int start, int end) { + int n = 0; + try { + n = Integer.parseInt(null, 10, start, end); + System.err.println("parseInt(null, " + radix + ", " + start + ", " + end + + ") incorrectly returned " + n); + throw new RuntimeException(); + } catch (NullPointerException npe) { + ; // Expected + } + } + + private static void check(String val, int expected, int start, int end) { + int n = Integer.parseInt(val, 10, start, end); + if (n != expected) + throw new RuntimeException("Integer.parsedInt failed. String:" + + val + ", start: " + start + ", end: " + end + " Result:" + n); + } } diff -r d9ce05f36ffe -r b08ff6ffcc26 jdk/test/java/lang/Long/ParsingTest.java --- a/jdk/test/java/lang/Long/ParsingTest.java Wed Jul 05 19:51:30 2017 +0200 +++ b/jdk/test/java/lang/Long/ParsingTest.java Tue Jul 22 11:55:27 2014 -0700 @@ -23,29 +23,31 @@ /* * @test - * @bug 5017980 6576055 + * @bug 5017980 6576055 8041972 * @summary Test parsing methods * @author Joseph D. Darcy */ - /** - * There are six methods in java.lang.Long which transform strings + * There are eight methods in java.lang.Long which transform strings * into a long or Long value: * * public Long(String s) * public static Long decode(String nm) + * public static long parseLong(CharSequence s, int radix, int beginIndex, int endIndex) + * public static long parseLong(CharSequence s, int radix, int beginIndex) * public static long parseLong(String s, int radix) * public static long parseLong(String s) * public static Long valueOf(String s, int radix) * public static Long valueOf(String s) * * Besides decode, all the methods and constructor call down into - * parseLong(String, int) to do the actual work. Therefore, the - * behavior of parseLong(String, int) will be tested here. + * parseLong(CharSequence, int, int, int) to do the actual work. Therefore, the + * behavior of parseLong(CharSequence, int, int, int) will be tested here. */ public class ParsingTest { + public static void main(String... argv) { check("+100", +100L); check("-100", -100L); @@ -59,6 +61,7 @@ check("1", 1L); check("9", 9L); + checkFailure(""); checkFailure("\u0000"); checkFailure("\u002f"); checkFailure("+"); @@ -72,12 +75,44 @@ checkFailure("+-6"); checkFailure("-+6"); checkFailure("*100"); + + check("test-00000", 0L, 4, 10); + check("test-12345", -12345L, 4, 10); + check("xx12345yy", 12345L, 2, 7); + check("xx123456789012345yy", 123456789012345L, 2, 17); + + checkNumberFormatException("100", 10, 3); + checkNumberFormatException("", 10, 0); + checkNumberFormatException("+1000000", 10, 8); + checkNumberFormatException("-1000000", 10, 8); + + checkNumberFormatException("", 10, 0, 0); + checkNumberFormatException("+-6", 10, 0, 3); + checkNumberFormatException("1000000", 10, 7, 7); + checkNumberFormatException("1000000", Character.MAX_RADIX + 1, 0, 2); + checkNumberFormatException("1000000", Character.MIN_RADIX - 1, 0, 2); + + checkIndexOutOfBoundsException("", 10, 1, 1); + checkIndexOutOfBoundsException("1000000", 10, 10, 4); + checkIndexOutOfBoundsException("1000000", Character.MAX_RADIX + 1, 10, 2); + checkIndexOutOfBoundsException("1000000", Character.MIN_RADIX - 1, 10, 2); + checkIndexOutOfBoundsException("1000000", Character.MAX_RADIX + 1, -1, 2); + checkIndexOutOfBoundsException("1000000", Character.MIN_RADIX - 1, -1, 2); + checkIndexOutOfBoundsException("-1", 10, 0, 3); + checkIndexOutOfBoundsException("-1", 10, 2, 3); + checkIndexOutOfBoundsException("-1", 10, -1, 2); + + checkNull(10, 0, 1); + checkNull(10, -1, 0); + checkNull(10, 0, 0); + checkNull(10, 0, -1); + checkNull(-1, -1, -1); } private static void check(String val, long expected) { long n = Long.parseLong(val); if (n != expected) - throw new RuntimeException("Long.parsedLong failed. String:" + + throw new RuntimeException("Long.parseLong failed. String:" + val + " Result:" + n); } @@ -91,4 +126,71 @@ ; // Expected } } + + private static void checkNumberFormatException(String val, int radix, int start) { + int n = 0; + try { + n = Integer.parseInt(val, radix, start); + System.err.println("parseInt(" + val + ", " + radix + ", " + start + + ") incorrectly returned " + n); + throw new RuntimeException(); + } catch (NumberFormatException nfe) { + ; // Expected + } + } + + private static void checkNumberFormatException(String val, int radix, int start, int end) { + long n = 0; + try { + n = Long.parseLong(val, radix, start, end); + System.err.println("parseInt(" + val + ", " + radix + ", " + start + ", " + end + + ") incorrectly returned " + n); + throw new RuntimeException(); + } catch (NumberFormatException nfe) { + ; // Expected + } + } + + private static void checkIndexOutOfBoundsException(String val, int radix, int start) { + int n = 0; + try { + n = Integer.parseInt(val, radix, start); + System.err.println("parseInt(" + val + ", " + radix + ", " + start + + ") incorrectly returned " + n); + throw new RuntimeException(); + } catch (IndexOutOfBoundsException ioob) { + ; // Expected + } + } + + private static void checkIndexOutOfBoundsException(String val, int radix, int start, int end) { + long n = 0; + try { + n = Long.parseLong(val, radix, start, end); + System.err.println("parseInt(" + val + ", " + radix + ", " + start + ", " + end + + ") incorrectly returned " + n); + throw new RuntimeException(); + } catch (IndexOutOfBoundsException ioob) { + ; // Expected + } + } + + private static void checkNull(int radix, int start, int end) { + long n = 0; + try { + n = Long.parseLong(null, 10, start, end); + System.err.println("parseInt(null, " + radix + ", " + start + ", " + end + + ") incorrectly returned " + n); + throw new RuntimeException(); + } catch (NullPointerException npe) { + ; // Expected + } + } + + private static void check(String val, long expected, int start, int end) { + long n = Long.parseLong(val, 10, start, end); + if (n != expected) + throw new RuntimeException("Long.parseLong failed. String:" + + val + ", start: " + start + ", end: " + end + " Result:" + n); + } } diff -r d9ce05f36ffe -r b08ff6ffcc26 jdk/test/java/lang/String/ToLowerCase.java --- a/jdk/test/java/lang/String/ToLowerCase.java Wed Jul 05 19:51:30 2017 +0200 +++ b/jdk/test/java/lang/String/ToLowerCase.java Tue Jul 22 11:55:27 2014 -0700 @@ -23,7 +23,7 @@ /* @test - @bug 4217441 4533872 4900935 8020037 8032012 8041791 + @bug 4217441 4533872 4900935 8020037 8032012 8041791 8042589 @summary toLowerCase should lower-case Greek Sigma correctly depending on the context (final/non-final). Also it should handle Locale specific (lt, tr, and az) lowercasings and supplementary @@ -106,6 +106,12 @@ // invalid code point tests: test("\uD800\uD800\uD801A\uDC00\uDC00\uDC00B", Locale.US, "\uD800\uD800\uD801a\uDC00\uDC00\uDC00b"); + // lower/uppercase + surrogates + test("a\uD801\uDC1c", Locale.ROOT, "a\uD801\uDC44"); + test("A\uD801\uDC1c", Locale.ROOT, "a\uD801\uDC44"); + test("a\uD801\uDC00\uD801\uDC01\uD801\uDC02", Locale.US, "a\uD801\uDC28\uD801\uDC29\uD801\uDC2A"); + test("A\uD801\uDC00\uD801\uDC01\uD801\uDC02", Locale.US, "a\uD801\uDC28\uD801\uDC29\uD801\uDC2A"); + // test bmp + supp1 StringBuilder src = new StringBuilder(0x20000); StringBuilder exp = new StringBuilder(0x20000); diff -r d9ce05f36ffe -r b08ff6ffcc26 jdk/test/java/lang/String/ToUpperCase.java --- a/jdk/test/java/lang/String/ToUpperCase.java Wed Jul 05 19:51:30 2017 +0200 +++ b/jdk/test/java/lang/String/ToUpperCase.java Tue Jul 22 11:55:27 2014 -0700 @@ -23,7 +23,7 @@ /* @test - @bug 4219630 4304573 4533872 4900935 + @bug 4219630 4304573 4533872 4900935 8042589 @summary toUpperCase should upper-case German sharp s correctly even if it's the only character in the string. should also uppercase all of the 1:M char mappings correctly. Also it should handle @@ -91,6 +91,12 @@ test("\uD801\uDC28a\uD801\uDC29b\uD801\uDC2Ac", Locale.US, "\uD801\uDC00A\uD801\uDC01B\uD801\uDC02C"); // invalid code point tests: test("\uD800\uD800\uD801a\uDC00\uDC00\uDC00b", Locale.US, "\uD800\uD800\uD801A\uDC00\uDC00\uDC00B"); + + // lower/uppercase + surrogates + test("a\uD801\uDC44", Locale.ROOT, "A\uD801\uDC1c"); + test("A\uD801\uDC44", Locale.ROOT, "A\uD801\uDC1c"); + test("a\uD801\uDC28\uD801\uDC29\uD801\uDC2A", Locale.US, "A\uD801\uDC00\uD801\uDC01\uD801\uDC02"); + test("A\uD801\uDC28a\uD801\uDC29b\uD801\uDC2Ac", Locale.US, "A\uD801\uDC00A\uD801\uDC01B\uD801\uDC02C"); } static void test(String in, Locale locale, String expected) { diff -r d9ce05f36ffe -r b08ff6ffcc26 jdk/test/java/net/MulticastSocket/TestInterfaces.java --- a/jdk/test/java/net/MulticastSocket/TestInterfaces.java Wed Jul 05 19:51:30 2017 +0200 +++ b/jdk/test/java/net/MulticastSocket/TestInterfaces.java Tue Jul 22 11:55:27 2014 -0700 @@ -28,6 +28,8 @@ * same InetAddress set by MulticastSocket.setInterface */ import java.net.*; +import java.util.Arrays; +import java.util.Collections; import java.util.Enumeration; import java.io.IOException; @@ -47,6 +49,7 @@ /* * Test MulticastSocket.getInterface */ + System.out.println("Testing network interface " + ni); Enumeration addrs = ni.getInetAddresses(); while (addrs.hasMoreElements()) { InetAddress ia = (InetAddress)addrs.nextElement(); @@ -64,6 +67,8 @@ InetAddress curr = soc.getInterface(); if (!curr.equals(ia)) { + System.err.println("NetworkInterface under test " + ni); + displayInterfaceInformation(ni); System.err.println("MulticastSocket.getInterface returned: " + curr); System.err.println("Failed! Expected: " + ia); failures++; @@ -96,6 +101,10 @@ if (!curr.equals(ni)) { System.err.println("MulticastSocket.getNetworkInterface returned: " + curr); System.err.println("Failed! Expected: " + ni); + System.err.println("NetworkInterface details for curr variable "); + displayInterfaceInformation(curr); + System.err.println("NetworkInterface details for ni variable "); + displayInterfaceInformation(ni) ; failures++; } else { System.out.println("Passed."); @@ -110,4 +119,23 @@ } + static void displayInterfaceInformation(NetworkInterface netint) throws SocketException { + System.err.println("Display name: " + netint.getDisplayName()); + System.err.println("Name: " + netint.getName()); + Enumeration inetAddresses = netint.getInetAddresses(); + + for (InetAddress inetAddress : Collections.list(inetAddresses)) + System.err.println("InetAddress: " + inetAddress); + + System.err.println("Up? " + netint.isUp()); + System.err.println("Loopback? " + netint.isLoopback()); + System.err.println("PointToPoint? " + netint.isPointToPoint()); + System.err.println("Supports multicast? " + netint.supportsMulticast()); + System.err.println("Virtual? " + netint.isVirtual()); + System.err.println("Hardware address: " + + Arrays.toString(netint.getHardwareAddress())); + System.err.println("MTU: " + netint.getMTU()); + System.err.println("Index: " + netint.getIndex()); + System.err.println(); + } } diff -r d9ce05f36ffe -r b08ff6ffcc26 jdk/test/javax/security/auth/kerberos/KerberosHashEqualsTest.java --- a/jdk/test/javax/security/auth/kerberos/KerberosHashEqualsTest.java Wed Jul 05 19:51:30 2017 +0200 +++ b/jdk/test/javax/security/auth/kerberos/KerberosHashEqualsTest.java Tue Jul 22 11:55:27 2014 -0700 @@ -33,9 +33,7 @@ import java.net.InetAddress; import java.util.Date; -import javax.security.auth.kerberos.KerberosKey; -import javax.security.auth.kerberos.KerberosPrincipal; -import javax.security.auth.kerberos.KerberosTicket; +import javax.security.auth.kerberos.*; public class KerberosHashEqualsTest { public static void main(String[] args) throws Exception { @@ -66,28 +64,67 @@ k2.destroy(); checkNotSame(k1, k2); - - // destroyed keys doesn't equal to each other checkNotSame(k2, k1); checkSame(k2, k2); + k1.destroy(); + checkNotSame(k1, k2); + + // Destroyed key has string and hashCode + k1.toString(); k1.hashCode(); + // a little different + k1 = new KerberosKey(newKP("A"), "pass".getBytes(), 1, 1); k2 = new KerberosKey(newKP("B"), "pass".getBytes(), 1, 1); checkNotSame(k1, k2); + k2 = new KerberosKey(newKP("A"), "ssap".getBytes(), 1, 1); checkNotSame(k1, k2); + k2 = new KerberosKey(newKP("A"), "pass".getBytes(), 2, 1); checkNotSame(k1, k2); + k2 = new KerberosKey(newKP("A"), "pass".getBytes(), 1, 2); checkNotSame(k1, k2); + // Null k1 = new KerberosKey(null, "pass".getBytes(), 1, 2); checkNotSame(k1, k2); // null to non-null k2 = new KerberosKey(null, "pass".getBytes(), 1, 2); checkSame(k1, k2); // null to null + // Even key with null principal has a string and hashCode + k1.toString(); k1.hashCode(); + checkNotSame(k1, "Another Object"); + EncryptionKey e1, e2; + e1 = new EncryptionKey("pass".getBytes(), 1); + e2 = new EncryptionKey("pass".getBytes(), 1); + checkSame(e1, e1); // me to me + checkSame(e1, e2); // same + + e2.destroy(); + checkNotSame(e1, e2); + checkNotSame(e2, e1); + checkSame(e2, e2); + + e1.destroy(); + checkNotSame(e1, e2); + + // Destroyed key has string and hashCode + e1.toString(); e1.hashCode(); + + // a little different + e1 = new EncryptionKey("pass".getBytes(), 1); + e2 = new EncryptionKey("ssap".getBytes(), 1); + checkNotSame(e1, e2); + + e2 = new EncryptionKey("pass".getBytes(), 2); + checkNotSame(e1, e2); + + checkNotSame(e1, "Another Object"); + KerberosTicket t1, t2; t1 = new KerberosTicket("asn1".getBytes(), newKP("client"), newKP("server"), "pass".getBytes(), 1, new boolean[] {true, true}, new Date(0), new Date(0), new Date(0), new Date(0), null); t2 = new KerberosTicket("asn1".getBytes(), newKP("client"), newKP("server"), "pass".getBytes(), 1, new boolean[] {true, true}, new Date(0), new Date(0), new Date(0), new Date(0), null); @@ -120,6 +157,7 @@ t2.destroy(); checkNotSame(t1, t2); + t2.hashCode(); t2.toString(); // destroyed tickets doesn't equal to each other checkNotSame(t2, t1); @@ -130,6 +168,37 @@ checkNotSame(t1, t2); // renewtill is useful checkNotSame(t1, "Another Object"); + + KerberosCredMessage m1, m2; + m1 = new KerberosCredMessage(newKP("C"), newKP("S"), "message".getBytes()); + m2 = new KerberosCredMessage(newKP("C"), newKP("S"), "message".getBytes()); + checkSame(m1, m1); // me to me + checkSame(m1, m2); // same + + m2.destroy(); + checkNotSame(m1, m2); + checkNotSame(m2, m1); + checkSame(m2, m2); + + m1.destroy(); + checkNotSame(m1, m2); + + // Destroyed message has string and hashCode + m1.toString(); m1.hashCode(); + + // a little different + m1 = new KerberosCredMessage(newKP("C"), newKP("S"), "message".getBytes()); + m2 = new KerberosCredMessage(newKP("A"), newKP("S"), "message".getBytes()); + checkNotSame(m1, m2); + + m2 = new KerberosCredMessage(newKP("C"), newKP("B"), "message".getBytes()); + checkNotSame(m1, m2); + + m1 = new KerberosCredMessage(newKP("C"), newKP("S"), "hello".getBytes()); + checkNotSame(m1, m2); + + checkNotSame(m1, "Another Object"); + System.out.println("Good!"); } diff -r d9ce05f36ffe -r b08ff6ffcc26 jdk/test/javax/security/auth/kerberos/KerberosNullsAndDestroyTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/security/auth/kerberos/KerberosNullsAndDestroyTest.java Tue Jul 22 11:55:27 2014 -0700 @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8043071 + * @summary Expose session key and KRB_CRED through extended GSS-API + */ + +import javax.security.auth.kerberos.*; +import java.util.function.Supplier; + +public class KerberosNullsAndDestroyTest { + + public static void main(String[] args) throws Exception { + + KerberosPrincipal c = new KerberosPrincipal("me@HERE"); + KerberosPrincipal s = new KerberosPrincipal("you@THERE"); + + // These object constructions should throw NullPointerException + checkNPE(() -> new KerberosKey(c, null, 17, 1)); + checkNPE(() -> new EncryptionKey(null, 17)); + checkNPE(() -> new KerberosCredMessage(null, s, new byte[1])); + checkNPE(() -> new KerberosCredMessage(c, null, new byte[1])); + checkNPE(() -> new KerberosCredMessage(c, s, null)); + + KerberosKey k1 = new KerberosKey(c, new byte[16], 17, 1); + EncryptionKey k2 = new EncryptionKey(new byte[16], 17); + KerberosCredMessage m = new KerberosCredMessage(c, s, new byte[1]); + + // These get calls should throw IllegalStateException + k1.destroy(); + checkISE(() -> k1.getAlgorithm()); + checkISE(() -> k1.getEncoded()); + checkISE(() -> k1.getFormat()); + checkISE(() -> k1.getKeyType()); + checkISE(() -> k1.getPrincipal()); + checkISE(() -> k1.getVersionNumber()); + + k2.destroy(); + checkISE(() -> k2.getAlgorithm()); + checkISE(() -> k2.getEncoded()); + checkISE(() -> k2.getFormat()); + checkISE(() -> k2.getKeyType()); + + m.destroy(); + checkISE(() -> m.getSender()); + checkISE(() -> m.getRecipient()); + checkISE(() -> m.getEncoded()); + } + + static void checkNPE(Supplier f) throws Exception { + check(f, NullPointerException.class); + } + + static void checkISE(Supplier f) throws Exception { + check(f, IllegalStateException.class); + } + + static void check(Supplier f, Class type) throws Exception { + try { + f.get(); + } catch (Exception e) { + if (e.getClass() != type) { + throw e; + } else { + return; + } + } + throw new Exception("Should fail"); + } +} diff -r d9ce05f36ffe -r b08ff6ffcc26 jdk/test/javax/xml/bind/xjc/8029837/PreParseGrammarTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/xml/bind/xjc/8029837/PreParseGrammarTest.java Tue Jul 22 11:55:27 2014 -0700 @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8029837 + * @summary Test simulates the partial call to xjc ant task that fails with + * NullPointer exception + * @run main/othervm PreParseGrammarTest + */ + +import com.sun.org.apache.xerces.internal.parsers.XMLGrammarPreparser; +import com.sun.org.apache.xerces.internal.xni.XNIException; +import com.sun.org.apache.xerces.internal.xni.grammars.Grammar; +import com.sun.org.apache.xerces.internal.xni.grammars.XMLGrammarDescription; +import com.sun.org.apache.xerces.internal.xni.parser.XMLInputSource; +import java.io.BufferedInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; + +public class PreParseGrammarTest { + + public static void main(String[] args) throws FileNotFoundException, XNIException, IOException { + File xsdf = new File(System.getProperty("test.src", ".") + "/test.xsd"); + InputStream is = new BufferedInputStream(new FileInputStream(xsdf)); + XMLInputSource xis = new XMLInputSource(null, null, null, is, null); + XMLGrammarPreparser gp = new XMLGrammarPreparser(); + gp.registerPreparser(XMLGrammarDescription.XML_SCHEMA, null); + //The NullPointerException is observed on next call during ant task + // execution + Grammar res = gp.preparseGrammar(XMLGrammarDescription.XML_SCHEMA, xis); + System.out.println("Grammar preparsed successfully:" + res); + return; + } +} diff -r d9ce05f36ffe -r b08ff6ffcc26 jdk/test/javax/xml/bind/xjc/8029837/test.xsd --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/javax/xml/bind/xjc/8029837/test.xsd Tue Jul 22 11:55:27 2014 -0700 @@ -0,0 +1,4 @@ + + + + diff -r d9ce05f36ffe -r b08ff6ffcc26 jdk/test/sun/misc/JavaLangAccess/FormatUnsigned.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/sun/misc/JavaLangAccess/FormatUnsigned.java Tue Jul 22 11:55:27 2014 -0700 @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import sun.misc.JavaLangAccess; +import sun.misc.SharedSecrets; + +/* + * @test + * @summary Test JavaLangAccess.formatUnsignedInt/-Long + * @bug 8050114 + */ +public class FormatUnsigned { + + static final JavaLangAccess jla = SharedSecrets.getJavaLangAccess(); + + public static void testFormatUnsignedInt() { + testFormatUnsignedInt("7fffffff", Integer.MAX_VALUE, 8, 4, 0, 8); + testFormatUnsignedInt("80000000", Integer.MIN_VALUE, 8, 4, 0, 8); + testFormatUnsignedInt("4711", 04711, 4, 3, 0, 4); + testFormatUnsignedInt("4711", 0x4711, 4, 4, 0, 4); + testFormatUnsignedInt("1010", 0b1010, 4, 1, 0, 4); + testFormatUnsignedInt("00001010", 0b1010, 8, 1, 0, 8); + testFormatUnsignedInt("\u0000\u000000001010", 0b1010, 10, 1, 2, 8); + } + + public static void testFormatUnsignedLong() { + testFormatUnsignedLong("7fffffffffffffff", Long.MAX_VALUE, 16, 4, 0, 16); + testFormatUnsignedLong("8000000000000000", Long.MIN_VALUE, 16, 4, 0, 16); + testFormatUnsignedLong("4711", 04711L, 4, 3, 0, 4); + testFormatUnsignedLong("4711", 0x4711L, 4, 4, 0, 4); + testFormatUnsignedLong("1010", 0b1010L, 4, 1, 0, 4); + testFormatUnsignedLong("00001010", 0b1010L, 8, 1, 0, 8); + testFormatUnsignedLong("\u0000\u000000001010", 0b1010L, 10, 1, 2, 8); + } + + public static void testFormatUnsignedInt(String expected, int value, int arraySize, int shift, int offset, int length) { + char[] chars = new char[arraySize]; + jla.formatUnsignedInt(value, shift, chars, offset, length); + String s = new String(chars); + if (!expected.equals(s)) { + throw new Error(s + " should be equal to expected " + expected); + } + } + + public static void testFormatUnsignedLong(String expected, long value, int arraySize, int shift, int offset, int length) { + char[] chars = new char[arraySize]; + jla.formatUnsignedLong(value, shift, chars, offset, length); + String s = new String(chars); + if (!expected.equals(s)) { + throw new Error(s + " should be equal to expected " + expected); + } + } + + public static void main(String[] args) { + testFormatUnsignedInt(); + testFormatUnsignedLong(); + } +} diff -r d9ce05f36ffe -r b08ff6ffcc26 jdk/test/sun/security/jgss/spnego/NotPreferredMech.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/sun/security/jgss/spnego/NotPreferredMech.java Tue Jul 22 11:55:27 2014 -0700 @@ -0,0 +1,100 @@ +/* + * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8048194 + * @run main/othervm NotPreferredMech + * @summary GSSContext.acceptSecContext fails when a supported mech is not initiator preferred + */ + +import org.ietf.jgss.*; +import sun.security.jgss.*; +import sun.security.jgss.spnego.NegTokenInit; +import sun.security.jgss.spnego.NegTokenTarg; +import sun.security.util.BitArray; +import sun.security.util.DerOutputStream; +import sun.security.util.DerValue; +import sun.security.util.ObjectIdentifier; + +import java.io.ByteArrayOutputStream; +import java.lang.reflect.Constructor; +import java.lang.reflect.Method; + +public class NotPreferredMech { + + public static void main(String[] argv) throws Exception { + + // Generates a NegTokenInit mechTypes field, with an + // unsupported mech as the preferred. + DerOutputStream mech = new DerOutputStream(); + mech.write(new Oid("1.2.3.4").getDER()); + mech.write(GSSUtil.GSS_KRB5_MECH_OID.getDER()); + DerOutputStream mechTypeList = new DerOutputStream(); + mechTypeList.write(DerValue.tag_Sequence, mech); + + // Generates a NegTokenInit mechToken field for 1.2.3.4 mech + GSSHeader h1 = new GSSHeader(new ObjectIdentifier("1.2.3.4"), 1); + ByteArrayOutputStream bout = new ByteArrayOutputStream(); + h1.encode(bout); + bout.write(new byte[1]); + + // Generates the NegTokenInit token + Constructor ctor = NegTokenInit.class.getDeclaredConstructor( + byte[].class, BitArray.class, byte[].class, byte[].class); + ctor.setAccessible(true); + NegTokenInit initToken = ctor.newInstance( + mechTypeList.toByteArray(), + new BitArray(0), + bout.toByteArray(), + null); + Method m = Class.forName("sun.security.jgss.spnego.SpNegoToken") + .getDeclaredMethod("getEncoded"); + m.setAccessible(true); + byte[] spnegoToken = (byte[])m.invoke(initToken); + + // and wraps it into a GSSToken + GSSHeader h = new GSSHeader( + new ObjectIdentifier(GSSUtil.GSS_SPNEGO_MECH_OID.toString()), + spnegoToken.length); + bout = new ByteArrayOutputStream(); + h.encode(bout); + bout.write(spnegoToken); + byte[] token = bout.toByteArray(); + + // and feeds it to a GSS acceptor + GSSManager man = GSSManager.getInstance(); + GSSContext ctxt = man.createContext((GSSCredential) null); + token = ctxt.acceptSecContext(token, 0, token.length); + NegTokenTarg targ = new NegTokenTarg(token); + + // Make sure it's a GO-ON message + Method m2 = NegTokenTarg.class.getDeclaredMethod("getNegotiatedResult"); + m2.setAccessible(true); + int negResult = (int)m2.invoke(targ); + + if (negResult != 1 /* ACCEPT_INCOMPLETE */) { + throw new Exception("Not a continue"); + } + } +} diff -r d9ce05f36ffe -r b08ff6ffcc26 jdk/test/sun/security/krb5/auto/Context.java --- a/jdk/test/sun/security/krb5/auto/Context.java Wed Jul 05 19:51:30 2017 +0200 +++ b/jdk/test/sun/security/krb5/auto/Context.java Tue Jul 22 11:55:27 2014 -0700 @@ -26,9 +26,11 @@ import java.security.PrivilegedActionException; import java.security.PrivilegedExceptionAction; import java.util.Arrays; +import java.util.Base64; import java.util.HashMap; import java.util.Map; import javax.security.auth.Subject; +import javax.security.auth.kerberos.KerberosCredMessage; import javax.security.auth.kerberos.KerberosKey; import javax.security.auth.kerberos.KerberosTicket; import javax.security.auth.login.LoginContext; @@ -86,7 +88,6 @@ /** * Using the delegated credentials from a previous acceptor - * @param c */ public Context delegated() throws Exception { Context out = new Context(); @@ -177,7 +178,6 @@ /** * Logins with username/keytab as an existing Subject. The * same subject can be used multiple times to simulate multiple logins. - * @param s existing subject */ public static Context fromUserKtab( String user, String ktab, boolean storeKey) throws Exception { @@ -411,6 +411,12 @@ Key k = (Key)ex.inquireSecContext( InquireType.KRB5_GET_SESSION_KEY); if (k == null) { + throw new Exception("(Old) Session key cannot be null"); + } + System.out.println("(Old) Session key is: " + k); + Key k2 = (Key)ex.inquireSecContext( + InquireType.KRB5_GET_SESSION_KEY_EX); + if (k2 == null) { throw new Exception("Session key cannot be null"); } System.out.println("Session key is: " + k); @@ -431,6 +437,19 @@ InquireType.KRB5_GET_AUTHZ_DATA); System.out.println("AuthzData is: " + Arrays.toString(ad)); } + try { + KerberosCredMessage tok = (KerberosCredMessage)ex.inquireSecContext( + InquireType.KRB5_GET_KRB_CRED); + System.out.println("KRB_CRED is " + + (tok == null?"not ":"") + "available"); + if (tok != null) { + System.out.println("From " + tok.getSender() + " to " + + tok.getRecipient()); + System.out.println(Base64.getEncoder().encodeToString(tok.getEncoded())); + } + } catch (Exception e) { + System.out.println("KRB_CRED is not available: " + e); + } } } } diff -r d9ce05f36ffe -r b08ff6ffcc26 jdk/test/sun/security/krb5/auto/KerberosHashEqualsTest.java --- a/jdk/test/sun/security/krb5/auto/KerberosHashEqualsTest.java Wed Jul 05 19:51:30 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,174 +0,0 @@ -/* - * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -/* - * @test - * @bug 4641821 - * @run main/othervm KerberosHashEqualsTest - * @summary hashCode() and equals() for KerberosKey and KerberosTicket - */ - -import java.net.InetAddress; -import java.util.Date; -import javax.security.auth.kerberos.KerberosKey; -import javax.security.auth.kerberos.KerberosPrincipal; -import javax.security.auth.kerberos.KerberosTicket; - -public class KerberosHashEqualsTest { - public static void main(String[] args) throws Exception { - new OneKDC(null); - new KerberosHashEqualsTest().check(); - } - - void checkSame(Object o1, Object o2) { - if(!o1.equals(o2)) { - throw new RuntimeException("equals() fails"); - } - if(o1.hashCode() != o2.hashCode()) { - throw new RuntimeException("hashCode() not same"); - } - } - - void checkNotSame(Object o1, Object o2) { - if(o1.equals(o2)) { - throw new RuntimeException("equals() succeeds"); - } - } - - void check() throws Exception { - - // The key part: - // new KerberosKey(principal, bytes, keyType, version) - - KerberosKey k1, k2; - KerberosPrincipal CLIENT = new KerberosPrincipal("client"); - KerberosPrincipal SERVER = new KerberosPrincipal("server"); - byte[] PASS = "pass".getBytes(); - - k1 = new KerberosKey(CLIENT, PASS, 1, 1); - k2 = new KerberosKey(CLIENT, PASS, 1, 1); - checkSame(k1, k1); // me is me - checkSame(k1, k2); // same - - // A destroyed key doesn't equal to any key - k2.destroy(); - checkNotSame(k1, k2); - checkNotSame(k2, k1); - k1.destroy(); - checkNotSame(k1, k2); // even if they are both destroyed - checkNotSame(k2, k1); - checkSame(k2, k2); - - // a little difference means not equal - k1 = new KerberosKey(CLIENT, PASS, 1, 1); - k2 = new KerberosKey(SERVER, PASS, 1, 1); - checkNotSame(k1, k2); // Different principal name - - k2 = new KerberosKey(CLIENT, "ssap".getBytes(), 1, 1); - checkNotSame(k1, k2); // Different password - - k2 = new KerberosKey(CLIENT, PASS, 2, 1); - checkNotSame(k1, k2); // Different keytype - - k2 = new KerberosKey(CLIENT, PASS, 1, 2); - checkNotSame(k1, k2); // Different version - - k2 = new KerberosKey(null, PASS, 1, 2); - checkNotSame(k1, k2); // null is not non-null - - k1 = new KerberosKey(null, PASS, 1, 2); - checkSame(k1, k2); // null is null - - checkNotSame(k1, "Another Object"); - - // The ticket part: - // new KerberosTicket(asn1 bytes, client, server, session key, type, flags, - // auth, start, end, renewUntil times, address) - - KerberosTicket t1, t2; - - byte[] ASN1 = "asn1".getBytes(); - boolean[] FORWARDABLE = new boolean[] {true, true}; - boolean[] ALLTRUE = new boolean[] {true, true, true, true, true, true, true, true, true, true}; - Date D0 = new Date(0); - - t1 = new KerberosTicket(ASN1, CLIENT, SERVER, PASS, 1, FORWARDABLE, D0, D0, D0, D0, null); - t2 = new KerberosTicket(ASN1, CLIENT, SERVER, PASS, 1, FORWARDABLE, D0, D0, D0, D0, null); - checkSame(t1, t1); - checkSame(t1, t2); - - // destroyed tickets doesn't equal to each other - t1.destroy(); - checkNotSame(t1, t2); - checkNotSame(t2, t1); - - t2.destroy(); - checkNotSame(t1, t2); // even if they are both destroyed - checkNotSame(t2, t1); - - checkSame(t2, t2); // unless they are the same object - - // a little difference means not equal - t1 = new KerberosTicket(ASN1, CLIENT, SERVER, PASS, 1, FORWARDABLE, D0, D0, D0, D0, null); - t2 = new KerberosTicket("asn11".getBytes(), CLIENT, SERVER, PASS, 1, FORWARDABLE, D0, D0, D0, D0, null); - checkNotSame(t1, t2); // Different ASN1 encoding - - t2 = new KerberosTicket(ASN1, new KerberosPrincipal("client1"), SERVER, PASS, 1, FORWARDABLE, D0, D0, D0, D0, null); - checkNotSame(t1, t2); // Different client - - t2 = new KerberosTicket(ASN1, CLIENT, new KerberosPrincipal("server1"), PASS, 1, FORWARDABLE, D0, D0, D0, D0, null); - checkNotSame(t1, t2); // Different server - - t2 = new KerberosTicket(ASN1, CLIENT, SERVER, "pass1".getBytes(), 1, FORWARDABLE, D0, D0, D0, D0, null); - checkNotSame(t1, t2); // Different session key - - t2 = new KerberosTicket(ASN1, CLIENT, SERVER, PASS, 2, FORWARDABLE, D0, D0, D0, D0, null); - checkNotSame(t1, t2); // Different key type - - t2 = new KerberosTicket(ASN1, CLIENT, SERVER, PASS, 1, new boolean[] {true, false}, D0, D0, D0, D0, null); - checkNotSame(t1, t2); // Different flags, not FORWARDABLE - - t2 = new KerberosTicket(ASN1, CLIENT, SERVER, PASS, 1, FORWARDABLE, new Date(1), D0, D0, D0, null); - checkNotSame(t1, t2); // Different authtime - - t2 = new KerberosTicket(ASN1, CLIENT, SERVER, PASS, 1, FORWARDABLE, D0, new Date(1), D0, D0, null); - checkNotSame(t1, t2); // Different starttime - - t2 = new KerberosTicket(ASN1, CLIENT, SERVER, PASS, 1, FORWARDABLE, D0, D0, new Date(1), D0, null); - checkNotSame(t1, t2); // Different endtime - - t2 = new KerberosTicket(ASN1, CLIENT, SERVER, PASS, 1, FORWARDABLE, D0, D0, D0, D0, new InetAddress[2]); - checkNotSame(t1, t2); // Different client addresses - - t2 = new KerberosTicket(ASN1, CLIENT, SERVER, PASS, 1, FORWARDABLE, D0, D0, D0, new Date(1), null); - t1 = new KerberosTicket(ASN1, CLIENT, SERVER, PASS, 1, FORWARDABLE, D0, D0, D0, new Date(2), null); - checkSame(t1, t2); // renewtill is ignored when RENEWABLE ticket flag is not set. - - t2 = new KerberosTicket(ASN1, CLIENT, SERVER, PASS, 1, ALLTRUE, D0, D0, D0, new Date(1), null); - t1 = new KerberosTicket(ASN1, CLIENT, SERVER, PASS, 1, ALLTRUE, D0, D0, D0, new Date(2), null); - checkNotSame(t1, t2); // renewtill is used when RENEWABLE is set. - - checkNotSame(t1, "Another Object"); - System.out.println("Good!"); - } -} diff -r d9ce05f36ffe -r b08ff6ffcc26 jdk/test/sun/security/krb5/auto/NewInquireTypes.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/sun/security/krb5/auto/NewInquireTypes.java Tue Jul 22 11:55:27 2014 -0700 @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8043071 + * @summary Expose session key and KRB_CRED through extended GSS-API + * @compile -XDignore.symbol.file NewInquireTypes.java + * @run main/othervm NewInquireTypes + */ + +import com.sun.security.jgss.InquireType; +import sun.security.jgss.GSSUtil; +import sun.security.krb5.internal.KRBCred; +import sun.security.krb5.internal.crypto.KeyUsage; + +import javax.security.auth.kerberos.KerberosCredMessage; +import javax.security.auth.kerberos.EncryptionKey; + +public class NewInquireTypes { + + public static void main(String[] args) throws Exception { + + new OneKDC(null).writeJAASConf(); + + Context c, s; + c = Context.fromJAAS("client"); + s = Context.fromJAAS("server"); + + c.startAsClient(OneKDC.SERVER, GSSUtil.GSS_KRB5_MECH_OID); + s.startAsServer(GSSUtil.GSS_KRB5_MECH_OID); + + Context.handshake(c, s); + + EncryptionKey key = (EncryptionKey) + c.x().inquireSecContext(InquireType.KRB5_GET_SESSION_KEY_EX); + KerberosCredMessage cred = (KerberosCredMessage) + c.x().inquireSecContext(InquireType.KRB5_GET_KRB_CRED); + + // Confirm the KRB_CRED message is encrypted with the session key. + new KRBCred(cred.getEncoded()).encPart.decrypt( + new sun.security.krb5.EncryptionKey(key.getKeyType(), key.getEncoded()), + KeyUsage.KU_ENC_KRB_CRED_PART); + } +} diff -r d9ce05f36ffe -r b08ff6ffcc26 jdk/test/sun/security/smartcardio/TestAll.java --- a/jdk/test/sun/security/smartcardio/TestAll.java Wed Jul 05 19:51:30 2017 +0200 +++ b/jdk/test/sun/security/smartcardio/TestAll.java Tue Jul 22 11:55:27 2014 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,7 +26,7 @@ // Because all the tests are marked @ignore as they require special hardware, // we cannot use jtreg to do this. -import java.lang.reflect.*; +import java.lang.reflect.Method; public class TestAll { diff -r d9ce05f36ffe -r b08ff6ffcc26 jdk/test/sun/security/smartcardio/TestChannel.java --- a/jdk/test/sun/security/smartcardio/TestChannel.java Wed Jul 05 19:51:30 2017 +0200 +++ b/jdk/test/sun/security/smartcardio/TestChannel.java Tue Jul 22 11:55:27 2014 -0700 @@ -31,10 +31,10 @@ // This test requires special hardware. -import java.io.*; -import java.util.*; - -import javax.smartcardio.*; +import javax.smartcardio.Card; +import javax.smartcardio.CardChannel; +import javax.smartcardio.CardTerminal; +import javax.smartcardio.CommandAPDU; public class TestChannel extends Utils { @@ -95,7 +95,7 @@ } // disconnect - card.disconnect(false); + card.disconnect(true); System.out.println("OK."); } diff -r d9ce05f36ffe -r b08ff6ffcc26 jdk/test/sun/security/smartcardio/TestConnect.java --- a/jdk/test/sun/security/smartcardio/TestConnect.java Wed Jul 05 19:51:30 2017 +0200 +++ b/jdk/test/sun/security/smartcardio/TestConnect.java Tue Jul 22 11:55:27 2014 -0700 @@ -31,10 +31,11 @@ // This test requires special hardware. -import java.io.*; -import java.util.*; - -import javax.smartcardio.*; +import java.util.List; +import javax.smartcardio.TerminalFactory; +import javax.smartcardio.Card; +import javax.smartcardio.CardChannel; +import javax.smartcardio.CardTerminal; public class TestConnect extends Utils { @@ -63,7 +64,7 @@ throw new Exception("Not T=0 protocol"); } transmit(card); - card.disconnect(false); + card.disconnect(true); try { transmit(card); @@ -96,7 +97,7 @@ throw new Exception("Not T=0 protocol"); } transmit(card); - card.disconnect(true); + card.disconnect(false); card = terminal.connect("*"); System.out.println("card: " + card); @@ -105,7 +106,6 @@ } transmit(card); card.disconnect(true); - card.disconnect(true); System.out.println("OK."); } diff -r d9ce05f36ffe -r b08ff6ffcc26 jdk/test/sun/security/smartcardio/TestConnectAgain.java --- a/jdk/test/sun/security/smartcardio/TestConnectAgain.java Wed Jul 05 19:51:30 2017 +0200 +++ b/jdk/test/sun/security/smartcardio/TestConnectAgain.java Tue Jul 22 11:55:27 2014 -0700 @@ -31,10 +31,10 @@ // This test requires special hardware. -import java.io.*; -import java.util.*; - -import javax.smartcardio.*; +import javax.smartcardio.Card; +import javax.smartcardio.CardException; +import javax.smartcardio.CardChannel; +import javax.smartcardio.CardTerminal; public class TestConnectAgain extends Utils { @@ -95,7 +95,7 @@ } // disconnect - card.disconnect(false); + card.disconnect(true); System.out.println("OK."); } diff -r d9ce05f36ffe -r b08ff6ffcc26 jdk/test/sun/security/smartcardio/TestControl.java --- a/jdk/test/sun/security/smartcardio/TestControl.java Wed Jul 05 19:51:30 2017 +0200 +++ b/jdk/test/sun/security/smartcardio/TestControl.java Tue Jul 22 11:55:27 2014 -0700 @@ -31,10 +31,9 @@ // This test requires special hardware. -import java.io.*; -import java.util.*; - -import javax.smartcardio.*; +import javax.smartcardio.Card; +import javax.smartcardio.CardException; +import javax.smartcardio.CardTerminal; public class TestControl extends Utils { @@ -68,7 +67,7 @@ } // disconnect - card.disconnect(false); + card.disconnect(true); System.out.println("OK."); } diff -r d9ce05f36ffe -r b08ff6ffcc26 jdk/test/sun/security/smartcardio/TestDefault.java --- a/jdk/test/sun/security/smartcardio/TestDefault.java Wed Jul 05 19:51:30 2017 +0200 +++ b/jdk/test/sun/security/smartcardio/TestDefault.java Tue Jul 22 11:55:27 2014 -0700 @@ -31,10 +31,9 @@ // This test requires special hardware. -import java.io.*; -import java.util.*; - -import javax.smartcardio.*; +import java.util.List; +import javax.smartcardio.CardTerminal; +import javax.smartcardio.TerminalFactory; public class TestDefault { diff -r d9ce05f36ffe -r b08ff6ffcc26 jdk/test/sun/security/smartcardio/TestExclusive.java --- a/jdk/test/sun/security/smartcardio/TestExclusive.java Wed Jul 05 19:51:30 2017 +0200 +++ b/jdk/test/sun/security/smartcardio/TestExclusive.java Tue Jul 22 11:55:27 2014 -0700 @@ -31,10 +31,11 @@ // This test requires special hardware. -import java.io.*; -import java.util.*; - -import javax.smartcardio.*; +import javax.smartcardio.Card; +import javax.smartcardio.CardChannel; +import javax.smartcardio.CardException; +import javax.smartcardio.CardTerminal; +import javax.smartcardio.CommandAPDU; public class TestExclusive extends Utils { @@ -84,9 +85,9 @@ Thread.sleep(1000); // disconnect - card.disconnect(false); + card.disconnect(true); - if (otherOK == false) { + if (! otherOK) { throw new Exception("Secondary thread failed"); } diff -r d9ce05f36ffe -r b08ff6ffcc26 jdk/test/sun/security/smartcardio/TestMultiplePresent.java --- a/jdk/test/sun/security/smartcardio/TestMultiplePresent.java Wed Jul 05 19:51:30 2017 +0200 +++ b/jdk/test/sun/security/smartcardio/TestMultiplePresent.java Tue Jul 22 11:55:27 2014 -0700 @@ -31,10 +31,10 @@ // This test requires special hardware. -import java.io.*; -import java.util.*; - -import javax.smartcardio.*; +import java.util.List; +import javax.smartcardio.CardTerminal; +import javax.smartcardio.CardTerminals; +import javax.smartcardio.TerminalFactory; import static javax.smartcardio.CardTerminals.State.*; public class TestMultiplePresent { diff -r d9ce05f36ffe -r b08ff6ffcc26 jdk/test/sun/security/smartcardio/TestPresent.java --- a/jdk/test/sun/security/smartcardio/TestPresent.java Wed Jul 05 19:51:30 2017 +0200 +++ b/jdk/test/sun/security/smartcardio/TestPresent.java Tue Jul 22 11:55:27 2014 -0700 @@ -31,10 +31,9 @@ // This test requires special hardware. -import java.io.*; -import java.util.*; - -import javax.smartcardio.*; +import java.util.List; +import javax.smartcardio.CardTerminal; +import javax.smartcardio.TerminalFactory; public class TestPresent { diff -r d9ce05f36ffe -r b08ff6ffcc26 jdk/test/sun/security/smartcardio/TestTransmit.java --- a/jdk/test/sun/security/smartcardio/TestTransmit.java Wed Jul 05 19:51:30 2017 +0200 +++ b/jdk/test/sun/security/smartcardio/TestTransmit.java Tue Jul 22 11:55:27 2014 -0700 @@ -31,10 +31,16 @@ // This test requires special hardware. -import java.io.*; -import java.util.*; - -import javax.smartcardio.*; +import java.io.BufferedReader; +import java.io.ByteArrayOutputStream; +import java.io.FileReader; +import java.io.IOException; +import java.io.StringReader; +import javax.smartcardio.Card; +import javax.smartcardio.CardChannel; +import javax.smartcardio.CardTerminal; +import javax.smartcardio.CommandAPDU; +import javax.smartcardio.ResponseAPDU; public class TestTransmit extends Utils { @@ -79,7 +85,7 @@ } // disconnect - card.disconnect(false); + card.disconnect(true); System.out.println("OK."); } diff -r d9ce05f36ffe -r b08ff6ffcc26 jdk/test/sun/security/smartcardio/Utils.java --- a/jdk/test/sun/security/smartcardio/Utils.java Wed Jul 05 19:51:30 2017 +0200 +++ b/jdk/test/sun/security/smartcardio/Utils.java Tue Jul 22 11:55:27 2014 -0700 @@ -24,10 +24,16 @@ // common utility functions for the PC/SC tests -import javax.smartcardio.*; - -import java.io.*; -import java.util.*; +import java.io.StringReader; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.Arrays; +import java.util.List; +import javax.smartcardio.CardTerminal; +import javax.smartcardio.CardChannel; +import javax.smartcardio.ResponseAPDU; +import javax.smartcardio.CommandAPDU; +import javax.smartcardio.TerminalFactory; public class Utils { diff -r d9ce05f36ffe -r b08ff6ffcc26 jdk/test/sun/security/tools/jarsigner/default_options.sh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/sun/security/tools/jarsigner/default_options.sh Tue Jul 22 11:55:27 2014 -0700 @@ -0,0 +1,64 @@ +# +# Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# This code is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 only, as +# published by the Free Software Foundation. +# +# This code is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# version 2 for more details (a copy is included in the LICENSE file that +# accompanied this code). +# +# You should have received a copy of the GNU General Public License version +# 2 along with this work; if not, write to the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +# or visit www.oracle.com if you need additional information or have any +# questions. +# + +# @test +# @bug 8049834 +# @summary Two security tools tests do not run with only JRE +# + +if [ "${TESTJAVA}" = "" ] ; then + JAVAC_CMD=`which javac` + TESTJAVA=`dirname $JAVAC_CMD`/.. +fi + +KS=ks +KEYTOOL="$TESTJAVA/bin/keytool ${TESTTOOLVMOPTS}" +JAR="$TESTJAVA/bin/jar ${TESTTOOLVMOPTS}" +JARSIGNER="$TESTJAVA/bin/jarsigner ${TESTTOOLVMOPTS}" + +rm $KS 2> /dev/null + +PASS=changeit +export PASS + +$KEYTOOL -genkeypair -dname CN=A -alias a \ + -storepass:env PASS -keypass:env PASS -keystore $KS \ + -keyalg rsa || exit 1 + +cat < js.conf +jarsigner.all = -keystore \${user.dir}/$KS -storepass:env PASS -debug -strict +jarsigner.sign = -digestalg SHA1 +jarsigner.verify = -verbose:summary + +EOF + +$JAR cvf a.jar ks js.conf + +$JARSIGNER -conf js.conf a.jar a || exit 21 +$JARSIGNER -conf js.conf -verify a.jar > jarsigner.out || exit 22 +grep "and 1 more" jarsigner.out || exit 23 +$JAR xvf a.jar META-INF/MANIFEST.MF +grep "SHA1-Digest" META-INF/MANIFEST.MF || exit 24 + +echo Done +exit 0 diff -r d9ce05f36ffe -r b08ff6ffcc26 jdk/test/sun/security/tools/jarsigner/weaksize.sh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/sun/security/tools/jarsigner/weaksize.sh Tue Jul 22 11:55:27 2014 -0700 @@ -0,0 +1,60 @@ +# +# Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# This code is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 only, as +# published by the Free Software Foundation. +# +# This code is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# version 2 for more details (a copy is included in the LICENSE file that +# accompanied this code). +# +# You should have received a copy of the GNU General Public License version +# 2 along with this work; if not, write to the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +# or visit www.oracle.com if you need additional information or have any +# questions. +# + +# @test +# @bug 8044755 +# @summary Add a test for algorithm constraints check in jarsigner +# + +if [ "${TESTJAVA}" = "" ] ; then + JAVAC_CMD=`which javac` + TESTJAVA=`dirname $JAVAC_CMD`/.. +fi + +# The sigalg used is MD2withRSA, which is obsolete. + +KT="$TESTJAVA/bin/keytool ${TESTTOOLVMOPTS} -keystore ks + -storepass changeit -keypass changeit + -keyalg rsa -sigalg MD2withRSA -debug" +JS="$TESTJAVA/bin/jarsigner ${TESTTOOLVMOPTS} -keystore ks + -storepass changeit -strict -debug" +JAR="$TESTJAVA/bin/jar ${TESTTOOLVMOPTS}" + +rm ks 2> /dev/null + +$KT -genkeypair -alias ca -dname CN=CA -ext bc +$KT -genkeypair -alias signer -dname CN=Signer + +$KT -certreq -alias signer | \ + $KT -gencert -alias ca -ext ku=dS -rfc | \ + $KT -importcert -alias signer + +$JAR cvf a.jar ks + +# We always trust a TrustedCertificateEntry +$JS a.jar ca || exit 1 + +# An end-entity cert must follow algorithm constraints +$JS a.jar signer && exit 2 + +exit 0 diff -r d9ce05f36ffe -r b08ff6ffcc26 jdk/test/sun/security/tools/keytool/default_options.sh --- a/jdk/test/sun/security/tools/keytool/default_options.sh Wed Jul 05 19:51:30 2017 +0200 +++ b/jdk/test/sun/security/tools/keytool/default_options.sh Tue Jul 22 11:55:27 2014 -0700 @@ -33,16 +33,12 @@ KS=ks KEYTOOL="$TESTJAVA/bin/keytool ${TESTTOOLVMOPTS}" -JAR="$TESTJAVA/bin/jar ${TESTTOOLVMOPTS}" -JARSIGNER="$TESTJAVA/bin/jarsigner ${TESTTOOLVMOPTS}" rm $KS 2> /dev/null PASS=changeit export PASS -# keytool - cat < kt.conf # A Pre-configured options file keytool.all = -storepass:env PASS -keypass:env PASS -keystore \${user.dir}/$KS -debug @@ -69,23 +65,6 @@ # Single-valued option on command line overrides again $KEYTOOL -conf kt.conf -delete -alias b -keystore $KS || exit 17 -# jarsigner - -cat < js.conf -jarsigner.all = -keystore \${user.dir}/$KS -storepass:env PASS -debug -strict -jarsigner.sign = -digestalg SHA1 -jarsigner.verify = -verbose:summary - -EOF - -$JAR cvf a.jar ks js.conf kt.conf - -$JARSIGNER -conf js.conf a.jar a || exit 21 -$JARSIGNER -conf js.conf -verify a.jar > jarsigner.out || exit 22 -grep "and 2 more" jarsigner.out || exit 23 -$JAR xvf a.jar META-INF/MANIFEST.MF -grep "SHA1-Digest" META-INF/MANIFEST.MF || exit 24 - # Error cases # File does not exist diff -r d9ce05f36ffe -r b08ff6ffcc26 jdk/test/sun/security/tools/keytool/weaksize.sh --- a/jdk/test/sun/security/tools/keytool/weaksize.sh Wed Jul 05 19:51:30 2017 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,60 +0,0 @@ -# -# Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# This code is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License version 2 only, as -# published by the Free Software Foundation. -# -# This code is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -# version 2 for more details (a copy is included in the LICENSE file that -# accompanied this code). -# -# You should have received a copy of the GNU General Public License version -# 2 along with this work; if not, write to the Free Software Foundation, -# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. -# -# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA -# or visit www.oracle.com if you need additional information or have any -# questions. -# - -# @test -# @bug 8044755 -# @summary Add a test for algorithm constraints check in jarsigner -# - -if [ "${TESTJAVA}" = "" ] ; then - JAVAC_CMD=`which javac` - TESTJAVA=`dirname $JAVAC_CMD`/.. -fi - -# The sigalg used is MD2withRSA, which is obsolete. - -KT="$TESTJAVA/bin/keytool ${TESTTOOLVMOPTS} -keystore ks - -storepass changeit -keypass changeit - -keyalg rsa -sigalg MD2withRSA -debug" -JS="$TESTJAVA/bin/jarsigner ${TESTTOOLVMOPTS} -keystore ks - -storepass changeit -strict -debug" -JAR="$TESTJAVA/bin/jar ${TESTTOOLVMOPTS}" - -rm ks 2> /dev/null - -$KT -genkeypair -alias ca -dname CN=CA -ext bc -$KT -genkeypair -alias signer -dname CN=Signer - -$KT -certreq -alias signer | \ - $KT -gencert -alias ca -ext ku=dS -rfc | \ - $KT -importcert -alias signer - -$JAR cvf a.jar ks - -# We always trust a TrustedCertificateEntry -$JS a.jar ca || exit 1 - -# An end-entity cert must follow algorithm constraints -$JS a.jar signer && exit 2 - -exit 0