aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2023-05-10 16:30:18 +0000
committerAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2023-05-10 16:30:18 +0000
commite2dee9f71115cecb6ce59492fc78c6e2a2033229 (patch)
tree965b351ee04003a046a394a47c977857d972fdf8
parenta0a499fe7ffc638187018955e24fa832f105493a (diff)
parentab52bcdb3475c3c242a89fe3a0d2323e31a6cced (diff)
downloadlibcore-android13-mainline-tzdata4-release.tar.gz
Snap for 10102166 from ab52bcdb3475c3c242a89fe3a0d2323e31a6cced to mainline-tzdata4-releaseaml_tz4_331910000android13-mainline-tzdata4-release
Change-Id: I4c53c5e2c0055cc48f78fc9a3a28441b276fcc37
-rw-r--r--Android.bp25
-rw-r--r--JavaLibrary.bp130
-rw-r--r--[-rwxr-xr-x]luni/src/test/java/libcore/android/system/OsTest.java12
-rw-r--r--luni/src/test/java/libcore/java/io/FileTest.java24
-rw-r--r--luni/src/test/java/tests/targets/security/KeyStorePkcs7FormatTest.java170
-rw-r--r--luni/src/test/resources/keystore/README.md68
-rw-r--r--luni/src/test/resources/keystore/certificate.pem13
-rwxr-xr-xluni/src/test/resources/keystore/mkstores.sh27
-rw-r--r--luni/src/test/resources/keystore/pberc2.p12bin0 -> 1533 bytes
-rw-r--r--luni/src/test/resources/keystore/pbes2-aes-128-aes-128-sha1.p12bin0 -> 1651 bytes
-rw-r--r--luni/src/test/resources/keystore/pbes2-aes-128-aes-128-sha224.p12bin0 -> 1663 bytes
-rw-r--r--luni/src/test/resources/keystore/pbes2-aes-128-aes-128-sha256.p12bin0 -> 1667 bytes
-rw-r--r--luni/src/test/resources/keystore/pbes2-aes-128-aes-128-sha384.p12bin0 -> 1683 bytes
-rw-r--r--luni/src/test/resources/keystore/pbes2-aes-128-aes-128-sha512.p12bin0 -> 1699 bytes
-rw-r--r--luni/src/test/resources/keystore/pbes2-aes-128-aes-192-sha1.p12bin0 -> 1651 bytes
-rw-r--r--luni/src/test/resources/keystore/pbes2-aes-128-aes-192-sha224.p12bin0 -> 1663 bytes
-rw-r--r--luni/src/test/resources/keystore/pbes2-aes-128-aes-192-sha256.p12bin0 -> 1667 bytes
-rw-r--r--luni/src/test/resources/keystore/pbes2-aes-128-aes-192-sha384.p12bin0 -> 1683 bytes
-rw-r--r--luni/src/test/resources/keystore/pbes2-aes-128-aes-192-sha512.p12bin0 -> 1699 bytes
-rw-r--r--luni/src/test/resources/keystore/pbes2-aes-128-aes-256-sha1.p12bin0 -> 1651 bytes
-rw-r--r--luni/src/test/resources/keystore/pbes2-aes-128-aes-256-sha224.p12bin0 -> 1663 bytes
-rw-r--r--luni/src/test/resources/keystore/pbes2-aes-128-aes-256-sha256.p12bin0 -> 1667 bytes
-rw-r--r--luni/src/test/resources/keystore/pbes2-aes-128-aes-256-sha384.p12bin0 -> 1683 bytes
-rw-r--r--luni/src/test/resources/keystore/pbes2-aes-128-aes-256-sha512.p12bin0 -> 1699 bytes
-rw-r--r--luni/src/test/resources/keystore/pbes2-aes-192-aes-128-sha1.p12bin0 -> 1651 bytes
-rw-r--r--luni/src/test/resources/keystore/pbes2-aes-192-aes-128-sha224.p12bin0 -> 1663 bytes
-rw-r--r--luni/src/test/resources/keystore/pbes2-aes-192-aes-128-sha256.p12bin0 -> 1667 bytes
-rw-r--r--luni/src/test/resources/keystore/pbes2-aes-192-aes-128-sha384.p12bin0 -> 1683 bytes
-rw-r--r--luni/src/test/resources/keystore/pbes2-aes-192-aes-128-sha512.p12bin0 -> 1699 bytes
-rw-r--r--luni/src/test/resources/keystore/pbes2-aes-192-aes-192-sha1.p12bin0 -> 1651 bytes
-rw-r--r--luni/src/test/resources/keystore/pbes2-aes-192-aes-192-sha224.p12bin0 -> 1663 bytes
-rw-r--r--luni/src/test/resources/keystore/pbes2-aes-192-aes-192-sha256.p12bin0 -> 1667 bytes
-rw-r--r--luni/src/test/resources/keystore/pbes2-aes-192-aes-192-sha384.p12bin0 -> 1683 bytes
-rw-r--r--luni/src/test/resources/keystore/pbes2-aes-192-aes-192-sha512.p12bin0 -> 1699 bytes
-rw-r--r--luni/src/test/resources/keystore/pbes2-aes-192-aes-256-sha1.p12bin0 -> 1651 bytes
-rw-r--r--luni/src/test/resources/keystore/pbes2-aes-192-aes-256-sha224.p12bin0 -> 1663 bytes
-rw-r--r--luni/src/test/resources/keystore/pbes2-aes-192-aes-256-sha256.p12bin0 -> 1667 bytes
-rw-r--r--luni/src/test/resources/keystore/pbes2-aes-192-aes-256-sha384.p12bin0 -> 1683 bytes
-rw-r--r--luni/src/test/resources/keystore/pbes2-aes-192-aes-256-sha512.p12bin0 -> 1699 bytes
-rw-r--r--luni/src/test/resources/keystore/pbes2-aes-256-aes-128-sha1.p12bin0 -> 1651 bytes
-rw-r--r--luni/src/test/resources/keystore/pbes2-aes-256-aes-128-sha224.p12bin0 -> 1663 bytes
-rw-r--r--luni/src/test/resources/keystore/pbes2-aes-256-aes-128-sha256.p12bin0 -> 1667 bytes
-rw-r--r--luni/src/test/resources/keystore/pbes2-aes-256-aes-128-sha384.p12bin0 -> 1683 bytes
-rw-r--r--luni/src/test/resources/keystore/pbes2-aes-256-aes-128-sha512.p12bin0 -> 1699 bytes
-rw-r--r--luni/src/test/resources/keystore/pbes2-aes-256-aes-192-sha1.p12bin0 -> 1651 bytes
-rw-r--r--luni/src/test/resources/keystore/pbes2-aes-256-aes-192-sha224.p12bin0 -> 1663 bytes
-rw-r--r--luni/src/test/resources/keystore/pbes2-aes-256-aes-192-sha256.p12bin0 -> 1667 bytes
-rw-r--r--luni/src/test/resources/keystore/pbes2-aes-256-aes-192-sha384.p12bin0 -> 1683 bytes
-rw-r--r--luni/src/test/resources/keystore/pbes2-aes-256-aes-192-sha512.p12bin0 -> 1699 bytes
-rw-r--r--luni/src/test/resources/keystore/pbes2-aes-256-aes-256-sha1.p12bin0 -> 1651 bytes
-rw-r--r--luni/src/test/resources/keystore/pbes2-aes-256-aes-256-sha224.p12bin0 -> 1663 bytes
-rw-r--r--luni/src/test/resources/keystore/pbes2-aes-256-aes-256-sha256.p12bin0 -> 1667 bytes
-rw-r--r--luni/src/test/resources/keystore/pbes2-aes-256-aes-256-sha384.p12bin0 -> 1683 bytes
-rw-r--r--luni/src/test/resources/keystore/pbes2-aes-256-aes-256-sha512.p12bin0 -> 1699 bytes
-rw-r--r--luni/src/test/resources/keystore/privkey.pem16
-rw-r--r--luni/src/test/resources/keystore/sha3.p12bin0 -> 1667 bytes
-rw-r--r--ojluni/Android.bp58
-rw-r--r--ojluni/src/main/Android.bp46
-rw-r--r--ojluni/src/main/MODULE_LICENSE_GPL_WITH_CLASSPATH_EXCEPTION (renamed from ojluni/MODULE_LICENSE_GPL_WITH_CLASSPATH_EXCEPTION)0
-rw-r--r--ojluni/src/main/NOTICE (renamed from ojluni/NOTICE)0
-rw-r--r--ojluni/src/main/native/Android.bp9
-rw-r--r--ojluni/src/main/native/canonicalize_md.c106
-rw-r--r--ojluni/src/test/Android.bp176
-rw-r--r--ojluni/src/test/LICENSE339
-rw-r--r--ojluni/src/tools/Android.bp28
-rw-r--r--ojluni/src/tools/LICENSE339
66 files changed, 1386 insertions, 200 deletions
diff --git a/Android.bp b/Android.bp
index 6d8a0f562d9..e330964f42c 100644
--- a/Android.bp
+++ b/Android.bp
@@ -13,7 +13,7 @@
// limitations under the License.
package {
- default_visibility: ["//visibility:private"],
+ default_visibility: [":__subpackages__"],
default_applicable_licenses: ["libcore_license"],
}
@@ -42,9 +42,7 @@ license {
license_kinds: [
"SPDX-license-identifier-Apache-2.0",
"SPDX-license-identifier-BSD",
- "SPDX-license-identifier-GPL",
- "SPDX-license-identifier-GPL-2.0",
- "SPDX-license-identifier-LGPL",
+ "SPDX-license-identifier-GPL-2.0-with-classpath-exception",
"SPDX-license-identifier-MIT",
"SPDX-license-identifier-OpenSSL",
"SPDX-license-identifier-Unicode-DFS",
@@ -54,6 +52,7 @@ license {
license_text: [
"LICENSE",
"NOTICE",
+ "ojluni/src/main/NOTICE",
],
}
@@ -63,16 +62,22 @@ build = [
"Extras.bp",
]
+gen_notice {
+ name: "libcore-library-notices",
+ for: [
+ "core-oj",
+ "core-libart",
+ ],
+ stem: "libcore-NOTICES",
+ suffix: ".txt",
+}
+
java_genrule {
name: "notices-for-stubs-jar",
tools: ["soong_zip"],
- tool_files: [
- "NOTICE",
- "ojluni/NOTICE",
- ],
+ srcs: [":libcore-library-notices"],
cmd: "mkdir $(genDir)/NOTICES && " +
- "cp -f $(location NOTICE) $(genDir)/NOTICES/libcore-NOTICE && " +
- "cp -f $(location ojluni/NOTICE) $(genDir)/NOTICES/ojluni-NOTICE && " +
+ "cp -f $(in) $(genDir)/NOTICES && " +
"$(location soong_zip) -o $(out) -C $(genDir) -D $(genDir)/NOTICES",
out: ["notices-for-stubs.jar"],
}
diff --git a/JavaLibrary.bp b/JavaLibrary.bp
index da7aacef9a4..7a8dfd9d801 100644
--- a/JavaLibrary.bp
+++ b/JavaLibrary.bp
@@ -149,6 +149,9 @@ filegroup {
java_defaults {
name: "libcore_java_defaults",
+ visibility: [
+ "//libcore:__subpackages__",
+ ],
javacflags: [
//"-Xlint:all",
//"-Xlint:-serial,-deprecation,-unchecked",
@@ -289,8 +292,6 @@ java_library {
],
},
- notice: "ojluni/NOTICE",
-
hiddenapi_additional_annotations: [
"core-oj-hiddenapi-annotations",
],
@@ -353,6 +354,7 @@ java_library {
name: "core-libart-for-host",
visibility: [
"//art/build/sdk",
+ "//external/robolectric",
"//external/robolectric-shadows",
"//frameworks/layoutlib",
],
@@ -379,7 +381,7 @@ java_library {
java_library {
name: "core-oj-hiddenapi-annotations",
// Do not allow this to be accessed from outside this directory.
- visibility: ["//visibility:private"],
+ visibility: ["//libcore:__subpackages__"],
defaults: ["libcore_java_defaults"],
compile_dex: true,
@@ -400,8 +402,6 @@ java_defaults {
system_modules: "core-all-system-modules",
patch_module: "java.base",
- notice: "ojluni/NOTICE",
-
installable: false,
include_srcs: true,
}
@@ -457,7 +457,6 @@ java_library {
sdk_version: "none",
system_modules: "core-all-system-modules",
patch_module: "java.base",
- notice: "ojluni/NOTICE",
installable: false,
include_srcs: true,
}
@@ -593,6 +592,17 @@ filegroup {
exclude_srcs: ["ojluni/src/test/javax/**/*.java"],
}
+filegroup {
+ name: "core-ojtests-java-resources",
+ // Set path to keep the resources and .class files in the same directory in the jar file.
+ path: "ojluni/src",
+ srcs: [
+ "ojluni/src/test/java/util/regex/**/*",
+ "ojluni/src/test/java/util/Base64/**/*",
+ ],
+ exclude_srcs: ["ojluni/src/test/java/**/*.java"],
+}
+
// Builds the core-tests library.
java_test {
name: "core-tests",
@@ -707,114 +717,6 @@ java_test {
],
}
-// Builds the core-ojtests library that contains test code from OpenJDK.
-java_test {
- name: "core-ojtests",
- defaults: ["libcore_java_defaults"],
- hostdex: true,
-
- srcs: [
- "ojluni/src/test/java/**/*.java",
- "ojluni/src/test/javax/**/*.java",
- "ojluni/src/test/sun/**/*.java",
- ],
- java_resource_dirs: [
- "ojluni/src/test/java",
- "ojluni/src/test/resources",
- ],
-
- java_resources: [
- ":core-ojtests-javax-resources",
- ],
-
- sdk_version: "none",
- system_modules: "core-all-system-modules",
- libs: [
- "okhttp",
- "bouncycastle",
- ],
-
- static_libs: [
- "junit",
- "testng",
- ],
-
- // ojluni/src/test/java/util/stream/{bootlib,boottest}
- // contains tests that are in packages from java.base;
- // By default, OpenJDK 9's javac will only compile such
- // code if it's declared to also be in java.base at
- // compile time.
- //
- // For now, we use patch_module to put all sources
- // and dependencies from this make target into java.base;
- // other source directories in this make target are in
- // packages not from java.base; if this becomes a problem
- // in future, this could be addressed eg. by splitting
- // boot{lib,test} out into a separate make target,
- // deleting those tests or moving them to a different
- // package.
- patch_module: "java.base",
-
- errorprone: {
- javacflags: [
- "-Xep:AlwaysThrows:OFF",
- "-Xep:DoNotCall:OFF",
- ],
- },
-}
-
-// Builds the core-ojtests-public library. Excludes any private API tests.
-// Like core-ojtests but smaller.
-java_test {
- name: "core-ojtests-public",
- visibility: [
- "//art/build/sdk",
- "//cts/tests/libcore/ojluni",
- ],
- defaults: ["libcore_java_defaults"],
- srcs: [
- "ojluni/src/test/java/**/*.java",
- "ojluni/src/test/javax/**/*.java",
- "ojluni/src/test/sun/**/*.java",
- ],
- // Filter out the following:
- // 1.) DeserializeMethodTest and SerializedLambdaTest, because they depends on stub classes
- // and won't actually run, and
- // 2.) util/stream/boot*. Those directories contain classes in the package java.util.stream;
- // excluding them means we don't need patch_module: "java.base"
- exclude_srcs: [
- "**/DeserializeMethodTest.java",
- "**/SerializedLambdaTest.java",
- "ojluni/src/test/java/util/stream/boot*/**/*",
- ],
- java_resource_dirs: [
- "ojluni/src/test/java",
- "ojluni/src/test/resources",
- // Include source code as part of JAR
- "ojluni/src/test/dist",
- ],
-
- java_resources: [
- ":core-ojtests-javax-resources",
- ],
-
- sdk_version: "none",
- system_modules: "core-all-system-modules",
- libs: [
- "bouncycastle",
- "junit",
- "okhttp",
- "testng",
- ],
-
- errorprone: {
- javacflags: [
- "-Xep:AlwaysThrows:OFF",
- "-Xep:DoNotCall:OFF",
- ],
- },
-}
-
// Exports annotated stubs source files in ojluni/annotations/sdk to make them
// available to metalava. Used for nullability annotations in OpenJDK source.
droiddoc_exported_dir {
diff --git a/luni/src/test/java/libcore/android/system/OsTest.java b/luni/src/test/java/libcore/android/system/OsTest.java
index f3dd685b22f..d305b84aa93 100755..100644
--- a/luni/src/test/java/libcore/android/system/OsTest.java
+++ b/luni/src/test/java/libcore/android/system/OsTest.java
@@ -1797,13 +1797,19 @@ public class OsTest {
// http://b/65051835
@Test
- public void test_sendfile_errno() {
+ public void test_sendfile_errno() throws Exception {
+ File testFile = File.createTempFile("test_sendfile_errno", "");
+ FileDescriptor fd = Os.open(testFile.toString(), O_WRONLY, S_IRUSR | S_IWUSR);
+ assertNotNull(fd);
+
try {
- // FileDescriptor.out is not open for input, will cause EBADF
+ // fd is not open for input, will cause EBADF
Int64Ref offset = new Int64Ref(10);
- Os.sendfile(FileDescriptor.out, FileDescriptor.out, offset, 10);
+ Os.sendfile(fd, fd, offset, 10);
fail();
} catch (ErrnoException expected) {
+ } finally {
+ Os.close(fd);
}
}
diff --git a/luni/src/test/java/libcore/java/io/FileTest.java b/luni/src/test/java/libcore/java/io/FileTest.java
index 3705f2b3c85..e61f572e8e3 100644
--- a/luni/src/test/java/libcore/java/io/FileTest.java
+++ b/luni/src/test/java/libcore/java/io/FileTest.java
@@ -23,6 +23,7 @@ import java.io.File;
import java.io.FileFilter;
import java.io.FilenameFilter;
import java.io.IOException;
+import java.lang.reflect.Field;
import java.nio.file.InvalidPathException;
import java.nio.file.Path;
import java.nio.file.Paths;
@@ -31,6 +32,8 @@ import libcore.io.Libcore;
import static android.system.Os.stat;
+import org.junit.Assert;
+
public class FileTest extends junit.framework.TestCase {
static {
@@ -414,4 +417,25 @@ public class FileTest extends junit.framework.TestCase {
// Did we cache canonical path results? hope not!
assertEquals(symlinkFile.getCanonicalPath(), f2.getCanonicalPath());
}
+
+ public void testGetCanonicalPath_duplicatePathSeparator() throws Exception {
+ assertCanonicalPath("/a//./b", "/a/b");
+ assertCanonicalPath("//a//b", "/a/b");
+ assertCanonicalPath("//a///b", "/a/b");
+ assertCanonicalPath("//a////b", "/a/b");
+ }
+
+ private void assertCanonicalPath(String internalPathValue, String expected) throws Exception {
+ File file = new File("/");
+ Field pathField = File.class.getDeclaredField("path");
+ pathField.setAccessible(true);
+
+ pathField.set(file, internalPathValue);
+ assertEquals(expected, file.getCanonicalFile().getPath());
+ }
+
+ public void testGetCanonicalPath_longPath() {
+ String p = "/a".repeat(2048);
+ Assert.assertThrows(IOException.class, () -> new File(p).getCanonicalFile());
+ }
}
diff --git a/luni/src/test/java/tests/targets/security/KeyStorePkcs7FormatTest.java b/luni/src/test/java/tests/targets/security/KeyStorePkcs7FormatTest.java
new file mode 100644
index 00000000000..43c84696c63
--- /dev/null
+++ b/luni/src/test/java/tests/targets/security/KeyStorePkcs7FormatTest.java
@@ -0,0 +1,170 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package tests.targets.security;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.security.KeyStore;
+import java.security.KeyStore.PrivateKeyEntry;
+import java.security.cert.X509Certificate;
+import java.security.interfaces.RSAPrivateKey;
+import java.security.interfaces.RSAPublicKey;
+import java.util.Arrays;
+import java.util.Enumeration;
+import javax.crypto.Cipher;
+import org.junit.Test;
+import org.junit.experimental.runners.Enclosed;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameter;
+import org.junit.runners.Parameterized.Parameters;
+
+/**
+ * Tests the ability of PKCS#12 KeyStores to read PKCS#7 private key entries
+ * shrouded with different encryption schemes.
+ *
+ * KeyStores to test and instructions for regenerating them are in
+ * libcore/luni/src/test/resources/keystore.
+ *
+ * Each KeyStore to be tested contains the same certificate and private key
+ * pair and has the password "password".
+ */
+@RunWith(Enclosed.class)
+public class KeyStorePkcs7FormatTest {
+ private static final char[] PASSWORD = "password".toCharArray();
+ private static final String UNKNOWN_HASH = "/keystore/sha3.p12";
+
+ @RunWith(Parameterized.class)
+ public static class ParameterizedTests {
+ @Parameters(name = "{0}")
+ public static Iterable<?> data() {
+ return Arrays.asList(
+ "/keystore/pberc2.p12",
+ "/keystore/pbes2-aes-128-aes-128-sha1.p12",
+ "/keystore/pbes2-aes-128-aes-128-sha224.p12",
+ "/keystore/pbes2-aes-128-aes-128-sha256.p12",
+ "/keystore/pbes2-aes-128-aes-128-sha384.p12",
+ "/keystore/pbes2-aes-128-aes-128-sha512.p12",
+ "/keystore/pbes2-aes-128-aes-192-sha1.p12",
+ "/keystore/pbes2-aes-128-aes-192-sha224.p12",
+ "/keystore/pbes2-aes-128-aes-192-sha256.p12",
+ "/keystore/pbes2-aes-128-aes-192-sha384.p12",
+ "/keystore/pbes2-aes-128-aes-192-sha512.p12",
+ "/keystore/pbes2-aes-128-aes-256-sha1.p12",
+ "/keystore/pbes2-aes-128-aes-256-sha224.p12",
+ "/keystore/pbes2-aes-128-aes-256-sha256.p12",
+ "/keystore/pbes2-aes-128-aes-256-sha384.p12",
+ "/keystore/pbes2-aes-128-aes-256-sha512.p12",
+ "/keystore/pbes2-aes-192-aes-128-sha1.p12",
+ "/keystore/pbes2-aes-192-aes-128-sha224.p12",
+ "/keystore/pbes2-aes-192-aes-128-sha256.p12",
+ "/keystore/pbes2-aes-192-aes-128-sha384.p12",
+ "/keystore/pbes2-aes-192-aes-128-sha512.p12",
+ "/keystore/pbes2-aes-192-aes-192-sha1.p12",
+ "/keystore/pbes2-aes-192-aes-192-sha224.p12",
+ "/keystore/pbes2-aes-192-aes-192-sha256.p12",
+ "/keystore/pbes2-aes-192-aes-192-sha384.p12",
+ "/keystore/pbes2-aes-192-aes-192-sha512.p12",
+ "/keystore/pbes2-aes-192-aes-256-sha1.p12",
+ "/keystore/pbes2-aes-192-aes-256-sha224.p12",
+ "/keystore/pbes2-aes-192-aes-256-sha256.p12",
+ "/keystore/pbes2-aes-192-aes-256-sha384.p12",
+ "/keystore/pbes2-aes-192-aes-256-sha512.p12",
+ "/keystore/pbes2-aes-256-aes-128-sha1.p12",
+ "/keystore/pbes2-aes-256-aes-128-sha224.p12",
+ "/keystore/pbes2-aes-256-aes-128-sha256.p12",
+ "/keystore/pbes2-aes-256-aes-128-sha384.p12",
+ "/keystore/pbes2-aes-256-aes-128-sha512.p12",
+ "/keystore/pbes2-aes-256-aes-192-sha1.p12",
+ "/keystore/pbes2-aes-256-aes-192-sha224.p12",
+ "/keystore/pbes2-aes-256-aes-192-sha256.p12",
+ "/keystore/pbes2-aes-256-aes-192-sha384.p12",
+ "/keystore/pbes2-aes-256-aes-192-sha512.p12",
+ "/keystore/pbes2-aes-256-aes-256-sha1.p12",
+ "/keystore/pbes2-aes-256-aes-256-sha224.p12",
+ "/keystore/pbes2-aes-256-aes-256-sha256.p12",
+ "/keystore/pbes2-aes-256-aes-256-sha384.p12",
+ "/keystore/pbes2-aes-256-aes-256-sha512.p12"
+ );
+ }
+
+ @Parameter
+ public String keystoreFile;
+
+ @Test
+ public void keystoreIsReadableAndConsistent() throws Exception {
+ KeyStore keystore = KeyStore.getInstance("PKCS12");
+ InputStream inputStream = getClass().getResourceAsStream(keystoreFile);
+ assertNotNull("Resource not found: " + keystoreFile, inputStream);
+ keystore.load(inputStream, PASSWORD);
+
+ Enumeration<String> aliases = keystore.aliases();
+ assertTrue("Empty KeyStore", aliases.hasMoreElements());
+
+ while (aliases.hasMoreElements()) {
+ String alias = aliases.nextElement();
+
+ if (!keystore.isKeyEntry(alias)) {
+ fail("Test KeyStore should only contain private key entries");
+ }
+
+ PrivateKeyEntry keyEntry = (PrivateKeyEntry) keystore.getEntry(alias, null);
+ X509Certificate certificate = (X509Certificate) keyEntry.getCertificate();
+ assertEquals("CN=Test", certificate.getSubjectX500Principal().getName());
+
+ // Check the keys actually work with each other.
+ RSAPublicKey publicKey = (RSAPublicKey) certificate.getPublicKey();
+ RSAPrivateKey privateKey = (RSAPrivateKey) keyEntry.getPrivateKey();
+ byte[] original = "Some random input text".getBytes();
+
+ Cipher cipher = Cipher.getInstance("RSA");
+ cipher.init(Cipher.ENCRYPT_MODE, privateKey);
+ byte[] encrypted = cipher.doFinal(original);
+
+ cipher.init(Cipher.DECRYPT_MODE, publicKey);
+ byte[] decrypted = cipher.doFinal(encrypted);
+
+ assertArrayEquals(original, decrypted);
+ }
+ }
+ }
+
+ @RunWith(JUnit4.class)
+ public static class OtherTests {
+ @Test
+ public void unknownHashThrowsCorrectException() throws Exception {
+ KeyStore keystore = KeyStore.getInstance("PKCS12");
+ InputStream inputStream = getClass().getResourceAsStream(UNKNOWN_HASH);
+ assertNotNull("Resource not found: " + UNKNOWN_HASH, inputStream);
+
+ try {
+ keystore.load(inputStream, PASSWORD);
+ fail();
+ } catch (IOException expected) {
+ assertFalse("Internal BCPrivate exception thrown",
+ expected.getMessage().contains("BCPrivate"));
+ }
+ }
+ }
+}
diff --git a/luni/src/test/resources/keystore/README.md b/luni/src/test/resources/keystore/README.md
new file mode 100644
index 00000000000..876735e6913
--- /dev/null
+++ b/luni/src/test/resources/keystore/README.md
@@ -0,0 +1,68 @@
+## Test KeyStore data
+
+This directory contains the same certificate and private key stored in multiple
+PKCS#12 KeyStore files, each using a different PKCS#7 encryption scheme for the
+private key, for use in `KeyStorePkcs7FormatTest`.
+
+To generate the certificate and private key:
+
+```
+openssl req -x509 -nodes -days 36500 -subj "/CN=Test" -newkey rsa:1024 \
+ -out certificate.pem -keyout privkey.pem
+```
+
+### Tested formats
+
+All KeyStores have the password "password".
+
+#### Openssl version notes
+
+In the following commands `openssl1` refers to version 1.x of the
+`openssl` binary and `openssl3` refers to version 3.x.
+
+On most Linux installations openssl1 is still the default and you may need
+to build openssl3 from source.
+
+
+#### RC2 / 3DES
+
+Very old format, but still the default generated by openssl 1.x.
+
+* PKCS12 MAC: SHA-1
+* PKCS7 Encrypted data: pbeWithSHA1And40BitRC2-CBC, Iteration 2048
+* Shrouded Keybag: pbeWithSHA1And3-KeyTripleDES-CBC, Iteration 2048
+
+(The "Encrypted data" scheme is for the outer layer encryption for the
+whole KeyStore and the "Shrouded Keybag" is the scheme used to encrypt
+the private key)
+
+```
+openssl1 pkcs12 -export -out pberc2.p12 -in certificate.pem -inkey privkey.pem \
+ -passout pass:password
+```
+
+Can also be generated using:
+
+```
+openssl3 pkcs12 -legacy -export -out pberc2.p12 -in certificate.pem -inkey privkey.pem \
+ -passout pass:password
+```
+
+which generates identical ASN.1 data.
+
+#### PBES2
+
+All the pbes2-* files are generated with the mkstores.sh script which uses
+openssl3 to generate all supported variations of private key and certificate
+encryption (from the AES family) and overall MAC algorithm from the SHA-1 and
+SHA-2 family.
+
+#### SHA-3
+
+A file using SHA3-256 as its MAC algorithm. Used to trigger exceptions
+for testing. Created with:
+
+```
+openssl3 pkcs12 -export -out sha3.p12 -in certificate.pem -inkey privkey.pem \
+ -passout pass:password -macalg SHA3-256
+```
diff --git a/luni/src/test/resources/keystore/certificate.pem b/luni/src/test/resources/keystore/certificate.pem
new file mode 100644
index 00000000000..8364e47ff15
--- /dev/null
+++ b/luni/src/test/resources/keystore/certificate.pem
@@ -0,0 +1,13 @@
+-----BEGIN CERTIFICATE-----
+MIIB/DCCAWWgAwIBAgIUIcImGa1nvbzmXV2KuHXM7MpC5UkwDQYJKoZIhvcNAQEL
+BQAwDzENMAsGA1UEAwwEVGVzdDAgFw0yMjA1MTcxMzMwMzlaGA8yMTIyMDQyMzEz
+MzAzOVowDzENMAsGA1UEAwwEVGVzdDCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkC
+gYEAoXKYUP8oSM5eW3aSuDz6+vd/STgFL7YVf777oVOfcgk0t6UKCr4sTx2GJYJB
+KwgQBjcSWkpoS3kVDBN+PYaNOoWxp0+pvDaa6S5P5Gg2h6Qr3ag4bS6vjxx5JbTs
+Kw5wuPl+yINhAjGSzcArLJauEz0FACDSxQy9FQdjSPVIviMCAwEAAaNTMFEwHQYD
+VR0OBBYEFHyc1WuHSglRut4pgGgcQMX7BHTuMB8GA1UdIwQYMBaAFHyc1WuHSglR
+ut4pgGgcQMX7BHTuMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADgYEA
+RvExqBRNmh+2h2OoHSH9GwVbWjN+YZCujX1p33kNQ+a+TogdBIoNET77IvvWlIqu
+kW1VPZdFksYpoOvbtW0z7qXpwMe9vfXaF17MS4tNhCaoE/3V/Qs3v4x1cK8S9fDa
+t/5O1U4ph488Esa7q7WcALq703nV3Q+cDXTX5d9gSQY=
+-----END CERTIFICATE-----
diff --git a/luni/src/test/resources/keystore/mkstores.sh b/luni/src/test/resources/keystore/mkstores.sh
new file mode 100755
index 00000000000..19d13bafd89
--- /dev/null
+++ b/luni/src/test/resources/keystore/mkstores.sh
@@ -0,0 +1,27 @@
+#! /bin/sh
+#
+# Creates keystores from privkey.prm and certificate.pem with algorithm variations
+
+mkstore() {
+ local KEYALG="$1"
+ local CERTALG="$2"
+ local MACALG="$3"
+
+ local OUTFILE="pbes2-${KEYALG}-${CERTALG}-${MACALG}.p12"
+
+ openssl3 pkcs12 -export -out "$OUTFILE" -in certificate.pem \
+ -inkey privkey.pem -passout pass:password \
+ -macalg "$MACALG" -keypbe "${KEYALG}-cbc" -certpbe "${CERTALG}-cbc"
+}
+
+
+KEYALGS="aes-128 aes-192 aes-256"
+MACALGS="sha1 sha224 sha256 sha384 sha512"
+
+for keyalg in $KEYALGS; do
+ for certalg in $KEYALGS; do
+ for macalg in $MACALGS; do
+ mkstore "$keyalg" "$certalg" "$macalg"
+ done
+ done
+done
diff --git a/luni/src/test/resources/keystore/pberc2.p12 b/luni/src/test/resources/keystore/pberc2.p12
new file mode 100644
index 00000000000..05d35376591
--- /dev/null
+++ b/luni/src/test/resources/keystore/pberc2.p12
Binary files differ
diff --git a/luni/src/test/resources/keystore/pbes2-aes-128-aes-128-sha1.p12 b/luni/src/test/resources/keystore/pbes2-aes-128-aes-128-sha1.p12
new file mode 100644
index 00000000000..faf0fa09003
--- /dev/null
+++ b/luni/src/test/resources/keystore/pbes2-aes-128-aes-128-sha1.p12
Binary files differ
diff --git a/luni/src/test/resources/keystore/pbes2-aes-128-aes-128-sha224.p12 b/luni/src/test/resources/keystore/pbes2-aes-128-aes-128-sha224.p12
new file mode 100644
index 00000000000..6f3a20d8b31
--- /dev/null
+++ b/luni/src/test/resources/keystore/pbes2-aes-128-aes-128-sha224.p12
Binary files differ
diff --git a/luni/src/test/resources/keystore/pbes2-aes-128-aes-128-sha256.p12 b/luni/src/test/resources/keystore/pbes2-aes-128-aes-128-sha256.p12
new file mode 100644
index 00000000000..b3207e2db30
--- /dev/null
+++ b/luni/src/test/resources/keystore/pbes2-aes-128-aes-128-sha256.p12
Binary files differ
diff --git a/luni/src/test/resources/keystore/pbes2-aes-128-aes-128-sha384.p12 b/luni/src/test/resources/keystore/pbes2-aes-128-aes-128-sha384.p12
new file mode 100644
index 00000000000..3cd5906af42
--- /dev/null
+++ b/luni/src/test/resources/keystore/pbes2-aes-128-aes-128-sha384.p12
Binary files differ
diff --git a/luni/src/test/resources/keystore/pbes2-aes-128-aes-128-sha512.p12 b/luni/src/test/resources/keystore/pbes2-aes-128-aes-128-sha512.p12
new file mode 100644
index 00000000000..f499da1fa0e
--- /dev/null
+++ b/luni/src/test/resources/keystore/pbes2-aes-128-aes-128-sha512.p12
Binary files differ
diff --git a/luni/src/test/resources/keystore/pbes2-aes-128-aes-192-sha1.p12 b/luni/src/test/resources/keystore/pbes2-aes-128-aes-192-sha1.p12
new file mode 100644
index 00000000000..d69e3aa5b41
--- /dev/null
+++ b/luni/src/test/resources/keystore/pbes2-aes-128-aes-192-sha1.p12
Binary files differ
diff --git a/luni/src/test/resources/keystore/pbes2-aes-128-aes-192-sha224.p12 b/luni/src/test/resources/keystore/pbes2-aes-128-aes-192-sha224.p12
new file mode 100644
index 00000000000..67b3380e324
--- /dev/null
+++ b/luni/src/test/resources/keystore/pbes2-aes-128-aes-192-sha224.p12
Binary files differ
diff --git a/luni/src/test/resources/keystore/pbes2-aes-128-aes-192-sha256.p12 b/luni/src/test/resources/keystore/pbes2-aes-128-aes-192-sha256.p12
new file mode 100644
index 00000000000..1fc3f548abf
--- /dev/null
+++ b/luni/src/test/resources/keystore/pbes2-aes-128-aes-192-sha256.p12
Binary files differ
diff --git a/luni/src/test/resources/keystore/pbes2-aes-128-aes-192-sha384.p12 b/luni/src/test/resources/keystore/pbes2-aes-128-aes-192-sha384.p12
new file mode 100644
index 00000000000..195c0ca7581
--- /dev/null
+++ b/luni/src/test/resources/keystore/pbes2-aes-128-aes-192-sha384.p12
Binary files differ
diff --git a/luni/src/test/resources/keystore/pbes2-aes-128-aes-192-sha512.p12 b/luni/src/test/resources/keystore/pbes2-aes-128-aes-192-sha512.p12
new file mode 100644
index 00000000000..4b49cd4cfad
--- /dev/null
+++ b/luni/src/test/resources/keystore/pbes2-aes-128-aes-192-sha512.p12
Binary files differ
diff --git a/luni/src/test/resources/keystore/pbes2-aes-128-aes-256-sha1.p12 b/luni/src/test/resources/keystore/pbes2-aes-128-aes-256-sha1.p12
new file mode 100644
index 00000000000..f728c43c2f3
--- /dev/null
+++ b/luni/src/test/resources/keystore/pbes2-aes-128-aes-256-sha1.p12
Binary files differ
diff --git a/luni/src/test/resources/keystore/pbes2-aes-128-aes-256-sha224.p12 b/luni/src/test/resources/keystore/pbes2-aes-128-aes-256-sha224.p12
new file mode 100644
index 00000000000..e2bac979838
--- /dev/null
+++ b/luni/src/test/resources/keystore/pbes2-aes-128-aes-256-sha224.p12
Binary files differ
diff --git a/luni/src/test/resources/keystore/pbes2-aes-128-aes-256-sha256.p12 b/luni/src/test/resources/keystore/pbes2-aes-128-aes-256-sha256.p12
new file mode 100644
index 00000000000..3b864848b5b
--- /dev/null
+++ b/luni/src/test/resources/keystore/pbes2-aes-128-aes-256-sha256.p12
Binary files differ
diff --git a/luni/src/test/resources/keystore/pbes2-aes-128-aes-256-sha384.p12 b/luni/src/test/resources/keystore/pbes2-aes-128-aes-256-sha384.p12
new file mode 100644
index 00000000000..e08afacb584
--- /dev/null
+++ b/luni/src/test/resources/keystore/pbes2-aes-128-aes-256-sha384.p12
Binary files differ
diff --git a/luni/src/test/resources/keystore/pbes2-aes-128-aes-256-sha512.p12 b/luni/src/test/resources/keystore/pbes2-aes-128-aes-256-sha512.p12
new file mode 100644
index 00000000000..dfaf763ab98
--- /dev/null
+++ b/luni/src/test/resources/keystore/pbes2-aes-128-aes-256-sha512.p12
Binary files differ
diff --git a/luni/src/test/resources/keystore/pbes2-aes-192-aes-128-sha1.p12 b/luni/src/test/resources/keystore/pbes2-aes-192-aes-128-sha1.p12
new file mode 100644
index 00000000000..049ac78ac4d
--- /dev/null
+++ b/luni/src/test/resources/keystore/pbes2-aes-192-aes-128-sha1.p12
Binary files differ
diff --git a/luni/src/test/resources/keystore/pbes2-aes-192-aes-128-sha224.p12 b/luni/src/test/resources/keystore/pbes2-aes-192-aes-128-sha224.p12
new file mode 100644
index 00000000000..25f0d269e85
--- /dev/null
+++ b/luni/src/test/resources/keystore/pbes2-aes-192-aes-128-sha224.p12
Binary files differ
diff --git a/luni/src/test/resources/keystore/pbes2-aes-192-aes-128-sha256.p12 b/luni/src/test/resources/keystore/pbes2-aes-192-aes-128-sha256.p12
new file mode 100644
index 00000000000..ab96aa649f9
--- /dev/null
+++ b/luni/src/test/resources/keystore/pbes2-aes-192-aes-128-sha256.p12
Binary files differ
diff --git a/luni/src/test/resources/keystore/pbes2-aes-192-aes-128-sha384.p12 b/luni/src/test/resources/keystore/pbes2-aes-192-aes-128-sha384.p12
new file mode 100644
index 00000000000..85b5e40faad
--- /dev/null
+++ b/luni/src/test/resources/keystore/pbes2-aes-192-aes-128-sha384.p12
Binary files differ
diff --git a/luni/src/test/resources/keystore/pbes2-aes-192-aes-128-sha512.p12 b/luni/src/test/resources/keystore/pbes2-aes-192-aes-128-sha512.p12
new file mode 100644
index 00000000000..81bc86edee6
--- /dev/null
+++ b/luni/src/test/resources/keystore/pbes2-aes-192-aes-128-sha512.p12
Binary files differ
diff --git a/luni/src/test/resources/keystore/pbes2-aes-192-aes-192-sha1.p12 b/luni/src/test/resources/keystore/pbes2-aes-192-aes-192-sha1.p12
new file mode 100644
index 00000000000..df180109012
--- /dev/null
+++ b/luni/src/test/resources/keystore/pbes2-aes-192-aes-192-sha1.p12
Binary files differ
diff --git a/luni/src/test/resources/keystore/pbes2-aes-192-aes-192-sha224.p12 b/luni/src/test/resources/keystore/pbes2-aes-192-aes-192-sha224.p12
new file mode 100644
index 00000000000..c4e3c8f9c89
--- /dev/null
+++ b/luni/src/test/resources/keystore/pbes2-aes-192-aes-192-sha224.p12
Binary files differ
diff --git a/luni/src/test/resources/keystore/pbes2-aes-192-aes-192-sha256.p12 b/luni/src/test/resources/keystore/pbes2-aes-192-aes-192-sha256.p12
new file mode 100644
index 00000000000..35937648c6f
--- /dev/null
+++ b/luni/src/test/resources/keystore/pbes2-aes-192-aes-192-sha256.p12
Binary files differ
diff --git a/luni/src/test/resources/keystore/pbes2-aes-192-aes-192-sha384.p12 b/luni/src/test/resources/keystore/pbes2-aes-192-aes-192-sha384.p12
new file mode 100644
index 00000000000..2d978044269
--- /dev/null
+++ b/luni/src/test/resources/keystore/pbes2-aes-192-aes-192-sha384.p12
Binary files differ
diff --git a/luni/src/test/resources/keystore/pbes2-aes-192-aes-192-sha512.p12 b/luni/src/test/resources/keystore/pbes2-aes-192-aes-192-sha512.p12
new file mode 100644
index 00000000000..36ce440b768
--- /dev/null
+++ b/luni/src/test/resources/keystore/pbes2-aes-192-aes-192-sha512.p12
Binary files differ
diff --git a/luni/src/test/resources/keystore/pbes2-aes-192-aes-256-sha1.p12 b/luni/src/test/resources/keystore/pbes2-aes-192-aes-256-sha1.p12
new file mode 100644
index 00000000000..feeb995fc57
--- /dev/null
+++ b/luni/src/test/resources/keystore/pbes2-aes-192-aes-256-sha1.p12
Binary files differ
diff --git a/luni/src/test/resources/keystore/pbes2-aes-192-aes-256-sha224.p12 b/luni/src/test/resources/keystore/pbes2-aes-192-aes-256-sha224.p12
new file mode 100644
index 00000000000..1ac50be806f
--- /dev/null
+++ b/luni/src/test/resources/keystore/pbes2-aes-192-aes-256-sha224.p12
Binary files differ
diff --git a/luni/src/test/resources/keystore/pbes2-aes-192-aes-256-sha256.p12 b/luni/src/test/resources/keystore/pbes2-aes-192-aes-256-sha256.p12
new file mode 100644
index 00000000000..46975cd2fd4
--- /dev/null
+++ b/luni/src/test/resources/keystore/pbes2-aes-192-aes-256-sha256.p12
Binary files differ
diff --git a/luni/src/test/resources/keystore/pbes2-aes-192-aes-256-sha384.p12 b/luni/src/test/resources/keystore/pbes2-aes-192-aes-256-sha384.p12
new file mode 100644
index 00000000000..08a76694dde
--- /dev/null
+++ b/luni/src/test/resources/keystore/pbes2-aes-192-aes-256-sha384.p12
Binary files differ
diff --git a/luni/src/test/resources/keystore/pbes2-aes-192-aes-256-sha512.p12 b/luni/src/test/resources/keystore/pbes2-aes-192-aes-256-sha512.p12
new file mode 100644
index 00000000000..e557c94a2d8
--- /dev/null
+++ b/luni/src/test/resources/keystore/pbes2-aes-192-aes-256-sha512.p12
Binary files differ
diff --git a/luni/src/test/resources/keystore/pbes2-aes-256-aes-128-sha1.p12 b/luni/src/test/resources/keystore/pbes2-aes-256-aes-128-sha1.p12
new file mode 100644
index 00000000000..3218d657949
--- /dev/null
+++ b/luni/src/test/resources/keystore/pbes2-aes-256-aes-128-sha1.p12
Binary files differ
diff --git a/luni/src/test/resources/keystore/pbes2-aes-256-aes-128-sha224.p12 b/luni/src/test/resources/keystore/pbes2-aes-256-aes-128-sha224.p12
new file mode 100644
index 00000000000..a20a1bcf612
--- /dev/null
+++ b/luni/src/test/resources/keystore/pbes2-aes-256-aes-128-sha224.p12
Binary files differ
diff --git a/luni/src/test/resources/keystore/pbes2-aes-256-aes-128-sha256.p12 b/luni/src/test/resources/keystore/pbes2-aes-256-aes-128-sha256.p12
new file mode 100644
index 00000000000..1a3e11137e5
--- /dev/null
+++ b/luni/src/test/resources/keystore/pbes2-aes-256-aes-128-sha256.p12
Binary files differ
diff --git a/luni/src/test/resources/keystore/pbes2-aes-256-aes-128-sha384.p12 b/luni/src/test/resources/keystore/pbes2-aes-256-aes-128-sha384.p12
new file mode 100644
index 00000000000..ab59494753e
--- /dev/null
+++ b/luni/src/test/resources/keystore/pbes2-aes-256-aes-128-sha384.p12
Binary files differ
diff --git a/luni/src/test/resources/keystore/pbes2-aes-256-aes-128-sha512.p12 b/luni/src/test/resources/keystore/pbes2-aes-256-aes-128-sha512.p12
new file mode 100644
index 00000000000..82c3a21bbaf
--- /dev/null
+++ b/luni/src/test/resources/keystore/pbes2-aes-256-aes-128-sha512.p12
Binary files differ
diff --git a/luni/src/test/resources/keystore/pbes2-aes-256-aes-192-sha1.p12 b/luni/src/test/resources/keystore/pbes2-aes-256-aes-192-sha1.p12
new file mode 100644
index 00000000000..4f0e33615ac
--- /dev/null
+++ b/luni/src/test/resources/keystore/pbes2-aes-256-aes-192-sha1.p12
Binary files differ
diff --git a/luni/src/test/resources/keystore/pbes2-aes-256-aes-192-sha224.p12 b/luni/src/test/resources/keystore/pbes2-aes-256-aes-192-sha224.p12
new file mode 100644
index 00000000000..fa059032598
--- /dev/null
+++ b/luni/src/test/resources/keystore/pbes2-aes-256-aes-192-sha224.p12
Binary files differ
diff --git a/luni/src/test/resources/keystore/pbes2-aes-256-aes-192-sha256.p12 b/luni/src/test/resources/keystore/pbes2-aes-256-aes-192-sha256.p12
new file mode 100644
index 00000000000..83fb514c69b
--- /dev/null
+++ b/luni/src/test/resources/keystore/pbes2-aes-256-aes-192-sha256.p12
Binary files differ
diff --git a/luni/src/test/resources/keystore/pbes2-aes-256-aes-192-sha384.p12 b/luni/src/test/resources/keystore/pbes2-aes-256-aes-192-sha384.p12
new file mode 100644
index 00000000000..943b6c25f79
--- /dev/null
+++ b/luni/src/test/resources/keystore/pbes2-aes-256-aes-192-sha384.p12
Binary files differ
diff --git a/luni/src/test/resources/keystore/pbes2-aes-256-aes-192-sha512.p12 b/luni/src/test/resources/keystore/pbes2-aes-256-aes-192-sha512.p12
new file mode 100644
index 00000000000..4bb85f5d6c5
--- /dev/null
+++ b/luni/src/test/resources/keystore/pbes2-aes-256-aes-192-sha512.p12
Binary files differ
diff --git a/luni/src/test/resources/keystore/pbes2-aes-256-aes-256-sha1.p12 b/luni/src/test/resources/keystore/pbes2-aes-256-aes-256-sha1.p12
new file mode 100644
index 00000000000..194c6267bed
--- /dev/null
+++ b/luni/src/test/resources/keystore/pbes2-aes-256-aes-256-sha1.p12
Binary files differ
diff --git a/luni/src/test/resources/keystore/pbes2-aes-256-aes-256-sha224.p12 b/luni/src/test/resources/keystore/pbes2-aes-256-aes-256-sha224.p12
new file mode 100644
index 00000000000..a5cdbaa0e31
--- /dev/null
+++ b/luni/src/test/resources/keystore/pbes2-aes-256-aes-256-sha224.p12
Binary files differ
diff --git a/luni/src/test/resources/keystore/pbes2-aes-256-aes-256-sha256.p12 b/luni/src/test/resources/keystore/pbes2-aes-256-aes-256-sha256.p12
new file mode 100644
index 00000000000..0f8c39115bf
--- /dev/null
+++ b/luni/src/test/resources/keystore/pbes2-aes-256-aes-256-sha256.p12
Binary files differ
diff --git a/luni/src/test/resources/keystore/pbes2-aes-256-aes-256-sha384.p12 b/luni/src/test/resources/keystore/pbes2-aes-256-aes-256-sha384.p12
new file mode 100644
index 00000000000..65f940a150c
--- /dev/null
+++ b/luni/src/test/resources/keystore/pbes2-aes-256-aes-256-sha384.p12
Binary files differ
diff --git a/luni/src/test/resources/keystore/pbes2-aes-256-aes-256-sha512.p12 b/luni/src/test/resources/keystore/pbes2-aes-256-aes-256-sha512.p12
new file mode 100644
index 00000000000..ac32f8fbc44
--- /dev/null
+++ b/luni/src/test/resources/keystore/pbes2-aes-256-aes-256-sha512.p12
Binary files differ
diff --git a/luni/src/test/resources/keystore/privkey.pem b/luni/src/test/resources/keystore/privkey.pem
new file mode 100644
index 00000000000..60dc0f052c8
--- /dev/null
+++ b/luni/src/test/resources/keystore/privkey.pem
@@ -0,0 +1,16 @@
+-----BEGIN PRIVATE KEY-----
+MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAKFymFD/KEjOXlt2
+krg8+vr3f0k4BS+2FX+++6FTn3IJNLelCgq+LE8dhiWCQSsIEAY3ElpKaEt5FQwT
+fj2GjTqFsadPqbw2mukuT+RoNoekK92oOG0ur48ceSW07CsOcLj5fsiDYQIxks3A
+KyyWrhM9BQAg0sUMvRUHY0j1SL4jAgMBAAECgYEAmrox4kZ3/DbT1YJxIONIgiea
+tLhcuBogxpppnHaBNBBAltQ0KJGT84rPGrmX7T6/5MT48NGo3NRBaJ5x+VMvm2X2
+Z1OCePuc1ZMmgnHzsbQLuzH5aajD1wLwyYCTmQl1cUOH+Qw38axkFMkKfDgveSax
+LW2H7VMrbFYiie3KeSkCQQDOb7hOSQHodxsyo02m00LyrwOu7g/o6RfC4YNLm5js
+rO9egrRBRFB99wTLcB+iSZ+HQvWzch8S6xbl/kWg7TatAkEAyDW2ifbldcD39dhq
+AC8N1VyOugbZcle2zb4bzx7x4rWe+ekFrZvKsomfTevevGIhp4HpLHCNim6z9LQS
+bd/yDwJAMT4jF8GAjARFX5nmvwGr+ZnX5hVxhBx+B4WlvRZbrzE9VC0XdG4oSTPw
+V9riIOMxA6HsXCa/1NJxPuGdmFqdbQJBAIajoJtNX2h+GgLJxBdVjX8D3LP7sTX1
+COl5xKfYTqDAtSWpcHkdAQZqCKjVS5fygmFsuwt4sab75adVheNALD8CQBDzw8HR
+YhwauMYGxvWZmSTmNDVW93ouBFnO+uweVZhqMqztRu2bUkXUbwJJchddOWL2Jx1S
+vguQtWRnq9yfNgQ=
+-----END PRIVATE KEY-----
diff --git a/luni/src/test/resources/keystore/sha3.p12 b/luni/src/test/resources/keystore/sha3.p12
new file mode 100644
index 00000000000..f1e32dfe4e9
--- /dev/null
+++ b/luni/src/test/resources/keystore/sha3.p12
Binary files differ
diff --git a/ojluni/Android.bp b/ojluni/Android.bp
deleted file mode 100644
index 4c9e703599d..00000000000
--- a/ojluni/Android.bp
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright (C) 2019 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package {
- default_applicable_licenses: ["libcore_ojluni_license"],
-}
-
-// Added automatically by a large-scale-change that took the approach of
-// 'apply every license found to every target'. While this makes sure we respect
-// every license restriction, it may not be entirely correct.
-//
-// e.g. GPL in an MIT project might only apply to the contrib/ directory.
-//
-// Please consider splitting the single license below into multiple licenses,
-// taking care not to lose any license_kind information, and overriding the
-// default license using the 'licenses: [...]' property on targets as needed.
-//
-// For unused files, consider creating a 'filegroup' with "//visibility:private"
-// to attach the license to, and including a comment whether the files may be
-// used in the current project.
-// http://go/android-license-faq
-license {
- name: "libcore_ojluni_license",
- visibility: [":__subpackages__"],
- license_kinds: [
- "SPDX-license-identifier-Apache-2.0",
- "SPDX-license-identifier-BSD",
- "SPDX-license-identifier-GPL-2.0",
- "SPDX-license-identifier-GPL-with-classpath-exception",
- ],
- license_text: [
- "NOTICE",
- ],
-}
-
-// Phony target that causes the build to check the license file in this
-// directory, detect that it is a GPL license and then copy all the files
-// from this directory and its subdirectories in to the
-// ${OUT}/obj/PACKAGING/gpl_source_intermediates/gpl_source.tgz file.
-phony {
- name: "ojluni-phony",
-
- // A phony module must have at least one dependency.
- required: [
- "core-all",
- ],
-}
diff --git a/ojluni/src/main/Android.bp b/ojluni/src/main/Android.bp
new file mode 100644
index 00000000000..2002ddf454b
--- /dev/null
+++ b/ojluni/src/main/Android.bp
@@ -0,0 +1,46 @@
+// Copyright (C) 2019 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package {
+ default_applicable_licenses: ["libcore_ojluni_src_main_license"],
+}
+
+// License for OpenJDK source files. The tests from OpenJDK have a
+// separate license in ojluni/src/test/Android.bp.
+//
+// For general tips, see http://go/android-license-faq.
+license {
+ name: "libcore_ojluni_src_main_license",
+ visibility: [":__subpackages__"],
+ license_kinds: [
+ "SPDX-license-identifier-Apache-2.0",
+ "SPDX-license-identifier-GPL-2.0-with-classpath-exception",
+ ],
+ license_text: [
+ "NOTICE",
+ ],
+}
+
+// Phony target that causes the build to check the license file in this
+// directory, detect that it is a GPL+classpath license and then copy all
+// the files from this directory and its subdirectories in to the
+// ${OUT}/obj/PACKAGING/gpl_source_intermediates/gpl_source.tgz file.
+phony {
+ name: "ojluni-phony",
+
+ // A phony module must have at least one dependency.
+ required: [
+ "core-all",
+ ],
+}
diff --git a/ojluni/MODULE_LICENSE_GPL_WITH_CLASSPATH_EXCEPTION b/ojluni/src/main/MODULE_LICENSE_GPL_WITH_CLASSPATH_EXCEPTION
index e69de29bb2d..e69de29bb2d 100644
--- a/ojluni/MODULE_LICENSE_GPL_WITH_CLASSPATH_EXCEPTION
+++ b/ojluni/src/main/MODULE_LICENSE_GPL_WITH_CLASSPATH_EXCEPTION
diff --git a/ojluni/NOTICE b/ojluni/src/main/NOTICE
index 26136e435bf..26136e435bf 100644
--- a/ojluni/NOTICE
+++ b/ojluni/src/main/NOTICE
diff --git a/ojluni/src/main/native/Android.bp b/ojluni/src/main/native/Android.bp
index 5edf48ad040..d2e36b28502 100644
--- a/ojluni/src/main/native/Android.bp
+++ b/ojluni/src/main/native/Android.bp
@@ -13,11 +13,10 @@
// limitations under the License.
package {
- // http://go/android-license-faq
- // A large-scale-change added 'default_applicable_licenses' to import
- // the below license kinds from "libcore_ojluni_license":
- // SPDX-license-identifier-GPL-2.0
- default_applicable_licenses: ["libcore_ojluni_license"],
+ // The native sources are GPLv2 with classpath exception.
+ // SPDX-license-identifier-GPL-2.0-with-classpath-exception
+ // For general tips, see http://go/android-license-faq
+ default_applicable_licenses: ["libcore_ojluni_src_main_license"],
}
filegroup {
diff --git a/ojluni/src/main/native/canonicalize_md.c b/ojluni/src/main/native/canonicalize_md.c
index b62ba6d10aa..ed926191193 100644
--- a/ojluni/src/main/native/canonicalize_md.c
+++ b/ojluni/src/main/native/canonicalize_md.c
@@ -33,6 +33,7 @@
#include <sys/stat.h>
#include <errno.h>
#include <limits.h>
+#include <unistd.h>
#if !defined(_ALLBSD_SOURCE)
#include <alloca.h>
#endif
@@ -42,6 +43,37 @@
defined in the java.io.File class */
+// BEGIN Android-added: Remove consecutive duplicate path separators "//". b/267617531
+// and the trailing path separator `/` if it's not root fs.
+char* removeDupSeparator(char *path)
+{
+ if (path == NULL || *path == '\0') {
+ return NULL;
+ }
+
+ char *in = path;
+ char *out = path;
+ char prevChar = 0;
+ int n = 0;
+ for (; *in != '\0'; in++) {
+ // Remove duplicate path separators
+ if (!(*in == '/' && prevChar == '/')) {
+ *(out++) = *in;
+ n++;
+ }
+ prevChar = *in;
+ }
+ *out = '\0';
+
+ // Remove the trailing path separator, except when path equals `/`
+ if (prevChar == '/' && n > 1) {
+ *(--out) = '\0';
+ }
+
+ return path;
+}
+// END Android-added: Remove consecutive duplicate path separators "//". b/267617531
+
/* Check the given name sequence to see if it can be further collapsed.
Return zero if not, otherwise return the number of names in the sequence. */
@@ -61,7 +93,11 @@ collapsible(char *names)
n++;
while (*p) {
if (*p == '/') {
- p++;
+ // Android-changed: Remove consecutive duplicate path separators "//". b/267617531
+ // p++
+ while (*p == '/') {
+ p++;
+ }
break;
}
p++;
@@ -84,7 +120,11 @@ splitNames(char *names, char **ix)
ix[i++] = p++;
while (*p) {
if (*p == '/') {
- *p++ = '\0';
+ // Android-changed: Remove consecutive duplicate path separators "//". b/267617531
+ // *p++ = '\0';
+ while (*p == '/') {
+ *p++ = '\0';
+ }
break;
}
p++;
@@ -127,11 +167,15 @@ joinNames(char *names, int nc, char **ix)
static void
collapse(char *path)
{
+ // Android-changed: Remove consecutive duplicate path separators "//". b/267617531
+ removeDupSeparator(path);
+
char *names = (path[0] == '/') ? path + 1 : path; /* Preserve first '/' */
int nc;
char **ix;
int i, j;
- char *p, *q;
+ // Android-removed: unused variables.
+ // char *p, *q;
nc = collapsible(names);
if (nc < 2) return; /* Nothing to do */
@@ -144,7 +188,9 @@ collapse(char *path)
/* Find next occurrence of "." or ".." */
do {
char *p = ix[i];
- if (p[0] == '.') {
+ // Android-changed: null pointer check.
+ // if (p[0] == '.') {
+ if (p != NULL && p[0] == '.') {
if (p[1] == '\0') {
dots = 1;
break;
@@ -196,7 +242,9 @@ canonicalize(char *original, char *resolved, int len)
return -1;
}
- if (strlen(original) > PATH_MAX) {
+ // Android-changed: Avoid crash in getCanonicalPath() due to a long path. b/266432364
+ // if (strlen(original) > PATH_MAX) {
+ if (strlen(original) >= PATH_MAX) {
errno = ENAMETOOLONG;
return -1;
}
@@ -208,13 +256,20 @@ canonicalize(char *original, char *resolved, int len)
return 0;
}
else {
+ // Android-changed: Avoid crash in getCanonicalPath(). b/266432364
+ if (errno == EINVAL || errno == ELOOP || errno == ENAMETOOLONG || errno == ENOMEM) {
+ return -1;
+ }
+
/* Something's bogus in the original path, so remove names from the end
until either some subpath works or we run out of names */
char *p, *end, *r = NULL;
- char path[PATH_MAX + 1];
+ // Android-changed: Avoid crash in getCanonicalPath() due to a long path. b/266432364
+ char path[PATH_MAX];
strncpy(path, original, sizeof(path));
- if (path[PATH_MAX] != '\0') {
+ // Android-changed: Avoid crash in getCanonicalPath() due to a long path. b/266432364
+ if (path[PATH_MAX - 1] != '\0') {
errno = ENAMETOOLONG;
return -1;
}
@@ -253,6 +308,7 @@ canonicalize(char *original, char *resolved, int len)
}
}
+ size_t nameMax;
if (r != NULL) {
/* Append unresolved subpath to resolved subpath */
int rn = strlen(r);
@@ -261,20 +317,52 @@ canonicalize(char *original, char *resolved, int len)
errno = ENAMETOOLONG;
return -1;
}
+
+ // Android-changed: Avoid crash in getCanonicalPath() due to a long path. b/266432364
+ nameMax = pathconf(r, _PC_NAME_MAX);
+
if ((rn > 0) && (r[rn - 1] == '/') && (*p == '/')) {
/* Avoid duplicate slashes */
p++;
}
strcpy(r + rn, p);
collapse(r);
- return 0;
}
else {
/* Nothing resolved, so just return the original path */
+ // Android-changed: Avoid crash in getCanonicalPath() due to a long path. b/266432364
+ nameMax = pathconf("/", _PC_NAME_MAX);
strcpy(resolved, path);
collapse(resolved);
- return 0;
}
+
+ // BEGIN Android-added: Avoid crash in getCanonicalPath() due to a long path. b/266432364
+ // Ensure resolve path length is "< PATH_MAX" and collapse() did not overwrite
+ // terminating null byte
+ char resolvedPath[PATH_MAX];
+ strncpy(resolvedPath, resolved, sizeof(resolvedPath));
+ if (resolvedPath[PATH_MAX - 1] != '\0') {
+ errno = ENAMETOOLONG;
+ return -1;
+ }
+
+ // Ensure resolve path does not contain any components who length is "> NAME_MAX"
+ // If pathconf call failed with -1 or returned 0 in case of permission denial
+ if (nameMax < 1) {
+ nameMax = NAME_MAX;
+ }
+
+ char *component;
+ char *rest = resolvedPath;
+ while ((component = strtok_r(rest, "/", &rest))) {
+ if (strlen(component) > nameMax) {
+ errno = ENAMETOOLONG;
+ return -1;
+ }
+ }
+
+ return 0;
+ // END Android-added: Avoid crash in getCanonicalPath() due to a long path. b/266432364
}
}
diff --git a/ojluni/src/test/Android.bp b/ojluni/src/test/Android.bp
new file mode 100644
index 00000000000..0eeb92c53e1
--- /dev/null
+++ b/ojluni/src/test/Android.bp
@@ -0,0 +1,176 @@
+// Copyright (C) 2022 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package {
+ default_visibility: ["//visibility:private"],
+ default_applicable_licenses: ["libcore_ojluni_src_test_license"],
+}
+
+license {
+ name: "libcore_ojluni_src_test_license",
+ visibility: [":__subpackages__"],
+ license_kinds: [
+ "SPDX-license-identifier-Apache-2.0",
+ "SPDX-license-identifier-GPL-2.0",
+ ],
+ license_text: [
+ "LICENSE",
+ ],
+}
+
+// Builds the core-ojtests library that contains test code from OpenJDK.
+java_test {
+ name: "core-ojtests",
+ defaults: ["libcore_java_defaults"],
+ hostdex: true,
+
+ srcs: [
+ "java/**/*.java",
+ "javax/**/*.java",
+ "sun/**/*.java",
+ ],
+ java_resource_dirs: [
+ "resources",
+ ],
+
+ java_resources: [
+ ":core-ojtests-java-resources",
+ ":core-ojtests-javax-resources",
+ ],
+
+ sdk_version: "none",
+ system_modules: "core-all-system-modules",
+ libs: [
+ "okhttp",
+ "bouncycastle",
+ ],
+
+ static_libs: [
+ "junit",
+ "testng",
+ ],
+
+ // ojluni/src/test/java/util/stream/{bootlib,boottest}
+ // contains tests that are in packages from java.base;
+ // By default, OpenJDK 9's javac will only compile such
+ // code if it's declared to also be in java.base at
+ // compile time.
+ //
+ // For now, we use patch_module to put all sources
+ // and dependencies from this make target into java.base;
+ // other source directories in this make target are in
+ // packages not from java.base; if this becomes a problem
+ // in future, this could be addressed eg. by splitting
+ // boot{lib,test} out into a separate make target,
+ // deleting those tests or moving them to a different
+ // package.
+ patch_module: "java.base",
+
+ errorprone: {
+ javacflags: [
+ "-Xep:AlwaysThrows:OFF",
+ "-Xep:DoNotCall:OFF",
+ "-Xep:ArrayToString:WARN",
+ "-Xep:ReturnValueIgnored:WARN",
+ "-Xep:MathRoundIntLong:WARN",
+ "-Xep:FormatString:WARN",
+ "-Xep:IdentityBinaryExpression:WARN",
+ "-Xep:RandomModInteger:WARN",
+ "-Xep:SelfEquals:WARN",
+ "-Xep:DurationTemporalUnit:WARN",
+ "-Xep:DurationFrom:WARN",
+ "-Xep:InstantTemporalUnit:WARN",
+ "-Xep:SelfComparison:WARN",
+ "-Xep:PeriodFrom:WARN",
+ "-Xep:BoxedPrimitiveEquality:WARN",
+ "-Xep:IdentityHashMapBoxing:WARN",
+ "-Xep:DoubleBraceInitialization:WARN",
+ "-Xep:ComparableType:WARN",
+ "-Xep:ModifyingCollectionWithItself:WARN",
+ "-Xep:InvalidZoneId:WARN",
+ "-Xep:HashtableContains:WARN",
+ ],
+ },
+}
+
+// Builds the core-ojtests-public library. Excludes any private API tests.
+// Like core-ojtests but smaller.
+java_test {
+ name: "core-ojtests-public",
+ visibility: [
+ "//art/build/sdk",
+ "//cts/tests/libcore/ojluni",
+ ],
+ defaults: ["libcore_java_defaults"],
+ srcs: [
+ "java/**/*.java",
+ "javax/**/*.java",
+ "sun/**/*.java",
+ ],
+ // Filter out the following:
+ // 1.) DeserializeMethodTest and SerializedLambdaTest, because they depends on stub classes
+ // and won't actually run, and
+ // 2.) util/stream/boot*. Those directories contain classes in the package java.util.stream;
+ // excluding them means we don't need patch_module: "java.base"
+ exclude_srcs: [
+ "**/DeserializeMethodTest.java",
+ "**/SerializedLambdaTest.java",
+ "java/util/stream/boot*/**/*",
+ ],
+ java_resource_dirs: [
+ "resources",
+ // Include source code as part of JAR
+ "dist",
+ ],
+
+ java_resources: [
+ ":core-ojtests-java-resources",
+ ":core-ojtests-javax-resources",
+ ],
+
+ sdk_version: "none",
+ system_modules: "core-all-system-modules",
+ libs: [
+ "bouncycastle",
+ "junit",
+ "okhttp",
+ "testng",
+ ],
+
+ errorprone: {
+ javacflags: [
+ "-Xep:AlwaysThrows:OFF",
+ "-Xep:DoNotCall:OFF",
+ "-Xep:ArrayToString:WARN",
+ "-Xep:ReturnValueIgnored:WARN",
+ "-Xep:MathRoundIntLong:WARN",
+ "-Xep:FormatString:WARN",
+ "-Xep:IdentityBinaryExpression:WARN",
+ "-Xep:RandomModInteger:WARN",
+ "-Xep:SelfEquals:WARN",
+ "-Xep:DurationTemporalUnit:WARN",
+ "-Xep:DurationFrom:WARN",
+ "-Xep:InstantTemporalUnit:WARN",
+ "-Xep:SelfComparison:WARN",
+ "-Xep:PeriodFrom:WARN",
+ "-Xep:BoxedPrimitiveEquality:WARN",
+ "-Xep:IdentityHashMapBoxing:WARN",
+ "-Xep:DoubleBraceInitialization:WARN",
+ "-Xep:ComparableType:WARN",
+ "-Xep:ModifyingCollectionWithItself:WARN",
+ "-Xep:InvalidZoneId:WARN",
+ "-Xep:HashtableContains:WARN",
+ ],
+ },
+}
diff --git a/ojluni/src/test/LICENSE b/ojluni/src/test/LICENSE
new file mode 100644
index 00000000000..d159169d105
--- /dev/null
+++ b/ojluni/src/test/LICENSE
@@ -0,0 +1,339 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program 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 for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
diff --git a/ojluni/src/tools/Android.bp b/ojluni/src/tools/Android.bp
index b4a0bd7d89e..59408c569ef 100644
--- a/ojluni/src/tools/Android.bp
+++ b/ojluni/src/tools/Android.bp
@@ -1,5 +1,31 @@
+// Copyright (C) 2022 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
package {
- default_applicable_licenses: ["libcore_ojluni_license"],
+ default_visibility: ["//visibility:private"],
+ default_applicable_licenses: ["libcore_ojluni_tools_license"],
+}
+
+license {
+ name: "libcore_ojluni_tools_license",
+ visibility: [":__subpackages__"],
+ license_kinds: [
+ "SPDX-license-identifier-GPL-2.0",
+ ],
+ license_text: [
+ "LICENSE",
+ ],
}
java_binary_host {
diff --git a/ojluni/src/tools/LICENSE b/ojluni/src/tools/LICENSE
new file mode 100644
index 00000000000..d159169d105
--- /dev/null
+++ b/ojluni/src/tools/LICENSE
@@ -0,0 +1,339 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program 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 for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.