Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
dragonwell8_jdk
提交
88be1441
D
dragonwell8_jdk
项目概览
openanolis
/
dragonwell8_jdk
通知
4
Star
2
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
dragonwell8_jdk
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
88be1441
编写于
5月 17, 2013
作者:
C
chegar
浏览文件
操作
浏览文件
下载
差异文件
Merge
上级
dfc91b6a
b0951cac
变更
56
展开全部
隐藏空白更改
内联
并排
Showing
56 changed file
with
3072 addition
and
1427 deletion
+3072
-1427
make/sun/security/ec/Makefile
make/sun/security/ec/Makefile
+0
-9
make/sun/security/other/Makefile
make/sun/security/other/Makefile
+0
-9
makefiles/CreateJars.gmk
makefiles/CreateJars.gmk
+1
-13
src/share/classes/com/sun/java/util/jar/pack/Attribute.java
src/share/classes/com/sun/java/util/jar/pack/Attribute.java
+72
-18
src/share/classes/com/sun/java/util/jar/pack/BandStructure.java
...are/classes/com/sun/java/util/jar/pack/BandStructure.java
+113
-59
src/share/classes/com/sun/java/util/jar/pack/Constants.java
src/share/classes/com/sun/java/util/jar/pack/Constants.java
+4
-1
src/share/classes/com/sun/java/util/jar/pack/Fixups.java
src/share/classes/com/sun/java/util/jar/pack/Fixups.java
+43
-10
src/share/classes/com/sun/java/util/jar/pack/Package.java
src/share/classes/com/sun/java/util/jar/pack/Package.java
+2
-2
src/share/classes/com/sun/java/util/jar/pack/PackageReader.java
...are/classes/com/sun/java/util/jar/pack/PackageReader.java
+21
-12
src/share/classes/com/sun/tools/jdi/AbstractLauncher.java
src/share/classes/com/sun/tools/jdi/AbstractLauncher.java
+1
-1
src/share/classes/com/sun/tools/jdi/SunCommandLineLauncher.java
...are/classes/com/sun/tools/jdi/SunCommandLineLauncher.java
+1
-1
src/share/classes/java/lang/reflect/Proxy.java
src/share/classes/java/lang/reflect/Proxy.java
+7
-4
src/share/classes/java/util/logging/LogManager.java
src/share/classes/java/util/logging/LogManager.java
+3
-3
src/share/classes/java/util/logging/Logger.java
src/share/classes/java/util/logging/Logger.java
+83
-23
src/share/classes/sun/security/ec/CurveDB.java
src/share/classes/sun/security/ec/CurveDB.java
+669
-0
src/share/classes/sun/security/ec/ECDHKeyAgreement.java
src/share/classes/sun/security/ec/ECDHKeyAgreement.java
+5
-3
src/share/classes/sun/security/ec/ECDSASignature.java
src/share/classes/sun/security/ec/ECDSASignature.java
+5
-3
src/share/classes/sun/security/ec/ECKeyPairGenerator.java
src/share/classes/sun/security/ec/ECKeyPairGenerator.java
+8
-6
src/share/classes/sun/security/ec/ECParameters.java
src/share/classes/sun/security/ec/ECParameters.java
+79
-192
src/share/classes/sun/security/ec/ECPrivateKeyImpl.java
src/share/classes/sun/security/ec/ECPrivateKeyImpl.java
+6
-7
src/share/classes/sun/security/ec/ECPublicKeyImpl.java
src/share/classes/sun/security/ec/ECPublicKeyImpl.java
+6
-6
src/share/classes/sun/security/ec/NamedCurve.java
src/share/classes/sun/security/ec/NamedCurve.java
+17
-595
src/share/classes/sun/security/ec/SunECEntries.java
src/share/classes/sun/security/ec/SunECEntries.java
+30
-58
src/share/classes/sun/security/pkcs11/P11ECKeyFactory.java
src/share/classes/sun/security/pkcs11/P11ECKeyFactory.java
+47
-24
src/share/classes/sun/security/pkcs11/P11Key.java
src/share/classes/sun/security/pkcs11/P11Key.java
+5
-5
src/share/classes/sun/security/pkcs11/P11KeyStore.java
src/share/classes/sun/security/pkcs11/P11KeyStore.java
+6
-3
src/share/classes/sun/security/ssl/JsseJce.java
src/share/classes/sun/security/ssl/JsseJce.java
+5
-6
src/share/classes/sun/security/util/ECKeySizeParameterSpec.java
...are/classes/sun/security/util/ECKeySizeParameterSpec.java
+66
-0
src/share/classes/sun/security/util/ECUtil.java
src/share/classes/sun/security/util/ECUtil.java
+231
-0
src/share/native/com/sun/java/util/jar/pack/constants.h
src/share/native/com/sun/java/util/jar/pack/constants.h
+4
-0
src/share/native/com/sun/java/util/jar/pack/unpack.cpp
src/share/native/com/sun/java/util/jar/pack/unpack.cpp
+89
-32
test/ProblemList.txt
test/ProblemList.txt
+0
-4
test/java/lang/reflect/Proxy/Basic1.java
test/java/lang/reflect/Proxy/Basic1.java
+25
-13
test/java/net/CookieHandler/CookieManagerTest.java
test/java/net/CookieHandler/CookieManagerTest.java
+110
-85
test/java/util/logging/bundlesearch/IndirectlyLoadABundle.java
...java/util/logging/bundlesearch/IndirectlyLoadABundle.java
+98
-27
test/java/util/logging/bundlesearch/LoadItUp1.java
test/java/util/logging/bundlesearch/LoadItUp1.java
+49
-0
test/java/util/logging/bundlesearch/LoadItUp2.java
test/java/util/logging/bundlesearch/LoadItUp2.java
+9
-9
test/java/util/logging/bundlesearch/LoadItUp2Invoker.java
test/java/util/logging/bundlesearch/LoadItUp2Invoker.java
+60
-0
test/java/util/logging/bundlesearch/ResourceBundleSearchTest.java
...a/util/logging/bundlesearch/ResourceBundleSearchTest.java
+65
-30
test/java/util/logging/bundlesearch/TwiceIndirectlyLoadABundle.java
...util/logging/bundlesearch/TwiceIndirectlyLoadABundle.java
+91
-0
test/java/util/logging/bundlesearch/resources/CallerSearchableResource_en.properties
...lesearch/resources/CallerSearchableResource_en.properties
+25
-0
test/javax/xml/jaxp/PrecisionDecimalDV/XPrecisionDecimalToString.java
...ml/jaxp/PrecisionDecimalDV/XPrecisionDecimalToString.java
+103
-0
test/sun/net/www/protocol/http/B6299712.java
test/sun/net/www/protocol/http/B6299712.java
+91
-95
test/sun/security/pkcs11/ec/TestCurves.java
test/sun/security/pkcs11/ec/TestCurves.java
+62
-7
test/sun/security/pkcs11/ec/TestECDH2.java
test/sun/security/pkcs11/ec/TestECDH2.java
+7
-5
test/sun/security/pkcs11/ec/TestECDSA2.java
test/sun/security/pkcs11/ec/TestECDSA2.java
+8
-5
test/tools/pack200/AttributeTests.java
test/tools/pack200/AttributeTests.java
+1
-5
test/tools/pack200/BandIntegrity.java
test/tools/pack200/BandIntegrity.java
+61
-0
test/tools/pack200/InstructionTests.java
test/tools/pack200/InstructionTests.java
+2
-7
test/tools/pack200/Utils.java
test/tools/pack200/Utils.java
+11
-0
test/tools/pack200/pack200-verifier/src/xmlkit/ClassReader.java
...ools/pack200/pack200-verifier/src/xmlkit/ClassReader.java
+161
-30
test/tools/pack200/typeannos/Lambda.java
test/tools/pack200/typeannos/Lambda.java
+59
-0
test/tools/pack200/typeannos/Readme.txt
test/tools/pack200/typeannos/Readme.txt
+11
-0
test/tools/pack200/typeannos/TargetTypes.java
test/tools/pack200/typeannos/TargetTypes.java
+227
-0
test/tools/pack200/typeannos/TestTypeAnnotations.java
test/tools/pack200/typeannos/TestTypeAnnotations.java
+45
-0
test/tools/pack200/typeannos/TypeUseTarget.java
test/tools/pack200/typeannos/TypeUseTarget.java
+62
-0
未找到文件。
make/sun/security/ec/Makefile
浏览文件 @
88be1441
...
...
@@ -124,15 +124,6 @@ CLASSDESTDIR = $(TEMPDIR)/classes
#
AUTO_FILES_JAVA_DIRS
=
$(PKGDIR)
#
# Exclude the sources that get built by ../other/Makefile
#
AUTO_JAVA_PRUNE
=
\
ECParameters.java
\
ECPrivateKeyImpl.java
\
ECPublicKeyImpl.java
\
NamedCurve.java
#
# Some licensees do not get the native ECC sources, but we still need to
# be able to build "all" for them. Check here to see if the sources are
...
...
make/sun/security/other/Makefile
浏览文件 @
88be1441
...
...
@@ -49,15 +49,6 @@ AUTO_FILES_JAVA_DIRS = \
sun/security/x509
\
com/sun/net/ssl/internal/ssl
#
# EC classes used by the packages above
#
FILES_java
+=
\
sun/security/ec/ECParameters.java
\
sun/security/ec/ECPrivateKeyImpl.java
\
sun/security/ec/ECPublicKeyImpl.java
\
sun/security/ec/NamedCurve.java
#
# Rules
#
...
...
makefiles/CreateJars.gmk
浏览文件 @
88be1441
...
...
@@ -216,19 +216,7 @@ RT_JAR_EXCLUDES += \
sun/net/spi/nameservice/dns \
sun/nio/cs/ext \
sun/rmi/rmic \
sun/security/ec/ECDHKeyAgreement.class \
sun/security/ec/ECDSASignature.class \
sun/security/ec/ECDSASignature\$$$$Raw.class \
sun/security/ec/ECDSASignature\$$$$SHA1.class \
sun/security/ec/ECDSASignature\$$$$SHA224.class \
sun/security/ec/ECDSASignature\$$$$SHA256.class \
sun/security/ec/ECDSASignature\$$$$SHA384.class \
sun/security/ec/ECDSASignature\$$$$SHA512.class \
sun/security/ec/ECKeyFactory.class \
sun/security/ec/ECKeyPairGenerator.class \
sun/security/ec/SunEC\$$$$1.class \
sun/security/ec/SunEC.class \
sun/security/ec/SunECEntries.class \
sun/security/ec \
sun/security/internal \
sun/security/mscapi \
sun/security/pkcs11 \
...
...
src/share/classes/com/sun/java/util/jar/pack/Attribute.java
浏览文件 @
88be1441
...
...
@@ -99,6 +99,7 @@ class Attribute implements Comparable<Attribute> {
return
this
==
def
.
canon
;
}
@Override
public
int
compareTo
(
Attribute
that
)
{
return
this
.
def
.
compareTo
(
that
.
def
);
}
...
...
@@ -212,20 +213,20 @@ class Attribute implements Comparable<Attribute> {
// Metadata.
//
// We define metadata using similar layouts
// for all five kinds of metadata attributes
.
// for all five kinds of metadata attributes
and 2 type metadata attributes
//
// Regular annotations are a counted list of [RSHNH[RUH(1)]][...]
// pack.method.attribute.RuntimeVisibleAnnotations=[NH[(1)]][RSHNH[RUH(1)]][TB...]
//
// Parameter annotations are a counted list of regular annotations.
// pack.method.attribute.RuntimeVisibleParameterAnnotations=[N
H
[(1)]][NH[(1)]][RSHNH[RUH(1)]][TB...]
// pack.method.attribute.RuntimeVisibleParameterAnnotations=[N
B
[(1)]][NH[(1)]][RSHNH[RUH(1)]][TB...]
//
// RuntimeInvisible annotations are defined similarly...
// Non-method annotations are defined similarly...
//
// Annotation are a simple tagged value [TB...]
// pack.attribute.method.AnnotationDefault=[TB...]
//
static
{
String
mdLayouts
[]
=
{
Attribute
.
normalizeLayoutString
...
...
@@ -238,6 +239,9 @@ class Attribute implements Comparable<Attribute> {
+
"\n # annotations :="
+
"\n [ NH[(1)] ] # forward call to annotation"
+
"\n "
),
Attribute
.
normalizeLayoutString
(
""
+
"\n # annotation :="
+
"\n [RSH"
+
"\n NH[RUH (1)] # forward call to value"
...
...
@@ -259,24 +263,67 @@ class Attribute implements Comparable<Attribute> {
+
"\n ()[] ]"
)
};
/*
* RuntimeVisibleTypeAnnotation and RuntimeInvisibleTypeAnnotatation are
* similar to RuntimeVisibleAnnotation and RuntimeInvisibleAnnotation,
* a type-annotation union and a type-path structure precedes the
* annotation structure
*/
String
typeLayouts
[]
=
{
Attribute
.
normalizeLayoutString
(
""
+
"\n # type-annotations :="
+
"\n [ NH[(1)(2)(3)] ] # forward call to type-annotations"
),
Attribute
.
normalizeLayoutString
(
""
+
"\n # type-annotation :="
+
"\n [TB"
+
"\n (0-1) [B] # {CLASS, METHOD}_TYPE_PARAMETER"
+
"\n (16) [FH] # CLASS_EXTENDS"
+
"\n (17-18) [BB] # {CLASS, METHOD}_TYPE_PARAMETER_BOUND"
+
"\n (19-21) [] # FIELD, METHOD_RETURN, METHOD_RECEIVER"
+
"\n (22) [B] # METHOD_FORMAL_PARAMETER"
+
"\n (23) [H] # THROWS"
+
"\n (64-65) [NH[PHOHH]] # LOCAL_VARIABLE, RESOURCE_VARIABLE"
+
"\n (66) [H] # EXCEPTION_PARAMETER"
+
"\n (67-70) [PH] # INSTANCEOF, NEW, {CONSTRUCTOR, METHOD}_REFERENCE_RECEIVER"
+
"\n (71-75) [PHB] # CAST, {CONSTRUCTOR,METHOD}_INVOCATION_TYPE_ARGUMENT, {CONSTRUCTOR, METHOD}_REFERENCE_TYPE_ARGUMENT"
+
"\n ()[] ]"
),
Attribute
.
normalizeLayoutString
(
""
+
"\n # type-path"
+
"\n [ NB[BB] ]"
)
};
Map
<
Layout
,
Attribute
>
sd
=
standardDefs
;
String
defaultLayout
=
mdLayouts
[
2
];
String
annotationsLayout
=
mdLayouts
[
1
]
+
mdLayouts
[
2
];
String
defaultLayout
=
mdLayouts
[
3
];
String
annotationsLayout
=
mdLayouts
[
1
]
+
mdLayouts
[
2
]
+
mdLayouts
[
3
]
;
String
paramsLayout
=
mdLayouts
[
0
]
+
annotationsLayout
;
String
typesLayout
=
typeLayouts
[
0
]
+
typeLayouts
[
1
]
+
typeLayouts
[
2
]
+
mdLayouts
[
2
]
+
mdLayouts
[
3
];
for
(
int
ctype
=
0
;
ctype
<
ATTR_CONTEXT_LIMIT
;
ctype
++)
{
if
(
ctype
==
ATTR_CONTEXT_CODE
)
continue
;
define
(
sd
,
ctype
,
"RuntimeVisibleAnnotations"
,
annotationsLayout
);
define
(
sd
,
ctype
,
"RuntimeInvisibleAnnotations"
,
annotationsLayout
);
if
(
ctype
==
ATTR_CONTEXT_METHOD
)
{
define
(
sd
,
ctype
,
"RuntimeVisibleParameterAnnotations"
,
paramsLayout
);
if
(
ctype
!=
ATTR_CONTEXT_CODE
)
{
define
(
sd
,
ctype
,
"Runtime
InvisibleParameterAnnotations"
,
param
sLayout
);
"Runtime
VisibleAnnotations"
,
annotation
sLayout
);
define
(
sd
,
ctype
,
"AnnotationDefault"
,
defaultLayout
);
"RuntimeInvisibleAnnotations"
,
annotationsLayout
);
if
(
ctype
==
ATTR_CONTEXT_METHOD
)
{
define
(
sd
,
ctype
,
"RuntimeVisibleParameterAnnotations"
,
paramsLayout
);
define
(
sd
,
ctype
,
"RuntimeInvisibleParameterAnnotations"
,
paramsLayout
);
define
(
sd
,
ctype
,
"AnnotationDefault"
,
defaultLayout
);
}
}
define
(
sd
,
ctype
,
"RuntimeVisibleTypeAnnotations"
,
typesLayout
);
define
(
sd
,
ctype
,
"RuntimeInvisibleTypeAnnotations"
,
typesLayout
);
}
}
...
...
@@ -529,6 +576,7 @@ class Attribute implements Comparable<Attribute> {
return
canon
.
addContent
(
bytes
,
null
);
}
@Override
public
boolean
equals
(
Object
x
)
{
return
(
x
!=
null
)
&&
(
x
.
getClass
()
==
Layout
.
class
)
&&
equals
((
Layout
)
x
);
...
...
@@ -538,11 +586,13 @@ class Attribute implements Comparable<Attribute> {
&&
this
.
layout
.
equals
(
that
.
layout
)
&&
this
.
ctype
==
that
.
ctype
;
}
@Override
public
int
hashCode
()
{
return
(((
17
+
name
.
hashCode
())
*
37
+
layout
.
hashCode
())
*
37
+
ctype
);
}
@Override
public
int
compareTo
(
Layout
that
)
{
int
r
;
r
=
this
.
name
.
compareTo
(
that
.
name
);
...
...
@@ -551,6 +601,7 @@ class Attribute implements Comparable<Attribute> {
if
(
r
!=
0
)
return
r
;
return
this
.
ctype
-
that
.
ctype
;
}
@Override
public
String
toString
()
{
String
str
=
contextName
(
ctype
)+
"."
+
name
+
"["
+
layout
+
"]"
;
// If -ea, print out more informative strings!
...
...
@@ -698,11 +749,14 @@ class Attribute implements Comparable<Attribute> {
// References (to a local cpMap) are embedded in the bytes.
def
.
parse
(
holder
,
bytes
,
0
,
bytes
.
length
,
new
ValueStream
()
{
@Override
public
void
putInt
(
int
bandIndex
,
int
value
)
{
}
@Override
public
void
putRef
(
int
bandIndex
,
Entry
ref
)
{
refs
.
add
(
ref
);
}
@Override
public
int
encodeBCI
(
int
bci
)
{
return
bci
;
}
...
...
@@ -716,6 +770,7 @@ class Attribute implements Comparable<Attribute> {
return
def
.
unparse
(
in
,
out
);
}
@Override
public
String
toString
()
{
return
def
+
"{"
+(
bytes
==
null
?
-
1
:
size
())+
"}"
...
...
@@ -1309,7 +1364,7 @@ class Attribute implements Comparable<Attribute> {
}
out
.
putRef
(
bandIndex
,
globalRef
);
break
;
default
:
assert
(
false
);
continue
;
default
:
assert
(
false
);
}
}
return
pos
;
...
...
@@ -1416,8 +1471,7 @@ class Attribute implements Comparable<Attribute> {
int
localRef
;
if
(
globalRef
!=
null
)
{
// It's a one-element array, really an lvalue.
fixups
[
0
]
=
Fixups
.
add
(
fixups
[
0
],
null
,
out
.
size
(),
Fixups
.
U2_FORMAT
,
globalRef
);
fixups
[
0
]
=
Fixups
.
addRefWithLoc
(
fixups
[
0
],
out
.
size
(),
globalRef
);
localRef
=
0
;
// placeholder for fixups
}
else
{
localRef
=
0
;
// fixed null value
...
...
src/share/classes/com/sun/java/util/jar/pack/BandStructure.java
浏览文件 @
88be1441
此差异已折叠。
点击以展开。
src/share/classes/com/sun/java/util/jar/pack/Constants.java
浏览文件 @
88be1441
...
...
@@ -45,6 +45,7 @@ class Constants {
1.5 to 1.5.X 49,0
1.6 to 1.5.x 50,0
1.7 to 1.6.x 51,0
1.8 to 1.7.x 52,0
*/
public
final
static
Package
.
Version
JAVA_MIN_CLASS_VERSION
=
...
...
@@ -161,7 +162,9 @@ class Constants {
METHOD_ATTR_RuntimeInvisibleParameterAnnotations
=
24
,
CLASS_ATTR_ClassFile_version
=
24
,
METHOD_ATTR_AnnotationDefault
=
25
,
METHOD_ATTR_MethodParameters
=
26
,
METHOD_ATTR_MethodParameters
=
26
,
// JDK8
X_ATTR_RuntimeVisibleTypeAnnotations
=
27
,
// JDK8
X_ATTR_RuntimeInvisibleTypeAnnotations
=
28
,
// JDK8
CODE_ATTR_StackMapTable
=
0
,
// new in Java 6
CODE_ATTR_LineNumberTable
=
1
,
CODE_ATTR_LocalVariableTable
=
2
,
...
...
src/share/classes/com/sun/java/util/jar/pack/Fixups.java
浏览文件 @
88be1441
/*
* Copyright (c) 2003, 201
1
, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2003, 201
3
, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
...
...
@@ -30,6 +30,7 @@ import java.util.AbstractCollection;
import
java.util.ArrayList
;
import
java.util.Collection
;
import
java.util.Iterator
;
import
java.util.Objects
;
/**
* Collection of relocatable constant pool references.
...
...
@@ -77,8 +78,9 @@ final class Fixups extends AbstractCollection<Fixups.Fixup> {
private
static
final
int
MINBIGSIZE
=
1
;
// cleverly share empty bigDescs:
private
static
int
[]
noBigDescs
=
{
MINBIGSIZE
};
private
static
final
int
[]
noBigDescs
=
{
MINBIGSIZE
};
@Override
public
int
size
()
{
return
size
;
}
...
...
@@ -105,6 +107,7 @@ final class Fixups extends AbstractCollection<Fixups.Fixup> {
}
}
@Override
public
void
clear
()
{
if
(
bytes
!=
null
)
{
// Clean the bytes:
...
...
@@ -141,16 +144,16 @@ final class Fixups extends AbstractCollection<Fixups.Fixup> {
assert
(
old
.
equals
(
new
ArrayList
<>(
this
)));
}
static
final
int
LOC_SHIFT
=
1
;
static
final
int
FMT_MASK
=
0x1
;
static
final
byte
UNUSED_BYTE
=
0
;
static
final
byte
OVERFLOW_BYTE
=
-
1
;
private
static
final
int
LOC_SHIFT
=
1
;
private
static
final
int
FMT_MASK
=
0x1
;
private
static
final
byte
UNUSED_BYTE
=
0
;
private
static
final
byte
OVERFLOW_BYTE
=
-
1
;
// fill pointer of bigDescs array is in element [0]
static
final
int
BIGSIZE
=
0
;
private
static
final
int
BIGSIZE
=
0
;
// Format values:
p
ublic
static
final
int
U2_FORMAT
=
0
;
p
ublic
static
final
int
U1_FORMAT
=
1
;
p
rivate
static
final
int
U2_FORMAT
=
0
;
p
rivate
static
final
int
U1_FORMAT
=
1
;
// Special values for the static methods.
private
static
final
int
SPECIAL_LOC
=
0
;
...
...
@@ -232,6 +235,14 @@ final class Fixups extends AbstractCollection<Fixups.Fixup> {
}
}
void
addU1
(
int
pc
,
Entry
ref
)
{
add
(
pc
,
U1_FORMAT
,
ref
);
}
void
addU2
(
int
pc
,
Entry
ref
)
{
add
(
pc
,
U2_FORMAT
,
ref
);
}
/** Simple and necessary tuple to present each fixup. */
public
static
class
Fixup
implements
Comparable
<
Fixup
>
{
...
...
@@ -248,15 +259,25 @@ final class Fixups extends AbstractCollection<Fixups.Fixup> {
public
int
location
()
{
return
descLoc
(
desc
);
}
public
int
format
()
{
return
descFmt
(
desc
);
}
public
Entry
entry
()
{
return
entry
;
}
@Override
public
int
compareTo
(
Fixup
that
)
{
// Ordering depends only on location.
return
this
.
location
()
-
that
.
location
();
}
@Override
public
boolean
equals
(
Object
x
)
{
if
(!(
x
instanceof
Fixup
))
return
false
;
Fixup
that
=
(
Fixup
)
x
;
return
this
.
desc
==
that
.
desc
&&
this
.
entry
==
that
.
entry
;
}
@Override
public
int
hashCode
()
{
int
hash
=
7
;
hash
=
59
*
hash
+
this
.
desc
;
hash
=
59
*
hash
+
Objects
.
hashCode
(
this
.
entry
);
return
hash
;
}
@Override
public
String
toString
()
{
return
"@"
+
location
()+(
format
()==
U1_FORMAT
?
".1"
:
""
)+
"="
+
entry
;
}
...
...
@@ -267,8 +288,11 @@ final class Fixups extends AbstractCollection<Fixups.Fixup> {
int
index
=
0
;
// index into entries
int
bigIndex
=
BIGSIZE
+
1
;
// index into bigDescs
int
next
=
head
;
// desc pointing to next fixup
@Override
public
boolean
hasNext
()
{
return
index
<
size
;
}
@Override
public
void
remove
()
{
throw
new
UnsupportedOperationException
();
}
@Override
public
Fixup
next
()
{
int
thisIndex
=
index
;
return
new
Fixup
(
nextDesc
(),
entries
[
thisIndex
]);
...
...
@@ -293,17 +317,20 @@ final class Fixups extends AbstractCollection<Fixups.Fixup> {
}
}
@Override
public
Iterator
<
Fixup
>
iterator
()
{
return
new
Itr
();
}
public
void
add
(
int
location
,
int
format
,
Entry
entry
)
{
addDesc
(
makeDesc
(
location
,
format
),
entry
);
}
@Override
public
boolean
add
(
Fixup
f
)
{
addDesc
(
f
.
desc
,
f
.
entry
);
return
true
;
}
@Override
public
boolean
addAll
(
Collection
<?
extends
Fixup
>
c
)
{
if
(
c
instanceof
Fixups
)
{
// Use knowledge of Itr structure to avoid building little structs.
...
...
@@ -367,7 +394,13 @@ final class Fixups extends AbstractCollection<Fixups.Fixup> {
}
/// Static methods that optimize the use of this class.
public
static
static
Object
addRefWithBytes
(
Object
f
,
byte
[]
bytes
,
Entry
e
)
{
return
add
(
f
,
bytes
,
0
,
U2_FORMAT
,
e
);
}
static
Object
addRefWithLoc
(
Object
f
,
int
loc
,
Entry
entry
)
{
return
add
(
f
,
null
,
loc
,
U2_FORMAT
,
entry
);
}
private
static
Object
add
(
Object
prevFixups
,
byte
[]
bytes
,
int
loc
,
int
fmt
,
Entry
e
)
{
...
...
src/share/classes/com/sun/java/util/jar/pack/Package.java
浏览文件 @
88be1441
/*
* Copyright (c) 2001, 201
2
, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2001, 201
3
, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
...
...
@@ -259,7 +259,7 @@ class Package {
byte
[]
bytes
=
new
byte
[
2
];
sfName
=
getRefString
(
obvious
);
Object
f
=
null
;
f
=
Fixups
.
add
(
f
,
bytes
,
0
,
Fixups
.
U2_FORMAT
,
sfName
);
f
=
Fixups
.
add
RefWithBytes
(
f
,
bytes
,
sfName
);
a
=
attrSourceFileSpecial
.
addContent
(
bytes
,
f
);
}
}
else
if
(
obvious
.
equals
(
sfName
.
stringValue
()))
{
...
...
src/share/classes/com/sun/java/util/jar/pack/PackageReader.java
浏览文件 @
88be1441
...
...
@@ -116,7 +116,7 @@ class PackageReader extends BandStructure {
int
nr
=
super
.
read
(
b
,
off
,
len
);
servedPos
=
pos
;
if
(
nr
>=
0
)
served
+=
nr
;
assert
(
served
<=
limit
||
limit
==
-
1
);
//
assert(served <= limit || limit == -1);
return
nr
;
}
public
long
skip
(
long
n
)
throws
IOException
{
...
...
@@ -1500,6 +1500,7 @@ class PackageReader extends BandStructure {
// ic_local_bands
// *class_ClassFile_version_minor_H :UNSIGNED5
// *class_ClassFile_version_major_H :UNSIGNED5
// class_type_metadata_bands
//
// field_attr_bands:
// *field_flags :UNSIGNED5
...
...
@@ -1509,6 +1510,7 @@ class PackageReader extends BandStructure {
// *field_Signature_RS :UNSIGNED5 (cp_Signature)
// field_metadata_bands
// *field_ConstantValue_KQ :UNSIGNED5 (cp_Int, etc.; see note)
// field_type_metadata_bands
//
// method_attr_bands:
// *method_flags :UNSIGNED5
...
...
@@ -1522,6 +1524,7 @@ class PackageReader extends BandStructure {
// *method_MethodParameters_NB: BYTE1
// *method_MethodParameters_RUN: UNSIGNED5 (cp_Utf8)
// *method_MethodParameters_FH: UNSIGNED5 (flag)
// method_type_metadata_bands
//
// code_attr_bands:
// *code_flags :UNSIGNED5
...
...
@@ -1537,6 +1540,7 @@ class PackageReader extends BandStructure {
// *code_LocalVariableTable_name_RU :UNSIGNED5 (cp_Utf8)
// *code_LocalVariableTable_type_RS :UNSIGNED5 (cp_Signature)
// *code_LocalVariableTable_slot :UNSIGNED5
// code_type_metadata_bands
countAttrs
(
ctype
,
holders
);
readAttrs
(
ctype
,
holders
);
...
...
@@ -1703,8 +1707,9 @@ class PackageReader extends BandStructure {
class_InnerClasses_outer_RCN
.
readFrom
(
in
);
class_InnerClasses_name_RUN
.
expectLength
(
tupleCount
);
class_InnerClasses_name_RUN
.
readFrom
(
in
);
}
else
if
(
totalCount
==
0
)
{
// Expect no elements at all. Skip quickly.
}
else
if
(!
optDebugBands
&&
totalCount
==
0
)
{
// Expect no elements at all. Skip quickly. however if we
// are debugging bands, read all bands regardless
for
(
int
j
=
0
;
j
<
ab
.
length
;
j
++)
{
ab
[
j
].
doneWithUnusedBand
();
}
...
...
@@ -1723,11 +1728,17 @@ class PackageReader extends BandStructure {
assert
(
cbles
[
j
].
kind
==
Attribute
.
EK_CBLE
);
int
entryCount
=
forwardCounts
[
j
];
forwardCounts
[
j
]
=
-
1
;
// No more, please!
if
(
cbles
[
j
].
flagTest
(
Attribute
.
EF_BACK
))
if
(
totalCount
>
0
&&
cbles
[
j
].
flagTest
(
Attribute
.
EF_BACK
))
entryCount
+=
xxx_attr_calls
.
getInt
();
readAttrBands
(
cbles
[
j
].
body
,
entryCount
,
forwardCounts
,
ab
);
}
}
// mark them read, to satisfy asserts
if
(
optDebugBands
&&
totalCount
==
0
)
{
for
(
int
j
=
0
;
j
<
ab
.
length
;
j
++)
{
ab
[
j
].
doneDisbursing
();
}
}
}
}
if
(!
predef
)
break
;
...
...
@@ -2154,11 +2165,10 @@ class PackageReader extends BandStructure {
if
(
size
==
1
)
ldcRefSet
.
add
(
ref
);
int
fmt
;
switch
(
size
)
{
case
1
:
f
mt
=
Fixups
.
U1_FORMAT
;
break
;
case
2
:
f
mt
=
Fixups
.
U2_FORMAT
;
break
;
case
1
:
f
ixupBuf
.
addU1
(
pc
,
ref
)
;
break
;
case
2
:
f
ixupBuf
.
addU2
(
pc
,
ref
)
;
break
;
default
:
assert
(
false
);
fmt
=
0
;
}
fixupBuf
.
add
(
pc
,
fmt
,
ref
);
buf
[
pc
+
0
]
=
buf
[
pc
+
1
]
=
0
;
pc
+=
size
;
}
...
...
@@ -2193,7 +2203,7 @@ class PackageReader extends BandStructure {
int
coding
=
bc_initref
.
getInt
();
// Find the nth overloading of <init> in classRef.
MemberEntry
ref
=
pkg
.
cp
.
getOverloadingForIndex
(
CONSTANT_Methodref
,
classRef
,
"<init>"
,
coding
);
fixupBuf
.
add
(
pc
,
Fixups
.
U2_FORMAT
,
ref
);
fixupBuf
.
add
U2
(
pc
,
ref
);
buf
[
pc
+
0
]
=
buf
[
pc
+
1
]
=
0
;
pc
+=
2
;
assert
(
Instruction
.
opLength
(
origBC
)
==
(
pc
-
curPC
));
...
...
@@ -2226,7 +2236,7 @@ class PackageReader extends BandStructure {
insnMap
[
numInsns
++]
=
curPC
;
}
buf
[
pc
++]
=
(
byte
)
origBC
;
fixupBuf
.
add
(
pc
,
Fixups
.
U2_FORMAT
,
ref
);
fixupBuf
.
add
U2
(
pc
,
ref
);
buf
[
pc
+
0
]
=
buf
[
pc
+
1
]
=
0
;
pc
+=
2
;
assert
(
Instruction
.
opLength
(
origBC
)
==
(
pc
-
curPC
));
...
...
@@ -2289,11 +2299,10 @@ class PackageReader extends BandStructure {
buf
[
pc
++]
=
(
byte
)
origBC
;
int
fmt
;
switch
(
size
)
{
case
1
:
f
mt
=
Fixups
.
U1_FORMAT
;
break
;
case
2
:
f
mt
=
Fixups
.
U2_FORMAT
;
break
;
case
1
:
f
ixupBuf
.
addU1
(
pc
,
ref
)
;
break
;
case
2
:
f
ixupBuf
.
addU2
(
pc
,
ref
)
;
break
;
default
:
assert
(
false
);
fmt
=
0
;
}
fixupBuf
.
add
(
pc
,
fmt
,
ref
);
buf
[
pc
+
0
]
=
buf
[
pc
+
1
]
=
0
;
pc
+=
size
;
if
(
origBC
==
_multianewarray
)
{
...
...
src/share/classes/com/sun/tools/jdi/AbstractLauncher.java
浏览文件 @
88be1441
...
...
@@ -142,7 +142,7 @@ abstract class AbstractLauncher extends ConnectorImpl implements LaunchingConnec
* This class simply provides a context for a single launch and
* accept. It provides instance fields that can be used by
* all threads involved. This stuff can't be in the Connector proper
* because the connector is
is a singleton and
not specific to any
* because the connector is
a singleton and is
not specific to any
* one launch.
*/
private
class
Helper
{
...
...
src/share/classes/com/sun/tools/jdi/SunCommandLineLauncher.java
浏览文件 @
88be1441
...
...
@@ -213,7 +213,7 @@ public class SunCommandLineLauncher extends AbstractLauncher implements Launchin
exePath
=
exe
;
}
// Quote only if necessary in case the quote arg value is bogus
if
(
hasWhitespace
(
exe
))
{
if
(
hasWhitespace
(
exe
Path
))
{
exePath
=
quote
+
exePath
+
quote
;
}
...
...
src/share/classes/java/lang/reflect/Proxy.java
浏览文件 @
88be1441
...
...
@@ -31,6 +31,7 @@ import java.security.PrivilegedAction;
import
java.util.Arrays
;
import
java.util.IdentityHashMap
;
import
java.util.Map
;
import
java.util.Objects
;
import
java.util.concurrent.atomic.AtomicLong
;
import
java.util.function.BiFunction
;
import
sun.misc.ProxyGenerator
;
...
...
@@ -255,9 +256,13 @@ public class Proxy implements java.io.Serializable {
* (typically, a dynamic proxy class) with the specified value
* for its invocation handler.
*
* @param h the invocation handler for this proxy instance
* @param h the invocation handler for this proxy instance
*
* @throws NullPointerException if the given invocation handler, {@code h},
* is {@code null}.
*/
protected
Proxy
(
InvocationHandler
h
)
{
Objects
.
requireNonNull
(
h
);
this
.
h
=
h
;
}
...
...
@@ -698,9 +703,7 @@ public class Proxy implements java.io.Serializable {
InvocationHandler
h
)
throws
IllegalArgumentException
{
if
(
h
==
null
)
{
throw
new
NullPointerException
();
}
Objects
.
requireNonNull
(
h
);
final
SecurityManager
sm
=
System
.
getSecurityManager
();
if
(
sm
!=
null
)
{
...
...
src/share/classes/java/util/logging/LogManager.java
浏览文件 @
88be1441
...
...
@@ -433,11 +433,11 @@ public class LogManager {
// add a new Logger or return the one that has been added previously
// as a LogManager subclass may override the addLogger, getLogger,
// readConfiguration, and other methods.
Logger
demandLogger
(
String
name
,
String
resourceBundleName
)
{
Logger
demandLogger
(
String
name
,
String
resourceBundleName
,
Class
<?>
caller
)
{
Logger
result
=
getLogger
(
name
);
if
(
result
==
null
)
{
// only allocate the new logger once
Logger
newLogger
=
new
Logger
(
name
,
resourceBundleName
);
Logger
newLogger
=
new
Logger
(
name
,
resourceBundleName
,
caller
);
do
{
if
(
addLogger
(
newLogger
))
{
// We successfully added the new Logger that we
...
...
@@ -519,7 +519,7 @@ public class LogManager {
Logger
demandLogger
(
String
name
,
String
resourceBundleName
)
{
// a LogManager subclass may have its own implementation to add and
// get a Logger. So delegate to the LogManager to do the work.
return
manager
.
demandLogger
(
name
,
resourceBundleName
);
return
manager
.
demandLogger
(
name
,
resourceBundleName
,
null
);
}
synchronized
Logger
findLogger
(
String
name
)
{
...
...
src/share/classes/java/util/logging/Logger.java
浏览文件 @
88be1441
...
...
@@ -191,8 +191,6 @@ import sun.reflect.Reflection;
*
* @since 1.4
*/
public
class
Logger
{
private
static
final
Handler
emptyHandlers
[]
=
new
Handler
[
0
];
private
static
final
int
offValue
=
Level
.
OFF
.
intValue
();
...
...
@@ -218,6 +216,7 @@ public class Logger {
private
ArrayList
<
LogManager
.
LoggerWeakRef
>
kids
;
// WeakReferences to loggers that have us as parent
private
volatile
Level
levelObject
;
private
volatile
int
levelValue
;
// current effective level value
private
WeakReference
<
ClassLoader
>
callersClassLoaderRef
;
/**
* GLOBAL_LOGGER_NAME is a name for the global logger.
...
...
@@ -278,18 +277,31 @@ public class Logger {
* no corresponding resource can be found.
*/
protected
Logger
(
String
name
,
String
resourceBundleName
)
{
this
(
name
,
resourceBundleName
,
null
);
}
Logger
(
String
name
,
String
resourceBundleName
,
Class
<?>
caller
)
{
this
.
manager
=
LogManager
.
getLogManager
();
if
(
resourceBundleName
!=
null
)
{
// MissingResourceException or IllegalArgumentException can
// be thrown by setupResourceInfo(). Since this is the Logger
// constructor, the resourceBundleName field is null so
// IllegalArgumentException cannot happen here.
setupResourceInfo
(
resourceBundleName
);
}
setupResourceInfo
(
resourceBundleName
,
caller
);
this
.
name
=
name
;
levelValue
=
Level
.
INFO
.
intValue
();
}
private
void
setCallersClassLoaderRef
(
Class
<?>
caller
)
{
ClassLoader
callersClassLoader
=
((
caller
!=
null
)
?
caller
.
getClassLoader
()
:
null
);
if
(
callersClassLoader
!=
null
)
{
this
.
callersClassLoaderRef
=
new
WeakReference
(
callersClassLoader
);
}
}
private
ClassLoader
getCallersClassLoader
()
{
return
(
callersClassLoaderRef
!=
null
)
?
callersClassLoaderRef
.
get
()
:
null
;
}
// This constructor is used only to create the global Logger.
// It is needed to break a cyclic dependence between the LogManager
// and Logger static initializers causing deadlocks.
...
...
@@ -343,7 +355,9 @@ public class Logger {
return
manager
.
demandSystemLogger
(
name
,
resourceBundleName
);
}
}
return
manager
.
demandLogger
(
name
,
resourceBundleName
);
return
manager
.
demandLogger
(
name
,
resourceBundleName
,
caller
);
// ends up calling new Logger(name, resourceBundleName, caller)
// iff the logger doesn't exist already
}
/**
...
...
@@ -436,11 +450,19 @@ public class Logger {
// adding a new Logger object is handled by LogManager.addLogger().
@CallerSensitive
public
static
Logger
getLogger
(
String
name
,
String
resourceBundleName
)
{
Logger
result
=
demandLogger
(
name
,
resourceBundleName
,
Reflection
.
getCallerClass
());
Class
<?>
callerClass
=
Reflection
.
getCallerClass
();
Logger
result
=
demandLogger
(
name
,
resourceBundleName
,
callerClass
);
// MissingResourceException or IllegalArgumentException can be
// thrown by setupResourceInfo().
result
.
setupResourceInfo
(
resourceBundleName
);
// We have to set the callers ClassLoader here in case demandLogger
// above found a previously created Logger. This can happen, for
// example, if Logger.getLogger(name) is called and subsequently
// Logger.getLogger(name, resourceBundleName) is called. In this case
// we won't necessarily have the correct classloader saved away, so
// we need to set it here, too.
result
.
setupResourceInfo
(
resourceBundleName
,
callerClass
);
return
result
;
}
...
...
@@ -507,11 +529,13 @@ public class Logger {
// Synchronization is not required here. All synchronization for
// adding a new anonymous Logger object is handled by doSetParent().
@CallerSensitive
public
static
Logger
getAnonymousLogger
(
String
resourceBundleName
)
{
LogManager
manager
=
LogManager
.
getLogManager
();
// cleanup some Loggers that have been GC'ed
manager
.
drainLoggerRefQueueBounded
();
Logger
result
=
new
Logger
(
null
,
resourceBundleName
);
Logger
result
=
new
Logger
(
null
,
resourceBundleName
,
Reflection
.
getCallerClass
());
result
.
anonymous
=
true
;
Logger
root
=
manager
.
getLogger
(
""
);
result
.
doSetParent
(
root
);
...
...
@@ -527,7 +551,7 @@ public class Logger {
* @return localization bundle (may be null)
*/
public
ResourceBundle
getResourceBundle
()
{
return
findResourceBundle
(
getResourceBundleName
());
return
findResourceBundle
(
getResourceBundleName
()
,
true
);
}
/**
...
...
@@ -609,7 +633,7 @@ public class Logger {
String
ebname
=
getEffectiveResourceBundleName
();
if
(
ebname
!=
null
&&
!
ebname
.
equals
(
SYSTEM_LOGGER_RB_NAME
))
{
lr
.
setResourceBundleName
(
ebname
);
lr
.
setResourceBundle
(
findResourceBundle
(
ebname
));
lr
.
setResourceBundle
(
findResourceBundle
(
ebname
,
true
));
}
log
(
lr
);
}
...
...
@@ -936,7 +960,7 @@ public class Logger {
lr
.
setLoggerName
(
name
);
if
(
rbname
!=
null
)
{
lr
.
setResourceBundleName
(
rbname
);
lr
.
setResourceBundle
(
findResourceBundle
(
rbname
));
lr
.
setResourceBundle
(
findResourceBundle
(
rbname
,
false
));
}
log
(
lr
);
}
...
...
@@ -960,7 +984,6 @@ public class Logger {
* can be null
* @param msg The string message (or a key in the message catalog)
*/
public
void
logrb
(
Level
level
,
String
sourceClass
,
String
sourceMethod
,
String
bundleName
,
String
msg
)
{
if
(
level
.
intValue
()
<
levelValue
||
levelValue
==
offValue
)
{
...
...
@@ -1609,9 +1632,18 @@ public class Logger {
* there is no suitable previous cached value.
*
* @param name the ResourceBundle to locate
* @param userCallersClassLoader if true search using the caller's ClassLoader
* @return ResourceBundle specified by name or null if not found
*/
private
synchronized
ResourceBundle
findResourceBundle
(
String
name
)
{
private
synchronized
ResourceBundle
findResourceBundle
(
String
name
,
boolean
useCallersClassLoader
)
{
// For all lookups, we first check the thread context class loader
// if it is set. If not, we use the system classloader. If we
// still haven't found it we use the callersClassLoaderRef if it
// is set and useCallersClassLoader is true. We set
// callersClassLoaderRef initially upon creating the logger with a
// non-null resource bundle name.
// Return a null bundle for a null name.
if
(
name
==
null
)
{
return
null
;
...
...
@@ -1644,17 +1676,40 @@ public class Logger {
catalogLocale
=
currentLocale
;
return
catalog
;
}
catch
(
MissingResourceException
ex
)
{
// We can't find the ResourceBundle in the default
// ClassLoader. Drop through.
}
if
(
useCallersClassLoader
)
{
// Try with the caller's ClassLoader
ClassLoader
callersClassLoader
=
getCallersClassLoader
();
if
(
callersClassLoader
==
null
||
callersClassLoader
==
cl
)
{
return
null
;
}
try
{
catalog
=
ResourceBundle
.
getBundle
(
name
,
currentLocale
,
callersClassLoader
);
catalogName
=
name
;
catalogLocale
=
currentLocale
;
return
catalog
;
}
catch
(
MissingResourceException
ex
)
{
return
null
;
// no luck
}
}
else
{
return
null
;
}
}
// Private utility method to initialize our one entry
// resource bundle name cache
.
// resource bundle name cache
and the callers ClassLoader
// Note: for consistency reasons, we are careful to check
// that a suitable ResourceBundle exists before setting the
// resourceBundleName field.
// Synchronized to prevent races in setting the field.
private
synchronized
void
setupResourceInfo
(
String
name
)
{
// Synchronized to prevent races in setting the fields.
private
synchronized
void
setupResourceInfo
(
String
name
,
Class
<?>
callersClass
)
{
if
(
name
==
null
)
{
return
;
}
...
...
@@ -1672,9 +1727,14 @@ public class Logger {
resourceBundleName
+
" != "
+
name
);
}
if
(
findResourceBundle
(
name
)
==
null
)
{
setCallersClassLoaderRef
(
callersClass
);
if
(
findResourceBundle
(
name
,
true
)
==
null
)
{
// We've failed to find an expected ResourceBundle.
throw
new
MissingResourceException
(
"Can't find "
+
name
+
" bundle"
,
name
,
""
);
// unset the caller's ClassLoader since we were unable to find the
// the bundle using it
this
.
callersClassLoaderRef
=
null
;
throw
new
MissingResourceException
(
"Can't find "
+
name
+
" bundle"
,
name
,
""
);
}
resourceBundleName
=
name
;
}
...
...
src/share/classes/sun/security/ec/CurveDB.java
0 → 100644
浏览文件 @
88be1441
此差异已折叠。
点击以展开。
src/share/classes/sun/security/ec/ECDHKeyAgreement.java
浏览文件 @
88be1441
...
...
@@ -32,6 +32,8 @@ import java.security.spec.*;
import
javax.crypto.*
;
import
javax.crypto.spec.*
;
import
sun.security.util.ECUtil
;
/**
* KeyAgreement implementation for ECDH.
*
...
...
@@ -104,7 +106,7 @@ public final class ECDHKeyAgreement extends KeyAgreementSpi {
publicValue
=
((
ECPublicKeyImpl
)
ecKey
).
getEncodedPublicValue
();
}
else
{
// instanceof ECPublicKey
publicValue
=
EC
Parameters
.
encodePoint
(
ecKey
.
getW
(),
params
.
getCurve
());
EC
Util
.
encodePoint
(
ecKey
.
getW
(),
params
.
getCurve
());
}
int
keyLenBits
=
params
.
getCurve
().
getField
().
getFieldSize
();
secretLen
=
(
keyLenBits
+
7
)
>>
3
;
...
...
@@ -120,8 +122,8 @@ public final class ECDHKeyAgreement extends KeyAgreementSpi {
}
byte
[]
s
=
privateKey
.
getS
().
toByteArray
();
byte
[]
encodedParams
=
EC
Parameters
.
encodeParameters
(
privateKey
.
getParams
());
// DER OID
byte
[]
encodedParams
=
// DER OID
EC
Util
.
encodeECParameterSpec
(
null
,
privateKey
.
getParams
());
try
{
...
...
src/share/classes/sun/security/ec/ECDSASignature.java
浏览文件 @
88be1441
...
...
@@ -275,7 +275,8 @@ abstract class ECDSASignature extends SignatureSpi {
protected
byte
[]
engineSign
()
throws
SignatureException
{
byte
[]
s
=
privateKey
.
getS
().
toByteArray
();
ECParameterSpec
params
=
privateKey
.
getParams
();
byte
[]
encodedParams
=
ECParameters
.
encodeParameters
(
params
);
// DER OID
// DER OID
byte
[]
encodedParams
=
ECUtil
.
encodeECParameterSpec
(
null
,
params
);
int
keySize
=
params
.
getCurve
().
getField
().
getFieldSize
();
// seed is twice the key size (in bytes) plus 1
...
...
@@ -301,12 +302,13 @@ abstract class ECDSASignature extends SignatureSpi {
byte
[]
w
;
ECParameterSpec
params
=
publicKey
.
getParams
();
byte
[]
encodedParams
=
ECParameters
.
encodeParameters
(
params
);
// DER OID
// DER OID
byte
[]
encodedParams
=
ECUtil
.
encodeECParameterSpec
(
null
,
params
);
if
(
publicKey
instanceof
ECPublicKeyImpl
)
{
w
=
((
ECPublicKeyImpl
)
publicKey
).
getEncodedPublicValue
();
}
else
{
// instanceof ECPublicKey
w
=
EC
Parameters
.
encodePoint
(
publicKey
.
getW
(),
params
.
getCurve
());
w
=
EC
Util
.
encodePoint
(
publicKey
.
getW
(),
params
.
getCurve
());
}
try
{
...
...
src/share/classes/sun/security/ec/ECKeyPairGenerator.java
浏览文件 @
88be1441
/*
* Copyright (c) 2009, 201
1
, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2009, 201
2
, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
...
...
@@ -37,6 +37,7 @@ import sun.security.ec.ECParameters;
import
sun.security.ec.ECPrivateKeyImpl
;
import
sun.security.ec.ECPublicKeyImpl
;
import
sun.security.jca.JCAUtil
;
import
sun.security.util.ECUtil
;
/**
* EC keypair generator.
...
...
@@ -72,7 +73,7 @@ public final class ECKeyPairGenerator extends KeyPairGeneratorSpi {
public
void
initialize
(
int
keySize
,
SecureRandom
random
)
{
checkKeySize
(
keySize
);
this
.
params
=
NamedCurve
.
getECParameterSpec
(
keySize
);
this
.
params
=
ECUtil
.
getECParameterSpec
(
null
,
keySize
);
if
(
params
==
null
)
{
throw
new
InvalidParameterException
(
"No EC parameters available for key size "
+
keySize
+
" bits"
);
...
...
@@ -86,14 +87,15 @@ public final class ECKeyPairGenerator extends KeyPairGeneratorSpi {
throws
InvalidAlgorithmParameterException
{
if
(
params
instanceof
ECParameterSpec
)
{
this
.
params
=
ECParameters
.
getNamedCurve
((
ECParameterSpec
)
params
);
this
.
params
=
ECUtil
.
getECParameterSpec
(
null
,
(
ECParameterSpec
)
params
);
if
(
this
.
params
==
null
)
{
throw
new
InvalidAlgorithmParameterException
(
"Unsupported curve: "
+
params
);
}
}
else
if
(
params
instanceof
ECGenParameterSpec
)
{
String
name
=
((
ECGenParameterSpec
)
params
).
getName
();
this
.
params
=
NamedCurve
.
getECParameterSpec
(
name
);
this
.
params
=
ECUtil
.
getECParameterSpec
(
null
,
name
);
if
(
this
.
params
==
null
)
{
throw
new
InvalidAlgorithmParameterException
(
"Unknown curve name: "
+
name
);
...
...
@@ -112,7 +114,7 @@ public final class ECKeyPairGenerator extends KeyPairGeneratorSpi {
public
KeyPair
generateKeyPair
()
{
byte
[]
encodedParams
=
EC
Parameters
.
encodeParameters
(
(
ECParameterSpec
)
params
);
EC
Util
.
encodeECParameterSpec
(
null
,
(
ECParameterSpec
)
params
);
// seed is twice the key size (in bytes) plus 1
byte
[]
seed
=
new
byte
[(((
keySize
+
7
)
>>
3
)
+
1
)
*
2
];
...
...
@@ -135,7 +137,7 @@ public final class ECKeyPairGenerator extends KeyPairGeneratorSpi {
new
ECPrivateKeyImpl
(
s
,
(
ECParameterSpec
)
params
);
// handles[1] points to the native public key
ECPoint
w
=
EC
Parameters
.
decodePoint
(
getEncodedBytes
(
handles
[
1
]),
ECPoint
w
=
EC
Util
.
decodePoint
(
getEncodedBytes
(
handles
[
1
]),
((
ECParameterSpec
)
params
).
getCurve
());
PublicKey
publicKey
=
new
ECPublicKeyImpl
(
w
,
(
ECParameterSpec
)
params
);
...
...
src/share/classes/sun/security/ec/ECParameters.java
浏览文件 @
88be1441
...
...
@@ -26,7 +26,6 @@
package
sun.security.ec
;
import
java.io.IOException
;
import
java.math.BigInteger
;
import
java.security.*
;
import
java.security.spec.*
;
...
...
@@ -77,128 +76,75 @@ import sun.security.util.*;
*/
public
final
class
ECParameters
extends
AlgorithmParametersSpi
{
// used by ECPublicKeyImpl and ECPrivateKeyImpl
static
AlgorithmParameters
getAlgorithmParameters
(
ECParameterSpec
spec
)
throws
InvalidKeyException
{
try
{
AlgorithmParameters
params
=
AlgorithmParameters
.
getInstance
(
"EC"
,
"SunEC"
);
params
.
init
(
spec
);
return
params
;
}
catch
(
GeneralSecurityException
e
)
{
throw
new
InvalidKeyException
(
"EC parameters error"
,
e
);
}
}
/*
* The parameters these AlgorithmParameters object represents.
* Currently, it is always an instance of NamedCurve.
*/
private
NamedCurve
namedCurve
;
// A public constructor is required by AlgorithmParameters class.
public
ECParameters
()
{
// empty
}
// Used by SunPKCS11 and SunJSSE.
public
static
ECPoint
decodePoint
(
byte
[]
data
,
EllipticCurve
curve
)
throws
IOException
{
if
((
data
.
length
==
0
)
||
(
data
[
0
]
!=
4
))
{
throw
new
IOException
(
"Only uncompressed point format supported"
);
}
// Per ANSI X9.62, an encoded point is a 1 byte type followed by
// ceiling(log base 2 field-size / 8) bytes of x and the same of y.
int
n
=
(
data
.
length
-
1
)
/
2
;
if
(
n
!=
((
curve
.
getField
().
getFieldSize
()
+
7
)
>>
3
))
{
throw
new
IOException
(
"Point does not match field size"
);
}
byte
[]
xb
=
new
byte
[
n
];
byte
[]
yb
=
new
byte
[
n
];
System
.
arraycopy
(
data
,
1
,
xb
,
0
,
n
);
System
.
arraycopy
(
data
,
n
+
1
,
yb
,
0
,
n
);
return
new
ECPoint
(
new
BigInteger
(
1
,
xb
),
new
BigInteger
(
1
,
yb
));
}
// AlgorithmParameterSpi methods
// Used by SunPKCS11 and SunJSSE.
public
static
byte
[]
encodePoint
(
ECPoint
point
,
EllipticCurve
curve
)
{
// get field size in bytes (rounding up)
int
n
=
(
curve
.
getField
().
getFieldSize
()
+
7
)
>>
3
;
byte
[]
xb
=
trimZeroes
(
point
.
getAffineX
().
toByteArray
());
byte
[]
yb
=
trimZeroes
(
point
.
getAffineY
().
toByteArray
());
if
((
xb
.
length
>
n
)
||
(
yb
.
length
>
n
))
{
throw
new
RuntimeException
(
"Point coordinates do not match field size"
);
}
byte
[]
b
=
new
byte
[
1
+
(
n
<<
1
)];
b
[
0
]
=
4
;
// uncompressed
System
.
arraycopy
(
xb
,
0
,
b
,
n
-
xb
.
length
+
1
,
xb
.
length
);
System
.
arraycopy
(
yb
,
0
,
b
,
b
.
length
-
yb
.
length
,
yb
.
length
);
return
b
;
}
protected
void
engineInit
(
AlgorithmParameterSpec
paramSpec
)
throws
InvalidParameterSpecException
{
// Copied from the SunPKCS11 code - should be moved to a common location.
// trim leading (most significant) zeroes from the result
static
byte
[]
trimZeroes
(
byte
[]
b
)
{
int
i
=
0
;
while
((
i
<
b
.
length
-
1
)
&&
(
b
[
i
]
==
0
))
{
i
++;
}
if
(
i
==
0
)
{
return
b
;
if
(
paramSpec
==
null
)
{
throw
new
InvalidParameterSpecException
(
"paramSpec must not be null"
);
}
byte
[]
t
=
new
byte
[
b
.
length
-
i
];
System
.
arraycopy
(
b
,
i
,
t
,
0
,
t
.
length
);
return
t
;
}
// Convert the given ECParameterSpec object to a NamedCurve object.
// If params does not represent a known named curve, return null.
// Used by SunPKCS11.
public
static
NamedCurve
getNamedCurve
(
ECParameterSpec
params
)
{
if
((
params
instanceof
NamedCurve
)
||
(
params
==
null
))
{
return
(
NamedCurve
)
params
;
if
(
paramSpec
instanceof
NamedCurve
)
{
namedCurve
=
(
NamedCurve
)
paramSpec
;
return
;
}
// This is a hack to allow SunJSSE to work with 3rd party crypto
// providers for ECC and not just SunPKCS11.
// This can go away once we decide how to expose curve names in the
// public API.
// Note that it assumes that the 3rd party provider encodes named
// curves using the short form, not explicitly. If it did that, then
// the SunJSSE TLS ECC extensions are wrong, which could lead to
// interoperability problems.
int
fieldSize
=
params
.
getCurve
().
getField
().
getFieldSize
();
for
(
ECParameterSpec
namedCurve
:
NamedCurve
.
knownECParameterSpecs
())
{
// ECParameterSpec does not define equals, so check all the
// components ourselves.
// Quick field size check first
if
(
namedCurve
.
getCurve
().
getField
().
getFieldSize
()
!=
fieldSize
)
{
continue
;
}
if
(
namedCurve
.
getCurve
().
equals
(
params
.
getCurve
())
==
false
)
{
continue
;
}
if
(
namedCurve
.
getGenerator
().
equals
(
params
.
getGenerator
())
==
false
)
{
continue
;
}
if
(
namedCurve
.
getOrder
().
equals
(
params
.
getOrder
())
==
false
)
{
continue
;
}
if
(
namedCurve
.
getCofactor
()
!=
params
.
getCofactor
())
{
continue
;
}
// everything matches our named curve, return it
return
(
NamedCurve
)
namedCurve
;
}
// no match found
return
null
;
}
// Used by SunJSSE.
public
static
String
getCurveName
(
ECParameterSpec
params
)
{
NamedCurve
curve
=
getNamedCurve
(
params
);
return
(
curve
==
null
)
?
null
:
curve
.
getObjectIdentifier
().
toString
();
}
if
(
paramSpec
instanceof
ECParameterSpec
)
{
namedCurve
=
CurveDB
.
lookup
((
ECParameterSpec
)
paramSpec
);
}
else
if
(
paramSpec
instanceof
ECGenParameterSpec
)
{
String
name
=
((
ECGenParameterSpec
)
paramSpec
).
getName
();
namedCurve
=
CurveDB
.
lookup
(
name
);
}
else
if
(
paramSpec
instanceof
ECKeySizeParameterSpec
)
{
int
keySize
=
((
ECKeySizeParameterSpec
)
paramSpec
).
getKeySize
();
namedCurve
=
CurveDB
.
lookup
(
keySize
);
}
else
{
throw
new
InvalidParameterSpecException
(
"Only ECParameterSpec and ECGenParameterSpec supported"
);
}
// Used by SunPKCS11.
public
static
byte
[]
encodeParameters
(
ECParameterSpec
params
)
{
NamedCurve
curve
=
getNamedCurve
(
params
);
if
(
curve
==
null
)
{
throw
new
RuntimeException
(
"Not a known named curve: "
+
params
);
if
(
namedCurve
==
null
)
{
throw
new
InvalidParameterSpecException
(
"Not a supported curve: "
+
paramSpec
);
}
return
curve
.
getEncoded
();
}
// Used by SunPKCS11.
public
static
ECParameterSpec
decodeParameters
(
byte
[]
params
)
throws
IOException
{
protected
void
engineInit
(
byte
[]
params
)
throws
IOException
{
DerValue
encodedParams
=
new
DerValue
(
params
);
if
(
encodedParams
.
tag
==
DerValue
.
tag_ObjectId
)
{
ObjectIdentifier
oid
=
encodedParams
.
getOID
();
ECParameterSpec
spec
=
NamedCurve
.
getECParameterSpec
(
oid
);
NamedCurve
spec
=
CurveDB
.
lookup
(
oid
.
toString
()
);
if
(
spec
==
null
)
{
throw
new
IOException
(
"Unknown named curve: "
+
oid
);
}
return
spec
;
namedCurve
=
spec
;
return
;
}
throw
new
IOException
(
"Only named ECParameters supported"
);
...
...
@@ -208,7 +154,8 @@ public final class ECParameters extends AlgorithmParametersSpi {
/*
if (encodedParams.tag != DerValue.tag_Sequence) {
throw new IOException("Unsupported EC parameters, tag: " + encodedParams.tag);
throw new IOException("Unsupported EC parameters, tag: " +
encodedParams.tag);
}
encodedParams.data.reset();
...
...
@@ -217,7 +164,8 @@ public final class ECParameters extends AlgorithmParametersSpi {
int version = in.getInteger();
if (version != 1) {
throw new IOException("Unsupported EC parameters version: " + version);
throw new IOException("Unsupported EC parameters version: " +
version);
}
ECField field = parseField(in);
EllipticCurve curve = parseCurve(in, field);
...
...
@@ -242,110 +190,49 @@ public final class ECParameters extends AlgorithmParametersSpi {
*/
}
/*
private static final ObjectIdentifier fieldTypePrime =
ObjectIdentifier.newInternal(new int[] {1, 2, 840, 10045, 1, 1});
private static final ObjectIdentifier fieldTypeChar2 =
ObjectIdentifier.newInternal(new int[] {1, 2, 840, 10045, 1, 2});
private static ECField parseField(DerInputStream in) throws IOException {
DerValue v = in.getDerValue();
ObjectIdentifier oid = v.data.getOID();
if (oid.equals(fieldTypePrime) == false) {
throw new IOException("Only prime fields supported: " + oid);
}
BigInteger fieldSize = v.data.getBigInteger();
return new ECFieldFp(fieldSize);
}
private static EllipticCurve parseCurve(DerInputStream in, ECField field)
protected
void
engineInit
(
byte
[]
params
,
String
decodingMethod
)
throws
IOException
{
DerValue v = in.getDerValue();
byte[] ab = v.data.getOctetString();
byte[] bb = v.data.getOctetString();
return new EllipticCurve(field, new BigInteger(1, ab), new BigInteger(1, bb));
engineInit
(
params
);
}
private static ECPoint parsePoint(DerInputStream in, EllipticCurve curve)
throws IOException {
byte[] data = in.getOctetString();
return decodePoint(data, curve);
}
*/
protected
<
T
extends
AlgorithmParameterSpec
>
T
engineGetParameterSpec
(
Class
<
T
>
spec
)
throws
InvalidParameterSpecException
{
// used by ECPublicKeyImpl and ECPrivateKeyImpl
static
AlgorithmParameters
getAlgorithmParameters
(
ECParameterSpec
spec
)
throws
InvalidKeyException
{
try
{
AlgorithmParameters
params
=
AlgorithmParameters
.
getInstance
(
"EC"
,
"SunEC"
);
params
.
init
(
spec
);
return
params
;
}
catch
(
GeneralSecurityException
e
)
{
throw
new
InvalidKeyException
(
"EC parameters error"
,
e
);
if
(
spec
.
isAssignableFrom
(
ECParameterSpec
.
class
))
{
return
spec
.
cast
(
namedCurve
);
}
}
// AlgorithmParameterSpi methods
// The parameters these AlgorithmParameters object represents.
// Currently, it is always an instance of NamedCurve.
private
ECParameterSpec
paramSpec
;
protected
void
engineInit
(
AlgorithmParameterSpec
paramSpec
)
throws
InvalidParameterSpecException
{
if
(
paramSpec
instanceof
ECParameterSpec
)
{
this
.
paramSpec
=
getNamedCurve
((
ECParameterSpec
)
paramSpec
);
if
(
this
.
paramSpec
==
null
)
{
throw
new
InvalidParameterSpecException
(
"Not a supported named curve: "
+
paramSpec
);
}
}
else
if
(
paramSpec
instanceof
ECGenParameterSpec
)
{
String
name
=
((
ECGenParameterSpec
)
paramSpec
).
getName
();
ECParameterSpec
spec
=
NamedCurve
.
getECParameterSpec
(
name
);
if
(
spec
==
null
)
{
throw
new
InvalidParameterSpecException
(
"Unknown curve: "
+
name
);
}
this
.
paramSpec
=
spec
;
}
else
if
(
paramSpec
==
null
)
{
throw
new
InvalidParameterSpecException
(
"paramSpec must not be null"
);
}
else
{
throw
new
InvalidParameterSpecException
(
"Only ECParameterSpec and ECGenParameterSpec supported"
);
if
(
spec
.
isAssignableFrom
(
ECGenParameterSpec
.
class
))
{
// Ensure the name is the Object ID
String
name
=
namedCurve
.
getObjectId
();
return
spec
.
cast
(
new
ECGenParameterSpec
(
name
));
}
}
protected
void
engineInit
(
byte
[]
params
)
throws
IOException
{
paramSpec
=
decodeParameters
(
params
);
}
protected
void
engineInit
(
byte
[]
params
,
String
decodingMethod
)
throws
IOException
{
engineInit
(
params
);
}
protected
<
T
extends
AlgorithmParameterSpec
>
T
engineGetParameterSpec
(
Class
<
T
>
spec
)
throws
InvalidParameterSpecException
{
if
(
spec
.
isAssignableFrom
(
ECParameterSpec
.
class
))
{
return
spec
.
cast
(
paramSpec
);
}
else
if
(
spec
.
isAssignableFrom
(
ECGenParameterSpec
.
class
))
{
return
spec
.
cast
(
new
ECGenParameterSpec
(
getCurveName
(
paramSpec
)));
}
else
{
throw
new
InvalidParameterSpecException
(
"Only ECParameterSpec and ECGenParameterSpec supported"
);
if
(
spec
.
isAssignableFrom
(
ECKeySizeParameterSpec
.
class
))
{
int
keySize
=
namedCurve
.
getCurve
().
getField
().
getFieldSize
();
return
spec
.
cast
(
new
ECKeySizeParameterSpec
(
keySize
));
}
throw
new
InvalidParameterSpecException
(
"Only ECParameterSpec and ECGenParameterSpec supported"
);
}
protected
byte
[]
engineGetEncoded
()
throws
IOException
{
return
encodeParameters
(
paramSpec
);
return
namedCurve
.
getEncoded
(
);
}
protected
byte
[]
engineGetEncoded
(
String
encodingMethod
)
throws
IOException
{
protected
byte
[]
engineGetEncoded
(
String
encodingMethod
)
throws
IOException
{
return
engineGetEncoded
();
}
protected
String
engineToString
()
{
return
paramSpec
.
toString
();
if
(
namedCurve
==
null
)
{
return
"Not initialized"
;
}
return
namedCurve
.
toString
();
}
}
src/share/classes/sun/security/ec/ECPrivateKeyImpl.java
浏览文件 @
88be1441
/*
* Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2006,
2012,
Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
...
...
@@ -67,18 +67,17 @@ public final class ECPrivateKeyImpl extends PKCS8Key implements ECPrivateKey {
private
ECParameterSpec
params
;
/**
* Construct a key from its encoding. Called by the ECKeyFactory and
* the SunPKCS11 code.
* Construct a key from its encoding. Called by the ECKeyFactory.
*/
public
ECPrivateKeyImpl
(
byte
[]
encoded
)
throws
InvalidKeyException
{
ECPrivateKeyImpl
(
byte
[]
encoded
)
throws
InvalidKeyException
{
decode
(
encoded
);
}
/**
* Construct a key from its components. Used by the
* KeyFactory
and the SunPKCS11 code
.
* KeyFactory.
*/
public
ECPrivateKeyImpl
(
BigInteger
s
,
ECParameterSpec
params
)
ECPrivateKeyImpl
(
BigInteger
s
,
ECParameterSpec
params
)
throws
InvalidKeyException
{
this
.
s
=
s
;
this
.
params
=
params
;
...
...
@@ -88,7 +87,7 @@ public final class ECPrivateKeyImpl extends PKCS8Key implements ECPrivateKey {
try
{
DerOutputStream
out
=
new
DerOutputStream
();
out
.
putInteger
(
1
);
// version 1
byte
[]
privBytes
=
EC
Parameters
.
trimZeroes
(
s
.
toByteArray
());
byte
[]
privBytes
=
EC
Util
.
trimZeroes
(
s
.
toByteArray
());
out
.
putOctetString
(
privBytes
);
DerValue
val
=
new
DerValue
(
DerValue
.
tag_Sequence
,
out
.
toByteArray
());
...
...
src/share/classes/sun/security/ec/ECPublicKeyImpl.java
浏览文件 @
88be1441
...
...
@@ -49,23 +49,23 @@ public final class ECPublicKeyImpl extends X509Key implements ECPublicKey {
/**
* Construct a key from its components. Used by the
* ECKeyFactory
and SunPKCS11
.
* ECKeyFactory.
*/
@SuppressWarnings
(
"deprecation"
)
public
ECPublicKeyImpl
(
ECPoint
w
,
ECParameterSpec
params
)
ECPublicKeyImpl
(
ECPoint
w
,
ECParameterSpec
params
)
throws
InvalidKeyException
{
this
.
w
=
w
;
this
.
params
=
params
;
// generate the encoding
algid
=
new
AlgorithmId
(
AlgorithmId
.
EC_oid
,
ECParameters
.
getAlgorithmParameters
(
params
));
key
=
EC
Parameters
.
encodePoint
(
w
,
params
.
getCurve
());
key
=
EC
Util
.
encodePoint
(
w
,
params
.
getCurve
());
}
/**
* Construct a key from its encoding.
Used by RSAKeyFactory.
* Construct a key from its encoding.
*/
public
ECPublicKeyImpl
(
byte
[]
encoded
)
throws
InvalidKeyException
{
ECPublicKeyImpl
(
byte
[]
encoded
)
throws
InvalidKeyException
{
decode
(
encoded
);
}
...
...
@@ -104,7 +104,7 @@ public final class ECPublicKeyImpl extends X509Key implements ECPublicKey {
try
{
params
=
algParams
.
getParameterSpec
(
ECParameterSpec
.
class
);
w
=
EC
Parameters
.
decodePoint
(
key
,
params
.
getCurve
());
w
=
EC
Util
.
decodePoint
(
key
,
params
.
getCurve
());
}
catch
(
IOException
e
)
{
throw
new
InvalidKeyException
(
"Invalid EC key"
,
e
);
}
catch
(
InvalidParameterSpecException
e
)
{
...
...
src/share/classes/sun/security/ec/NamedCurve.java
浏览文件 @
88be1441
此差异已折叠。
点击以展开。
src/share/classes/sun/security/ec/SunECEntries.java
浏览文件 @
88be1441
...
...
@@ -25,8 +25,11 @@
package
sun.security.ec
;
import
java.util.Collection
;
import
java.util.Map
;
import
java.util.regex.Pattern
;
/**
* Defines the entries of the SunEC provider.
*
...
...
@@ -60,64 +63,33 @@ final class SunECEntries {
map
.
put
(
"AlgorithmParameters.EC ImplementedIn"
,
"Software"
);
map
.
put
(
"AlgorithmParameters.EC SupportedCurves"
,
// A list comprising lists of curve names and object identifiers.
// '[' ( <curve-name> ',' )+ <curve-object-identifier> ']' '|'
// SEC 2 prime curves
"[secp112r1,1.3.132.0.6]|"
+
"[secp112r2,1.3.132.0.7]|"
+
"[secp128r1,1.3.132.0.28]|"
+
"[secp128r2,1.3.132.0.29]|"
+
"[secp160k1,1.3.132.0.9]|"
+
"[secp160r1,1.3.132.0.8]|"
+
"[secp160r2,1.3.132.0.30]|"
+
"[secp192k1,1.3.132.0.31]|"
+
"[secp192r1,NIST P-192,X9.62 prime192v1,1.2.840.10045.3.1.1]|"
+
"[secp224k1,1.3.132.0.32]|"
+
"[secp224r1,NIST P-224,1.3.132.0.33]|"
+
"[secp256k1,1.3.132.0.10]|"
+
"[secp256r1,NIST P-256,X9.62 prime256v1,1.2.840.10045.3.1.7]|"
+
"[secp384r1,NIST P-384,1.3.132.0.34]|"
+
"[secp521r1,NIST P-521,1.3.132.0.35]|"
+
// ANSI X9.62 prime curves
"[X9.62 prime192v2,1.2.840.10045.3.1.2]|"
+
"[X9.62 prime192v3,1.2.840.10045.3.1.3]|"
+
"[X9.62 prime239v1,1.2.840.10045.3.1.4]|"
+
"[X9.62 prime239v2,1.2.840.10045.3.1.5]|"
+
"[X9.62 prime239v3,1.2.840.10045.3.1.6]|"
+
// SEC 2 binary curves
"[sect113r1,1.3.132.0.4]|"
+
"[sect113r2,1.3.132.0.5]|"
+
"[sect131r1,1.3.132.0.22]|"
+
"[sect131r2,1.3.132.0.23]|"
+
"[sect163k1,NIST K-163,1.3.132.0.1]|"
+
"[sect163r1,1.3.132.0.2]|"
+
"[sect163r2,NIST B-163,1.3.132.0.15]|"
+
"[sect193r1,1.3.132.0.24]|"
+
"[sect193r2,1.3.132.0.25]|"
+
"[sect233k1,NIST K-233,1.3.132.0.26]|"
+
"[sect233r1,NIST B-233,1.3.132.0.27]|"
+
"[sect239k1,1.3.132.0.3]|"
+
"[sect283k1,NIST K-283,1.3.132.0.16]|"
+
"[sect283r1,NIST B-283,1.3.132.0.17]|"
+
"[sect409k1,NIST K-409,1.3.132.0.36]|"
+
"[sect409r1,NIST B-409,1.3.132.0.37]|"
+
"[sect571k1,NIST K-571,1.3.132.0.38]|"
+
"[sect571r1,NIST B-571,1.3.132.0.39]|"
+
// ANSI X9.62 binary curves
"[X9.62 c2tnb191v1,1.2.840.10045.3.0.5]|"
+
"[X9.62 c2tnb191v2,1.2.840.10045.3.0.6]|"
+
"[X9.62 c2tnb191v3,1.2.840.10045.3.0.7]|"
+
"[X9.62 c2tnb239v1,1.2.840.10045.3.0.11]|"
+
"[X9.62 c2tnb239v2,1.2.840.10045.3.0.12]|"
+
"[X9.62 c2tnb239v3,1.2.840.10045.3.0.13]|"
+
"[X9.62 c2tnb359v1,1.2.840.10045.3.0.18]|"
+
"[X9.62 c2tnb431r1,1.2.840.10045.3.0.20]"
);
// "AlgorithmParameters.EC SupportedCurves" prop used by unit test
boolean
firstCurve
=
true
;
StringBuilder
names
=
new
StringBuilder
();
Pattern
nameSplitPattern
=
Pattern
.
compile
(
CurveDB
.
SPLIT_PATTERN
);
Collection
<?
extends
NamedCurve
>
supportedCurves
=
CurveDB
.
getSupportedCurves
();
for
(
NamedCurve
namedCurve
:
supportedCurves
)
{
if
(!
firstCurve
)
{
names
.
append
(
"|"
);
}
else
{
firstCurve
=
false
;
}
names
.
append
(
"["
);
String
[]
commonNames
=
nameSplitPattern
.
split
(
namedCurve
.
getName
());
for
(
String
commonName
:
commonNames
)
{
names
.
append
(
commonName
.
trim
());
names
.
append
(
","
);
}
names
.
append
(
namedCurve
.
getObjectId
());
names
.
append
(
"]"
);
}
map
.
put
(
"AlgorithmParameters.EC SupportedCurves"
,
names
.
toString
());
/*
* Register the algorithms below only when the full ECC implementation
...
...
src/share/classes/sun/security/pkcs11/P11ECKeyFactory.java
浏览文件 @
88be1441
...
...
@@ -32,15 +32,12 @@ import java.security.*;
import
java.security.interfaces.*
;
import
java.security.spec.*
;
import
sun.security.ec.ECPublicKeyImpl
;
import
sun.security.ec.ECParameters
;
import
sun.security.ec.NamedCurve
;
import
static
sun
.
security
.
pkcs11
.
TemplateManager
.*;
import
sun.security.pkcs11.wrapper.*
;
import
static
sun
.
security
.
pkcs11
.
wrapper
.
PKCS11Constants
.*;
import
sun.security.util.DerValue
;
import
sun.security.util.ECUtil
;
/**
* EC KeyFactory implemenation.
...
...
@@ -49,46 +46,56 @@ import sun.security.util.DerValue;
* @since 1.6
*/
final
class
P11ECKeyFactory
extends
P11KeyFactory
{
private
static
Provider
sunECprovider
;
private
static
Provider
getSunECProvider
()
{
if
(
sunECprovider
==
null
)
{
sunECprovider
=
Security
.
getProvider
(
"SunEC"
);
if
(
sunECprovider
==
null
)
{
throw
new
RuntimeException
(
"Cannot load SunEC provider"
);
}
}
return
sunECprovider
;
}
P11ECKeyFactory
(
Token
token
,
String
algorithm
)
{
super
(
token
,
algorithm
);
}
static
ECParameterSpec
getECParameterSpec
(
String
name
)
{
return
NamedCurve
.
getECParameterSpec
(
name
);
return
ECUtil
.
getECParameterSpec
(
getSunECProvider
(),
name
);
}
static
ECParameterSpec
getECParameterSpec
(
int
keySize
)
{
return
NamedCurve
.
getECParameterSpec
(
keySize
);
return
ECUtil
.
getECParameterSpec
(
getSunECProvider
(),
keySize
);
}
// Check that spec is a known supported curve and convert it to our
// ECParameterSpec subclass. If not possible, return null.
static
ECParameterSpec
getECParameterSpec
(
ECParameterSpec
spec
)
{
return
EC
Parameters
.
getNamedCurve
(
spec
);
return
EC
Util
.
getECParameterSpec
(
getSunECProvider
(),
spec
);
}
static
ECParameterSpec
decodeParameters
(
byte
[]
params
)
throws
IOException
{
return
EC
Parameters
.
decodeParameters
(
params
);
return
EC
Util
.
getECParameterSpec
(
getSunECProvider
(),
params
);
}
static
byte
[]
encodeParameters
(
ECParameterSpec
params
)
{
return
EC
Parameters
.
encodeParameters
(
params
);
return
EC
Util
.
encodeECParameterSpec
(
getSunECProvider
(),
params
);
}
static
ECPoint
decodePoint
(
byte
[]
encoded
,
EllipticCurve
curve
)
throws
IOException
{
return
EC
Parameters
.
decodePoint
(
encoded
,
curve
);
return
EC
Util
.
decodePoint
(
encoded
,
curve
);
}
// Used by ECDH KeyAgreement
static
byte
[]
getEncodedPublicValue
(
PublicKey
key
)
throws
InvalidKeyException
{
if
(
key
instanceof
ECPublicKeyImpl
)
{
return
((
ECPublicKeyImpl
)
key
).
getEncodedPublicValue
();
}
else
if
(
key
instanceof
ECPublicKey
)
{
if
(
key
instanceof
ECPublicKey
)
{
ECPublicKey
ecKey
=
(
ECPublicKey
)
key
;
ECPoint
w
=
ecKey
.
getW
();
ECParameterSpec
params
=
ecKey
.
getParams
();
return
EC
Parameters
.
encodePoint
(
w
,
params
.
getCurve
());
return
EC
Util
.
encodePoint
(
w
,
params
.
getCurve
());
}
else
{
// should never occur
throw
new
InvalidKeyException
...
...
@@ -107,7 +114,13 @@ final class P11ECKeyFactory extends P11KeyFactory {
}
else
if
(
"X.509"
.
equals
(
key
.
getFormat
()))
{
// let Sun provider parse for us, then recurse
byte
[]
encoded
=
key
.
getEncoded
();
key
=
new
sun
.
security
.
ec
.
ECPublicKeyImpl
(
encoded
);
try
{
key
=
ECUtil
.
decodeX509ECPublicKey
(
encoded
);
}
catch
(
InvalidKeySpecException
ikse
)
{
throw
new
InvalidKeyException
(
ikse
);
}
return
implTranslatePublicKey
(
key
);
}
else
{
throw
new
InvalidKeyException
(
"PublicKey must be instance "
...
...
@@ -130,7 +143,13 @@ final class P11ECKeyFactory extends P11KeyFactory {
}
else
if
(
"PKCS#8"
.
equals
(
key
.
getFormat
()))
{
// let Sun provider parse for us, then recurse
byte
[]
encoded
=
key
.
getEncoded
();
key
=
new
sun
.
security
.
ec
.
ECPrivateKeyImpl
(
encoded
);
try
{
key
=
ECUtil
.
decodePKCS8ECPrivateKey
(
encoded
);
}
catch
(
InvalidKeySpecException
ikse
)
{
throw
new
InvalidKeyException
(
ikse
);
}
return
implTranslatePrivateKey
(
key
);
}
else
{
throw
new
InvalidKeyException
(
"PrivateKey must be instance "
...
...
@@ -148,7 +167,7 @@ final class P11ECKeyFactory extends P11KeyFactory {
if
(
keySpec
instanceof
X509EncodedKeySpec
)
{
try
{
byte
[]
encoded
=
((
X509EncodedKeySpec
)
keySpec
).
getEncoded
();
PublicKey
key
=
new
sun
.
security
.
ec
.
ECPublicKeyImpl
(
encoded
);
PublicKey
key
=
ECUtil
.
decodeX509ECPublicKey
(
encoded
);
return
implTranslatePublicKey
(
key
);
}
catch
(
InvalidKeyException
e
)
{
throw
new
InvalidKeySpecException
...
...
@@ -178,7 +197,7 @@ final class P11ECKeyFactory extends P11KeyFactory {
if
(
keySpec
instanceof
PKCS8EncodedKeySpec
)
{
try
{
byte
[]
encoded
=
((
PKCS8EncodedKeySpec
)
keySpec
).
getEncoded
();
PrivateKey
key
=
new
sun
.
security
.
ec
.
ECPrivateKeyImpl
(
encoded
);
PrivateKey
key
=
ECUtil
.
decodePKCS8ECPrivateKey
(
encoded
);
return
implTranslatePrivateKey
(
key
);
}
catch
(
GeneralSecurityException
e
)
{
throw
new
InvalidKeySpecException
...
...
@@ -201,10 +220,12 @@ final class P11ECKeyFactory extends P11KeyFactory {
}
}
private
PublicKey
generatePublic
(
ECPoint
point
,
ECParameterSpec
params
)
throws
PKCS11Exception
{
byte
[]
encodedParams
=
ECParameters
.
encodeParameters
(
params
);
private
PublicKey
generatePublic
(
ECPoint
point
,
ECParameterSpec
params
)
throws
PKCS11Exception
{
byte
[]
encodedParams
=
ECUtil
.
encodeECParameterSpec
(
getSunECProvider
(),
params
);
byte
[]
encodedPoint
=
EC
Parameters
.
encodePoint
(
point
,
params
.
getCurve
());
EC
Util
.
encodePoint
(
point
,
params
.
getCurve
());
// Check whether the X9.63 encoding of an EC point shall be wrapped
// in an ASN.1 OCTET STRING
...
...
@@ -238,8 +259,10 @@ final class P11ECKeyFactory extends P11KeyFactory {
}
}
private
PrivateKey
generatePrivate
(
BigInteger
s
,
ECParameterSpec
params
)
throws
PKCS11Exception
{
byte
[]
encodedParams
=
ECParameters
.
encodeParameters
(
params
);
private
PrivateKey
generatePrivate
(
BigInteger
s
,
ECParameterSpec
params
)
throws
PKCS11Exception
{
byte
[]
encodedParams
=
ECUtil
.
encodeECParameterSpec
(
getSunECProvider
(),
params
);
CK_ATTRIBUTE
[]
attributes
=
new
CK_ATTRIBUTE
[]
{
new
CK_ATTRIBUTE
(
CKA_CLASS
,
CKO_PRIVATE_KEY
),
new
CK_ATTRIBUTE
(
CKA_KEY_TYPE
,
CKK_EC
),
...
...
@@ -304,7 +327,7 @@ final class P11ECKeyFactory extends P11KeyFactory {
}
KeyFactory
implGetSoftwareFactory
()
throws
GeneralSecurityException
{
return
KeyFactory
.
getInstance
(
"EC"
,
"SunEC"
);
return
KeyFactory
.
getInstance
(
"EC"
,
getSunECProvider
()
);
}
}
src/share/classes/sun/security/pkcs11/P11Key.java
浏览文件 @
88be1441
...
...
@@ -47,6 +47,7 @@ import static sun.security.pkcs11.wrapper.PKCS11Constants.*;
import
sun.security.util.DerValue
;
import
sun.security.util.Length
;
import
sun.security.util.ECUtil
;
/**
* Key implementation classes.
...
...
@@ -984,9 +985,9 @@ abstract class P11Key implements Key, Length {
if
(
encoded
==
null
)
{
fetchValues
();
try
{
Key
key
=
new
sun
.
security
.
ec
.
ECPrivateKeyImpl
(
s
,
params
);
Key
key
=
ECUtil
.
generateECPrivateKey
(
s
,
params
);
encoded
=
key
.
getEncoded
();
}
catch
(
InvalidKeyException
e
)
{
}
catch
(
InvalidKey
Spec
Exception
e
)
{
throw
new
ProviderException
(
e
);
}
}
...
...
@@ -1064,9 +1065,8 @@ abstract class P11Key implements Key, Length {
if
(
encoded
==
null
)
{
fetchValues
();
try
{
Key
key
=
new
sun
.
security
.
ec
.
ECPublicKeyImpl
(
w
,
params
);
encoded
=
key
.
getEncoded
();
}
catch
(
InvalidKeyException
e
)
{
return
ECUtil
.
x509EncodeECPublicKey
(
w
,
params
);
}
catch
(
InvalidKeySpecException
e
)
{
throw
new
ProviderException
(
e
);
}
}
...
...
src/share/classes/sun/security/pkcs11/P11KeyStore.java
浏览文件 @
88be1441
...
...
@@ -65,6 +65,7 @@ import javax.security.auth.callback.UnsupportedCallbackException;
import
sun.security.util.Debug
;
import
sun.security.util.DerValue
;
import
sun.security.util.ECUtil
;
import
sun.security.ec.ECParameters
;
...
...
@@ -1351,7 +1352,8 @@ final class P11KeyStore extends KeyStoreSpi {
token
.
p11
.
C_GetAttributeValue
(
session
.
id
(),
oHandle
,
attrs
);
byte
[]
encodedParams
=
attrs
[
0
].
getByteArray
();
try
{
ECParameterSpec
params
=
ECParameters
.
decodeParameters
(
encodedParams
);
ECParameterSpec
params
=
ECUtil
.
getECParameterSpec
(
null
,
encodedParams
);
keyLength
=
params
.
getCurve
().
getField
().
getFieldSize
();
}
catch
(
IOException
e
)
{
// we do not want to accept key with unsupported parameters
...
...
@@ -1726,7 +1728,8 @@ final class P11KeyStore extends KeyStoreSpi {
idAttrs
[
0
]
=
new
CK_ATTRIBUTE
(
CKA_ID
,
alias
);
}
byte
[]
encodedParams
=
ECParameters
.
encodeParameters
(
ecKey
.
getParams
());
byte
[]
encodedParams
=
ECUtil
.
encodeECParameterSpec
(
null
,
ecKey
.
getParams
());
attrs
=
new
CK_ATTRIBUTE
[]
{
ATTR_TOKEN_TRUE
,
ATTR_CLASS_PKEY
,
...
...
@@ -1901,7 +1904,7 @@ final class P11KeyStore extends KeyStoreSpi {
ECPublicKey
ecPub
=
(
ECPublicKey
)
publicKey
;
ECPoint
point
=
ecPub
.
getW
();
ECParameterSpec
params
=
ecPub
.
getParams
();
byte
[]
encodedPoint
=
EC
Parameters
.
encodePoint
(
point
,
params
.
getCurve
());
byte
[]
encodedPoint
=
EC
Util
.
encodePoint
(
point
,
params
.
getCurve
());
if
(
id
)
{
attrs
[
0
]
=
new
CK_ATTRIBUTE
(
CKA_ID
,
sha1
(
encodedPoint
));
}
...
...
src/share/classes/sun/security/ssl/JsseJce.java
浏览文件 @
88be1441
...
...
@@ -41,8 +41,7 @@ import java.security.Provider;
import
sun.security.jca.Providers
;
import
sun.security.jca.ProviderList
;
import
sun.security.ec.ECParameters
;
import
sun.security.ec.NamedCurve
;
import
sun.security.util.ECUtil
;
import
static
sun
.
security
.
ssl
.
SunJSSE
.
cryptoProvider
;
...
...
@@ -383,20 +382,20 @@ final class JsseJce {
}
static
ECParameterSpec
getECParameterSpec
(
String
namedCurveOid
)
{
return
NamedCurve
.
getECParameterSpec
(
namedCurveOid
);
return
ECUtil
.
getECParameterSpec
(
cryptoProvider
,
namedCurveOid
);
}
static
String
getNamedCurveOid
(
ECParameterSpec
params
)
{
return
EC
Parameters
.
getCurveName
(
params
);
return
EC
Util
.
getCurveName
(
cryptoProvider
,
params
);
}
static
ECPoint
decodePoint
(
byte
[]
encoded
,
EllipticCurve
curve
)
throws
java
.
io
.
IOException
{
return
EC
Parameters
.
decodePoint
(
encoded
,
curve
);
return
EC
Util
.
decodePoint
(
encoded
,
curve
);
}
static
byte
[]
encodePoint
(
ECPoint
point
,
EllipticCurve
curve
)
{
return
EC
Parameters
.
encodePoint
(
point
,
curve
);
return
EC
Util
.
encodePoint
(
point
,
curve
);
}
// In FIPS mode, set thread local providers; otherwise a no-op.
...
...
src/share/classes/sun/security/util/ECKeySizeParameterSpec.java
0 → 100644
浏览文件 @
88be1441
/*
* Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package
sun.security.util
;
import
java.security.spec.AlgorithmParameterSpec
;
import
sun.security.util.ObjectIdentifier
;
/**
* This immutable class is used when randomly generating a key pair and the
* consumer only specifies the length of the key and therefore a curve for that
* key size must be picked from a the list of supported curves using this spec.
*
* @see AlgorithmParameterSpec
* @see ECGenParameterSpec
*/
public
class
ECKeySizeParameterSpec
implements
AlgorithmParameterSpec
{
private
int
keySize
;
/**
* Creates a parameter specification for EC curve
* generation using a standard (or predefined) key size
* <code>keySize</code> in order to generate the corresponding
* (precomputed) elliptic curve.
* <p>
* Note, if the curve of the specified length is not supported,
* <code>AlgorithmParameters.init</code> will throw an exception.
*
* @param keySize the key size of the curve to lookup
*/
public
ECKeySizeParameterSpec
(
int
keySize
)
{
this
.
keySize
=
keySize
;
}
/**
* Returns the key size of this spec.
*
* @return the standard or predefined key size.
*/
public
int
getKeySize
()
{
return
keySize
;
}
}
src/share/classes/sun/security/util/ECUtil.java
0 → 100644
浏览文件 @
88be1441
/*
* Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package
sun.security.util
;
import
java.io.IOException
;
import
java.math.BigInteger
;
import
java.security.*
;
import
java.security.interfaces.*
;
import
java.security.spec.*
;
import
java.util.Arrays
;
import
sun.security.x509.X509Key
;
public
class
ECUtil
{
// Used by SunPKCS11 and SunJSSE.
public
static
ECPoint
decodePoint
(
byte
[]
data
,
EllipticCurve
curve
)
throws
IOException
{
if
((
data
.
length
==
0
)
||
(
data
[
0
]
!=
4
))
{
throw
new
IOException
(
"Only uncompressed point format supported"
);
}
// Per ANSI X9.62, an encoded point is a 1 byte type followed by
// ceiling(log base 2 field-size / 8) bytes of x and the same of y.
int
n
=
(
data
.
length
-
1
)
/
2
;
if
(
n
!=
((
curve
.
getField
().
getFieldSize
()
+
7
)
>>
3
))
{
throw
new
IOException
(
"Point does not match field size"
);
}
byte
[]
xb
=
Arrays
.
copyOfRange
(
data
,
1
,
1
+
n
);
byte
[]
yb
=
Arrays
.
copyOfRange
(
data
,
n
+
1
,
n
+
1
+
n
);
return
new
ECPoint
(
new
BigInteger
(
1
,
xb
),
new
BigInteger
(
1
,
yb
));
}
// Used by SunPKCS11 and SunJSSE.
public
static
byte
[]
encodePoint
(
ECPoint
point
,
EllipticCurve
curve
)
{
// get field size in bytes (rounding up)
int
n
=
(
curve
.
getField
().
getFieldSize
()
+
7
)
>>
3
;
byte
[]
xb
=
trimZeroes
(
point
.
getAffineX
().
toByteArray
());
byte
[]
yb
=
trimZeroes
(
point
.
getAffineY
().
toByteArray
());
if
((
xb
.
length
>
n
)
||
(
yb
.
length
>
n
))
{
throw
new
RuntimeException
(
"Point coordinates do not match field size"
);
}
byte
[]
b
=
new
byte
[
1
+
(
n
<<
1
)];
b
[
0
]
=
4
;
// uncompressed
System
.
arraycopy
(
xb
,
0
,
b
,
n
-
xb
.
length
+
1
,
xb
.
length
);
System
.
arraycopy
(
yb
,
0
,
b
,
b
.
length
-
yb
.
length
,
yb
.
length
);
return
b
;
}
public
static
byte
[]
trimZeroes
(
byte
[]
b
)
{
int
i
=
0
;
while
((
i
<
b
.
length
-
1
)
&&
(
b
[
i
]
==
0
))
{
i
++;
}
if
(
i
==
0
)
{
return
b
;
}
return
Arrays
.
copyOfRange
(
b
,
i
,
b
.
length
);
}
private
static
KeyFactory
getKeyFactory
()
{
try
{
return
KeyFactory
.
getInstance
(
"EC"
,
"SunEC"
);
}
catch
(
NoSuchAlgorithmException
|
NoSuchProviderException
e
)
{
throw
new
RuntimeException
(
e
);
}
}
public
static
ECPublicKey
decodeX509ECPublicKey
(
byte
[]
encoded
)
throws
InvalidKeySpecException
{
KeyFactory
keyFactory
=
getKeyFactory
();
X509EncodedKeySpec
keySpec
=
new
X509EncodedKeySpec
(
encoded
);
return
(
ECPublicKey
)
keyFactory
.
generatePublic
(
keySpec
);
}
public
static
byte
[]
x509EncodeECPublicKey
(
ECPoint
w
,
ECParameterSpec
params
)
throws
InvalidKeySpecException
{
KeyFactory
keyFactory
=
getKeyFactory
();
ECPublicKeySpec
keySpec
=
new
ECPublicKeySpec
(
w
,
params
);
X509Key
key
=
(
X509Key
)
keyFactory
.
generatePublic
(
keySpec
);
return
key
.
getEncoded
();
}
public
static
ECPrivateKey
decodePKCS8ECPrivateKey
(
byte
[]
encoded
)
throws
InvalidKeySpecException
{
KeyFactory
keyFactory
=
getKeyFactory
();
PKCS8EncodedKeySpec
keySpec
=
new
PKCS8EncodedKeySpec
(
encoded
);
return
(
ECPrivateKey
)
keyFactory
.
generatePrivate
(
keySpec
);
}
public
static
ECPrivateKey
generateECPrivateKey
(
BigInteger
s
,
ECParameterSpec
params
)
throws
InvalidKeySpecException
{
KeyFactory
keyFactory
=
getKeyFactory
();
ECPrivateKeySpec
keySpec
=
new
ECPrivateKeySpec
(
s
,
params
);
return
(
ECPrivateKey
)
keyFactory
.
generatePrivate
(
keySpec
);
}
private
static
AlgorithmParameters
getECParameters
(
Provider
p
)
{
try
{
if
(
p
!=
null
)
{
return
AlgorithmParameters
.
getInstance
(
"EC"
,
p
);
}
return
AlgorithmParameters
.
getInstance
(
"EC"
);
}
catch
(
NoSuchAlgorithmException
nsae
)
{
throw
new
RuntimeException
(
nsae
);
}
}
public
static
byte
[]
encodeECParameterSpec
(
Provider
p
,
ECParameterSpec
spec
)
{
AlgorithmParameters
parameters
=
getECParameters
(
p
);
try
{
parameters
.
init
(
spec
);
}
catch
(
InvalidParameterSpecException
ipse
)
{
throw
new
RuntimeException
(
"Not a known named curve: "
+
spec
);
}
try
{
return
parameters
.
getEncoded
();
}
catch
(
IOException
ioe
)
{
// it is a bug if this should happen
throw
new
RuntimeException
(
ioe
);
}
}
public
static
ECParameterSpec
getECParameterSpec
(
Provider
p
,
ECParameterSpec
spec
)
{
AlgorithmParameters
parameters
=
getECParameters
(
p
);
try
{
parameters
.
init
(
spec
);
return
parameters
.
getParameterSpec
(
ECParameterSpec
.
class
);
}
catch
(
InvalidParameterSpecException
ipse
)
{
return
null
;
}
}
public
static
ECParameterSpec
getECParameterSpec
(
Provider
p
,
byte
[]
params
)
throws
IOException
{
AlgorithmParameters
parameters
=
getECParameters
(
p
);
parameters
.
init
(
params
);
try
{
return
parameters
.
getParameterSpec
(
ECParameterSpec
.
class
);
}
catch
(
InvalidParameterSpecException
ipse
)
{
return
null
;
}
}
public
static
ECParameterSpec
getECParameterSpec
(
Provider
p
,
String
name
)
{
AlgorithmParameters
parameters
=
getECParameters
(
p
);
try
{
parameters
.
init
(
new
ECGenParameterSpec
(
name
));
return
parameters
.
getParameterSpec
(
ECParameterSpec
.
class
);
}
catch
(
InvalidParameterSpecException
ipse
)
{
return
null
;
}
}
public
static
ECParameterSpec
getECParameterSpec
(
Provider
p
,
int
keySize
)
{
AlgorithmParameters
parameters
=
getECParameters
(
p
);
try
{
parameters
.
init
(
new
ECKeySizeParameterSpec
(
keySize
));
return
parameters
.
getParameterSpec
(
ECParameterSpec
.
class
);
}
catch
(
InvalidParameterSpecException
ipse
)
{
return
null
;
}
}
public
static
String
getCurveName
(
Provider
p
,
ECParameterSpec
spec
)
{
ECGenParameterSpec
nameSpec
;
AlgorithmParameters
parameters
=
getECParameters
(
p
);
try
{
parameters
.
init
(
spec
);
nameSpec
=
parameters
.
getParameterSpec
(
ECGenParameterSpec
.
class
);
}
catch
(
InvalidParameterSpecException
ipse
)
{
return
null
;
}
if
(
nameSpec
==
null
)
{
return
null
;
}
return
nameSpec
.
getName
();
}
private
ECUtil
()
{}
}
src/share/native/com/sun/java/util/jar/pack/constants.h
浏览文件 @
88be1441
...
...
@@ -133,6 +133,8 @@ enum {
X_ATTR_Deprecated
=
20
,
X_ATTR_RuntimeVisibleAnnotations
=
21
,
X_ATTR_RuntimeInvisibleAnnotations
=
22
,
X_ATTR_RuntimeVisibleTypeAnnotations
=
27
,
X_ATTR_RuntimeInvisibleTypeAnnotations
=
28
,
X_ATTR_OVERFLOW
=
16
,
X_ATTR_LIMIT_NO_FLAGS_HI
=
32
,
X_ATTR_LIMIT_FLAGS_HI
=
63
,
...
...
@@ -146,6 +148,8 @@ enum {
F(X_ATTR_Deprecated,Deprecated) \
F(X_ATTR_RuntimeVisibleAnnotations,RuntimeVisibleAnnotations) \
F(X_ATTR_RuntimeInvisibleAnnotations,RuntimeInvisibleAnnotations) \
F(X_ATTR_RuntimeVisibleTypeAnnotations,RuntimeVisibleTypeAnnotations) \
F(X_ATTR_RuntimeInvisibleTypeAnnotations,RuntimeInvisibleTypeAnnotations) \
/*F(X_ATTR_Synthetic,Synthetic)*/
\
/*(end)*/
#define CLASS_ATTR_DO(F) \
...
...
src/share/native/com/sun/java/util/jar/pack/unpack.cpp
浏览文件 @
88be1441
...
...
@@ -1791,7 +1791,7 @@ unpacker::attr_definitions::parseLayout(const char* lp, band** &res,
switch
(
*
lp
++
)
{
case
'B'
:
case
'H'
:
case
'I'
:
case
'V'
:
// unsigned_int
case
'S'
:
// signed_int
--
lp
;
// reparse
--
lp
;
// reparse
case
'F'
:
lp
=
parseIntLayout
(
lp
,
b
,
EK_INT
);
break
;
...
...
@@ -2037,47 +2037,80 @@ void unpacker::read_attr_defs() {
MDL0
// annotations:
#define MDL1 \
"[NH[(1)]]" \
"[RSHNH[RUH(1)]]"
"[NH[(1)]]"
MDL1
// member_value:
"[TB"
"(66,67,73,83,90)[KIH]"
"(68)[KDH]"
"(70)[KFH]"
"(74)[KJH]"
"(99)[RSH]"
"(101)[RSHRUH]"
"(115)[RUH]"
"(91)[NH[(0)]]"
"(64)["
// nested annotation:
"RSH"
"NH[RUH(0)]"
"]"
"()[]"
#define MDL2 \
"[RSHNH[RUH(1)]]"
MDL2
// element_value:
#define MDL3 \
"[TB" \
"(66,67,73,83,90)[KIH]" \
"(68)[KDH]" \
"(70)[KFH]" \
"(74)[KJH]" \
"(99)[RSH]" \
"(101)[RSHRUH]" \
"(115)[RUH]" \
"(91)[NH[(0)]]" \
"(64)[" \
/* nested annotation: */
\
"RSH" \
"NH[RUH(0)]" \
"]" \
"()[]" \
"]"
MDL3
);
const
char
*
md_layout_P
=
md_layout
;
const
char
*
md_layout_A
=
md_layout
+
strlen
(
MDL0
);
const
char
*
md_layout_V
=
md_layout
+
strlen
(
MDL0
MDL1
);
const
char
*
md_layout_V
=
md_layout
+
strlen
(
MDL0
MDL1
MDL2
);
assert
(
0
==
strncmp
(
&
md_layout_A
[
-
3
],
")]]["
,
4
));
assert
(
0
==
strncmp
(
&
md_layout_V
[
-
3
],
")]]["
,
4
));
const
char
*
type_md_layout
(
"[NH[(1)(2)(3)]]"
// target-type + target_info
"[TB"
"(0,1)[B]"
"(16)[FH]"
"(17,18)[BB]"
"(19,20,21)[]"
"(22)[B]"
"(23)[H]"
"(64,65)[NH[PHOHH]]"
"(66)[H]"
"(67,68,69,70)[PH]"
"(71,72,73,74,75)[PHB]"
"()[]]"
// target-path
"[NB[BB]]"
// annotation + element_value
MDL2
MDL3
);
for
(
i
=
0
;
i
<
ATTR_CONTEXT_LIMIT
;
i
++
)
{
attr_definitions
&
ad
=
attr_defs
[
i
];
ad
.
defineLayout
(
X_ATTR_RuntimeVisibleAnnotations
,
"RuntimeVisibleAnnotations"
,
md_layout_A
);
ad
.
defineLayout
(
X_ATTR_RuntimeInvisibleAnnotations
,
"RuntimeInvisibleAnnotations"
,
md_layout_A
);
if
(
i
!=
ATTR_CONTEXT_METHOD
)
continue
;
ad
.
defineLayout
(
METHOD_ATTR_RuntimeVisibleParameterAnnotations
,
"RuntimeVisibleParameterAnnotations"
,
md_layout_P
);
ad
.
defineLayout
(
METHOD_ATTR_RuntimeInvisibleParameterAnnotations
,
"RuntimeInvisibleParameterAnnotations"
,
md_layout_P
);
ad
.
defineLayout
(
METHOD_ATTR_AnnotationDefault
,
"AnnotationDefault"
,
md_layout_V
);
if
(
i
!=
ATTR_CONTEXT_CODE
)
{
ad
.
defineLayout
(
X_ATTR_RuntimeVisibleAnnotations
,
"RuntimeVisibleAnnotations"
,
md_layout_A
);
ad
.
defineLayout
(
X_ATTR_RuntimeInvisibleAnnotations
,
"RuntimeInvisibleAnnotations"
,
md_layout_A
);
if
(
i
==
ATTR_CONTEXT_METHOD
)
{
ad
.
defineLayout
(
METHOD_ATTR_RuntimeVisibleParameterAnnotations
,
"RuntimeVisibleParameterAnnotations"
,
md_layout_P
);
ad
.
defineLayout
(
METHOD_ATTR_RuntimeInvisibleParameterAnnotations
,
"RuntimeInvisibleParameterAnnotations"
,
md_layout_P
);
ad
.
defineLayout
(
METHOD_ATTR_AnnotationDefault
,
"AnnotationDefault"
,
md_layout_V
);
}
}
ad
.
defineLayout
(
X_ATTR_RuntimeVisibleTypeAnnotations
,
"RuntimeVisibleTypeAnnotations"
,
type_md_layout
);
ad
.
defineLayout
(
X_ATTR_RuntimeInvisibleTypeAnnotations
,
"RuntimeInvisibleTypeAnnotations"
,
type_md_layout
);
}
attr_definition_headers
.
readData
(
attr_definition_count
);
...
...
@@ -2433,6 +2466,7 @@ void unpacker::read_attrs(int attrc, int obj_count) {
ad
.
readBandData
(
X_ATTR_RuntimeVisibleAnnotations
);
ad
.
readBandData
(
X_ATTR_RuntimeInvisibleAnnotations
);
CHECK
;
count
=
ad
.
predefCount
(
CLASS_ATTR_InnerClasses
);
class_InnerClasses_N
.
readData
(
count
);
...
...
@@ -2452,6 +2486,10 @@ void unpacker::read_attrs(int attrc, int obj_count) {
class_ClassFile_version_minor_H
.
readData
(
count
);
class_ClassFile_version_major_H
.
readData
(
count
);
CHECK
;
ad
.
readBandData
(
X_ATTR_RuntimeVisibleTypeAnnotations
);
ad
.
readBandData
(
X_ATTR_RuntimeInvisibleTypeAnnotations
);
CHECK
;
break
;
case
ATTR_CONTEXT_FIELD
:
...
...
@@ -2467,6 +2505,10 @@ void unpacker::read_attrs(int attrc, int obj_count) {
ad
.
readBandData
(
X_ATTR_RuntimeVisibleAnnotations
);
ad
.
readBandData
(
X_ATTR_RuntimeInvisibleAnnotations
);
CHECK
;
ad
.
readBandData
(
X_ATTR_RuntimeVisibleTypeAnnotations
);
ad
.
readBandData
(
X_ATTR_RuntimeInvisibleTypeAnnotations
);
CHECK
;
break
;
case
ATTR_CONTEXT_METHOD
:
...
...
@@ -2497,6 +2539,11 @@ void unpacker::read_attrs(int attrc, int obj_count) {
method_MethodParameters_name_RUN
.
readData
(
count
);
method_MethodParameters_flag_FH
.
readData
(
count
);
CHECK
;
ad
.
readBandData
(
X_ATTR_RuntimeVisibleTypeAnnotations
);
ad
.
readBandData
(
X_ATTR_RuntimeInvisibleTypeAnnotations
);
CHECK
;
break
;
case
ATTR_CONTEXT_CODE
:
...
...
@@ -2566,18 +2613,22 @@ void unpacker::read_attrs(int attrc, int obj_count) {
count
=
ad
.
predefCount
(
CODE_ATTR_LineNumberTable
);
code_LineNumberTable_N
.
readData
(
count
);
CHECK
;
count
=
code_LineNumberTable_N
.
getIntTotal
();
code_LineNumberTable_bci_P
.
readData
(
count
);
code_LineNumberTable_line
.
readData
(
count
);
CHECK
;
count
=
ad
.
predefCount
(
CODE_ATTR_LocalVariableTable
);
code_LocalVariableTable_N
.
readData
(
count
);
CHECK
;
count
=
code_LocalVariableTable_N
.
getIntTotal
();
code_LocalVariableTable_bci_P
.
readData
(
count
);
code_LocalVariableTable_span_O
.
readData
(
count
);
code_LocalVariableTable_name_RU
.
readData
(
count
);
code_LocalVariableTable_type_RS
.
readData
(
count
);
code_LocalVariableTable_slot
.
readData
(
count
);
CHECK
;
count
=
ad
.
predefCount
(
CODE_ATTR_LocalVariableTypeTable
);
code_LocalVariableTypeTable_N
.
readData
(
count
);
...
...
@@ -2587,6 +2638,12 @@ void unpacker::read_attrs(int attrc, int obj_count) {
code_LocalVariableTypeTable_name_RU
.
readData
(
count
);
code_LocalVariableTypeTable_type_RS
.
readData
(
count
);
code_LocalVariableTypeTable_slot
.
readData
(
count
);
CHECK
;
ad
.
readBandData
(
X_ATTR_RuntimeVisibleTypeAnnotations
);
ad
.
readBandData
(
X_ATTR_RuntimeInvisibleTypeAnnotations
);
CHECK
;
break
;
}
...
...
@@ -5151,7 +5208,7 @@ void unpacker::redirect_stdio() {
#ifndef PRODUCT
int
unpacker
::
printcr_if_verbose
(
int
level
,
const
char
*
fmt
...)
{
if
(
verbose
<
level
+
10
)
return
0
;
if
(
verbose
<
level
)
return
0
;
va_list
vl
;
va_start
(
vl
,
fmt
);
char
fmtbuf
[
300
];
...
...
test/ProblemList.txt
浏览文件 @
88be1441
...
...
@@ -214,10 +214,6 @@ sun/misc/URLClassPath/ClassnameCharTest.java generic-all
# 8014719
sun/net/www/http/HttpClient/ProxyTest.java generic-all
# 7150552
sun/net/www/protocol/http/B6299712.java macosx-all
java/net/CookieHandler/CookieManagerTest.java macosx-all
############################################################################
# jdk_io
...
...
test/java/lang/reflect/Proxy/Basic1.java
浏览文件 @
88be1441
...
...
@@ -22,7 +22,7 @@
*/
/* @test
* @bug 4227192
* @bug 4227192
4487672
* @summary This is a basic functional test of the dynamic proxy API (part 1).
* @author Peter Jones
*
...
...
@@ -42,15 +42,15 @@ public class Basic1 {
"\nBasic functional test of dynamic proxy API, part 1\n"
);
try
{
Class
[]
interfaces
=
new
Class
[]
{
Runnable
.
class
,
Observer
.
class
};
Class
<?>
[]
interfaces
=
new
Class
<?>
[]
{
Runnable
.
class
,
Observer
.
class
};
ClassLoader
loader
=
ClassLoader
.
getSystemClassLoader
();
/*
* Generate a proxy class.
*/
Class
proxyClass
=
Proxy
.
getProxyClass
(
loader
,
interfaces
);
Class
<?>
proxyClass
=
Proxy
.
getProxyClass
(
loader
,
interfaces
);
System
.
err
.
println
(
"+ generated proxy class: "
+
proxyClass
);
/*
...
...
@@ -72,19 +72,19 @@ public class Basic1 {
/*
* Verify that it is assignable to the proxy interfaces.
*/
for
(
int
i
=
0
;
i
<
interfaces
.
length
;
i
++
)
{
if
(!
int
erfaces
[
i
]
.
isAssignableFrom
(
proxyClass
))
{
for
(
Class
<?>
intf
:
interfaces
)
{
if
(!
int
f
.
isAssignableFrom
(
proxyClass
))
{
throw
new
RuntimeException
(
"proxy class not assignable to proxy interface "
+
int
erfaces
[
i
]
.
getName
());
int
f
.
getName
());
}
}
/*
* Verify that it has the given permutation of interfaces.
*/
List
l1
=
Arrays
.
asList
(
interfaces
);
List
l2
=
Arrays
.
asList
(
proxyClass
.
getInterfaces
());
List
<
Class
<?>>
l1
=
Arrays
.
asList
(
interfaces
);
List
<
Class
<?>>
l2
=
Arrays
.
asList
(
proxyClass
.
getInterfaces
());
System
.
err
.
println
(
"+ proxy class's interfaces: "
+
l2
);
if
(!
l1
.
equals
(
l2
))
{
throw
new
RuntimeException
(
...
...
@@ -118,14 +118,26 @@ public class Basic1 {
* Verify that it has a constructor that takes an
* InvocationHandler instance.
*/
Constructor
cons
=
proxyClass
.
getConstructor
(
new
Class
[]
{
InvocationHandler
.
class
});
Constructor
<?>
cons
=
proxyClass
.
getConstructor
(
InvocationHandler
.
class
);
/*
* Test constructor with null InvocationHandler
*/
try
{
cons
.
newInstance
(
new
Object
[]
{
null
});
throw
new
RuntimeException
(
"Expected NullPointerException thrown"
);
}
catch
(
InvocationTargetException
e
)
{
Throwable
t
=
e
.
getTargetException
();
if
(!(
t
instanceof
NullPointerException
))
{
throw
t
;
}
}
/*
* Construct a proxy instance.
*/
Handler
handler
=
new
Handler
();
Object
proxy
=
cons
.
newInstance
(
new
Object
[]
{
handler
}
);
Object
proxy
=
cons
.
newInstance
(
handler
);
handler
.
currentProxy
=
proxy
;
/*
...
...
@@ -141,7 +153,7 @@ public class Basic1 {
System
.
err
.
println
(
"\nTEST PASSED"
);
}
catch
(
Exception
e
)
{
}
catch
(
Throwable
e
)
{
System
.
err
.
println
(
"\nTEST FAILED:"
);
e
.
printStackTrace
();
throw
new
RuntimeException
(
"TEST FAILED: "
+
e
.
toString
());
...
...
test/java/net/CookieHandler/CookieManagerTest.java
浏览文件 @
88be1441
...
...
@@ -24,21 +24,25 @@
/*
* @test
* @summary Unit test for java.net.CookieManager
* @bug 6244040
* @library ../../../sun/net/www/httptest/
* @build HttpCallback TestHttpServer ClosedChannelList HttpTransaction
* @bug 6244040 7150552
* @run main/othervm -ea CookieManagerTest
* @author Edward Wang
*/
import
java.net.*
;
import
java.util.*
;
import
java.io.*
;
import
sun.net.www.MessageHeader
;
import
com.sun.net.httpserver.*
;
import
java.io.IOException
;
import
java.net.CookieHandler
;
import
java.net.CookieManager
;
import
java.net.CookiePolicy
;
import
java.net.HttpURLConnection
;
import
java.net.InetAddress
;
import
java.net.InetSocketAddress
;
import
java.net.URL
;
public
class
CookieManagerTest
{
static
CookieHttpTransaction
httpTrans
;
static
TestHttpServer
server
;
static
CookieTransactionHandler
httpTrans
;
static
HttpServer
server
;
public
static
void
main
(
String
[]
args
)
throws
Exception
{
startHttpServer
();
...
...
@@ -49,41 +53,48 @@ public class CookieManagerTest {
}
}
public
static
void
startHttpServer
()
{
try
{
httpTrans
=
new
CookieHttpTransaction
();
server
=
new
TestHttpServer
(
httpTrans
,
1
,
1
,
0
);
}
catch
(
IOException
e
)
{
e
.
printStackTrace
();
}
public
static
void
startHttpServer
()
throws
IOException
{
httpTrans
=
new
CookieTransactionHandler
();
server
=
HttpServer
.
create
(
new
InetSocketAddress
(
0
),
0
);
server
.
createContext
(
"/"
,
httpTrans
);
server
.
start
();
}
public
static
void
makeHttpCall
()
{
public
static
void
makeHttpCall
()
throws
IOException
{
try
{
System
.
out
.
println
(
"http server listen on: "
+
server
.
getLocalPort
());
System
.
out
.
println
(
"http server listenining on: "
+
server
.
getAddress
().
getPort
());
// install CookieManager to use
CookieHandler
.
setDefault
(
new
CookieManager
());
for
(
int
i
=
0
;
i
<
CookieHttpTransaction
.
testCount
;
i
++)
{
System
.
out
.
println
(
"====== CookieManager test "
+
(
i
+
1
)
+
" ======"
);
((
CookieManager
)
CookieHandler
.
getDefault
()).
setCookiePolicy
(
CookieHttpTransaction
.
testPolicies
[
i
]);
((
CookieManager
)
CookieHandler
.
getDefault
()).
getCookieStore
().
removeAll
();
URL
url
=
new
URL
(
"http"
,
InetAddress
.
getLocalHost
().
getHostAddress
(),
server
.
getLocalPort
(),
CookieHttpTransaction
.
testCases
[
i
][
0
].
serverPath
);
for
(
int
i
=
0
;
i
<
CookieTransactionHandler
.
testCount
;
i
++)
{
System
.
out
.
println
(
"====== CookieManager test "
+
(
i
+
1
)
+
" ======"
);
((
CookieManager
)
CookieHandler
.
getDefault
())
.
setCookiePolicy
(
CookieTransactionHandler
.
testPolicies
[
i
]);
((
CookieManager
)
CookieHandler
.
getDefault
())
.
getCookieStore
().
removeAll
();
URL
url
=
new
URL
(
"http"
,
InetAddress
.
getLocalHost
().
getHostAddress
(),
server
.
getAddress
().
getPort
(),
CookieTransactionHandler
.
testCases
[
i
][
0
]
.
serverPath
);
HttpURLConnection
uc
=
(
HttpURLConnection
)
url
.
openConnection
();
uc
.
getResponseCode
();
uc
.
disconnect
();
}
}
catch
(
IOException
e
)
{
e
.
printStackTrace
();
}
finally
{
server
.
terminate
(
);
server
.
stop
(
0
);
}
}
}
class
CookieHttpTransaction
implements
HttpCallback
{
class
CookieTransactionHandler
implements
HttpHandler
{
private
int
testcaseDone
=
0
;
private
int
testDone
=
0
;
public
static
boolean
badRequest
=
false
;
// the main test control logic will also loop exactly this number
// to send http request
...
...
@@ -91,6 +102,47 @@ class CookieHttpTransaction implements HttpCallback {
private
String
localHostAddr
=
"127.0.0.1"
;
@Override
public
void
handle
(
HttpExchange
exchange
)
throws
IOException
{
if
(
testDone
<
testCases
[
testcaseDone
].
length
)
{
// still have other tests to run,
// check the Cookie header and then redirect it
if
(
testDone
>
0
)
checkRequest
(
exchange
.
getRequestHeaders
());
exchange
.
getResponseHeaders
().
add
(
"Location"
,
testCases
[
testcaseDone
][
testDone
].
serverPath
);
exchange
.
getResponseHeaders
()
.
add
(
testCases
[
testcaseDone
][
testDone
].
headerToken
,
testCases
[
testcaseDone
][
testDone
].
cookieToSend
);
exchange
.
sendResponseHeaders
(
302
,
-
1
);
testDone
++;
}
else
{
// the last test of this test case
if
(
testDone
>
0
)
checkRequest
(
exchange
.
getRequestHeaders
());
testcaseDone
++;
testDone
=
0
;
exchange
.
sendResponseHeaders
(
200
,
-
1
);
}
exchange
.
close
();
}
private
void
checkRequest
(
Headers
hdrs
)
{
assert
testDone
>
0
;
String
cookieHeader
=
hdrs
.
getFirst
(
"Cookie"
);
if
(
cookieHeader
!=
null
&&
cookieHeader
.
equalsIgnoreCase
(
testCases
[
testcaseDone
][
testDone
-
1
]
.
cookieToRecv
))
{
System
.
out
.
printf
(
"%15s %s\n"
,
"PASSED:"
,
cookieHeader
);
}
else
{
System
.
out
.
printf
(
"%15s %s\n"
,
"FAILED:"
,
cookieHeader
);
System
.
out
.
printf
(
"%15s %s\n\n"
,
"should be:"
,
testCases
[
testcaseDone
][
testDone
-
1
].
cookieToRecv
);
badRequest
=
true
;
}
}
// test cases
public
static
class
CookieTestCase
{
public
String
headerToken
;
...
...
@@ -106,13 +158,17 @@ class CookieHttpTransaction implements HttpCallback {
}
};
//
// these two must match each other, i.e. testCases.length == testPolicies.length
//
public
static
CookieTestCase
[][]
testCases
=
null
;
// the test cases to run; each test case may contain multiple roundtrips
public
static
CookiePolicy
[]
testPolicies
=
null
;
// indicates what CookiePolicy to use with each test cases
/*
* these two must match each other,
* i.e. testCases.length == testPolicies.length
*/
// the test cases to run; each test case may contain multiple roundtrips
public
static
CookieTestCase
[][]
testCases
=
null
;
// indicates what CookiePolicy to use with each test cases
public
static
CookiePolicy
[]
testPolicies
=
null
;
Cookie
HttpTransaction
()
{
Cookie
TransactionHandler
()
{
testCases
=
new
CookieTestCase
[
testCount
][];
testPolicies
=
new
CookiePolicy
[
testCount
];
...
...
@@ -126,7 +182,9 @@ class CookieHttpTransaction implements HttpCallback {
testPolicies
[
count
]
=
CookiePolicy
.
ACCEPT_ORIGINAL_SERVER
;
testCases
[
count
++]
=
new
CookieTestCase
[]{
new
CookieTestCase
(
"Set-Cookie"
,
"CUSTOMER=WILE:BOB; path=/; expires=Sat, 09-Nov-2030 23:12:40 GMT;"
+
"domain=."
+
localHostAddr
,
"CUSTOMER=WILE:BOB; "
+
"path=/; expires=Sat, 09-Nov-2030 23:12:40 GMT;"
+
"domain=."
+
localHostAddr
,
"CUSTOMER=WILE:BOB"
,
"/"
),
...
...
@@ -172,12 +230,17 @@ class CookieHttpTransaction implements HttpCallback {
),
new
CookieTestCase
(
"Set-Cookie2"
,
"Part_Number=\"Rocket_Launcher_0001\"; Version=\"1\";Path=\"/acme\";"
+
"domain=."
+
localHostAddr
,
"$Version=\"1\"; Customer=\"WILE_E_COYOTE\";$Path=\"/acme\";"
+
"$Domain=\"."
+
localHostAddr
+
"\""
+
"; Part_Number=\"Rocket_Launcher_0001\";$Path=\"/acme\";"
+
"$Domain=\"."
+
localHostAddr
+
"\""
,
"$Version=\"1\"; Customer=\"WILE_E_COYOTE\";$Path=\"/acme\";"
+
"$Domain=\"."
+
localHostAddr
+
"\""
+
"; Part_Number=\"Rocket_Launcher_0001\";$Path=\"/acme\";"
+
"$Domain=\"."
+
localHostAddr
+
"\""
,
"/acme/pickitem"
),
new
CookieTestCase
(
"Set-Cookie2"
,
"Shipping=\"FedEx\"; Version=\"1\"; Path=\"/acme\";"
+
"domain=."
+
localHostAddr
,
"$Version=\"1\"; Customer=\"WILE_E_COYOTE\";$Path=\"/acme\";"
+
"$Domain=\"."
+
localHostAddr
+
"\""
+
"; Part_Number=\"Rocket_Launcher_0001\";$Path=\"/acme\";"
+
"$Domain=\"."
+
localHostAddr
+
"\""
+
"; Shipping=\"FedEx\";$Path=\"/acme\";"
+
"$Domain=\"."
+
localHostAddr
+
"\""
,
"$Version=\"1\"; Customer=\"WILE_E_COYOTE\";$Path=\"/acme\";"
+
"$Domain=\"."
+
localHostAddr
+
"\""
+
"; Part_Number=\"Rocket_Launcher_0001\";$Path=\"/acme\";"
+
"$Domain=\"."
+
localHostAddr
+
"\""
+
"; Shipping=\"FedEx\";$Path=\"/acme\";"
+
"$Domain=\"."
+
localHostAddr
+
"\""
,
"/acme/shipping"
)
};
...
...
@@ -191,8 +254,11 @@ class CookieHttpTransaction implements HttpCallback {
"/acme/ammo"
),
new
CookieTestCase
(
"Set-Cookie2"
,
"Part_Number=\"Riding_Rocket_0023\"; Version=\"1\"; Path=\"/acme/ammo\";"
+
"domain=."
+
localHostAddr
,
"$Version=\"1\"; Part_Number=\"Riding_Rocket_0023\";$Path=\"/acme/ammo\";$Domain=\"."
+
localHostAddr
+
"\""
+
"; Part_Number=\"Rocket_Launcher_0001\";$Path=\"/acme\";"
+
"$Domain=\"."
+
localHostAddr
+
"\""
,
"Part_Number=\"Riding_Rocket_0023\"; Version=\"1\"; Path=\"/acme/ammo\";"
+
"domain=."
+
localHostAddr
,
"$Version=\"1\"; Part_Number=\"Riding_Rocket_0023\";$Path=\"/acme/ammo\";$Domain=\"."
+
localHostAddr
+
"\""
+
"; Part_Number=\"Rocket_Launcher_0001\";$Path=\"/acme\";"
+
"$Domain=\"."
+
localHostAddr
+
"\""
,
"/acme/ammo"
),
new
CookieTestCase
(
""
,
...
...
@@ -228,60 +294,19 @@ class CookieHttpTransaction implements HttpCallback {
),
new
CookieTestCase
(
"Set-Cookie2"
,
"Part_Number=\"Rocket_Launcher_0001\"; Version=\"1\";Path=\"/acme\""
,
"$Version=\"1\"; Customer=\"WILE_E_COYOTE\";$Path=\"/acme\";$Domain=\""
+
localHostAddr
+
"\""
+
"; Part_Number=\"Rocket_Launcher_0001\";$Path=\"/acme\";$Domain=\""
+
localHostAddr
+
"\""
,
"$Version=\"1\"; Customer=\"WILE_E_COYOTE\";$Path=\"/acme\";$Domain=\""
+
localHostAddr
+
"\""
+
"; Part_Number=\"Rocket_Launcher_0001\";$Path=\"/acme\";$Domain=\""
+
localHostAddr
+
"\""
,
"/acme/pickitem"
),
new
CookieTestCase
(
"Set-Cookie2"
,
"Shipping=\"FedEx\"; Version=\"1\"; Path=\"/acme\""
,
"$Version=\"1\"; Customer=\"WILE_E_COYOTE\";$Path=\"/acme\";$Domain=\""
+
localHostAddr
+
"\""
+
"; Part_Number=\"Rocket_Launcher_0001\";$Path=\"/acme\";$Domain=\""
+
localHostAddr
+
"\""
+
"; Shipping=\"FedEx\";$Path=\"/acme\";$Domain=\""
+
localHostAddr
+
"\""
,
"$Version=\"1\"; Customer=\"WILE_E_COYOTE\";$Path=\"/acme\";$Domain=\""
+
localHostAddr
+
"\""
+
"; Part_Number=\"Rocket_Launcher_0001\";$Path=\"/acme\";$Domain=\""
+
localHostAddr
+
"\""
+
"; Shipping=\"FedEx\";$Path=\"/acme\";$Domain=\""
+
localHostAddr
+
"\""
,
"/acme/shipping"
)
};
assert
count
==
testCount
;
}
private
int
testcaseDone
=
0
;
private
int
testDone
=
0
;
/*
* Our http server which is conducted by testCases array
*/
public
void
request
(
HttpTransaction
trans
)
{
try
{
if
(
testDone
<
testCases
[
testcaseDone
].
length
)
{
// still have other tests to run,
// check the Cookie header and then redirect it
if
(
testDone
>
0
)
checkResquest
(
trans
);
trans
.
addResponseHeader
(
"Location"
,
testCases
[
testcaseDone
][
testDone
].
serverPath
);
trans
.
addResponseHeader
(
testCases
[
testcaseDone
][
testDone
].
headerToken
,
testCases
[
testcaseDone
][
testDone
].
cookieToSend
);
testDone
++;
trans
.
sendResponse
(
302
,
"Moved Temporarily"
);
}
else
{
// the last test of this test case
if
(
testDone
>
0
)
checkResquest
(
trans
);
testcaseDone
++;
testDone
=
0
;
trans
.
sendResponse
(
200
,
"OK"
);
}
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
}
private
void
checkResquest
(
HttpTransaction
trans
)
{
String
cookieHeader
=
null
;
assert
testDone
>
0
;
cookieHeader
=
trans
.
getRequestHeader
(
"Cookie"
);
if
(
cookieHeader
!=
null
&&
cookieHeader
.
equalsIgnoreCase
(
testCases
[
testcaseDone
][
testDone
-
1
].
cookieToRecv
))
{
System
.
out
.
printf
(
"%15s %s\n"
,
"PASSED:"
,
cookieHeader
);
}
else
{
System
.
out
.
printf
(
"%15s %s\n"
,
"FAILED:"
,
cookieHeader
);
System
.
out
.
printf
(
"%15s %s\n\n"
,
"should be:"
,
testCases
[
testcaseDone
][
testDone
-
1
].
cookieToRecv
);
badRequest
=
true
;
}
}
}
test/java/util/logging/bundlesearch/IndirectlyLoadABundle.java
浏览文件 @
88be1441
...
...
@@ -23,41 +23,26 @@
import
java.lang.reflect.InvocationTargetException
;
import
java.lang.reflect.Method
;
import
java.net.MalformedURLException
;
import
java.net.URL
;
import
java.net.URLClassLoader
;
import
java.nio.file.Paths
;
import
java.util.logging.Logger
;
/**
* This class is used to ensure that a resource bundle loadable by a classloader
* is on the caller's stack, but not on the classpath or TCCL
to ensure
that
* Logger.getLogger() can
't load the bundle via a stack search
* is on the caller's stack, but not on the classpath or TCCL
. It tests
that
* Logger.getLogger() can
load the bundle via the immediate caller's classloader
*
* @author Jim Gish
*/
public
class
IndirectlyLoadABundle
{
private
final
static
String
rbName
=
"
Stack
SearchableResource"
;
private
final
static
String
rbName
=
"
Caller
SearchableResource"
;
public
boolean
loadAndTest
()
throws
Throwable
{
// Find out where we are running from so we can setup the URLClassLoader URLs
// test.src and test.classes will be set if running in jtreg, but probably
// not otherwise
String
testDir
=
System
.
getProperty
(
"test.src"
,
System
.
getProperty
(
"user.dir"
));
String
testClassesDir
=
System
.
getProperty
(
"test.classes"
,
System
.
getProperty
(
"user.dir"
));
String
sep
=
System
.
getProperty
(
"file.separator"
);
URL
[]
urls
=
new
URL
[
2
];
// Allow for both jtreg and standalone cases here
urls
[
0
]
=
Paths
.
get
(
testDir
,
"resources"
).
toUri
().
toURL
();
urls
[
1
]
=
Paths
.
get
(
testClassesDir
).
toUri
().
toURL
();
System
.
out
.
println
(
"INFO: urls[0] = "
+
urls
[
0
]);
System
.
out
.
println
(
"INFO: urls[1] = "
+
urls
[
1
]);
// Make sure we can find it via the URLClassLoader
URLClassLoader
yetAnotherResourceCL
=
new
URLClassLoader
(
urls
,
null
);
URLClassLoader
yetAnotherResourceCL
=
new
URLClassLoader
(
getURLs
()
,
null
);
if
(!
testForValidResourceSetup
(
yetAnotherResourceCL
))
{
throw
new
Exception
(
"Couldn't directly load bundle "
+
rbName
+
" as expected. Test config problem"
);
...
...
@@ -70,23 +55,109 @@ public class IndirectlyLoadABundle {
+
" able to. Test config problem"
);
}
Class
<?>
loadItUpClazz
=
Class
.
forName
(
"LoadItUp"
,
true
,
yetAnotherResourceCL
);
Class
<?>
loadItUpClazz
=
Class
.
forName
(
"LoadItUp1"
,
true
,
yetAnotherResourceCL
);
ClassLoader
actual
=
loadItUpClazz
.
getClassLoader
();
if
(
actual
!=
yetAnotherResourceCL
)
{
throw
new
Exception
(
"LoadItUp was loaded by an unexpected CL: "
+
actual
);
throw
new
Exception
(
"LoadItUp
1
was loaded by an unexpected CL: "
+
actual
);
}
Object
loadItUp
=
loadItUpClazz
.
newInstance
();
Method
testMethod
=
loadItUpClazz
.
getMethod
(
"test"
,
String
.
class
);
Method
testMethod
=
loadItUpClazz
.
getMethod
(
"getLogger"
,
String
.
class
,
String
.
class
);
try
{
return
(
Logger
)
testMethod
.
invoke
(
loadItUp
,
"NestedLogger1"
,
rbName
)
!=
null
;
}
catch
(
InvocationTargetException
ex
)
{
throw
ex
.
getTargetException
();
}
}
public
boolean
testGetAnonymousLogger
()
throws
Throwable
{
// Test getAnonymousLogger()
URLClassLoader
loadItUpCL
=
new
URLClassLoader
(
getURLs
(),
null
);
Class
<?>
loadItUpClazz
=
Class
.
forName
(
"LoadItUp1"
,
true
,
loadItUpCL
);
ClassLoader
actual
=
loadItUpClazz
.
getClassLoader
();
if
(
actual
!=
loadItUpCL
)
{
throw
new
Exception
(
"LoadItUp1 was loaded by an unexpected CL: "
+
actual
);
}
Object
loadItUpAnon
=
loadItUpClazz
.
newInstance
();
Method
testAnonMethod
=
loadItUpClazz
.
getMethod
(
"getAnonymousLogger"
,
String
.
class
);
try
{
return
(
Boolean
)
testMethod
.
invoke
(
loadItUp
,
rbName
)
;
return
(
Logger
)
testAnonMethod
.
invoke
(
loadItUpAnon
,
rbName
)
!=
null
;
}
catch
(
InvocationTargetException
ex
)
{
throw
ex
.
getTargetException
();
}
}
public
boolean
testGetLoggerGetLoggerWithBundle
()
throws
Throwable
{
// test getLogger("NestedLogger2"); followed by
// getLogger("NestedLogger2", rbName) to see if the bundle is found
//
URL
[]
urls
=
getURLs
();
if
(
getLoggerWithNewCL
(
urls
,
"NestedLogger2"
,
null
))
{
return
getLoggerWithNewCL
(
urls
,
"NestedLogger2"
,
rbName
);
}
else
{
throw
new
Exception
(
"TEST FAILED: first call to getLogger() failed "
+
" in IndirectlyLoadABundle."
+
"testGetLoggerGetLoggerWithBundle"
);
}
}
private
URL
[]
getURLs
()
throws
MalformedURLException
{
// Find out where we are running from so we can setup the URLClassLoader URLs
// test.src and test.classes will be set if running in jtreg, but probably
// not otherwise
String
testDir
=
System
.
getProperty
(
"test.src"
,
System
.
getProperty
(
"user.dir"
));
String
testClassesDir
=
System
.
getProperty
(
"test.classes"
,
System
.
getProperty
(
"user.dir"
));
URL
[]
urls
=
new
URL
[
2
];
// Allow for both jtreg and standalone cases here
urls
[
0
]
=
Paths
.
get
(
testDir
,
"resources"
).
toUri
().
toURL
();
urls
[
1
]
=
Paths
.
get
(
testClassesDir
).
toUri
().
toURL
();
return
urls
;
}
private
boolean
getLoggerWithNewCL
(
URL
[]
urls
,
String
loggerName
,
String
bundleName
)
throws
Throwable
{
Logger
result
=
null
;;
// Test getLogger("foo"); getLogger("foo", "rbName");
// First do the getLogger() call with no bundle name
URLClassLoader
getLoggerCL
=
new
URLClassLoader
(
urls
,
null
);
Class
<?>
loadItUpClazz1
=
Class
.
forName
(
"LoadItUp1"
,
true
,
getLoggerCL
);
ClassLoader
actual
=
loadItUpClazz1
.
getClassLoader
();
if
(
actual
!=
getLoggerCL
)
{
throw
new
Exception
(
"LoadItUp1 was loaded by an unexpected CL: "
+
actual
);
}
Object
loadItUp1
=
loadItUpClazz1
.
newInstance
();
if
(
bundleName
!=
null
)
{
Method
getLoggerMethod
=
loadItUpClazz1
.
getMethod
(
"getLogger"
,
String
.
class
,
String
.
class
);
try
{
result
=
(
Logger
)
getLoggerMethod
.
invoke
(
loadItUp1
,
loggerName
,
bundleName
);
}
catch
(
InvocationTargetException
ex
)
{
throw
ex
.
getTargetException
();
}
}
else
{
Method
getLoggerMethod
=
loadItUpClazz1
.
getMethod
(
"getLogger"
,
String
.
class
);
try
{
result
=
(
Logger
)
getLoggerMethod
.
invoke
(
loadItUp1
,
loggerName
);
}
catch
(
InvocationTargetException
ex
)
{
throw
ex
.
getTargetException
();
}
}
return
result
!=
null
;
}
private
boolean
testForValidResourceSetup
(
ClassLoader
cl
)
{
// First make sure the test environment is setup properly and the bundle
actually
// exists
// First make sure the test environment is setup properly and the bundle
//
actually
exists
return
ResourceBundleSearchTest
.
isOnClassPath
(
rbName
,
cl
);
}
}
test/java/util/logging/bundlesearch/LoadItUp1.java
0 → 100644
浏览文件 @
88be1441
/*
* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
import
java.util.logging.Logger
;
/*
* This class is loaded onto the call stack when the getLogger methods are
* called and then the classes classloader can be used to find a bundle in
* the same directory as the class. However, Logger is not allowed
* to find the bundle by looking up the stack for this classloader.
* We verify that this cannot happen.
*
* @author Jim Gish
*/
public
class
LoadItUp1
{
public
Logger
getAnonymousLogger
(
String
rbName
)
throws
Exception
{
// we should not be able to find the resource in this directory via
// getLogger calls. The only way that would be possible given this setup
// is that if Logger.getLogger searched up the call stack
return
Logger
.
getAnonymousLogger
(
rbName
);
}
public
Logger
getLogger
(
String
loggerName
)
{
return
Logger
.
getLogger
(
loggerName
);
}
public
Logger
getLogger
(
String
loggerName
,
String
bundleName
)
{
return
Logger
.
getLogger
(
loggerName
,
bundleName
);
}
}
test/java/util/logging/bundlesearch/LoadItUp.java
→
test/java/util/logging/bundlesearch/LoadItUp
2
.java
浏览文件 @
88be1441
...
...
@@ -24,15 +24,15 @@ import java.util.MissingResourceException;
import
java.util.logging.Logger
;
/*
* This class is loaded onto the call stack
when the test method is called
*
and then its classloader can be used to find a property bundle in the sam
e
*
directory as the class. However, Logger is not allowed
*
to find the bundle by looking up the stack for this classloader.
*
We verify that this cannot happen
.
* This class is loaded onto the call stack
by LoadItUp2Invoker from a separate
*
classloader. LoadItUp2Invoker was loaded by a class loader that does hav
e
*
access to the bundle, but the class loader used to load this class does not.
*
Thus the logging code should not be able to see the resource bundle unless
*
it has more than a single level stack crawl, which is not allowed
.
*
* @author Jim Gish
*/
public
class
LoadItUp
{
public
class
LoadItUp
2
{
private
final
static
boolean
DEBUG
=
false
;
...
...
@@ -46,16 +46,16 @@ public class LoadItUp {
private
boolean
lookupBundle
(
String
rbName
)
{
// See if Logger.getLogger can find the resource in this directory
try
{
Logger
aLogger
=
Logger
.
getLogger
(
"NestedLogger"
,
rbName
);
Logger
aLogger
=
Logger
.
getLogger
(
"NestedLogger
2
"
,
rbName
);
}
catch
(
MissingResourceException
re
)
{
if
(
DEBUG
)
{
System
.
out
.
println
(
"As expected, LoadItUp.lookupBundle() did not find the bundle "
"As expected, LoadItUp
2
.lookupBundle() did not find the bundle "
+
rbName
);
}
return
false
;
}
System
.
out
.
println
(
"FAILED: LoadItUp.lookupBundle() found the bundle "
System
.
out
.
println
(
"FAILED: LoadItUp
2
.lookupBundle() found the bundle "
+
rbName
+
" using a stack search."
);
return
true
;
}
...
...
test/java/util/logging/bundlesearch/LoadItUp2Invoker.java
0 → 100644
浏览文件 @
88be1441
/*
* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
import
java.lang.reflect.InvocationTargetException
;
import
java.lang.reflect.Method
;
import
java.net.URL
;
import
java.net.URLClassLoader
;
/**
* This class is loaded by a class loader that can see the resource. It creates
* a new classloader for LoadItUp2 which cannot see the resource. So, 2 levels
* up the call chain we have a class/classloader that can see the resource, but
* 1 level up the class/classloader cannot.
*
* @author Jim Gish
*/
public
class
LoadItUp2Invoker
{
private
URLClassLoader
cl
;
private
String
rbName
;
private
Object
loadItUp2
;
private
Method
testMethod
;
public
void
setup
(
URL
[]
urls
,
String
rbName
)
throws
ReflectiveOperationException
{
this
.
cl
=
new
URLClassLoader
(
urls
,
null
);
this
.
rbName
=
rbName
;
// Using this new classloader, load the actual test class
// which is now two levels removed from the original caller
Class
<?>
loadItUp2Clazz
=
Class
.
forName
(
"LoadItUp2"
,
true
,
cl
);
this
.
loadItUp2
=
loadItUp2Clazz
.
newInstance
();
this
.
testMethod
=
loadItUp2Clazz
.
getMethod
(
"test"
,
String
.
class
);
}
public
Boolean
test
()
throws
Throwable
{
try
{
return
(
Boolean
)
testMethod
.
invoke
(
loadItUp2
,
rbName
);
}
catch
(
InvocationTargetException
ex
)
{
throw
ex
.
getTargetException
();
}
}
}
test/java/util/logging/bundlesearch/ResourceBundleSearchTest.java
浏览文件 @
88be1441
...
...
@@ -23,11 +23,11 @@
/*
* @test
* @bug 8002070
* @bug 8002070
8013382
* @summary Remove the stack search for a resource bundle Logger to use
* @author Jim Gish
* @build ResourceBundleSearchTest IndirectlyLoadABundle LoadItUp
* @run main ResourceBundleSearchTest
* @build ResourceBundleSearchTest IndirectlyLoadABundle LoadItUp
1 LoadItUp2 TwiceIndirectlyLoadABundle LoadItUp2Invoker
* @run main
/othervm
ResourceBundleSearchTest
*/
import
java.net.URL
;
import
java.net.URLClassLoader
;
...
...
@@ -39,6 +39,12 @@ import java.util.MissingResourceException;
import
java.util.ResourceBundle
;
import
java.util.logging.Logger
;
/**
* This class tests various scenarios of loading resource bundles from
* java.util.logging. Since jtreg uses the logging system, it is necessary to
* run these tests using othervm mode to ensure no interference from logging
* initialization by jtreg
*/
public
class
ResourceBundleSearchTest
{
private
final
static
boolean
DEBUG
=
false
;
...
...
@@ -60,15 +66,11 @@ public class ResourceBundleSearchTest {
// ensure we are using en as the default Locale so we can find the resource
Locale
.
setDefault
(
Locale
.
ENGLISH
);
String
testClasses
=
System
.
getProperty
(
"test.classes"
);
System
.
out
.
println
(
"test.classes = "
+
testClasses
);
ClassLoader
myClassLoader
=
ClassLoader
.
getSystemClassLoader
();
// Find out where we are running from so we can setup the URLClassLoader URL
String
userDir
=
System
.
getProperty
(
"user.dir"
);
String
testDir
=
System
.
getProperty
(
"test.src"
,
userDir
);
String
sep
=
System
.
getProperty
(
"file.separator"
);
URL
[]
urls
=
new
URL
[
1
];
...
...
@@ -77,30 +79,41 @@ public class ResourceBundleSearchTest {
// Test 1 - can we find a Logger bundle from doing a stack search?
// We shouldn't be able to
assertFalse
(
testGetBundleFromStackSearch
(),
"testGetBundleFromStackSearch"
);
assertFalse
(
testGetBundleFromStackSearch
(),
"
1-
testGetBundleFromStackSearch"
);
// Test 2 - can we find a Logger bundle off of the Thread context class
// loader? We should be able to.
assertTrue
(
testGetBundleFromTCCL
(
TCCL_TEST_BUNDLE
,
rbClassLoader
),
"testGetBundleFromTCCL"
);
assertTrue
(
testGetBundleFromTCCL
(
TCCL_TEST_BUNDLE
,
rbClassLoader
),
"2-testGetBundleFromTCCL"
);
// Test 3 - Can we find a Logger bundle from the classpath? We should be
// able to, but ....
// We check to see if the bundle is on the classpath or not so that this
// will work standalone. In the case of jtreg/samevm,
// the resource bundles are not on the classpath. Running standalone
// (or othervm), they are
// able to. We'll first check to make sure the setup is correct and
// it actually is on the classpath before checking whether logging
// can see it there.
if
(
isOnClassPath
(
PROP_RB_NAME
,
myClassLoader
))
{
debug
(
"We should be able to see "
+
PROP_RB_NAME
+
" on the classpath"
);
assertTrue
(
testGetBundleFromSystemClassLoader
(
PROP_RB_NAME
),
"
testGetBundleFromSystemClassLoader"
);
"3-
testGetBundleFromSystemClassLoader"
);
}
else
{
debug
(
"We should not be able to see "
+
PROP_RB_NAME
+
" on the classpath"
);
assertFalse
(
testGetBundleFromSystemClassLoader
(
PROP_RB_NAME
),
"testGetBundleFromSystemClassLoader"
);
throw
new
Exception
(
"TEST SETUP FAILURE: Cannot see "
+
PROP_RB_NAME
+
" on the classpath"
);
}
// Test 4 - we should be able to find a bundle from the caller's
// classloader, but only one level up.
assertTrue
(
testGetBundleFromCallersClassLoader
(),
"4-testGetBundleFromCallersClassLoader"
);
// Test 5 - this ensures that getAnonymousLogger(String rbName)
// can find the bundle from the caller's classloader
assertTrue
(
testGetAnonymousLogger
(),
"5-testGetAnonymousLogger"
);
// Test 6 - first call getLogger("myLogger").
// Then call getLogger("myLogger","bundleName") from a different ClassLoader
// Make sure we find the bundle
assertTrue
(
testGetBundleFromSecondCallersClassLoader
(),
"6-testGetBundleFromSecondCallersClassLoader"
);
report
();
}
...
...
@@ -112,7 +125,7 @@ public class ResourceBundleSearchTest {
System
.
out
.
println
(
msg
);
}
throw
new
Exception
(
numFail
+
" out of "
+
(
numPass
+
numFail
)
+
" tests failed."
);
+
" tests failed."
);
}
}
...
...
@@ -122,7 +135,7 @@ public class ResourceBundleSearchTest {
}
else
{
numFail
++;
System
.
out
.
println
(
"FAILED: "
+
testName
+
" was supposed to return true but did NOT!"
);
+
" was supposed to return true but did NOT!"
);
}
}
...
...
@@ -132,13 +145,20 @@ public class ResourceBundleSearchTest {
}
else
{
numFail
++;
System
.
out
.
println
(
"FAILED: "
+
testName
+
" was supposed to return false but did NOT!"
);
+
" was supposed to return false but did NOT!"
);
}
}
public
boolean
testGetBundleFromStackSearch
()
throws
Throwable
{
// This should fail. This was the old functionality to search up the
// caller's call stack
TwiceIndirectlyLoadABundle
indirectLoader
=
new
TwiceIndirectlyLoadABundle
();
return
indirectLoader
.
loadAndTest
();
}
public
boolean
testGetBundleFromCallersClassLoader
()
throws
Throwable
{
// This should pass. This exercises getting the bundle using the
// class loader of the caller (one level up)
IndirectlyLoadABundle
indirectLoader
=
new
IndirectlyLoadABundle
();
return
indirectLoader
.
loadAndTest
();
}
...
...
@@ -193,14 +213,29 @@ public class ResourceBundleSearchTest {
bundleName
);
}
catch
(
MissingResourceException
re
)
{
msgs
.
add
(
"INFO: testGetBundleFromSystemClassLoader() did not find bundle "
+
bundleName
);
+
bundleName
);
return
false
;
}
msgs
.
add
(
"INFO: testGetBundleFromSystemClassLoader() found the bundle "
+
bundleName
);
+
bundleName
);
return
true
;
}
private
boolean
testGetAnonymousLogger
()
throws
Throwable
{
// This should pass. This exercises getting the bundle using the
// class loader of the caller (one level up) when calling
// Logger.getAnonymousLogger(String rbName)
IndirectlyLoadABundle
indirectLoader
=
new
IndirectlyLoadABundle
();
return
indirectLoader
.
testGetAnonymousLogger
();
}
private
boolean
testGetBundleFromSecondCallersClassLoader
()
throws
Throwable
{
// This should pass. This exercises getting the bundle using the
// class loader of the caller (one level up)
IndirectlyLoadABundle
indirectLoader
=
new
IndirectlyLoadABundle
();
return
indirectLoader
.
testGetLoggerGetLoggerWithBundle
();
}
public
static
class
LoggingThread
extends
Thread
{
boolean
foundBundle
=
false
;
...
...
@@ -227,13 +262,13 @@ public class ResourceBundleSearchTest {
// this should succeed if the bundle is on the system classpath.
try
{
Logger
aLogger
=
Logger
.
getLogger
(
ResourceBundleSearchTest
.
newLoggerName
(),
bundleName
);
msg
=
"INFO: Logging
Runnable
() found the bundle "
+
bundleName
+
(
setTCCL
?
" with "
:
" without "
)
+
"setting the TCCL"
;
bundleName
);
msg
=
"INFO: Logging
Thread.run
() found the bundle "
+
bundleName
+
(
setTCCL
?
" with "
:
" without "
)
+
"setting the TCCL"
;
foundBundle
=
true
;
}
catch
(
MissingResourceException
re
)
{
msg
=
"INFO: Logging
Runnable
() did not find the bundle "
+
bundleName
+
(
setTCCL
?
" with "
:
" without "
)
+
"setting the TCCL"
;
msg
=
"INFO: Logging
Thread.run
() did not find the bundle "
+
bundleName
+
(
setTCCL
?
" with "
:
" without "
)
+
"setting the TCCL"
;
foundBundle
=
false
;
}
}
catch
(
Throwable
e
)
{
...
...
test/java/util/logging/bundlesearch/TwiceIndirectlyLoadABundle.java
0 → 100644
浏览文件 @
88be1441
/*
* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
import
java.lang.reflect.InvocationTargetException
;
import
java.lang.reflect.Method
;
import
java.net.URL
;
import
java.net.URLClassLoader
;
import
java.nio.file.Paths
;
/**
* This class constructs a scenario where a bundle is accessible on the call
* stack two levels up from the call to getLogger(), but not on the immediate
* caller. This tests that getLogger() isn't doing a stack crawl more than one
* level up to find a bundle.
*
* @author Jim Gish
*/
public
class
TwiceIndirectlyLoadABundle
{
private
final
static
String
rbName
=
"StackSearchableResource"
;
public
boolean
loadAndTest
()
throws
Throwable
{
// Find out where we are running from so we can setup the URLClassLoader URLs
// test.src and test.classes will be set if running in jtreg, but probably
// not otherwise
String
testDir
=
System
.
getProperty
(
"test.src"
,
System
.
getProperty
(
"user.dir"
));
String
testClassesDir
=
System
.
getProperty
(
"test.classes"
,
System
.
getProperty
(
"user.dir"
));
URL
[]
urls
=
new
URL
[
2
];
// Allow for both jtreg and standalone cases here
// Unlike the 1-level test where we can get the bundle from the caller's
// class loader, for this one we don't want to expose the resource directory
// to the next class. That way we're invoking the LoadItUp2Invoker class
// from this class that does have access to the resources (two levels
// up the call stack), but the Invoker itself won't have access to resource
urls
[
0
]
=
Paths
.
get
(
testDir
,
"resources"
).
toUri
().
toURL
();
urls
[
1
]
=
Paths
.
get
(
testClassesDir
).
toUri
().
toURL
();
// Make sure we can find it via the URLClassLoader
URLClassLoader
yetAnotherResourceCL
=
new
URLClassLoader
(
urls
,
null
);
Class
<?>
loadItUp2InvokerClazz
=
Class
.
forName
(
"LoadItUp2Invoker"
,
true
,
yetAnotherResourceCL
);
ClassLoader
actual
=
loadItUp2InvokerClazz
.
getClassLoader
();
if
(
actual
!=
yetAnotherResourceCL
)
{
throw
new
Exception
(
"LoadItUp2Invoker was loaded by an unexpected CL: "
+
actual
);
}
Object
loadItUp2Invoker
=
loadItUp2InvokerClazz
.
newInstance
();
Method
setupMethod
=
loadItUp2InvokerClazz
.
getMethod
(
"setup"
,
urls
.
getClass
(),
String
.
class
);
try
{
// For the next class loader we create, we want to leave off
// the resources. That way loadItUp2Invoker will have access to
// them, but the next class won't.
URL
[]
noResourceUrl
=
new
URL
[
1
];
noResourceUrl
[
0
]
=
urls
[
1
];
// from above -- just the test classes
setupMethod
.
invoke
(
loadItUp2Invoker
,
noResourceUrl
,
rbName
);
}
catch
(
InvocationTargetException
ex
)
{
throw
ex
.
getTargetException
();
}
Method
testMethod
=
loadItUp2InvokerClazz
.
getMethod
(
"test"
);
try
{
return
(
Boolean
)
testMethod
.
invoke
(
loadItUp2Invoker
);
}
catch
(
InvocationTargetException
ex
)
{
throw
ex
.
getTargetException
();
}
}
}
test/java/util/logging/bundlesearch/resources/CallerSearchableResource_en.properties
0 → 100644
浏览文件 @
88be1441
#
# Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation.
#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
#
sample1
=
translation #4 for sample1
sample2
=
translation #4 for sample2
supports-test
=
ResourceBundleSearchTest
test/javax/xml/jaxp/PrecisionDecimalDV/XPrecisionDecimalToString.java
0 → 100644
浏览文件 @
88be1441
此差异已折叠。
点击以展开。
test/sun/net/www/protocol/http/B6299712.java
浏览文件 @
88be1441
此差异已折叠。
点击以展开。
test/sun/security/pkcs11/ec/TestCurves.java
浏览文件 @
88be1441
此差异已折叠。
点击以展开。
test/sun/security/pkcs11/ec/TestECDH2.java
浏览文件 @
88be1441
...
...
@@ -41,7 +41,7 @@ import java.security.spec.*;
import
java.security.interfaces.*
;
import
javax.crypto.*
;
import
sun.security.
ec.NamedCurve
;
import
sun.security.
util.ECUtil
;
public
class
TestECDH2
extends
PKCS11Test
{
...
...
@@ -79,8 +79,8 @@ public class TestECDH2 extends PKCS11Test {
}
private
KeyPair
genECKeyPair
(
String
curvName
,
String
privD
,
String
pubX
,
String
pubY
)
throws
Exception
{
ECParameterSpec
ecParams
=
NamedCurve
.
getECParameterSpec
(
curvName
);
String
pubY
,
Provider
p
)
throws
Exception
{
ECParameterSpec
ecParams
=
ECUtil
.
getECParameterSpec
(
p
,
curvName
);
ECPrivateKeySpec
privKeySpec
=
new
ECPrivateKeySpec
(
new
BigInteger
(
privD
,
16
),
ecParams
);
ECPublicKeySpec
pubKeySpec
=
...
...
@@ -112,12 +112,14 @@ public class TestECDH2 extends PKCS11Test {
System
.
out
.
println
(
"Testing against NIST P-256"
);
long
start
=
System
.
currentTimeMillis
();
KeyPair
kp256A
=
genECKeyPair
(
"secp256r1"
,
privD256
,
pubX256
,
pubY256
);
KeyPair
kp256A
=
genECKeyPair
(
"secp256r1"
,
privD256
,
pubX256
,
pubY256
,
provider
);
KeyPair
kp256B
=
genECKeyPair
(
"secp256r1"
);
testKeyAgreement
(
kp256A
,
kp256B
,
provider
);
System
.
out
.
println
(
"Testing against NIST P-384"
);
KeyPair
kp384A
=
genECKeyPair
(
"secp384r1"
,
privD384
,
pubX384
,
pubY384
);
KeyPair
kp384A
=
genECKeyPair
(
"secp384r1"
,
privD384
,
pubX384
,
pubY384
,
provider
);
KeyPair
kp384B
=
genECKeyPair
(
"secp384r1"
);
testKeyAgreement
(
kp384A
,
kp384B
,
provider
);
...
...
test/sun/security/pkcs11/ec/TestECDSA2.java
浏览文件 @
88be1441
此差异已折叠。
点击以展开。
test/tools/pack200/AttributeTests.java
浏览文件 @
88be1441
...
...
@@ -21,12 +21,9 @@
* questions.
*/
import
java.io.File
;
import
java.nio.charset.Charset
;
import
java.nio.file.Files
;
import
java.util.ArrayList
;
import
java.util.Arrays
;
import
java.util.List
;
import
static
java
.
nio
.
file
.
StandardOpenOption
.*;
/*
* @test
* @bug 6746111 8005252 8008262
...
...
@@ -58,8 +55,7 @@ public class AttributeTests {
scratch
.
add
(
"}"
);
File
cwd
=
new
File
(
"."
);
File
javaFile
=
new
File
(
cwd
,
javaFileName
);
Files
.
write
(
javaFile
.
toPath
(),
scratch
,
Charset
.
defaultCharset
(),
CREATE
,
TRUNCATE_EXISTING
);
Utils
.
createFile
(
javaFile
,
scratch
);
Utils
.
compiler
(
javaFile
.
getName
(),
"-parameters"
);
...
...
test/tools/pack200/BandIntegrity.java
0 → 100644
浏览文件 @
88be1441
此差异已折叠。
点击以展开。
test/tools/pack200/InstructionTests.java
浏览文件 @
88be1441
此差异已折叠。
点击以展开。
test/tools/pack200/Utils.java
浏览文件 @
88be1441
此差异已折叠。
点击以展开。
test/tools/pack200/pack200-verifier/src/xmlkit/ClassReader.java
浏览文件 @
88be1441
此差异已折叠。
点击以展开。
test/tools/pack200/typeannos/Lambda.java
0 → 100644
浏览文件 @
88be1441
此差异已折叠。
点击以展开。
test/tools/pack200/typeannos/Readme.txt
0 → 100644
浏览文件 @
88be1441
此差异已折叠。
点击以展开。
test/tools/pack200/typeannos/TargetTypes.java
0 → 100644
浏览文件 @
88be1441
此差异已折叠。
点击以展开。
test/tools/pack200/typeannos/TestTypeAnnotations.java
0 → 100644
浏览文件 @
88be1441
此差异已折叠。
点击以展开。
test/tools/pack200/typeannos/TypeUseTarget.java
0 → 100644
浏览文件 @
88be1441
此差异已折叠。
点击以展开。
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录