Merge
This commit is contained in:
commit
e9facbae15
@ -220,3 +220,4 @@ cb51fb4789ac0b8be4056482077ddfb8f3bd3805 jdk8-b91
|
||||
c156084add486f941c12d886a0b1b2854795d557 jdk8-b96
|
||||
a1c1e8bf71f354f3aec0214cf13d6668811e021d jdk8-b97
|
||||
0d0c983a817bbe8518a5ff201306334a8de267f2 jdk8-b98
|
||||
59dc9da813794c924a0383c2a6241af94defdfed jdk8-b99
|
||||
|
@ -220,3 +220,4 @@ c8286839d0df04aba819ec4bef12b86babccf30e jdk8-b90
|
||||
3357c2776431d51a8de326a85e0f41420e40774f jdk8-b96
|
||||
469995a8e97424f450c880606d689bf345277b19 jdk8-b97
|
||||
3370fb6146e47a6cc05a213fc213e12fc0a38d07 jdk8-b98
|
||||
3f67804ab61303782df57e54989ef5e0e4629beb jdk8-b99
|
||||
|
@ -359,3 +359,5 @@ d197d377ab2e016d024e8c86cb06a57bd7eae590 jdk8-b97
|
||||
c9dd82da51ed34a28f7c6b3245163ee962e94572 hs25-b40
|
||||
30b5b75c42ac5174b640fbef8aa87527668e8400 jdk8-b98
|
||||
2b9946e10587f74ef75ae8145bea484df4a2738b hs25-b41
|
||||
81b6cb70717c66375846b78bb174594ec3aa998e jdk8-b99
|
||||
9f71e36a471ae4a668e08827d33035963ed10c08 hs25-b42
|
||||
|
@ -35,7 +35,7 @@ HOTSPOT_VM_COPYRIGHT=Copyright 2013
|
||||
|
||||
HS_MAJOR_VER=25
|
||||
HS_MINOR_VER=0
|
||||
HS_BUILD_NUMBER=41
|
||||
HS_BUILD_NUMBER=42
|
||||
|
||||
JDK_MAJOR_VER=1
|
||||
JDK_MINOR_VER=8
|
||||
|
@ -46,6 +46,7 @@ ifeq ($(findstring true, $(JVM_VARIANT_ZERO) $(JVM_VARIANT_ZEROSHARK)), true)
|
||||
include $(MAKEFILES_DIR)/zeroshark.make
|
||||
else
|
||||
include $(MAKEFILES_DIR)/$(BUILDARCH).make
|
||||
-include $(HS_ALT_MAKE)/$(Platform_os_family)/makefiles/$(BUILDARCH).make
|
||||
endif
|
||||
|
||||
# set VPATH so make knows where to look for source files
|
||||
@ -380,4 +381,4 @@ build: $(LIBJVM) $(LAUNCHER) $(LIBJSIG) $(LIBJVM_DB) $(BUILDLIBSAPROC) dtraceChe
|
||||
|
||||
install: install_jvm install_jsig install_saproc
|
||||
|
||||
.PHONY: default build install install_jvm
|
||||
.PHONY: default build install install_jvm $(HS_ALT_MAKE)/$(Platform_os_family)/makefiles/$(BUILDARCH).make
|
||||
|
@ -410,6 +410,51 @@ class StubGenerator: public StubCodeGenerator {
|
||||
return start;
|
||||
}
|
||||
|
||||
// Safefetch stubs.
|
||||
void generate_safefetch(const char* name, int size, address* entry,
|
||||
address* fault_pc, address* continuation_pc) {
|
||||
// safefetch signatures:
|
||||
// int SafeFetch32(int* adr, int errValue);
|
||||
// intptr_t SafeFetchN (intptr_t* adr, intptr_t errValue);
|
||||
//
|
||||
// arguments:
|
||||
// o0 = adr
|
||||
// o1 = errValue
|
||||
//
|
||||
// result:
|
||||
// o0 = *adr or errValue
|
||||
|
||||
StubCodeMark mark(this, "StubRoutines", name);
|
||||
|
||||
// Entry point, pc or function descriptor.
|
||||
__ align(CodeEntryAlignment);
|
||||
*entry = __ pc();
|
||||
|
||||
__ mov(O0, G1); // g1 = o0
|
||||
__ mov(O1, O0); // o0 = o1
|
||||
// Load *adr into c_rarg1, may fault.
|
||||
*fault_pc = __ pc();
|
||||
switch (size) {
|
||||
case 4:
|
||||
// int32_t
|
||||
__ ldsw(G1, 0, O0); // o0 = [g1]
|
||||
break;
|
||||
case 8:
|
||||
// int64_t
|
||||
__ ldx(G1, 0, O0); // o0 = [g1]
|
||||
break;
|
||||
default:
|
||||
ShouldNotReachHere();
|
||||
}
|
||||
|
||||
// return errValue or *adr
|
||||
*continuation_pc = __ pc();
|
||||
// By convention with the trap handler we ensure there is a non-CTI
|
||||
// instruction in the trap shadow.
|
||||
__ nop();
|
||||
__ retl();
|
||||
__ delayed()->nop();
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------------------------------------------------
|
||||
// Continuation point for throwing of implicit exceptions that are not handled in
|
||||
@ -3315,6 +3360,14 @@ class StubGenerator: public StubCodeGenerator {
|
||||
|
||||
// Don't initialize the platform math functions since sparc
|
||||
// doesn't have intrinsics for these operations.
|
||||
|
||||
// Safefetch stubs.
|
||||
generate_safefetch("SafeFetch32", sizeof(int), &StubRoutines::_safefetch32_entry,
|
||||
&StubRoutines::_safefetch32_fault_pc,
|
||||
&StubRoutines::_safefetch32_continuation_pc);
|
||||
generate_safefetch("SafeFetchN", sizeof(intptr_t), &StubRoutines::_safefetchN_entry,
|
||||
&StubRoutines::_safefetchN_fault_pc,
|
||||
&StubRoutines::_safefetchN_continuation_pc);
|
||||
}
|
||||
|
||||
|
||||
|
@ -2766,6 +2766,39 @@ class StubGenerator: public StubCodeGenerator {
|
||||
return start;
|
||||
}
|
||||
|
||||
// Safefetch stubs.
|
||||
void generate_safefetch(const char* name, int size, address* entry,
|
||||
address* fault_pc, address* continuation_pc) {
|
||||
// safefetch signatures:
|
||||
// int SafeFetch32(int* adr, int errValue);
|
||||
// intptr_t SafeFetchN (intptr_t* adr, intptr_t errValue);
|
||||
|
||||
StubCodeMark mark(this, "StubRoutines", name);
|
||||
|
||||
// Entry point, pc or function descriptor.
|
||||
*entry = __ pc();
|
||||
|
||||
__ movl(rax, Address(rsp, 0x8));
|
||||
__ movl(rcx, Address(rsp, 0x4));
|
||||
// Load *adr into eax, may fault.
|
||||
*fault_pc = __ pc();
|
||||
switch (size) {
|
||||
case 4:
|
||||
// int32_t
|
||||
__ movl(rax, Address(rcx, 0));
|
||||
break;
|
||||
case 8:
|
||||
// int64_t
|
||||
Unimplemented();
|
||||
break;
|
||||
default:
|
||||
ShouldNotReachHere();
|
||||
}
|
||||
|
||||
// Return errValue or *adr.
|
||||
*continuation_pc = __ pc();
|
||||
__ ret(0);
|
||||
}
|
||||
|
||||
public:
|
||||
// Information about frame layout at time of blocking runtime call.
|
||||
@ -2978,6 +3011,14 @@ class StubGenerator: public StubCodeGenerator {
|
||||
StubRoutines::_cipherBlockChaining_encryptAESCrypt = generate_cipherBlockChaining_encryptAESCrypt();
|
||||
StubRoutines::_cipherBlockChaining_decryptAESCrypt = generate_cipherBlockChaining_decryptAESCrypt();
|
||||
}
|
||||
|
||||
// Safefetch stubs.
|
||||
generate_safefetch("SafeFetch32", sizeof(int), &StubRoutines::_safefetch32_entry,
|
||||
&StubRoutines::_safefetch32_fault_pc,
|
||||
&StubRoutines::_safefetch32_continuation_pc);
|
||||
StubRoutines::_safefetchN_entry = StubRoutines::_safefetch32_entry;
|
||||
StubRoutines::_safefetchN_fault_pc = StubRoutines::_safefetch32_fault_pc;
|
||||
StubRoutines::_safefetchN_continuation_pc = StubRoutines::_safefetch32_continuation_pc;
|
||||
}
|
||||
|
||||
|
||||
|
@ -3357,7 +3357,45 @@ class StubGenerator: public StubCodeGenerator {
|
||||
return start;
|
||||
}
|
||||
|
||||
// Safefetch stubs.
|
||||
void generate_safefetch(const char* name, int size, address* entry,
|
||||
address* fault_pc, address* continuation_pc) {
|
||||
// safefetch signatures:
|
||||
// int SafeFetch32(int* adr, int errValue);
|
||||
// intptr_t SafeFetchN (intptr_t* adr, intptr_t errValue);
|
||||
//
|
||||
// arguments:
|
||||
// c_rarg0 = adr
|
||||
// c_rarg1 = errValue
|
||||
//
|
||||
// result:
|
||||
// PPC_RET = *adr or errValue
|
||||
|
||||
StubCodeMark mark(this, "StubRoutines", name);
|
||||
|
||||
// Entry point, pc or function descriptor.
|
||||
*entry = __ pc();
|
||||
|
||||
// Load *adr into c_rarg1, may fault.
|
||||
*fault_pc = __ pc();
|
||||
switch (size) {
|
||||
case 4:
|
||||
// int32_t
|
||||
__ movl(c_rarg1, Address(c_rarg0, 0));
|
||||
break;
|
||||
case 8:
|
||||
// int64_t
|
||||
__ movq(c_rarg1, Address(c_rarg0, 0));
|
||||
break;
|
||||
default:
|
||||
ShouldNotReachHere();
|
||||
}
|
||||
|
||||
// return errValue or *adr
|
||||
*continuation_pc = __ pc();
|
||||
__ movq(rax, c_rarg1);
|
||||
__ ret(0);
|
||||
}
|
||||
|
||||
// This is a version of CBC/AES Decrypt which does 4 blocks in a loop at a time
|
||||
// to hide instruction latency
|
||||
@ -3833,6 +3871,14 @@ class StubGenerator: public StubCodeGenerator {
|
||||
StubRoutines::_cipherBlockChaining_encryptAESCrypt = generate_cipherBlockChaining_encryptAESCrypt();
|
||||
StubRoutines::_cipherBlockChaining_decryptAESCrypt = generate_cipherBlockChaining_decryptAESCrypt_Parallel();
|
||||
}
|
||||
|
||||
// Safefetch stubs.
|
||||
generate_safefetch("SafeFetch32", sizeof(int), &StubRoutines::_safefetch32_entry,
|
||||
&StubRoutines::_safefetch32_fault_pc,
|
||||
&StubRoutines::_safefetch32_continuation_pc);
|
||||
generate_safefetch("SafeFetchN", sizeof(intptr_t), &StubRoutines::_safefetchN_entry,
|
||||
&StubRoutines::_safefetchN_fault_pc,
|
||||
&StubRoutines::_safefetchN_continuation_pc);
|
||||
}
|
||||
|
||||
public:
|
||||
|
@ -2323,6 +2323,11 @@ LONG WINAPI topLevelExceptionFilter(struct _EXCEPTION_POINTERS* exceptionInfo) {
|
||||
#endif
|
||||
Thread* t = ThreadLocalStorage::get_thread_slow(); // slow & steady
|
||||
|
||||
// Handle SafeFetch32 and SafeFetchN exceptions.
|
||||
if (StubRoutines::is_safefetch_fault(pc)) {
|
||||
return Handle_Exception(exceptionInfo, StubRoutines::continuation_for_safefetch_fault(pc));
|
||||
}
|
||||
|
||||
#ifndef _WIN64
|
||||
// Execution protection violation - win32 running on AMD64 only
|
||||
// Handled first to avoid misdiagnosis as a "normal" access violation;
|
||||
|
@ -63,24 +63,6 @@ SYMBOL(fixcw):
|
||||
popl %eax
|
||||
ret
|
||||
|
||||
.globl SYMBOL(SafeFetch32), SYMBOL(Fetch32PFI), SYMBOL(Fetch32Resume)
|
||||
.globl SYMBOL(SafeFetchN)
|
||||
## TODO: avoid exposing Fetch32PFI and Fetch32Resume.
|
||||
## Instead, the signal handler would call a new SafeFetchTriage(FaultingEIP)
|
||||
## routine to vet the address. If the address is the faulting LD then
|
||||
## SafeFetchTriage() would return the resume-at EIP, otherwise null.
|
||||
ELF_TYPE(SafeFetch32,@function)
|
||||
.p2align 4,,15
|
||||
SYMBOL(SafeFetch32):
|
||||
SYMBOL(SafeFetchN):
|
||||
movl 0x8(%esp), %eax
|
||||
movl 0x4(%esp), %ecx
|
||||
SYMBOL(Fetch32PFI):
|
||||
movl (%ecx), %eax
|
||||
SYMBOL(Fetch32Resume):
|
||||
ret
|
||||
|
||||
|
||||
.globl SYMBOL(SpinPause)
|
||||
ELF_TYPE(SpinPause,@function)
|
||||
.p2align 4,,15
|
||||
|
@ -46,28 +46,6 @@
|
||||
|
||||
.text
|
||||
|
||||
.globl SYMBOL(SafeFetch32), SYMBOL(Fetch32PFI), SYMBOL(Fetch32Resume)
|
||||
.p2align 4,,15
|
||||
ELF_TYPE(SafeFetch32,@function)
|
||||
// Prototype: int SafeFetch32 (int * Adr, int ErrValue)
|
||||
SYMBOL(SafeFetch32):
|
||||
movl %esi, %eax
|
||||
SYMBOL(Fetch32PFI):
|
||||
movl (%rdi), %eax
|
||||
SYMBOL(Fetch32Resume):
|
||||
ret
|
||||
|
||||
.globl SYMBOL(SafeFetchN), SYMBOL(FetchNPFI), SYMBOL(FetchNResume)
|
||||
.p2align 4,,15
|
||||
ELF_TYPE(SafeFetchN,@function)
|
||||
// Prototype: intptr_t SafeFetchN (intptr_t * Adr, intptr_t ErrValue)
|
||||
SYMBOL(SafeFetchN):
|
||||
movq %rsi, %rax
|
||||
SYMBOL(FetchNPFI):
|
||||
movq (%rdi), %rax
|
||||
SYMBOL(FetchNResume):
|
||||
ret
|
||||
|
||||
.globl SYMBOL(SpinPause)
|
||||
.p2align 4,,15
|
||||
ELF_TYPE(SpinPause,@function)
|
||||
|
@ -385,13 +385,6 @@ enum {
|
||||
trap_page_fault = 0xE
|
||||
};
|
||||
|
||||
extern "C" void Fetch32PFI () ;
|
||||
extern "C" void Fetch32Resume () ;
|
||||
#ifdef AMD64
|
||||
extern "C" void FetchNPFI () ;
|
||||
extern "C" void FetchNResume () ;
|
||||
#endif // AMD64
|
||||
|
||||
extern "C" JNIEXPORT int
|
||||
JVM_handle_bsd_signal(int sig,
|
||||
siginfo_t* info,
|
||||
@ -454,16 +447,10 @@ JVM_handle_bsd_signal(int sig,
|
||||
if (info != NULL && uc != NULL && thread != NULL) {
|
||||
pc = (address) os::Bsd::ucontext_get_pc(uc);
|
||||
|
||||
if (pc == (address) Fetch32PFI) {
|
||||
uc->context_pc = intptr_t(Fetch32Resume) ;
|
||||
return 1 ;
|
||||
if (StubRoutines::is_safefetch_fault(pc)) {
|
||||
uc->context_pc = intptr_t(StubRoutines::continuation_for_safefetch_fault(pc));
|
||||
return 1;
|
||||
}
|
||||
#ifdef AMD64
|
||||
if (pc == (address) FetchNPFI) {
|
||||
uc->context_pc = intptr_t (FetchNResume) ;
|
||||
return 1 ;
|
||||
}
|
||||
#endif // AMD64
|
||||
|
||||
// Handle ALL stack overflow variations here
|
||||
if (sig == SIGSEGV || sig == SIGBUS) {
|
||||
|
@ -21,42 +21,6 @@
|
||||
# questions.
|
||||
#
|
||||
|
||||
# Prototype: int SafeFetch32 (int * adr, int ErrValue)
|
||||
# The "ld" at Fetch32 is potentially faulting instruction.
|
||||
# If the instruction traps the trap handler will arrange
|
||||
# for control to resume at Fetch32Resume.
|
||||
# By convention with the trap handler we ensure there is a non-CTI
|
||||
# instruction in the trap shadow.
|
||||
|
||||
|
||||
.globl SafeFetch32, Fetch32PFI, Fetch32Resume
|
||||
.globl SafeFetchN
|
||||
.align 32
|
||||
.type SafeFetch32,@function
|
||||
SafeFetch32:
|
||||
mov %o0, %g1
|
||||
mov %o1, %o0
|
||||
Fetch32PFI:
|
||||
# <-- Potentially faulting instruction
|
||||
ld [%g1], %o0
|
||||
Fetch32Resume:
|
||||
nop
|
||||
retl
|
||||
nop
|
||||
|
||||
.globl SafeFetchN, FetchNPFI, FetchNResume
|
||||
.type SafeFetchN,@function
|
||||
.align 32
|
||||
SafeFetchN:
|
||||
mov %o0, %g1
|
||||
mov %o1, %o0
|
||||
FetchNPFI:
|
||||
ldn [%g1], %o0
|
||||
FetchNResume:
|
||||
nop
|
||||
retl
|
||||
nop
|
||||
|
||||
# Possibilities:
|
||||
# -- membar
|
||||
# -- CAS (SP + BIAS, G0, G0)
|
||||
|
@ -366,18 +366,9 @@ intptr_t* os::Linux::ucontext_get_fp(ucontext_t *uc) {
|
||||
|
||||
// Utility functions
|
||||
|
||||
extern "C" void Fetch32PFI();
|
||||
extern "C" void Fetch32Resume();
|
||||
extern "C" void FetchNPFI();
|
||||
extern "C" void FetchNResume();
|
||||
|
||||
inline static bool checkPrefetch(sigcontext* uc, address pc) {
|
||||
if (pc == (address) Fetch32PFI) {
|
||||
set_cont_address(uc, address(Fetch32Resume));
|
||||
return true;
|
||||
}
|
||||
if (pc == (address) FetchNPFI) {
|
||||
set_cont_address(uc, address(FetchNResume));
|
||||
if (StubRoutines::is_safefetch_fault(pc)) {
|
||||
set_cont_address(uc, address(StubRoutines::continuation_for_safefetch_fault(pc)));
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
@ -42,24 +42,6 @@
|
||||
|
||||
.text
|
||||
|
||||
.globl SafeFetch32, Fetch32PFI, Fetch32Resume
|
||||
.globl SafeFetchN
|
||||
## TODO: avoid exposing Fetch32PFI and Fetch32Resume.
|
||||
## Instead, the signal handler would call a new SafeFetchTriage(FaultingEIP)
|
||||
## routine to vet the address. If the address is the faulting LD then
|
||||
## SafeFetchTriage() would return the resume-at EIP, otherwise null.
|
||||
.type SafeFetch32,@function
|
||||
.p2align 4,,15
|
||||
SafeFetch32:
|
||||
SafeFetchN:
|
||||
movl 0x8(%esp), %eax
|
||||
movl 0x4(%esp), %ecx
|
||||
Fetch32PFI:
|
||||
movl (%ecx), %eax
|
||||
Fetch32Resume:
|
||||
ret
|
||||
|
||||
|
||||
.globl SpinPause
|
||||
.type SpinPause,@function
|
||||
.p2align 4,,15
|
||||
|
@ -38,28 +38,6 @@
|
||||
|
||||
.text
|
||||
|
||||
.globl SafeFetch32, Fetch32PFI, Fetch32Resume
|
||||
.align 16
|
||||
.type SafeFetch32,@function
|
||||
// Prototype: int SafeFetch32 (int * Adr, int ErrValue)
|
||||
SafeFetch32:
|
||||
movl %esi, %eax
|
||||
Fetch32PFI:
|
||||
movl (%rdi), %eax
|
||||
Fetch32Resume:
|
||||
ret
|
||||
|
||||
.globl SafeFetchN, FetchNPFI, FetchNResume
|
||||
.align 16
|
||||
.type SafeFetchN,@function
|
||||
// Prototype: intptr_t SafeFetchN (intptr_t * Adr, intptr_t ErrValue)
|
||||
SafeFetchN:
|
||||
movq %rsi, %rax
|
||||
FetchNPFI:
|
||||
movq (%rdi), %rax
|
||||
FetchNResume:
|
||||
ret
|
||||
|
||||
.globl SpinPause
|
||||
.align 16
|
||||
.type SpinPause,@function
|
||||
|
@ -209,13 +209,6 @@ enum {
|
||||
trap_page_fault = 0xE
|
||||
};
|
||||
|
||||
extern "C" void Fetch32PFI () ;
|
||||
extern "C" void Fetch32Resume () ;
|
||||
#ifdef AMD64
|
||||
extern "C" void FetchNPFI () ;
|
||||
extern "C" void FetchNResume () ;
|
||||
#endif // AMD64
|
||||
|
||||
extern "C" JNIEXPORT int
|
||||
JVM_handle_linux_signal(int sig,
|
||||
siginfo_t* info,
|
||||
@ -278,16 +271,10 @@ JVM_handle_linux_signal(int sig,
|
||||
if (info != NULL && uc != NULL && thread != NULL) {
|
||||
pc = (address) os::Linux::ucontext_get_pc(uc);
|
||||
|
||||
if (pc == (address) Fetch32PFI) {
|
||||
uc->uc_mcontext.gregs[REG_PC] = intptr_t(Fetch32Resume) ;
|
||||
return 1 ;
|
||||
if (StubRoutines::is_safefetch_fault(pc)) {
|
||||
uc->uc_mcontext.gregs[REG_PC] = intptr_t(StubRoutines::continuation_for_safefetch_fault(pc));
|
||||
return 1;
|
||||
}
|
||||
#ifdef AMD64
|
||||
if (pc == (address) FetchNPFI) {
|
||||
uc->uc_mcontext.gregs[REG_PC] = intptr_t (FetchNResume) ;
|
||||
return 1 ;
|
||||
}
|
||||
#endif // AMD64
|
||||
|
||||
#ifndef AMD64
|
||||
// Halt if SI_KERNEL before more crashes get misdiagnosed as Java bugs
|
||||
|
@ -303,11 +303,6 @@ bool os::is_allocatable(size_t bytes) {
|
||||
#endif
|
||||
}
|
||||
|
||||
extern "C" void Fetch32PFI () ;
|
||||
extern "C" void Fetch32Resume () ;
|
||||
extern "C" void FetchNPFI () ;
|
||||
extern "C" void FetchNResume () ;
|
||||
|
||||
extern "C" JNIEXPORT int
|
||||
JVM_handle_solaris_signal(int sig, siginfo_t* info, void* ucVoid,
|
||||
int abort_if_unrecognized) {
|
||||
@ -379,17 +374,10 @@ JVM_handle_solaris_signal(int sig, siginfo_t* info, void* ucVoid,
|
||||
npc = (address) uc->uc_mcontext.gregs[REG_nPC];
|
||||
|
||||
// SafeFetch() support
|
||||
// Implemented with either a fixed set of addresses such
|
||||
// as Fetch32*, or with Thread._OnTrap.
|
||||
if (uc->uc_mcontext.gregs[REG_PC] == intptr_t(Fetch32PFI)) {
|
||||
uc->uc_mcontext.gregs [REG_PC] = intptr_t(Fetch32Resume) ;
|
||||
uc->uc_mcontext.gregs [REG_nPC] = intptr_t(Fetch32Resume) + 4 ;
|
||||
return true ;
|
||||
}
|
||||
if (uc->uc_mcontext.gregs[REG_PC] == intptr_t(FetchNPFI)) {
|
||||
uc->uc_mcontext.gregs [REG_PC] = intptr_t(FetchNResume) ;
|
||||
uc->uc_mcontext.gregs [REG_nPC] = intptr_t(FetchNResume) + 4 ;
|
||||
return true ;
|
||||
if (StubRoutines::is_safefetch_fault(pc)) {
|
||||
uc->uc_mcontext.gregs[REG_PC] = intptr_t(StubRoutines::continuation_for_safefetch_fault(pc));
|
||||
uc->uc_mcontext.gregs[REG_nPC] = uc->uc_mcontext.gregs[REG_PC] + 4;
|
||||
return 1;
|
||||
}
|
||||
|
||||
// Handle ALL stack overflow variations here
|
||||
|
@ -21,47 +21,6 @@
|
||||
!! questions.
|
||||
!!
|
||||
|
||||
!! Prototype: int SafeFetch32 (int * adr, int ErrValue)
|
||||
!! The "ld" at Fetch32 is potentially faulting instruction.
|
||||
!! If the instruction traps the trap handler will arrange
|
||||
!! for control to resume at Fetch32Resume.
|
||||
!! By convention with the trap handler we ensure there is a non-CTI
|
||||
!! instruction in the trap shadow.
|
||||
!!
|
||||
!! The reader might be tempted to move this service to .il.
|
||||
!! Don't. Sun's CC back-end reads and optimize code emitted
|
||||
!! by the .il "call", in some cases optimizing the code, completely eliding it,
|
||||
!! or by moving the code from the "call site".
|
||||
|
||||
!! ASM better know we may use G6 for our own purposes
|
||||
.register %g6, #ignore
|
||||
|
||||
.globl SafeFetch32
|
||||
.align 32
|
||||
.global Fetch32PFI, Fetch32Resume
|
||||
SafeFetch32:
|
||||
mov %o0, %g1
|
||||
mov %o1, %o0
|
||||
Fetch32PFI:
|
||||
ld [%g1], %o0 !! <-- Potentially faulting instruction
|
||||
Fetch32Resume:
|
||||
nop
|
||||
retl
|
||||
nop
|
||||
|
||||
.globl SafeFetchN
|
||||
.align 32
|
||||
.globl FetchNPFI, FetchNResume
|
||||
SafeFetchN:
|
||||
mov %o0, %g1
|
||||
mov %o1, %o0
|
||||
FetchNPFI:
|
||||
ldn [%g1], %o0
|
||||
FetchNResume:
|
||||
nop
|
||||
retl
|
||||
nop
|
||||
|
||||
!! Possibilities:
|
||||
!! -- membar
|
||||
!! -- CAS (SP + BIAS, G0, G0)
|
||||
|
@ -352,13 +352,6 @@ bool os::is_allocatable(size_t bytes) {
|
||||
|
||||
}
|
||||
|
||||
extern "C" void Fetch32PFI () ;
|
||||
extern "C" void Fetch32Resume () ;
|
||||
#ifdef AMD64
|
||||
extern "C" void FetchNPFI () ;
|
||||
extern "C" void FetchNResume () ;
|
||||
#endif // AMD64
|
||||
|
||||
extern "C" JNIEXPORT int
|
||||
JVM_handle_solaris_signal(int sig, siginfo_t* info, void* ucVoid,
|
||||
int abort_if_unrecognized) {
|
||||
@ -436,17 +429,10 @@ JVM_handle_solaris_signal(int sig, siginfo_t* info, void* ucVoid,
|
||||
// factor me: getPCfromContext
|
||||
pc = (address) uc->uc_mcontext.gregs[REG_PC];
|
||||
|
||||
// SafeFetch32() support
|
||||
if (pc == (address) Fetch32PFI) {
|
||||
uc->uc_mcontext.gregs[REG_PC] = intptr_t(Fetch32Resume) ;
|
||||
return true ;
|
||||
if (StubRoutines::is_safefetch_fault(pc)) {
|
||||
uc->uc_mcontext.gregs[REG_PC] = intptr_t(StubRoutines::continuation_for_safefetch_fault(pc));
|
||||
return true;
|
||||
}
|
||||
#ifdef AMD64
|
||||
if (pc == (address) FetchNPFI) {
|
||||
uc->uc_mcontext.gregs [REG_PC] = intptr_t(FetchNResume) ;
|
||||
return true ;
|
||||
}
|
||||
#endif // AMD64
|
||||
|
||||
// Handle ALL stack overflow variations here
|
||||
if (sig == SIGSEGV && info->si_code == SEGV_ACCERR) {
|
||||
|
@ -54,20 +54,6 @@ fixcw:
|
||||
popl %eax
|
||||
ret
|
||||
|
||||
.align 16
|
||||
.globl SafeFetch32
|
||||
.globl SafeFetchN
|
||||
.globl Fetch32PFI, Fetch32Resume
|
||||
SafeFetch32:
|
||||
SafeFetchN:
|
||||
movl 0x8(%esp), %eax
|
||||
movl 0x4(%esp), %ecx
|
||||
Fetch32PFI:
|
||||
movl (%ecx), %eax
|
||||
Fetch32Resume:
|
||||
ret
|
||||
|
||||
|
||||
.align 16
|
||||
.globl SpinPause
|
||||
SpinPause:
|
||||
|
@ -21,54 +21,34 @@
|
||||
/ questions.
|
||||
/
|
||||
|
||||
.globl fs_load
|
||||
.globl fs_thread
|
||||
.globl fs_load
|
||||
.globl fs_thread
|
||||
|
||||
// NOTE WELL! The _Copy functions are called directly
|
||||
// from server-compiler-generated code via CallLeafNoFP,
|
||||
// which means that they *must* either not use floating
|
||||
// point or use it in the same manner as does the server
|
||||
// compiler.
|
||||
// from server-compiler-generated code via CallLeafNoFP,
|
||||
// which means that they *must* either not use floating
|
||||
// point or use it in the same manner as does the server
|
||||
// compiler.
|
||||
|
||||
.globl _Copy_arrayof_conjoint_bytes
|
||||
.globl _Copy_conjoint_jshorts_atomic
|
||||
.globl _Copy_arrayof_conjoint_jshorts
|
||||
.globl _Copy_arrayof_conjoint_jshorts
|
||||
.globl _Copy_conjoint_jints_atomic
|
||||
.globl _Copy_arrayof_conjoint_jints
|
||||
.globl _Copy_conjoint_jlongs_atomic
|
||||
.globl _Copy_conjoint_jlongs_atomic
|
||||
.globl _Copy_arrayof_conjoint_jlongs
|
||||
|
||||
.section .text,"ax"
|
||||
.section .text,"ax"
|
||||
|
||||
/ Fast thread accessors, used by threadLS_solaris_amd64.cpp
|
||||
.align 16
|
||||
.align 16
|
||||
fs_load:
|
||||
movq %fs:(%rdi),%rax
|
||||
ret
|
||||
|
||||
.align 16
|
||||
fs_thread:
|
||||
movq %fs:0x0,%rax
|
||||
ret
|
||||
|
||||
.globl SafeFetch32, Fetch32PFI, Fetch32Resume
|
||||
.align 16
|
||||
// Prototype: int SafeFetch32 (int * Adr, int ErrValue)
|
||||
SafeFetch32:
|
||||
movl %esi, %eax
|
||||
Fetch32PFI:
|
||||
movl (%rdi), %eax
|
||||
Fetch32Resume:
|
||||
movq %fs:(%rdi),%rax
|
||||
ret
|
||||
|
||||
.globl SafeFetchN, FetchNPFI, FetchNResume
|
||||
.align 16
|
||||
// Prototype: intptr_t SafeFetchN (intptr_t * Adr, intptr_t ErrValue)
|
||||
SafeFetchN:
|
||||
movq %rsi, %rax
|
||||
FetchNPFI:
|
||||
movq (%rdi), %rax
|
||||
FetchNResume:
|
||||
.align 16
|
||||
fs_thread:
|
||||
movq %fs:0x0,%rax
|
||||
ret
|
||||
|
||||
.globl SpinPause
|
||||
@ -78,7 +58,7 @@ SpinPause:
|
||||
nop
|
||||
movq $1, %rax
|
||||
ret
|
||||
|
||||
|
||||
|
||||
/ Support for void Copy::arrayof_conjoint_bytes(void* from,
|
||||
/ void* to,
|
||||
@ -340,7 +320,7 @@ aci_CopyLeft:
|
||||
addq $4,%rdx
|
||||
jg 1b
|
||||
ret
|
||||
|
||||
|
||||
/ Support for void Copy::arrayof_conjoint_jlongs(jlong* from,
|
||||
/ jlong* to,
|
||||
/ size_t count)
|
||||
|
@ -518,24 +518,6 @@ void os::print_register_info(outputStream *st, void *context) {
|
||||
st->cr();
|
||||
}
|
||||
|
||||
extern "C" int SafeFetch32 (int * adr, int Err) {
|
||||
int rv = Err ;
|
||||
_try {
|
||||
rv = *((volatile int *) adr) ;
|
||||
} __except(EXCEPTION_EXECUTE_HANDLER) {
|
||||
}
|
||||
return rv ;
|
||||
}
|
||||
|
||||
extern "C" intptr_t SafeFetchN (intptr_t * adr, intptr_t Err) {
|
||||
intptr_t rv = Err ;
|
||||
_try {
|
||||
rv = *((volatile intptr_t *) adr) ;
|
||||
} __except(EXCEPTION_EXECUTE_HANDLER) {
|
||||
}
|
||||
return rv ;
|
||||
}
|
||||
|
||||
extern "C" int SpinPause () {
|
||||
#ifdef AMD64
|
||||
return 0 ;
|
||||
|
@ -873,7 +873,7 @@ bool G1CollectorPolicy::need_to_start_conc_mark(const char* source, size_t alloc
|
||||
size_t alloc_byte_size = alloc_word_size * HeapWordSize;
|
||||
|
||||
if ((cur_used_bytes + alloc_byte_size) > marking_initiating_used_threshold) {
|
||||
if (gcs_are_young()) {
|
||||
if (gcs_are_young() && !_last_young_gc) {
|
||||
ergo_verbose5(ErgoConcCycles,
|
||||
"request concurrent cycle initiation",
|
||||
ergo_format_reason("occupancy higher than threshold")
|
||||
@ -931,7 +931,7 @@ void G1CollectorPolicy::record_collection_pause_end(double pause_time_ms, Evacua
|
||||
last_pause_included_initial_mark = during_initial_mark_pause();
|
||||
if (last_pause_included_initial_mark) {
|
||||
record_concurrent_mark_init_end(0.0);
|
||||
} else if (!_last_young_gc && need_to_start_conc_mark("end of GC")) {
|
||||
} else if (need_to_start_conc_mark("end of GC")) {
|
||||
// Note: this might have already been set, if during the last
|
||||
// pause we decided to start a cycle but at the beginning of
|
||||
// this pause we decided to postpone it. That's OK.
|
||||
|
@ -915,8 +915,6 @@ class os: AllStatic {
|
||||
// of the global SpinPause() with C linkage.
|
||||
// It'd also be eligible for inlining on many platforms.
|
||||
|
||||
extern "C" int SpinPause () ;
|
||||
extern "C" int SafeFetch32 (int * adr, int errValue) ;
|
||||
extern "C" intptr_t SafeFetchN (intptr_t * adr, intptr_t errValue) ;
|
||||
extern "C" int SpinPause();
|
||||
|
||||
#endif // SHARE_VM_RUNTIME_OS_HPP
|
||||
|
@ -136,6 +136,13 @@ double (* StubRoutines::_intrinsic_sin )(double) = NULL;
|
||||
double (* StubRoutines::_intrinsic_cos )(double) = NULL;
|
||||
double (* StubRoutines::_intrinsic_tan )(double) = NULL;
|
||||
|
||||
address StubRoutines::_safefetch32_entry = NULL;
|
||||
address StubRoutines::_safefetch32_fault_pc = NULL;
|
||||
address StubRoutines::_safefetch32_continuation_pc = NULL;
|
||||
address StubRoutines::_safefetchN_entry = NULL;
|
||||
address StubRoutines::_safefetchN_fault_pc = NULL;
|
||||
address StubRoutines::_safefetchN_continuation_pc = NULL;
|
||||
|
||||
// Initialization
|
||||
//
|
||||
// Note: to break cycle with universe initialization, stubs are generated in two phases.
|
||||
|
@ -221,6 +221,14 @@ class StubRoutines: AllStatic {
|
||||
static double (*_intrinsic_cos)(double);
|
||||
static double (*_intrinsic_tan)(double);
|
||||
|
||||
// Safefetch stubs.
|
||||
static address _safefetch32_entry;
|
||||
static address _safefetch32_fault_pc;
|
||||
static address _safefetch32_continuation_pc;
|
||||
static address _safefetchN_entry;
|
||||
static address _safefetchN_fault_pc;
|
||||
static address _safefetchN_continuation_pc;
|
||||
|
||||
public:
|
||||
// Initialization/Testing
|
||||
static void initialize1(); // must happen before universe::genesis
|
||||
@ -381,6 +389,34 @@ class StubRoutines: AllStatic {
|
||||
return _intrinsic_tan(d);
|
||||
}
|
||||
|
||||
//
|
||||
// Safefetch stub support
|
||||
//
|
||||
|
||||
typedef int (*SafeFetch32Stub)(int* adr, int errValue);
|
||||
typedef intptr_t (*SafeFetchNStub) (intptr_t* adr, intptr_t errValue);
|
||||
|
||||
static SafeFetch32Stub SafeFetch32_stub() { return CAST_TO_FN_PTR(SafeFetch32Stub, _safefetch32_entry); }
|
||||
static SafeFetchNStub SafeFetchN_stub() { return CAST_TO_FN_PTR(SafeFetchNStub, _safefetchN_entry); }
|
||||
|
||||
static bool is_safefetch_fault(address pc) {
|
||||
return pc != NULL &&
|
||||
(pc == _safefetch32_fault_pc ||
|
||||
pc == _safefetchN_fault_pc);
|
||||
}
|
||||
|
||||
static address continuation_for_safefetch_fault(address pc) {
|
||||
assert(_safefetch32_continuation_pc != NULL &&
|
||||
_safefetchN_continuation_pc != NULL,
|
||||
"not initialized");
|
||||
|
||||
if (pc == _safefetch32_fault_pc) return _safefetch32_continuation_pc;
|
||||
if (pc == _safefetchN_fault_pc) return _safefetchN_continuation_pc;
|
||||
|
||||
ShouldNotReachHere();
|
||||
return NULL;
|
||||
}
|
||||
|
||||
//
|
||||
// Default versions of the above arraycopy functions for platforms which do
|
||||
// not have specialized versions
|
||||
@ -400,4 +436,15 @@ class StubRoutines: AllStatic {
|
||||
static void arrayof_oop_copy_uninit(HeapWord* src, HeapWord* dest, size_t count);
|
||||
};
|
||||
|
||||
// Safefetch allows to load a value from a location that's not known
|
||||
// to be valid. If the load causes a fault, the error value is returned.
|
||||
inline int SafeFetch32(int* adr, int errValue) {
|
||||
assert(StubRoutines::SafeFetch32_stub(), "stub not yet generated");
|
||||
return StubRoutines::SafeFetch32_stub()(adr, errValue);
|
||||
}
|
||||
inline intptr_t SafeFetchN(intptr_t* adr, intptr_t errValue) {
|
||||
assert(StubRoutines::SafeFetchN_stub(), "stub not yet generated");
|
||||
return StubRoutines::SafeFetchN_stub()(adr, errValue);
|
||||
}
|
||||
|
||||
#endif // SHARE_VM_RUNTIME_STUBROUTINES_HPP
|
||||
|
@ -81,13 +81,13 @@ void MemTracker::init_tracking_options(const char* option_line) {
|
||||
} else if (strcmp(option_line, "=detail") == 0) {
|
||||
// detail relies on a stack-walking ability that may not
|
||||
// be available depending on platform and/or compiler flags
|
||||
if (PLATFORM_NMT_DETAIL_SUPPORTED) {
|
||||
#if PLATFORM_NATIVE_STACK_WALKING_SUPPORTED
|
||||
_tracking_level = NMT_detail;
|
||||
} else {
|
||||
#else
|
||||
jio_fprintf(defaultStream::error_stream(),
|
||||
"NMT detail is not supported on this platform. Using NMT summary instead.");
|
||||
"NMT detail is not supported on this platform. Using NMT summary instead.\n");
|
||||
_tracking_level = NMT_summary;
|
||||
}
|
||||
#endif
|
||||
} else if (strcmp(option_line, "=off") != 0) {
|
||||
vm_exit_during_initialization("Syntax error, expecting -XX:NativeMemoryTracking=[off|summary|detail]", NULL);
|
||||
}
|
||||
|
@ -381,12 +381,12 @@ const uint64_t KlassEncodingMetaspaceMax = (uint64_t(max_juint) + 1) << LogKlass
|
||||
#endif
|
||||
|
||||
/*
|
||||
* If a platform does not support NMT_detail
|
||||
* If a platform does not support native stack walking
|
||||
* the platform specific globalDefinitions (above)
|
||||
* can set PLATFORM_NMT_DETAIL_SUPPORTED to false
|
||||
* can set PLATFORM_NATIVE_STACK_WALKING_SUPPORTED to 0
|
||||
*/
|
||||
#ifndef PLATFORM_NMT_DETAIL_SUPPORTED
|
||||
#define PLATFORM_NMT_DETAIL_SUPPORTED true
|
||||
#ifndef PLATFORM_NATIVE_STACK_WALKING_SUPPORTED
|
||||
#define PLATFORM_NATIVE_STACK_WALKING_SUPPORTED 1
|
||||
#endif
|
||||
|
||||
// The byte alignment to be used by Arena::Amalloc. See bugid 4169348.
|
||||
|
@ -220,3 +220,4 @@ a2a2a91075ad85becbe10a39d7fd04ef9bea8df5 jdk8-b92
|
||||
4a5d3cf2b3af1660db0237e8da324c140e534fa4 jdk8-b96
|
||||
978a95239044f26dcc8a6d59246be07ad6ca6be2 jdk8-b97
|
||||
c4908732fef5235f1b98cafe0ce507771ef7892c jdk8-b98
|
||||
6a099a36589bd933957272ba63e5263bede29971 jdk8-b99
|
||||
|
@ -102,7 +102,7 @@ SUNWprivate_1.1 {
|
||||
Java_sun_security_pkcs11_Secmod_nssGetLibraryHandle;
|
||||
Java_sun_security_pkcs11_Secmod_nssLoadLibrary;
|
||||
Java_sun_security_pkcs11_Secmod_nssVersionCheck;
|
||||
Java_sun_security_pkcs11_Secmod_nssInit;
|
||||
Java_sun_security_pkcs11_Secmod_nssInitialize;
|
||||
Java_sun_security_pkcs11_Secmod_nssGetModuleList;
|
||||
|
||||
local:
|
||||
|
@ -1,5 +1,5 @@
|
||||
#
|
||||
# Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
|
||||
# Copyright (c) 2003, 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
|
||||
@ -102,7 +102,7 @@ SUNWprivate_1.1 {
|
||||
Java_sun_security_pkcs11_Secmod_nssGetLibraryHandle;
|
||||
Java_sun_security_pkcs11_Secmod_nssLoadLibrary;
|
||||
Java_sun_security_pkcs11_Secmod_nssVersionCheck;
|
||||
Java_sun_security_pkcs11_Secmod_nssInit;
|
||||
Java_sun_security_pkcs11_Secmod_nssInitialize;
|
||||
Java_sun_security_pkcs11_Secmod_nssGetModuleList;
|
||||
|
||||
local:
|
||||
|
@ -32,6 +32,7 @@ import java.util.List;
|
||||
import javax.swing.RootPaneContainer;
|
||||
|
||||
import com.apple.eawt.AppEvent.FullScreenEvent;
|
||||
import sun.awt.SunToolkit;
|
||||
|
||||
import java.lang.annotation.Native;
|
||||
|
||||
@ -75,7 +76,7 @@ final class FullScreenHandler {
|
||||
static void handleFullScreenEventFromNative(final Window window, final int type) {
|
||||
if (!(window instanceof RootPaneContainer)) return; // handles null
|
||||
|
||||
EventQueue.invokeLater(new Runnable() {
|
||||
SunToolkit.executeOnEventHandlerThread(window, new Runnable() {
|
||||
public void run() {
|
||||
final FullScreenHandler handler = getHandlerFor((RootPaneContainer)window);
|
||||
if (handler != null) handler.notifyListener(new FullScreenEvent(window), type);
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2011, 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
|
||||
@ -31,6 +31,8 @@ import java.io.File;
|
||||
import java.net.*;
|
||||
import java.util.*;
|
||||
import java.util.List;
|
||||
import sun.awt.AppContext;
|
||||
import sun.awt.SunToolkit;
|
||||
|
||||
import com.apple.eawt.AppEvent.*;
|
||||
|
||||
@ -269,11 +271,9 @@ class _AppEventHandler {
|
||||
}
|
||||
|
||||
class _AppReOpenedDispatcher extends _AppEventMultiplexor<AppReOpenedListener> {
|
||||
void performOnListeners(final List<AppReOpenedListener> listeners, final _NativeEvent event) {
|
||||
void performOnListener(AppReOpenedListener listener, final _NativeEvent event) {
|
||||
final AppReOpenedEvent e = new AppReOpenedEvent();
|
||||
for (final AppReOpenedListener listener : listeners) {
|
||||
listener.appReOpened(e);
|
||||
}
|
||||
listener.appReOpened(e);
|
||||
}
|
||||
}
|
||||
|
||||
@ -415,50 +415,67 @@ class _AppEventHandler {
|
||||
}
|
||||
|
||||
abstract class _AppEventMultiplexor<L> {
|
||||
final List<L> _listeners = new ArrayList<L>(0);
|
||||
private final Map<L, AppContext> listenerToAppContext =
|
||||
new IdentityHashMap<L, AppContext>();
|
||||
boolean nativeListenerRegistered;
|
||||
|
||||
// called from AppKit Thread-0
|
||||
void dispatch(final _NativeEvent event, final Object... args) {
|
||||
// grab a local ref to the listeners
|
||||
final List<L> localListeners;
|
||||
// grab a local ref to the listeners and its contexts as an array of the map's entries
|
||||
final ArrayList<Map.Entry<L, AppContext>> localEntries;
|
||||
synchronized (this) {
|
||||
if (_listeners.size() == 0) return;
|
||||
localListeners = new ArrayList<L>(_listeners);
|
||||
if (listenerToAppContext.size() == 0) {
|
||||
return;
|
||||
}
|
||||
localEntries = new ArrayList<Map.Entry<L, AppContext>>(listenerToAppContext.size());
|
||||
localEntries.addAll(listenerToAppContext.entrySet());
|
||||
}
|
||||
|
||||
EventQueue.invokeLater(new Runnable() {
|
||||
public void run() {
|
||||
performOnListeners(localListeners, event);
|
||||
}
|
||||
});
|
||||
for (final Map.Entry<L, AppContext> e : localEntries) {
|
||||
final L listener = e.getKey();
|
||||
final AppContext listenerContext = e.getValue();
|
||||
SunToolkit.invokeLaterOnAppContext(listenerContext, new Runnable() {
|
||||
public void run() {
|
||||
performOnListener(listener, event);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
synchronized void addListener(final L listener) {
|
||||
setListenerContext(listener, AppContext.getAppContext());
|
||||
|
||||
if (!nativeListenerRegistered) {
|
||||
registerNativeListener();
|
||||
nativeListenerRegistered = true;
|
||||
}
|
||||
_listeners.add(listener);
|
||||
}
|
||||
|
||||
synchronized void removeListener(final L listener) {
|
||||
_listeners.remove(listener);
|
||||
listenerToAppContext.remove(listener);
|
||||
}
|
||||
|
||||
abstract void performOnListeners(final List<L> listeners, final _NativeEvent event);
|
||||
abstract void performOnListener(L listener, final _NativeEvent event);
|
||||
void registerNativeListener() { }
|
||||
|
||||
private void setListenerContext(L listener, AppContext listenerContext) {
|
||||
if (listenerContext == null) {
|
||||
throw new RuntimeException(
|
||||
"Attempting to add a listener from a thread group without AppContext");
|
||||
}
|
||||
listenerToAppContext.put(listener, AppContext.getAppContext());
|
||||
}
|
||||
}
|
||||
|
||||
abstract class _BooleanAppEventMultiplexor<L, E> extends _AppEventMultiplexor<L> {
|
||||
@Override
|
||||
void performOnListeners(final List<L> listeners, final _NativeEvent event) {
|
||||
void performOnListener(L listener, final _NativeEvent event) {
|
||||
final boolean isTrue = Boolean.TRUE.equals(event.get(0));
|
||||
final E e = createEvent(isTrue);
|
||||
if (isTrue) {
|
||||
for (final L listener : listeners) performTrueEventOn(listener, e);
|
||||
performTrueEventOn(listener, e);
|
||||
} else {
|
||||
for (final L listener : listeners) performFalseEventOn(listener, e);
|
||||
performFalseEventOn(listener, e);
|
||||
}
|
||||
}
|
||||
|
||||
@ -479,30 +496,34 @@ class _AppEventHandler {
|
||||
*/
|
||||
abstract class _AppEventDispatcher<H> {
|
||||
H _handler;
|
||||
AppContext handlerContext;
|
||||
|
||||
// called from AppKit Thread-0
|
||||
void dispatch(final _NativeEvent event) {
|
||||
EventQueue.invokeLater(new Runnable() {
|
||||
public void run() {
|
||||
// grab a local ref to the handler
|
||||
final H localHandler;
|
||||
synchronized (_AppEventDispatcher.this) {
|
||||
localHandler = _handler;
|
||||
}
|
||||
// grab a local ref to the handler
|
||||
final H localHandler;
|
||||
final AppContext localHandlerContext;
|
||||
synchronized (_AppEventDispatcher.this) {
|
||||
localHandler = _handler;
|
||||
localHandlerContext = handlerContext;
|
||||
}
|
||||
|
||||
// invoke the handler outside of the synchronized block
|
||||
if (localHandler == null) {
|
||||
performDefaultAction(event);
|
||||
} else {
|
||||
if (localHandler == null) {
|
||||
performDefaultAction(event);
|
||||
} else {
|
||||
SunToolkit.invokeLaterOnAppContext(localHandlerContext, new Runnable() {
|
||||
public void run() {
|
||||
performUsing(localHandler, event);
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
synchronized void setHandler(final H handler) {
|
||||
this._handler = handler;
|
||||
|
||||
setHandlerContext(AppContext.getAppContext());
|
||||
|
||||
// if a new handler is installed, block addition of legacy ApplicationListeners
|
||||
if (handler == legacyHandler) return;
|
||||
legacyHandler.blockLegacyAPI();
|
||||
@ -510,6 +531,15 @@ class _AppEventHandler {
|
||||
|
||||
void performDefaultAction(final _NativeEvent event) { } // by default, do nothing
|
||||
abstract void performUsing(final H handler, final _NativeEvent event);
|
||||
|
||||
protected void setHandlerContext(AppContext ctx) {
|
||||
if (ctx == null) {
|
||||
throw new RuntimeException(
|
||||
"Attempting to set a handler from a thread group without AppContext");
|
||||
}
|
||||
|
||||
handlerContext = ctx;
|
||||
}
|
||||
}
|
||||
|
||||
abstract class _QueuingAppEventDispatcher<H> extends _AppEventDispatcher<H> {
|
||||
@ -531,6 +561,8 @@ class _AppEventHandler {
|
||||
synchronized void setHandler(final H handler) {
|
||||
this._handler = handler;
|
||||
|
||||
setHandlerContext(AppContext.getAppContext());
|
||||
|
||||
// dispatch any events in the queue
|
||||
if (queuedEvents != null) {
|
||||
// grab a local ref to the queue, so the real one can be nulled out
|
||||
|
@ -25,6 +25,8 @@
|
||||
|
||||
package com.apple.eawt.event;
|
||||
|
||||
import sun.awt.SunToolkit;
|
||||
|
||||
import java.awt.*;
|
||||
import java.util.*;
|
||||
import java.util.List;
|
||||
@ -70,7 +72,7 @@ final class GestureHandler {
|
||||
static void handleGestureFromNative(final Window window, final int type, final double x, final double y, final double a, final double b) {
|
||||
if (window == null) return; // should never happen...
|
||||
|
||||
EventQueue.invokeLater(new Runnable() {
|
||||
SunToolkit.executeOnEventHandlerThread(window, new Runnable() {
|
||||
public void run() {
|
||||
final Component component = SwingUtilities.getDeepestComponentAt(window, (int)x, (int)y);
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2011, 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
|
||||
@ -32,6 +32,7 @@ import java.util.Hashtable;
|
||||
|
||||
import javax.swing.*;
|
||||
|
||||
import sun.awt.SunToolkit;
|
||||
import sun.lwawt.LWToolkit;
|
||||
import sun.lwawt.macosx.*;
|
||||
|
||||
@ -144,7 +145,7 @@ class ScreenMenu extends Menu implements ContainerListener, ComponentListener, S
|
||||
updateItems();
|
||||
fItemBounds = new Rectangle[invoker.getMenuComponentCount()];
|
||||
}
|
||||
}, null);
|
||||
}, invoker);
|
||||
} catch (final Exception e) {
|
||||
System.err.println(e);
|
||||
e.printStackTrace();
|
||||
@ -172,7 +173,7 @@ class ScreenMenu extends Menu implements ContainerListener, ComponentListener, S
|
||||
|
||||
fItemBounds = null;
|
||||
}
|
||||
}, null);
|
||||
}, invoker);
|
||||
} catch (final Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
@ -200,7 +201,7 @@ class ScreenMenu extends Menu implements ContainerListener, ComponentListener, S
|
||||
if (kind == 0) return;
|
||||
if (fItemBounds == null) return;
|
||||
|
||||
SwingUtilities.invokeLater(new Runnable() {
|
||||
SunToolkit.executeOnEventHandlerThread(fInvoker, new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
Component target = null;
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2011, 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
|
||||
@ -53,7 +53,7 @@ public class CCheckboxMenuItem extends CMenuItem implements CheckboxMenuItemPeer
|
||||
|
||||
public void handleAction(final boolean state) {
|
||||
final CheckboxMenuItem target = (CheckboxMenuItem)getTarget();
|
||||
EventQueue.invokeLater(new Runnable() {
|
||||
SunToolkit.executeOnEventHandlerThread(target, new Runnable() {
|
||||
public void run() {
|
||||
target.setState(state);
|
||||
}
|
||||
|
@ -107,10 +107,6 @@ public final class CDragSourceContextPeer extends SunDragSourceContextPeer {
|
||||
loc = rootComponent.getLocation();
|
||||
}
|
||||
|
||||
//It sure will be LWComponentPeer instance as rootComponent is a Window
|
||||
PlatformWindow platformWindow = ((LWComponentPeer)rootComponent.getPeer()).getPlatformWindow();
|
||||
long nativeViewPtr = CPlatformWindow.getNativeViewPtr(platformWindow);
|
||||
|
||||
// If there isn't any drag image make one of default appearance:
|
||||
if (fDragImage == null)
|
||||
this.setDefaultDragImage(component);
|
||||
@ -137,6 +133,11 @@ public final class CDragSourceContextPeer extends SunDragSourceContextPeer {
|
||||
}
|
||||
|
||||
try {
|
||||
//It sure will be LWComponentPeer instance as rootComponent is a Window
|
||||
PlatformWindow platformWindow = ((LWComponentPeer)rootComponent.getPeer()).getPlatformWindow();
|
||||
long nativeViewPtr = CPlatformWindow.getNativeViewPtr(platformWindow);
|
||||
if (nativeViewPtr == 0L) throw new InvalidDnDOperationException("Unsupported platform window implementation");
|
||||
|
||||
// Create native dragging source:
|
||||
final long nativeDragSource = createNativeDragSource(component, nativeViewPtr, transferable, triggerEvent,
|
||||
(int) (dragOrigin.getX()), (int) (dragOrigin.getY()), extModifiers,
|
||||
|
@ -52,6 +52,8 @@ public final class CDropTarget {
|
||||
fPeer = peer;
|
||||
|
||||
long nativePeer = CPlatformWindow.getNativeViewPtr(((LWComponentPeer) peer).getPlatformWindow());
|
||||
if (nativePeer == 0L) return; // Unsupported for a window without a native view (plugin)
|
||||
|
||||
// Create native dragging destination:
|
||||
fNativeDropTarget = this.createNativeDropTarget(dropTarget, component, peer, nativePeer);
|
||||
if (fNativeDropTarget == 0) {
|
||||
|
@ -479,12 +479,14 @@ public class CPlatformWindow extends CFRetainedResource implements PlatformWindo
|
||||
deliverZoom(true);
|
||||
|
||||
this.normalBounds = peer.getBounds();
|
||||
long screen = CWrapper.NSWindow.screen(getNSWindowPtr());
|
||||
Rectangle toBounds = CWrapper.NSScreen.visibleFrame(screen).getBounds();
|
||||
// Flip the y coordinate
|
||||
Rectangle frame = CWrapper.NSScreen.frame(screen).getBounds();
|
||||
toBounds.y = frame.height - toBounds.y - toBounds.height;
|
||||
setBounds(toBounds.x, toBounds.y, toBounds.width, toBounds.height);
|
||||
|
||||
GraphicsConfiguration config = getPeer().getGraphicsConfiguration();
|
||||
Insets i = ((CGraphicsDevice)config.getDevice()).getScreenInsets();
|
||||
Rectangle toBounds = config.getBounds();
|
||||
setBounds(toBounds.x + i.left,
|
||||
toBounds.y + i.top,
|
||||
toBounds.width - i.left - i.right,
|
||||
toBounds.height - i.top - i.bottom);
|
||||
}
|
||||
}
|
||||
|
||||
@ -751,13 +753,7 @@ public class CPlatformWindow extends CFRetainedResource implements PlatformWindo
|
||||
// the move/size notification from the underlying system comes
|
||||
// but it contains a bounds smaller than the whole screen
|
||||
// and therefore we need to create the synthetic notifications
|
||||
Rectangle screenBounds;
|
||||
final long screenPtr = CWrapper.NSWindow.screen(getNSWindowPtr());
|
||||
try {
|
||||
screenBounds = CWrapper.NSScreen.frame(screenPtr).getBounds();
|
||||
} finally {
|
||||
CWrapper.NSObject.release(screenPtr);
|
||||
}
|
||||
Rectangle screenBounds = getPeer().getGraphicsConfiguration().getBounds();
|
||||
peer.notifyReshape(screenBounds.x, screenBounds.y, screenBounds.width,
|
||||
screenBounds.height);
|
||||
}
|
||||
@ -900,8 +896,6 @@ public class CPlatformWindow extends CFRetainedResource implements PlatformWindo
|
||||
nativePeer = ((CPlatformWindow) platformWindow).getContentView().getAWTView();
|
||||
} else if (platformWindow instanceof CViewPlatformEmbeddedFrame){
|
||||
nativePeer = ((CViewPlatformEmbeddedFrame) platformWindow).getNSViewPtr();
|
||||
} else {
|
||||
throw new IllegalArgumentException("Unsupported platformWindow implementation");
|
||||
}
|
||||
return nativePeer;
|
||||
}
|
||||
@ -932,25 +926,19 @@ public class CPlatformWindow extends CFRetainedResource implements PlatformWindo
|
||||
|
||||
final Rectangle oldB = nativeBounds;
|
||||
nativeBounds = new Rectangle(x, y, width, height);
|
||||
final GraphicsConfiguration oldGC = peer.getGraphicsConfiguration();
|
||||
|
||||
final GraphicsConfiguration newGC = peer.getGraphicsConfiguration();
|
||||
// System-dependent appearance optimization.
|
||||
if (peer != null) {
|
||||
peer.notifyReshape(x, y, width, height);
|
||||
}
|
||||
|
||||
if ((byUser && !oldB.getSize().equals(nativeBounds.getSize()))
|
||||
|| isFullScreenAnimationOn || !Objects.equals(newGC, oldGC)) {
|
||||
flushBuffers();
|
||||
// System-dependent appearance optimization.
|
||||
if ((byUser && !oldB.getSize().equals(nativeBounds.getSize()))
|
||||
|| isFullScreenAnimationOn) {
|
||||
flushBuffers();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void deliverWindowClosingEvent() {
|
||||
if (peer != null) {
|
||||
if (peer.getBlocker() == null) {
|
||||
peer.postEvent(new WindowEvent(target, WindowEvent.WINDOW_CLOSING));
|
||||
}
|
||||
if (peer != null && peer.getBlocker() == null) {
|
||||
peer.postEvent(new WindowEvent(target, WindowEvent.WINDOW_CLOSING));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2012, 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
|
||||
@ -96,7 +96,7 @@ public class CViewEmbeddedFrame extends EmbeddedFrame {
|
||||
validate();
|
||||
setVisible(true);
|
||||
}
|
||||
}, null);
|
||||
}, this);
|
||||
} catch (InterruptedException | InvocationTargetException ex) {}
|
||||
}
|
||||
}
|
||||
|
@ -71,8 +71,6 @@ public final class CWrapper {
|
||||
public static native void zoom(long window);
|
||||
|
||||
public static native void makeFirstResponder(long window, long responder);
|
||||
|
||||
public static native long screen(long window);
|
||||
}
|
||||
|
||||
public static final class NSView {
|
||||
@ -95,12 +93,6 @@ public final class CWrapper {
|
||||
public static native void release(long object);
|
||||
}
|
||||
|
||||
public static final class NSScreen {
|
||||
public static native Rectangle2D frame(long screen);
|
||||
public static native Rectangle2D visibleFrame(long screen);
|
||||
public static native long screenByDisplayId(int displayID);
|
||||
}
|
||||
|
||||
public static final class NSColor {
|
||||
public static native long clearColor();
|
||||
}
|
||||
|
@ -82,8 +82,13 @@ JNF_COCOA_ENTER(env);
|
||||
// keys, so we need to do the same translation here that we do
|
||||
// for the regular key down events
|
||||
if ([eventKey length] == 1) {
|
||||
unichar ch = NsCharToJavaChar([eventKey characterAtIndex:0], 0);
|
||||
eventKey = [NSString stringWithCharacters: &ch length: 1];
|
||||
unichar origChar = [eventKey characterAtIndex:0];
|
||||
unichar newChar = NsCharToJavaChar(origChar, 0);
|
||||
if (newChar == java_awt_event_KeyEvent_CHAR_UNDEFINED) {
|
||||
newChar = origChar;
|
||||
}
|
||||
|
||||
eventKey = [NSString stringWithCharacters: &newChar length: 1];
|
||||
}
|
||||
|
||||
if ([menuKey isEqualToString:eventKey]) {
|
||||
|
@ -396,31 +396,6 @@ JNF_COCOA_ENTER(env);
|
||||
JNF_COCOA_EXIT(env);
|
||||
}
|
||||
|
||||
/*
|
||||
* Class: sun_lwawt_macosx_CWrapper$NSWindow
|
||||
* Method: screen
|
||||
* Signature: (J)J
|
||||
*/
|
||||
JNIEXPORT jlong JNICALL
|
||||
Java_sun_lwawt_macosx_CWrapper_00024NSWindow_screen
|
||||
(JNIEnv *env, jclass cls, jlong windowPtr)
|
||||
{
|
||||
__block jlong screenPtr = 0L;
|
||||
|
||||
JNF_COCOA_ENTER(env);
|
||||
|
||||
AWTWindow *window = (AWTWindow *)jlong_to_ptr(windowPtr);
|
||||
[ThreadUtilities performOnMainThreadWaiting:YES block:^(){
|
||||
const NSScreen *screen = [window screen];
|
||||
CFRetain(screen); // GC
|
||||
screenPtr = ptr_to_jlong(screen);
|
||||
}];
|
||||
|
||||
JNF_COCOA_EXIT(env);
|
||||
|
||||
return screenPtr;
|
||||
}
|
||||
|
||||
/*
|
||||
* Method: miniaturize
|
||||
* Signature: (J)V
|
||||
@ -690,92 +665,6 @@ JNF_COCOA_ENTER(env);
|
||||
JNF_COCOA_EXIT(env);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Class: sun_lwawt_macosx_CWrapper$NSScreen
|
||||
* Method: frame
|
||||
* Signature: (J)Ljava/awt/Rectangle;
|
||||
*/
|
||||
JNIEXPORT jobject JNICALL
|
||||
Java_sun_lwawt_macosx_CWrapper_00024NSScreen_frame
|
||||
(JNIEnv *env, jclass cls, jlong screenPtr)
|
||||
{
|
||||
jobject jRect = NULL;
|
||||
|
||||
JNF_COCOA_ENTER(env);
|
||||
|
||||
__block NSRect rect = NSZeroRect;
|
||||
|
||||
NSScreen *screen = (NSScreen *)jlong_to_ptr(screenPtr);
|
||||
[ThreadUtilities performOnMainThreadWaiting:YES block:^(){
|
||||
rect = [screen frame];
|
||||
}];
|
||||
|
||||
jRect = NSToJavaRect(env, rect);
|
||||
|
||||
JNF_COCOA_EXIT(env);
|
||||
|
||||
return jRect;
|
||||
}
|
||||
|
||||
/*
|
||||
* Class: sun_lwawt_macosx_CWrapper_NSScreen
|
||||
* Method: visibleFrame
|
||||
* Signature: (J)Ljava/awt/geom/Rectangle2D;
|
||||
*/
|
||||
JNIEXPORT jobject JNICALL
|
||||
Java_sun_lwawt_macosx_CWrapper_00024NSScreen_visibleFrame
|
||||
(JNIEnv *env, jclass cls, jlong screenPtr)
|
||||
{
|
||||
jobject jRect = NULL;
|
||||
|
||||
JNF_COCOA_ENTER(env);
|
||||
|
||||
__block NSRect rect = NSZeroRect;
|
||||
|
||||
NSScreen *screen = (NSScreen *)jlong_to_ptr(screenPtr);
|
||||
[ThreadUtilities performOnMainThreadWaiting:YES block:^(){
|
||||
rect = [screen visibleFrame];
|
||||
}];
|
||||
|
||||
jRect = NSToJavaRect(env, rect);
|
||||
|
||||
JNF_COCOA_EXIT(env);
|
||||
|
||||
return jRect;
|
||||
}
|
||||
|
||||
/*
|
||||
* Class: sun_lwawt_macosx_CWrapper_NSScreen
|
||||
* Method: screenByDisplayId
|
||||
* Signature: (J)J
|
||||
*/
|
||||
JNIEXPORT jlong JNICALL
|
||||
Java_sun_lwawt_macosx_CWrapper_00024NSScreen_screenByDisplayId
|
||||
(JNIEnv *env, jclass cls, jint displayID)
|
||||
{
|
||||
__block jlong screenPtr = 0L;
|
||||
|
||||
JNF_COCOA_ENTER(env);
|
||||
|
||||
[ThreadUtilities performOnMainThreadWaiting:YES block:^(){
|
||||
NSArray *screens = [NSScreen screens];
|
||||
for (NSScreen *screen in screens) {
|
||||
NSDictionary *screenInfo = [screen deviceDescription];
|
||||
NSNumber *screenID = [screenInfo objectForKey:@"NSScreenNumber"];
|
||||
if ([screenID intValue] == displayID){
|
||||
CFRetain(screen); // GC
|
||||
screenPtr = ptr_to_jlong(screen);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}];
|
||||
|
||||
JNF_COCOA_EXIT(env);
|
||||
|
||||
return screenPtr;
|
||||
}
|
||||
|
||||
/*
|
||||
* Class: sun_lwawt_macosx_CWrapper$NSColor
|
||||
* Method: clearColor
|
||||
|
@ -102,7 +102,7 @@ horizontal=horizontal
|
||||
#
|
||||
# accessible actions
|
||||
#
|
||||
toggle expand=toggle expand
|
||||
toggleexpand=toggle expand
|
||||
|
||||
# new relations, roles and states for J2SE 1.5.0
|
||||
|
||||
|
@ -102,7 +102,7 @@ horizontal=horizontal
|
||||
#
|
||||
# accessible actions
|
||||
#
|
||||
toggle expand=ein-/ausblenden
|
||||
toggleexpand=ein-/ausblenden
|
||||
|
||||
# new relations, roles and states for J2SE 1.5.0
|
||||
|
||||
|
@ -102,7 +102,7 @@ horizontal=horizontal
|
||||
#
|
||||
# accessible actions
|
||||
#
|
||||
toggle expand=activar/desactivar ampliaci\u00F3n
|
||||
toggleexpand=activar/desactivar ampliaci\u00F3n
|
||||
|
||||
# new relations, roles and states for J2SE 1.5.0
|
||||
|
||||
|
@ -102,7 +102,7 @@ horizontal=horizontal
|
||||
#
|
||||
# accessible actions
|
||||
#
|
||||
toggle expand=basculer le d\u00E9veloppement
|
||||
toggleexpand=basculer le d\u00E9veloppement
|
||||
|
||||
# new relations, roles and states for J2SE 1.5.0
|
||||
|
||||
|
@ -102,7 +102,7 @@ horizontal=orizzontale
|
||||
#
|
||||
# accessible actions
|
||||
#
|
||||
toggle expand=abilita/disabilita espansione
|
||||
toggleexpand=abilita/disabilita espansione
|
||||
|
||||
# new relations, roles and states for J2SE 1.5.0
|
||||
|
||||
|
@ -102,7 +102,7 @@ horizontal=\u6C34\u5E73
|
||||
#
|
||||
# accessible actions
|
||||
#
|
||||
toggle expand=\u5C55\u958B\u306E\u30C8\u30B0\u30EB
|
||||
toggleexpand=\u5C55\u958B\u306E\u30C8\u30B0\u30EB
|
||||
|
||||
# new relations, roles and states for J2SE 1.5.0
|
||||
|
||||
|
@ -102,7 +102,7 @@ horizontal=\uAC00\uB85C
|
||||
#
|
||||
# accessible actions
|
||||
#
|
||||
toggle expand=\uD1A0\uAE00 \uD655\uC7A5
|
||||
toggleexpand=\uD1A0\uAE00 \uD655\uC7A5
|
||||
|
||||
# new relations, roles and states for J2SE 1.5.0
|
||||
|
||||
|
@ -102,7 +102,7 @@ horizontal=horizontal
|
||||
#
|
||||
# accessible actions
|
||||
#
|
||||
toggle expand=alternar expans\u00E3o
|
||||
toggleexpand=alternar expans\u00E3o
|
||||
|
||||
# new relations, roles and states for J2SE 1.5.0
|
||||
|
||||
|
@ -102,7 +102,7 @@ horizontal=horisontell
|
||||
#
|
||||
# accessible actions
|
||||
#
|
||||
toggle expand=v\u00E4xla ut\u00F6ka
|
||||
toggleexpand=v\u00E4xla ut\u00F6ka
|
||||
|
||||
# new relations, roles and states for J2SE 1.5.0
|
||||
|
||||
|
@ -102,7 +102,7 @@ horizontal=\u6C34\u5E73
|
||||
#
|
||||
# accessible actions
|
||||
#
|
||||
toggle expand=\u5207\u6362\u5C55\u5F00
|
||||
toggleexpand=\u5207\u6362\u5C55\u5F00
|
||||
|
||||
# new relations, roles and states for J2SE 1.5.0
|
||||
|
||||
|
@ -102,7 +102,7 @@ horizontal=\u6C34\u5E73
|
||||
#
|
||||
# accessible actions
|
||||
#
|
||||
toggle expand=\u5207\u63DB\u64F4\u5C55
|
||||
toggleexpand=\u5207\u63DB\u64F4\u5C55
|
||||
|
||||
# new relations, roles and states for J2SE 1.5.0
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1997, 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
|
||||
@ -31,6 +31,7 @@ import javax.crypto.spec.DESKeySpec;
|
||||
import java.security.InvalidKeyException;
|
||||
import java.security.spec.KeySpec;
|
||||
import java.security.spec.InvalidKeySpecException;
|
||||
import javax.crypto.spec.SecretKeySpec;
|
||||
|
||||
/**
|
||||
* This class implements the DES key factory of the Sun provider.
|
||||
@ -60,20 +61,22 @@ public final class DESKeyFactory extends SecretKeyFactorySpi {
|
||||
*/
|
||||
protected SecretKey engineGenerateSecret(KeySpec keySpec)
|
||||
throws InvalidKeySpecException {
|
||||
DESKey desKey = null;
|
||||
|
||||
try {
|
||||
if (!(keySpec instanceof DESKeySpec)) {
|
||||
throw new InvalidKeySpecException
|
||||
("Inappropriate key specification");
|
||||
if (keySpec instanceof DESKeySpec) {
|
||||
return new DESKey(((DESKeySpec)keySpec).getKey());
|
||||
}
|
||||
else {
|
||||
DESKeySpec desKeySpec = (DESKeySpec)keySpec;
|
||||
desKey = new DESKey(desKeySpec.getKey());
|
||||
|
||||
if (keySpec instanceof SecretKeySpec) {
|
||||
return new DESKey(((SecretKeySpec)keySpec).getEncoded());
|
||||
}
|
||||
|
||||
throw new InvalidKeySpecException(
|
||||
"Inappropriate key specification");
|
||||
|
||||
} catch (InvalidKeyException e) {
|
||||
throw new InvalidKeySpecException(e.getMessage());
|
||||
}
|
||||
return desKey;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1997, 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
|
||||
@ -31,6 +31,7 @@ import javax.crypto.spec.DESedeKeySpec;
|
||||
import java.security.InvalidKeyException;
|
||||
import java.security.spec.KeySpec;
|
||||
import java.security.spec.InvalidKeySpecException;
|
||||
import javax.crypto.spec.SecretKeySpec;
|
||||
|
||||
/**
|
||||
* This class implements the DES-EDE key factory of the Sun provider.
|
||||
@ -60,20 +61,20 @@ public final class DESedeKeyFactory extends SecretKeyFactorySpi {
|
||||
*/
|
||||
protected SecretKey engineGenerateSecret(KeySpec keySpec)
|
||||
throws InvalidKeySpecException {
|
||||
DESedeKey desEdeKey = null;
|
||||
|
||||
try {
|
||||
if (keySpec instanceof DESedeKeySpec) {
|
||||
DESedeKeySpec desEdeKeySpec = (DESedeKeySpec)keySpec;
|
||||
desEdeKey = new DESedeKey(desEdeKeySpec.getKey());
|
||||
|
||||
} else {
|
||||
throw new InvalidKeySpecException
|
||||
("Inappropriate key specification");
|
||||
return new DESedeKey(((DESedeKeySpec)keySpec).getKey());
|
||||
}
|
||||
if (keySpec instanceof SecretKeySpec) {
|
||||
return new DESedeKey(((SecretKeySpec)keySpec).getEncoded());
|
||||
|
||||
}
|
||||
throw new InvalidKeySpecException
|
||||
("Inappropriate key specification");
|
||||
} catch (InvalidKeyException e) {
|
||||
throw new InvalidKeySpecException(e.getMessage());
|
||||
}
|
||||
return desEdeKey;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1997, 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
|
||||
@ -83,7 +83,7 @@ public final class DHKeyFactory extends KeyFactorySpi {
|
||||
}
|
||||
} catch (InvalidKeyException e) {
|
||||
throw new InvalidKeySpecException
|
||||
("Inappropriate key specification");
|
||||
("Inappropriate key specification", e);
|
||||
}
|
||||
}
|
||||
|
||||
@ -118,7 +118,7 @@ public final class DHKeyFactory extends KeyFactorySpi {
|
||||
}
|
||||
} catch (InvalidKeyException e) {
|
||||
throw new InvalidKeySpecException
|
||||
("Inappropriate key specification");
|
||||
("Inappropriate key specification", e);
|
||||
}
|
||||
}
|
||||
|
||||
@ -227,7 +227,7 @@ public final class DHKeyFactory extends KeyFactorySpi {
|
||||
}
|
||||
|
||||
} catch (InvalidKeySpecException e) {
|
||||
throw new InvalidKeyException("Cannot translate key");
|
||||
throw new InvalidKeyException("Cannot translate key", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -167,15 +167,16 @@ public final class DHKeyPairGenerator extends KeyPairGeneratorSpi {
|
||||
BigInteger pMinus2 = p.subtract(BigInteger.valueOf(2));
|
||||
|
||||
//
|
||||
// Handbook of Applied Cryptography: Menezes, et.al.
|
||||
// Repeat if the following does not hold:
|
||||
// 1 <= x <= p-2
|
||||
// PKCS#3 section 7.1 "Private-value generation"
|
||||
// Repeat if either of the followings does not hold:
|
||||
// 0 < x < p-1
|
||||
// 2^(lSize-1) <= x < 2^(lSize)
|
||||
//
|
||||
do {
|
||||
// generate random x up to 2^lSize bits long
|
||||
x = new BigInteger(lSize, random);
|
||||
} while ((x.compareTo(BigInteger.ONE) < 0) ||
|
||||
((x.compareTo(pMinus2) > 0)));
|
||||
((x.compareTo(pMinus2) > 0)) || (x.bitLength() != lSize));
|
||||
|
||||
// calculate public value y
|
||||
BigInteger y = g.modPow(x, p);
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1997, 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
|
||||
@ -26,6 +26,7 @@
|
||||
package com.sun.crypto.provider;
|
||||
|
||||
import java.io.*;
|
||||
import java.util.Objects;
|
||||
import java.math.BigInteger;
|
||||
import java.security.KeyRep;
|
||||
import java.security.PrivateKey;
|
||||
@ -67,7 +68,7 @@ javax.crypto.interfaces.DHPrivateKey, Serializable {
|
||||
// the base generator
|
||||
private BigInteger g;
|
||||
|
||||
// the private-value length
|
||||
// the private-value length (optional)
|
||||
private int l;
|
||||
|
||||
private int DH_data[] = { 1, 2, 840, 113549, 1, 3, 1 };
|
||||
@ -179,20 +180,9 @@ javax.crypto.interfaces.DHPrivateKey, Serializable {
|
||||
this.key = val.data.getOctetString();
|
||||
parseKeyBits();
|
||||
|
||||
// ignore OPTIONAL attributes
|
||||
|
||||
this.encodedKey = encodedKey.clone();
|
||||
|
||||
} catch (NumberFormatException e) {
|
||||
InvalidKeyException ike = new InvalidKeyException(
|
||||
"Private-value length too big");
|
||||
ike.initCause(e);
|
||||
throw ike;
|
||||
} catch (IOException e) {
|
||||
InvalidKeyException ike = new InvalidKeyException(
|
||||
"Error parsing key encoding: " + e.getMessage());
|
||||
ike.initCause(e);
|
||||
throw ike;
|
||||
} catch (IOException | NumberFormatException e) {
|
||||
throw new InvalidKeyException("Error parsing key encoding", e);
|
||||
}
|
||||
}
|
||||
|
||||
@ -234,8 +224,9 @@ javax.crypto.interfaces.DHPrivateKey, Serializable {
|
||||
DerOutputStream params = new DerOutputStream();
|
||||
params.putInteger(this.p);
|
||||
params.putInteger(this.g);
|
||||
if (this.l != 0)
|
||||
if (this.l != 0) {
|
||||
params.putInteger(this.l);
|
||||
}
|
||||
// wrap parameters into SEQUENCE
|
||||
DerValue paramSequence = new DerValue(DerValue.tag_Sequence,
|
||||
params.toByteArray());
|
||||
@ -273,10 +264,11 @@ javax.crypto.interfaces.DHPrivateKey, Serializable {
|
||||
* @return the key parameters
|
||||
*/
|
||||
public DHParameterSpec getParams() {
|
||||
if (this.l != 0)
|
||||
if (this.l != 0) {
|
||||
return new DHParameterSpec(this.p, this.g, this.l);
|
||||
else
|
||||
} else {
|
||||
return new DHParameterSpec(this.p, this.g);
|
||||
}
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
@ -312,26 +304,21 @@ javax.crypto.interfaces.DHPrivateKey, Serializable {
|
||||
* Objects that are equal will also have the same hashcode.
|
||||
*/
|
||||
public int hashCode() {
|
||||
int retval = 0;
|
||||
byte[] enc = getEncoded();
|
||||
|
||||
for (int i = 1; i < enc.length; i++) {
|
||||
retval += enc[i] * i;
|
||||
}
|
||||
return(retval);
|
||||
return Objects.hash(x, p, g);
|
||||
}
|
||||
|
||||
public boolean equals(Object obj) {
|
||||
if (this == obj)
|
||||
return true;
|
||||
if (this == obj) return true;
|
||||
|
||||
if (!(obj instanceof PrivateKey))
|
||||
if (!(obj instanceof javax.crypto.interfaces.DHPrivateKey)) {
|
||||
return false;
|
||||
|
||||
byte[] thisEncoded = this.getEncoded();
|
||||
byte[] thatEncoded = ((PrivateKey)obj).getEncoded();
|
||||
|
||||
return java.util.Arrays.equals(thisEncoded, thatEncoded);
|
||||
}
|
||||
javax.crypto.interfaces.DHPrivateKey other =
|
||||
(javax.crypto.interfaces.DHPrivateKey) obj;
|
||||
DHParameterSpec otherParams = other.getParams();
|
||||
return ((this.x.compareTo(other.getX()) == 0) &&
|
||||
(this.p.compareTo(otherParams.getP()) == 0) &&
|
||||
(this.g.compareTo(otherParams.getG()) == 0));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1997, 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
|
||||
@ -26,6 +26,7 @@
|
||||
package com.sun.crypto.provider;
|
||||
|
||||
import java.io.*;
|
||||
import java.util.Objects;
|
||||
import java.math.BigInteger;
|
||||
import java.security.KeyRep;
|
||||
import java.security.InvalidKeyException;
|
||||
@ -64,7 +65,7 @@ javax.crypto.interfaces.DHPublicKey, Serializable {
|
||||
// the base generator
|
||||
private BigInteger g;
|
||||
|
||||
// the private-value length
|
||||
// the private-value length (optional)
|
||||
private int l;
|
||||
|
||||
private int DH_data[] = { 1, 2, 840, 113549, 1, 3, 1 };
|
||||
@ -173,13 +174,8 @@ javax.crypto.interfaces.DHPublicKey, Serializable {
|
||||
}
|
||||
|
||||
this.encodedKey = encodedKey.clone();
|
||||
|
||||
} catch (NumberFormatException e) {
|
||||
throw new InvalidKeyException("Private-value length too big");
|
||||
|
||||
} catch (IOException e) {
|
||||
throw new InvalidKeyException(
|
||||
"Error parsing key encoding: " + e.toString());
|
||||
} catch (IOException | NumberFormatException e) {
|
||||
throw new InvalidKeyException("Error parsing key encoding", e);
|
||||
}
|
||||
}
|
||||
|
||||
@ -212,8 +208,9 @@ javax.crypto.interfaces.DHPublicKey, Serializable {
|
||||
DerOutputStream params = new DerOutputStream();
|
||||
params.putInteger(this.p);
|
||||
params.putInteger(this.g);
|
||||
if (this.l != 0)
|
||||
if (this.l != 0) {
|
||||
params.putInteger(this.l);
|
||||
}
|
||||
// wrap parameters into SEQUENCE
|
||||
DerValue paramSequence = new DerValue(DerValue.tag_Sequence,
|
||||
params.toByteArray());
|
||||
@ -253,10 +250,11 @@ javax.crypto.interfaces.DHPublicKey, Serializable {
|
||||
* @return the key parameters
|
||||
*/
|
||||
public DHParameterSpec getParams() {
|
||||
if (this.l != 0)
|
||||
if (this.l != 0) {
|
||||
return new DHParameterSpec(this.p, this.g, this.l);
|
||||
else
|
||||
} else {
|
||||
return new DHParameterSpec(this.p, this.g);
|
||||
}
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
@ -290,26 +288,22 @@ javax.crypto.interfaces.DHPublicKey, Serializable {
|
||||
* Objects that are equal will also have the same hashcode.
|
||||
*/
|
||||
public int hashCode() {
|
||||
int retval = 0;
|
||||
byte[] enc = getEncoded();
|
||||
|
||||
for (int i = 1; i < enc.length; i++) {
|
||||
retval += enc[i] * i;
|
||||
}
|
||||
return(retval);
|
||||
return Objects.hash(y, p, g);
|
||||
}
|
||||
|
||||
public boolean equals(Object obj) {
|
||||
if (this == obj)
|
||||
return true;
|
||||
if (this == obj) return true;
|
||||
|
||||
if (!(obj instanceof PublicKey))
|
||||
if (!(obj instanceof javax.crypto.interfaces.DHPublicKey)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
byte[] thisEncoded = this.getEncoded();
|
||||
byte[] thatEncoded = ((PublicKey)obj).getEncoded();
|
||||
|
||||
return java.util.Arrays.equals(thisEncoded, thatEncoded);
|
||||
javax.crypto.interfaces.DHPublicKey other =
|
||||
(javax.crypto.interfaces.DHPublicKey) obj;
|
||||
DHParameterSpec otherParams = other.getParams();
|
||||
return ((this.y.compareTo(other.getY()) == 0) &&
|
||||
(this.p.compareTo(otherParams.getP()) == 0) &&
|
||||
(this.g.compareTo(otherParams.getG()) == 0));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -134,7 +134,7 @@ public class UnpackerImpl extends TLGlobals implements Pack200.Unpacker {
|
||||
} else {
|
||||
try {
|
||||
(new NativeUnpack(this)).run(in0, out);
|
||||
} catch (UnsatisfiedLinkError ule) {
|
||||
} catch (UnsatisfiedLinkError | NoClassDefFoundError ex) {
|
||||
// failover to java implementation
|
||||
(new DoUnpack()).run(in0, out);
|
||||
}
|
||||
|
@ -52,6 +52,7 @@ import javax.management.NotCompliantMBeanException;
|
||||
import com.sun.jmx.remote.util.EnvHelp;
|
||||
import java.lang.reflect.Array;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.security.AccessController;
|
||||
import javax.management.AttributeNotFoundException;
|
||||
import javax.management.openmbean.CompositeData;
|
||||
import sun.reflect.misc.MethodUtil;
|
||||
@ -64,7 +65,11 @@ import sun.reflect.misc.ReflectUtil;
|
||||
* @since 1.5
|
||||
*/
|
||||
public class Introspector {
|
||||
|
||||
final public static boolean ALLOW_NONPUBLIC_MBEAN;
|
||||
static {
|
||||
String val = AccessController.doPrivileged(new GetPropertyAction("jdk.jmx.mbeans.allowNonPublic"));
|
||||
ALLOW_NONPUBLIC_MBEAN = Boolean.parseBoolean(val);
|
||||
}
|
||||
|
||||
/*
|
||||
* ------------------------------------------
|
||||
@ -223,11 +228,27 @@ public class Introspector {
|
||||
return testCompliance(baseClass, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests the given interface class for being a compliant MXBean interface.
|
||||
* A compliant MXBean interface is any publicly accessible interface
|
||||
* following the {@link MXBean} conventions.
|
||||
* @param interfaceClass An interface class to test for the MXBean compliance
|
||||
* @throws NotCompliantMBeanException Thrown when the tested interface
|
||||
* is not public or contradicts the {@link MXBean} conventions.
|
||||
*/
|
||||
public static void testComplianceMXBeanInterface(Class<?> interfaceClass)
|
||||
throws NotCompliantMBeanException {
|
||||
MXBeanIntrospector.getInstance().getAnalyzer(interfaceClass);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests the given interface class for being a compliant MBean interface.
|
||||
* A compliant MBean interface is any publicly accessible interface
|
||||
* following the {@code MBean} conventions.
|
||||
* @param interfaceClass An interface class to test for the MBean compliance
|
||||
* @throws NotCompliantMBeanException Thrown when the tested interface
|
||||
* is not public or contradicts the {@code MBean} conventions.
|
||||
*/
|
||||
public static void testComplianceMBeanInterface(Class<?> interfaceClass)
|
||||
throws NotCompliantMBeanException{
|
||||
StandardMBeanIntrospector.getInstance().getAnalyzer(interfaceClass);
|
||||
@ -299,18 +320,18 @@ public class Introspector {
|
||||
* not a JMX compliant Standard MBean.
|
||||
*/
|
||||
public static <T> Class<? super T> getStandardMBeanInterface(Class<T> baseClass)
|
||||
throws NotCompliantMBeanException {
|
||||
Class<? super T> current = baseClass;
|
||||
Class<? super T> mbeanInterface = null;
|
||||
while (current != null) {
|
||||
mbeanInterface =
|
||||
findMBeanInterface(current, current.getName());
|
||||
if (mbeanInterface != null) break;
|
||||
current = current.getSuperclass();
|
||||
}
|
||||
if (mbeanInterface != null) {
|
||||
return mbeanInterface;
|
||||
} else {
|
||||
throws NotCompliantMBeanException {
|
||||
Class<? super T> current = baseClass;
|
||||
Class<? super T> mbeanInterface = null;
|
||||
while (current != null) {
|
||||
mbeanInterface =
|
||||
findMBeanInterface(current, current.getName());
|
||||
if (mbeanInterface != null) break;
|
||||
current = current.getSuperclass();
|
||||
}
|
||||
if (mbeanInterface != null) {
|
||||
return mbeanInterface;
|
||||
} else {
|
||||
final String msg =
|
||||
"Class " + baseClass.getName() +
|
||||
" is not a JMX compliant Standard MBean";
|
||||
@ -507,8 +528,11 @@ public class Introspector {
|
||||
}
|
||||
Class<?>[] interfaces = c.getInterfaces();
|
||||
for (int i = 0;i < interfaces.length; i++) {
|
||||
if (interfaces[i].getName().equals(clMBeanName))
|
||||
if (interfaces[i].getName().equals(clMBeanName) &&
|
||||
(Modifier.isPublic(interfaces[i].getModifiers()) ||
|
||||
ALLOW_NONPUBLIC_MBEAN)) {
|
||||
return Util.cast(interfaces[i]);
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
|
@ -28,6 +28,8 @@ package com.sun.jmx.mbeanserver;
|
||||
import static com.sun.jmx.mbeanserver.Util.*;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
import java.lang.reflect.Modifier;
|
||||
import java.security.AccessController;
|
||||
import java.util.Arrays;
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
@ -50,7 +52,6 @@ import javax.management.NotCompliantMBeanException;
|
||||
* @since 1.6
|
||||
*/
|
||||
class MBeanAnalyzer<M> {
|
||||
|
||||
static interface MBeanVisitor<M> {
|
||||
public void visitAttribute(String attributeName,
|
||||
M getter,
|
||||
@ -107,6 +108,10 @@ class MBeanAnalyzer<M> {
|
||||
if (!mbeanType.isInterface()) {
|
||||
throw new NotCompliantMBeanException("Not an interface: " +
|
||||
mbeanType.getName());
|
||||
} else if (!Modifier.isPublic(mbeanType.getModifiers()) &&
|
||||
!Introspector.ALLOW_NONPUBLIC_MBEAN) {
|
||||
throw new NotCompliantMBeanException("Interface is not public: " +
|
||||
mbeanType.getName());
|
||||
}
|
||||
|
||||
try {
|
||||
|
@ -2,82 +2,78 @@
|
||||
* reserved comment block
|
||||
* DO NOT REMOVE OR ALTER!
|
||||
*/
|
||||
/*
|
||||
* Copyright 1999-2004 The Apache Software Foundation.
|
||||
/**
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package com.sun.org.apache.xml.internal.security.algorithms;
|
||||
|
||||
|
||||
|
||||
import com.sun.org.apache.xml.internal.security.exceptions.XMLSecurityException;
|
||||
import com.sun.org.apache.xml.internal.security.utils.Constants;
|
||||
import com.sun.org.apache.xml.internal.security.utils.SignatureElementProxy;
|
||||
import org.w3c.dom.Document;
|
||||
import org.w3c.dom.Element;
|
||||
|
||||
|
||||
/**
|
||||
* The Algorithm class which stores the Algorithm URI as a string.
|
||||
*
|
||||
*/
|
||||
public abstract class Algorithm extends SignatureElementProxy {
|
||||
|
||||
/**
|
||||
*
|
||||
* @param doc
|
||||
* @param algorithmURI is the URI of the algorithm as String
|
||||
*/
|
||||
public Algorithm(Document doc, String algorithmURI) {
|
||||
/**
|
||||
*
|
||||
* @param doc
|
||||
* @param algorithmURI is the URI of the algorithm as String
|
||||
*/
|
||||
public Algorithm(Document doc, String algorithmURI) {
|
||||
super(doc);
|
||||
|
||||
super(doc);
|
||||
this.setAlgorithmURI(algorithmURI);
|
||||
}
|
||||
|
||||
this.setAlgorithmURI(algorithmURI);
|
||||
}
|
||||
/**
|
||||
* Constructor Algorithm
|
||||
*
|
||||
* @param element
|
||||
* @param BaseURI
|
||||
* @throws XMLSecurityException
|
||||
*/
|
||||
public Algorithm(Element element, String BaseURI) throws XMLSecurityException {
|
||||
super(element, BaseURI);
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructor Algorithm
|
||||
*
|
||||
* @param element
|
||||
* @param BaseURI
|
||||
* @throws XMLSecurityException
|
||||
*/
|
||||
public Algorithm(Element element, String BaseURI)
|
||||
throws XMLSecurityException {
|
||||
super(element, BaseURI);
|
||||
}
|
||||
/**
|
||||
* Method getAlgorithmURI
|
||||
*
|
||||
* @return The URI of the algorithm
|
||||
*/
|
||||
public String getAlgorithmURI() {
|
||||
return this.constructionElement.getAttributeNS(null, Constants._ATT_ALGORITHM);
|
||||
}
|
||||
|
||||
/**
|
||||
* Method getAlgorithmURI
|
||||
*
|
||||
* @return The URI of the alogrithm
|
||||
*/
|
||||
public String getAlgorithmURI() {
|
||||
return this._constructionElement.getAttributeNS(null, Constants._ATT_ALGORITHM);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the algorithm's URI as used in the signature.
|
||||
*
|
||||
* @param algorithmURI is the URI of the algorithm as String
|
||||
*/
|
||||
protected void setAlgorithmURI(String algorithmURI) {
|
||||
|
||||
if ( (algorithmURI != null)) {
|
||||
this._constructionElement.setAttributeNS(null, Constants._ATT_ALGORITHM,
|
||||
algorithmURI);
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Sets the algorithm's URI as used in the signature.
|
||||
*
|
||||
* @param algorithmURI is the URI of the algorithm as String
|
||||
*/
|
||||
protected void setAlgorithmURI(String algorithmURI) {
|
||||
if (algorithmURI != null) {
|
||||
this.constructionElement.setAttributeNS(
|
||||
null, Constants._ATT_ALGORITHM, algorithmURI
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -114,6 +114,18 @@ public class JCEMapper {
|
||||
XMLSignature.ALGO_ID_SIGNATURE_ECDSA_SHA1,
|
||||
new Algorithm("", "SHA1withECDSA", "Signature")
|
||||
);
|
||||
algorithmsMap.put(
|
||||
XMLSignature.ALGO_ID_SIGNATURE_ECDSA_SHA256,
|
||||
new Algorithm("", "SHA256withECDSA", "Signature")
|
||||
);
|
||||
algorithmsMap.put(
|
||||
XMLSignature.ALGO_ID_SIGNATURE_ECDSA_SHA384,
|
||||
new Algorithm("", "SHA384withECDSA", "Signature")
|
||||
);
|
||||
algorithmsMap.put(
|
||||
XMLSignature.ALGO_ID_SIGNATURE_ECDSA_SHA512,
|
||||
new Algorithm("", "SHA512withECDSA", "Signature")
|
||||
);
|
||||
algorithmsMap.put(
|
||||
XMLSignature.ALGO_ID_MAC_HMAC_NOT_RECOMMENDED_MD5,
|
||||
new Algorithm("", "HmacMD5", "Mac")
|
||||
@ -154,6 +166,18 @@ public class JCEMapper {
|
||||
XMLCipher.AES_256,
|
||||
new Algorithm("AES", "AES/CBC/ISO10126Padding", "BlockEncryption", 256)
|
||||
);
|
||||
algorithmsMap.put(
|
||||
XMLCipher.AES_128_GCM,
|
||||
new Algorithm("AES", "AES/GCM/NoPadding", "BlockEncryption", 128)
|
||||
);
|
||||
algorithmsMap.put(
|
||||
XMLCipher.AES_192_GCM,
|
||||
new Algorithm("AES", "AES/GCM/NoPadding", "BlockEncryption", 192)
|
||||
);
|
||||
algorithmsMap.put(
|
||||
XMLCipher.AES_256_GCM,
|
||||
new Algorithm("AES", "AES/GCM/NoPadding", "BlockEncryption", 256)
|
||||
);
|
||||
algorithmsMap.put(
|
||||
XMLCipher.RSA_v1dot5,
|
||||
new Algorithm("RSA", "RSA/ECB/PKCS1Padding", "KeyTransport")
|
||||
@ -162,6 +186,10 @@ public class JCEMapper {
|
||||
XMLCipher.RSA_OAEP,
|
||||
new Algorithm("RSA", "RSA/ECB/OAEPPadding", "KeyTransport")
|
||||
);
|
||||
algorithmsMap.put(
|
||||
XMLCipher.RSA_OAEP_11,
|
||||
new Algorithm("RSA", "RSA/ECB/OAEPPadding", "KeyTransport")
|
||||
);
|
||||
algorithmsMap.put(
|
||||
XMLCipher.DIFFIE_HELLMAN,
|
||||
new Algorithm("", "", "KeyAgreement")
|
||||
|
@ -2,265 +2,254 @@
|
||||
* reserved comment block
|
||||
* DO NOT REMOVE OR ALTER!
|
||||
*/
|
||||
/*
|
||||
* Copyright 1999-2004 The Apache Software Foundation.
|
||||
/**
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package com.sun.org.apache.xml.internal.security.algorithms;
|
||||
|
||||
import java.security.MessageDigest;
|
||||
import java.security.NoSuchProviderException;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import com.sun.org.apache.xml.internal.security.signature.XMLSignatureException;
|
||||
import com.sun.org.apache.xml.internal.security.utils.Constants;
|
||||
import com.sun.org.apache.xml.internal.security.utils.EncryptionConstants;
|
||||
import org.w3c.dom.Document;
|
||||
|
||||
|
||||
/**
|
||||
* Digest Message wrapper & selector class.
|
||||
*
|
||||
* <pre>
|
||||
* MessageDigestAlgorithm.getInstance()
|
||||
* </pre>
|
||||
*
|
||||
*/
|
||||
public class MessageDigestAlgorithm extends Algorithm {
|
||||
|
||||
/** Message Digest - NOT RECOMMENDED MD5*/
|
||||
public static final String ALGO_ID_DIGEST_NOT_RECOMMENDED_MD5 = Constants.MoreAlgorithmsSpecNS + "md5";
|
||||
/** Digest - Required SHA1*/
|
||||
public static final String ALGO_ID_DIGEST_SHA1 = Constants.SignatureSpecNS + "sha1";
|
||||
/** Message Digest - RECOMMENDED SHA256*/
|
||||
public static final String ALGO_ID_DIGEST_SHA256 = EncryptionConstants.EncryptionSpecNS + "sha256";
|
||||
/** Message Digest - OPTIONAL SHA384*/
|
||||
public static final String ALGO_ID_DIGEST_SHA384 = Constants.MoreAlgorithmsSpecNS + "sha384";
|
||||
/** Message Digest - OPTIONAL SHA512*/
|
||||
public static final String ALGO_ID_DIGEST_SHA512 = EncryptionConstants.EncryptionSpecNS + "sha512";
|
||||
/** Message Digest - OPTIONAL RIPEMD-160*/
|
||||
public static final String ALGO_ID_DIGEST_RIPEMD160 = EncryptionConstants.EncryptionSpecNS + "ripemd160";
|
||||
public static final String ALGO_ID_DIGEST_NOT_RECOMMENDED_MD5 =
|
||||
Constants.MoreAlgorithmsSpecNS + "md5";
|
||||
/** Digest - Required SHA1*/
|
||||
public static final String ALGO_ID_DIGEST_SHA1 = Constants.SignatureSpecNS + "sha1";
|
||||
/** Message Digest - RECOMMENDED SHA256*/
|
||||
public static final String ALGO_ID_DIGEST_SHA256 =
|
||||
EncryptionConstants.EncryptionSpecNS + "sha256";
|
||||
/** Message Digest - OPTIONAL SHA384*/
|
||||
public static final String ALGO_ID_DIGEST_SHA384 =
|
||||
Constants.MoreAlgorithmsSpecNS + "sha384";
|
||||
/** Message Digest - OPTIONAL SHA512*/
|
||||
public static final String ALGO_ID_DIGEST_SHA512 =
|
||||
EncryptionConstants.EncryptionSpecNS + "sha512";
|
||||
/** Message Digest - OPTIONAL RIPEMD-160*/
|
||||
public static final String ALGO_ID_DIGEST_RIPEMD160 =
|
||||
EncryptionConstants.EncryptionSpecNS + "ripemd160";
|
||||
|
||||
/** Field algorithm stores the actual {@link java.security.MessageDigest} */
|
||||
java.security.MessageDigest algorithm = null;
|
||||
/** Field algorithm stores the actual {@link java.security.MessageDigest} */
|
||||
private final MessageDigest algorithm;
|
||||
|
||||
/**
|
||||
* Constructor for the brave who pass their own message digest algorithms and the corresponding URI.
|
||||
* @param doc
|
||||
* @param messageDigest
|
||||
* @param algorithmURI
|
||||
*/
|
||||
private MessageDigestAlgorithm(Document doc, MessageDigest messageDigest,
|
||||
String algorithmURI) {
|
||||
/**
|
||||
* Constructor for the brave who pass their own message digest algorithms and the
|
||||
* corresponding URI.
|
||||
* @param doc
|
||||
* @param algorithmURI
|
||||
*/
|
||||
private MessageDigestAlgorithm(Document doc, String algorithmURI)
|
||||
throws XMLSignatureException {
|
||||
super(doc, algorithmURI);
|
||||
|
||||
super(doc, algorithmURI);
|
||||
algorithm = getDigestInstance(algorithmURI);
|
||||
}
|
||||
|
||||
this.algorithm = messageDigest;
|
||||
}
|
||||
/**
|
||||
* Factory method for constructing a message digest algorithm by name.
|
||||
*
|
||||
* @param doc
|
||||
* @param algorithmURI
|
||||
* @return The MessageDigestAlgorithm element to attach in document and to digest
|
||||
* @throws XMLSignatureException
|
||||
*/
|
||||
public static MessageDigestAlgorithm getInstance(
|
||||
Document doc, String algorithmURI
|
||||
) throws XMLSignatureException {
|
||||
return new MessageDigestAlgorithm(doc, algorithmURI);
|
||||
}
|
||||
|
||||
static ThreadLocal<Map<String, MessageDigest>> instances=new
|
||||
ThreadLocal<Map<String, MessageDigest>>() {
|
||||
protected Map<String, MessageDigest> initialValue() {
|
||||
return new HashMap<String, MessageDigest>();
|
||||
};
|
||||
};
|
||||
private static MessageDigest getDigestInstance(String algorithmURI) throws XMLSignatureException {
|
||||
String algorithmID = JCEMapper.translateURItoJCEID(algorithmURI);
|
||||
|
||||
/**
|
||||
* Factory method for constructing a message digest algorithm by name.
|
||||
*
|
||||
* @param doc
|
||||
* @param algorithmURI
|
||||
* @return The MessageDigestAlgorithm element to attach in document and to digest
|
||||
* @throws XMLSignatureException
|
||||
*/
|
||||
public static MessageDigestAlgorithm getInstance(
|
||||
Document doc, String algorithmURI) throws XMLSignatureException {
|
||||
MessageDigest md = getDigestInstance(algorithmURI);
|
||||
return new MessageDigestAlgorithm(doc, md, algorithmURI);
|
||||
}
|
||||
|
||||
private static MessageDigest getDigestInstance(String algorithmURI) throws XMLSignatureException {
|
||||
MessageDigest result= instances.get().get(algorithmURI);
|
||||
if (result!=null)
|
||||
return result;
|
||||
String algorithmID = JCEMapper.translateURItoJCEID(algorithmURI);
|
||||
|
||||
if (algorithmID == null) {
|
||||
Object[] exArgs = { algorithmURI };
|
||||
throw new XMLSignatureException("algorithms.NoSuchMap", exArgs);
|
||||
}
|
||||
|
||||
MessageDigest md;
|
||||
String provider=JCEMapper.getProviderId();
|
||||
try {
|
||||
if (provider==null) {
|
||||
md = MessageDigest.getInstance(algorithmID);
|
||||
} else {
|
||||
md = MessageDigest.getInstance(algorithmID,provider);
|
||||
}
|
||||
} catch (java.security.NoSuchAlgorithmException ex) {
|
||||
Object[] exArgs = { algorithmID,
|
||||
ex.getLocalizedMessage() };
|
||||
|
||||
throw new XMLSignatureException("algorithms.NoSuchAlgorithm", exArgs);
|
||||
} catch (NoSuchProviderException ex) {
|
||||
Object[] exArgs = { algorithmID,
|
||||
ex.getLocalizedMessage() };
|
||||
|
||||
throw new XMLSignatureException("algorithms.NoSuchAlgorithm", exArgs);
|
||||
if (algorithmID == null) {
|
||||
Object[] exArgs = { algorithmURI };
|
||||
throw new XMLSignatureException("algorithms.NoSuchMap", exArgs);
|
||||
}
|
||||
instances.get().put(algorithmURI, md);
|
||||
|
||||
MessageDigest md;
|
||||
String provider = JCEMapper.getProviderId();
|
||||
try {
|
||||
if (provider == null) {
|
||||
md = MessageDigest.getInstance(algorithmID);
|
||||
} else {
|
||||
md = MessageDigest.getInstance(algorithmID, provider);
|
||||
}
|
||||
} catch (java.security.NoSuchAlgorithmException ex) {
|
||||
Object[] exArgs = { algorithmID, ex.getLocalizedMessage() };
|
||||
|
||||
throw new XMLSignatureException("algorithms.NoSuchAlgorithm", exArgs);
|
||||
} catch (NoSuchProviderException ex) {
|
||||
Object[] exArgs = { algorithmID, ex.getLocalizedMessage() };
|
||||
|
||||
throw new XMLSignatureException("algorithms.NoSuchAlgorithm", exArgs);
|
||||
}
|
||||
|
||||
return md;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the actual {@link java.security.MessageDigest} algorithm object
|
||||
*
|
||||
* @return the actual {@link java.security.MessageDigest} algorithm object
|
||||
*/
|
||||
public java.security.MessageDigest getAlgorithm() {
|
||||
return this.algorithm;
|
||||
}
|
||||
|
||||
/**
|
||||
* Proxy method for {@link java.security.MessageDigest#isEqual}
|
||||
* which is executed on the internal {@link java.security.MessageDigest} object.
|
||||
*
|
||||
* @param digesta
|
||||
* @param digestb
|
||||
* @return the result of the {@link java.security.MessageDigest#isEqual} method
|
||||
*/
|
||||
public static boolean isEqual(byte[] digesta, byte[] digestb) {
|
||||
return java.security.MessageDigest.isEqual(digesta, digestb);
|
||||
}
|
||||
|
||||
/**
|
||||
* Proxy method for {@link java.security.MessageDigest#digest()}
|
||||
* which is executed on the internal {@link java.security.MessageDigest} object.
|
||||
*
|
||||
* @return the result of the {@link java.security.MessageDigest#digest()} method
|
||||
*/
|
||||
public byte[] digest() {
|
||||
return this.algorithm.digest();
|
||||
}
|
||||
|
||||
/**
|
||||
* Proxy method for {@link java.security.MessageDigest#digest(byte[])}
|
||||
* which is executed on the internal {@link java.security.MessageDigest} object.
|
||||
*
|
||||
* @param input
|
||||
* @return the result of the {@link java.security.MessageDigest#digest(byte[])} method
|
||||
*/
|
||||
public byte[] digest(byte input[]) {
|
||||
return this.algorithm.digest(input);
|
||||
}
|
||||
|
||||
/**
|
||||
* Proxy method for {@link java.security.MessageDigest#digest(byte[], int, int)}
|
||||
* which is executed on the internal {@link java.security.MessageDigest} object.
|
||||
*
|
||||
* @param buf
|
||||
* @param offset
|
||||
* @param len
|
||||
* @return the result of the {@link java.security.MessageDigest#digest(byte[], int, int)} method
|
||||
* @throws java.security.DigestException
|
||||
*/
|
||||
public int digest(byte buf[], int offset, int len)
|
||||
throws java.security.DigestException {
|
||||
return this.algorithm.digest(buf, offset, len);
|
||||
}
|
||||
|
||||
/**
|
||||
* Proxy method for {@link java.security.MessageDigest#getAlgorithm}
|
||||
* which is executed on the internal {@link java.security.MessageDigest} object.
|
||||
*
|
||||
* @return the result of the {@link java.security.MessageDigest#getAlgorithm} method
|
||||
*/
|
||||
public String getJCEAlgorithmString() {
|
||||
return this.algorithm.getAlgorithm();
|
||||
}
|
||||
|
||||
/**
|
||||
* Proxy method for {@link java.security.MessageDigest#getProvider}
|
||||
* which is executed on the internal {@link java.security.MessageDigest} object.
|
||||
*
|
||||
* @return the result of the {@link java.security.MessageDigest#getProvider} method
|
||||
*/
|
||||
public java.security.Provider getJCEProvider() {
|
||||
return this.algorithm.getProvider();
|
||||
}
|
||||
|
||||
/**
|
||||
* Proxy method for {@link java.security.MessageDigest#getDigestLength}
|
||||
* which is executed on the internal {@link java.security.MessageDigest} object.
|
||||
*
|
||||
* @return the result of the {@link java.security.MessageDigest#getDigestLength} method
|
||||
*/
|
||||
public int getDigestLength() {
|
||||
return this.algorithm.getDigestLength();
|
||||
}
|
||||
|
||||
/**
|
||||
* Proxy method for {@link java.security.MessageDigest#reset}
|
||||
* which is executed on the internal {@link java.security.MessageDigest} object.
|
||||
*
|
||||
*/
|
||||
public void reset() {
|
||||
this.algorithm.reset();
|
||||
}
|
||||
|
||||
/**
|
||||
* Proxy method for {@link java.security.MessageDigest#update(byte[])}
|
||||
* which is executed on the internal {@link java.security.MessageDigest} object.
|
||||
*
|
||||
* @param input
|
||||
*/
|
||||
public void update(byte[] input) {
|
||||
this.algorithm.update(input);
|
||||
}
|
||||
|
||||
/**
|
||||
* Proxy method for {@link java.security.MessageDigest#update(byte)}
|
||||
* which is executed on the internal {@link java.security.MessageDigest} object.
|
||||
*
|
||||
* @param input
|
||||
*/
|
||||
public void update(byte input) {
|
||||
this.algorithm.update(input);
|
||||
}
|
||||
|
||||
/**
|
||||
* Proxy method for {@link java.security.MessageDigest#update(byte[], int, int)}
|
||||
* which is executed on the internal {@link java.security.MessageDigest} object.
|
||||
*
|
||||
* @param buf
|
||||
* @param offset
|
||||
* @param len
|
||||
*/
|
||||
public void update(byte buf[], int offset, int len) {
|
||||
this.algorithm.update(buf, offset, len);
|
||||
}
|
||||
|
||||
/** @inheritDoc */
|
||||
public String getBaseNamespace() {
|
||||
return Constants.SignatureSpecNS;
|
||||
}
|
||||
|
||||
/** @inheritDoc */
|
||||
public String getBaseLocalName() {
|
||||
return Constants._TAG_DIGESTMETHOD;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the actual {@link java.security.MessageDigest} algorithm object
|
||||
*
|
||||
* @return the actual {@link java.security.MessageDigest} algorithm object
|
||||
*/
|
||||
public java.security.MessageDigest getAlgorithm() {
|
||||
return algorithm;
|
||||
}
|
||||
|
||||
/**
|
||||
* Proxy method for {@link java.security.MessageDigest#isEqual}
|
||||
* which is executed on the internal {@link java.security.MessageDigest} object.
|
||||
*
|
||||
* @param digesta
|
||||
* @param digestb
|
||||
* @return the result of the {@link java.security.MessageDigest#isEqual} method
|
||||
*/
|
||||
public static boolean isEqual(byte[] digesta, byte[] digestb) {
|
||||
return java.security.MessageDigest.isEqual(digesta, digestb);
|
||||
}
|
||||
|
||||
/**
|
||||
* Proxy method for {@link java.security.MessageDigest#digest()}
|
||||
* which is executed on the internal {@link java.security.MessageDigest} object.
|
||||
*
|
||||
* @return the result of the {@link java.security.MessageDigest#digest()} method
|
||||
*/
|
||||
public byte[] digest() {
|
||||
return algorithm.digest();
|
||||
}
|
||||
|
||||
/**
|
||||
* Proxy method for {@link java.security.MessageDigest#digest(byte[])}
|
||||
* which is executed on the internal {@link java.security.MessageDigest} object.
|
||||
*
|
||||
* @param input
|
||||
* @return the result of the {@link java.security.MessageDigest#digest(byte[])} method
|
||||
*/
|
||||
public byte[] digest(byte input[]) {
|
||||
return algorithm.digest(input);
|
||||
}
|
||||
|
||||
/**
|
||||
* Proxy method for {@link java.security.MessageDigest#digest(byte[], int, int)}
|
||||
* which is executed on the internal {@link java.security.MessageDigest} object.
|
||||
*
|
||||
* @param buf
|
||||
* @param offset
|
||||
* @param len
|
||||
* @return the result of the {@link java.security.MessageDigest#digest(byte[], int, int)} method
|
||||
* @throws java.security.DigestException
|
||||
*/
|
||||
public int digest(byte buf[], int offset, int len) throws java.security.DigestException {
|
||||
return algorithm.digest(buf, offset, len);
|
||||
}
|
||||
|
||||
/**
|
||||
* Proxy method for {@link java.security.MessageDigest#getAlgorithm}
|
||||
* which is executed on the internal {@link java.security.MessageDigest} object.
|
||||
*
|
||||
* @return the result of the {@link java.security.MessageDigest#getAlgorithm} method
|
||||
*/
|
||||
public String getJCEAlgorithmString() {
|
||||
return algorithm.getAlgorithm();
|
||||
}
|
||||
|
||||
/**
|
||||
* Proxy method for {@link java.security.MessageDigest#getProvider}
|
||||
* which is executed on the internal {@link java.security.MessageDigest} object.
|
||||
*
|
||||
* @return the result of the {@link java.security.MessageDigest#getProvider} method
|
||||
*/
|
||||
public java.security.Provider getJCEProvider() {
|
||||
return algorithm.getProvider();
|
||||
}
|
||||
|
||||
/**
|
||||
* Proxy method for {@link java.security.MessageDigest#getDigestLength}
|
||||
* which is executed on the internal {@link java.security.MessageDigest} object.
|
||||
*
|
||||
* @return the result of the {@link java.security.MessageDigest#getDigestLength} method
|
||||
*/
|
||||
public int getDigestLength() {
|
||||
return algorithm.getDigestLength();
|
||||
}
|
||||
|
||||
/**
|
||||
* Proxy method for {@link java.security.MessageDigest#reset}
|
||||
* which is executed on the internal {@link java.security.MessageDigest} object.
|
||||
*
|
||||
*/
|
||||
public void reset() {
|
||||
algorithm.reset();
|
||||
}
|
||||
|
||||
/**
|
||||
* Proxy method for {@link java.security.MessageDigest#update(byte[])}
|
||||
* which is executed on the internal {@link java.security.MessageDigest} object.
|
||||
*
|
||||
* @param input
|
||||
*/
|
||||
public void update(byte[] input) {
|
||||
algorithm.update(input);
|
||||
}
|
||||
|
||||
/**
|
||||
* Proxy method for {@link java.security.MessageDigest#update(byte)}
|
||||
* which is executed on the internal {@link java.security.MessageDigest} object.
|
||||
*
|
||||
* @param input
|
||||
*/
|
||||
public void update(byte input) {
|
||||
algorithm.update(input);
|
||||
}
|
||||
|
||||
/**
|
||||
* Proxy method for {@link java.security.MessageDigest#update(byte[], int, int)}
|
||||
* which is executed on the internal {@link java.security.MessageDigest} object.
|
||||
*
|
||||
* @param buf
|
||||
* @param offset
|
||||
* @param len
|
||||
*/
|
||||
public void update(byte buf[], int offset, int len) {
|
||||
algorithm.update(buf, offset, len);
|
||||
}
|
||||
|
||||
/** @inheritDoc */
|
||||
public String getBaseNamespace() {
|
||||
return Constants.SignatureSpecNS;
|
||||
}
|
||||
|
||||
/** @inheritDoc */
|
||||
public String getBaseLocalName() {
|
||||
return Constants._TAG_DIGESTMETHOD;
|
||||
}
|
||||
}
|
||||
|
@ -74,7 +74,7 @@ public class SignatureAlgorithm extends Algorithm {
|
||||
this.algorithmURI = algorithmURI;
|
||||
|
||||
signatureAlgorithm = getSignatureAlgorithmSpi(algorithmURI);
|
||||
signatureAlgorithm.engineGetContextFromElement(this._constructionElement);
|
||||
signatureAlgorithm.engineGetContextFromElement(this.constructionElement);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -92,10 +92,10 @@ public class SignatureAlgorithm extends Algorithm {
|
||||
this.algorithmURI = algorithmURI;
|
||||
|
||||
signatureAlgorithm = getSignatureAlgorithmSpi(algorithmURI);
|
||||
signatureAlgorithm.engineGetContextFromElement(this._constructionElement);
|
||||
signatureAlgorithm.engineGetContextFromElement(this.constructionElement);
|
||||
|
||||
signatureAlgorithm.engineSetHMACOutputLength(hmacOutputLength);
|
||||
((IntegrityHmac)signatureAlgorithm).engineAddContextToElement(_constructionElement);
|
||||
((IntegrityHmac)signatureAlgorithm).engineAddContextToElement(constructionElement);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -136,7 +136,7 @@ public class SignatureAlgorithm extends Algorithm {
|
||||
}
|
||||
|
||||
signatureAlgorithm = getSignatureAlgorithmSpi(algorithmURI);
|
||||
signatureAlgorithm.engineGetContextFromElement(this._constructionElement);
|
||||
signatureAlgorithm.engineGetContextFromElement(this.constructionElement);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -310,7 +310,7 @@ public class SignatureAlgorithm extends Algorithm {
|
||||
* @return the URI representation of Transformation algorithm
|
||||
*/
|
||||
public final String getURI() {
|
||||
return _constructionElement.getAttributeNS(null, Constants._ATT_ALGORITHM);
|
||||
return constructionElement.getAttributeNS(null, Constants._ATT_ALGORITHM);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -380,9 +380,7 @@ public class SignatureAlgorithm extends Algorithm {
|
||||
* This method registers the default algorithms.
|
||||
*/
|
||||
public static void registerDefaultAlgorithms() {
|
||||
algorithmHash.put(
|
||||
XMLSignature.ALGO_ID_SIGNATURE_DSA, SignatureDSA.class
|
||||
);
|
||||
algorithmHash.put(SignatureDSA.URI, SignatureDSA.class);
|
||||
algorithmHash.put(
|
||||
XMLSignature.ALGO_ID_SIGNATURE_RSA_SHA1, SignatureBaseRSA.SignatureRSASHA1.class
|
||||
);
|
||||
@ -409,6 +407,15 @@ public class SignatureAlgorithm extends Algorithm {
|
||||
algorithmHash.put(
|
||||
XMLSignature.ALGO_ID_SIGNATURE_ECDSA_SHA1, SignatureECDSA.SignatureECDSASHA1.class
|
||||
);
|
||||
algorithmHash.put(
|
||||
XMLSignature.ALGO_ID_SIGNATURE_ECDSA_SHA256, SignatureECDSA.SignatureECDSASHA256.class
|
||||
);
|
||||
algorithmHash.put(
|
||||
XMLSignature.ALGO_ID_SIGNATURE_ECDSA_SHA384, SignatureECDSA.SignatureECDSASHA384.class
|
||||
);
|
||||
algorithmHash.put(
|
||||
XMLSignature.ALGO_ID_SIGNATURE_ECDSA_SHA512, SignatureECDSA.SignatureECDSASHA512.class
|
||||
);
|
||||
algorithmHash.put(
|
||||
XMLSignature.ALGO_ID_MAC_HMAC_NOT_RECOMMENDED_MD5, IntegrityHmac.IntegrityHmacMD5.class
|
||||
);
|
||||
|
@ -2,21 +2,23 @@
|
||||
* reserved comment block
|
||||
* DO NOT REMOVE OR ALTER!
|
||||
*/
|
||||
/*
|
||||
* Copyright 1999-2004 The Apache Software Foundation.
|
||||
/**
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package com.sun.org.apache.xml.internal.security.algorithms;
|
||||
|
||||
@ -27,157 +29,149 @@ import java.security.spec.AlgorithmParameterSpec;
|
||||
import com.sun.org.apache.xml.internal.security.signature.XMLSignatureException;
|
||||
import org.w3c.dom.Element;
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
* @author $Author: mullan $
|
||||
*/
|
||||
public abstract class SignatureAlgorithmSpi {
|
||||
|
||||
/**
|
||||
* Returns the URI representation of <code>Transformation algorithm</code>
|
||||
*
|
||||
* @return the URI representation of <code>Transformation algorithm</code>
|
||||
*/
|
||||
protected abstract String engineGetURI();
|
||||
/**
|
||||
* Returns the URI representation of <code>Transformation algorithm</code>
|
||||
*
|
||||
* @return the URI representation of <code>Transformation algorithm</code>
|
||||
*/
|
||||
protected abstract String engineGetURI();
|
||||
|
||||
/**
|
||||
* Proxy method for {@link java.security.Signature#getAlgorithm}
|
||||
* which is executed on the internal {@link java.security.Signature} object.
|
||||
*
|
||||
* @return the result of the {@link java.security.Signature#getAlgorithm} method
|
||||
*/
|
||||
protected abstract String engineGetJCEAlgorithmString();
|
||||
/**
|
||||
* Proxy method for {@link java.security.Signature#getAlgorithm}
|
||||
* which is executed on the internal {@link java.security.Signature} object.
|
||||
*
|
||||
* @return the result of the {@link java.security.Signature#getAlgorithm} method
|
||||
*/
|
||||
protected abstract String engineGetJCEAlgorithmString();
|
||||
|
||||
/**
|
||||
* Method engineGetJCEProviderName
|
||||
*
|
||||
* @return the JCE ProviderName
|
||||
*/
|
||||
protected abstract String engineGetJCEProviderName();
|
||||
/**
|
||||
* Method engineGetJCEProviderName
|
||||
*
|
||||
* @return the JCE ProviderName
|
||||
*/
|
||||
protected abstract String engineGetJCEProviderName();
|
||||
|
||||
/**
|
||||
* Proxy method for {@link java.security.Signature#update(byte[])}
|
||||
* which is executed on the internal {@link java.security.Signature} object.
|
||||
*
|
||||
* @param input
|
||||
* @throws XMLSignatureException
|
||||
*/
|
||||
protected abstract void engineUpdate(byte[] input)
|
||||
throws XMLSignatureException;
|
||||
/**
|
||||
* Proxy method for {@link java.security.Signature#update(byte[])}
|
||||
* which is executed on the internal {@link java.security.Signature} object.
|
||||
*
|
||||
* @param input
|
||||
* @throws XMLSignatureException
|
||||
*/
|
||||
protected abstract void engineUpdate(byte[] input) throws XMLSignatureException;
|
||||
|
||||
/**
|
||||
* Proxy method for {@link java.security.Signature#update(byte[])}
|
||||
* which is executed on the internal {@link java.security.Signature} object.
|
||||
*
|
||||
* @param input
|
||||
* @throws XMLSignatureException
|
||||
*/
|
||||
protected abstract void engineUpdate(byte input)
|
||||
throws XMLSignatureException;
|
||||
/**
|
||||
* Proxy method for {@link java.security.Signature#update(byte[])}
|
||||
* which is executed on the internal {@link java.security.Signature} object.
|
||||
*
|
||||
* @param input
|
||||
* @throws XMLSignatureException
|
||||
*/
|
||||
protected abstract void engineUpdate(byte input) throws XMLSignatureException;
|
||||
|
||||
/**
|
||||
* Proxy method for {@link java.security.Signature#update(byte[], int, int)}
|
||||
* which is executed on the internal {@link java.security.Signature} object.
|
||||
*
|
||||
* @param buf
|
||||
* @param offset
|
||||
* @param len
|
||||
* @throws XMLSignatureException
|
||||
*/
|
||||
protected abstract void engineUpdate(byte buf[], int offset, int len)
|
||||
throws XMLSignatureException;
|
||||
/**
|
||||
* Proxy method for {@link java.security.Signature#update(byte[], int, int)}
|
||||
* which is executed on the internal {@link java.security.Signature} object.
|
||||
*
|
||||
* @param buf
|
||||
* @param offset
|
||||
* @param len
|
||||
* @throws XMLSignatureException
|
||||
*/
|
||||
protected abstract void engineUpdate(byte buf[], int offset, int len)
|
||||
throws XMLSignatureException;
|
||||
|
||||
/**
|
||||
* Proxy method for {@link java.security.Signature#initSign(java.security.PrivateKey)}
|
||||
* which is executed on the internal {@link java.security.Signature} object.
|
||||
*
|
||||
* @param signingKey
|
||||
* @throws XMLSignatureException if this method is called on a MAC
|
||||
*/
|
||||
protected abstract void engineInitSign(Key signingKey)
|
||||
throws XMLSignatureException;
|
||||
/**
|
||||
* Proxy method for {@link java.security.Signature#initSign(java.security.PrivateKey)}
|
||||
* which is executed on the internal {@link java.security.Signature} object.
|
||||
*
|
||||
* @param signingKey
|
||||
* @throws XMLSignatureException if this method is called on a MAC
|
||||
*/
|
||||
protected abstract void engineInitSign(Key signingKey) throws XMLSignatureException;
|
||||
|
||||
/**
|
||||
* Proxy method for {@link java.security.Signature#initSign(java.security.PrivateKey, java.security.SecureRandom)}
|
||||
* which is executed on the internal {@link java.security.Signature} object.
|
||||
*
|
||||
* @param signingKey
|
||||
* @param secureRandom
|
||||
* @throws XMLSignatureException if this method is called on a MAC
|
||||
*/
|
||||
protected abstract void engineInitSign(
|
||||
Key signingKey, SecureRandom secureRandom) throws XMLSignatureException;
|
||||
/**
|
||||
* Proxy method for {@link java.security.Signature#initSign(java.security.PrivateKey,
|
||||
* java.security.SecureRandom)}
|
||||
* which is executed on the internal {@link java.security.Signature} object.
|
||||
*
|
||||
* @param signingKey
|
||||
* @param secureRandom
|
||||
* @throws XMLSignatureException if this method is called on a MAC
|
||||
*/
|
||||
protected abstract void engineInitSign(Key signingKey, SecureRandom secureRandom)
|
||||
throws XMLSignatureException;
|
||||
|
||||
/**
|
||||
* Proxy method for {@link javax.crypto.Mac}
|
||||
* which is executed on the internal {@link javax.crypto.Mac#init(Key)} object.
|
||||
*
|
||||
* @param signingKey
|
||||
* @param algorithmParameterSpec
|
||||
* @throws XMLSignatureException if this method is called on a Signature
|
||||
*/
|
||||
protected abstract void engineInitSign(
|
||||
Key signingKey, AlgorithmParameterSpec algorithmParameterSpec)
|
||||
throws XMLSignatureException;
|
||||
/**
|
||||
* Proxy method for {@link javax.crypto.Mac}
|
||||
* which is executed on the internal {@link javax.crypto.Mac#init(Key)} object.
|
||||
*
|
||||
* @param signingKey
|
||||
* @param algorithmParameterSpec
|
||||
* @throws XMLSignatureException if this method is called on a Signature
|
||||
*/
|
||||
protected abstract void engineInitSign(
|
||||
Key signingKey, AlgorithmParameterSpec algorithmParameterSpec
|
||||
) throws XMLSignatureException;
|
||||
|
||||
/**
|
||||
* Proxy method for {@link java.security.Signature#sign()}
|
||||
* which is executed on the internal {@link java.security.Signature} object.
|
||||
*
|
||||
* @return the result of the {@link java.security.Signature#sign()} method
|
||||
* @throws XMLSignatureException
|
||||
*/
|
||||
protected abstract byte[] engineSign() throws XMLSignatureException;
|
||||
/**
|
||||
* Proxy method for {@link java.security.Signature#sign()}
|
||||
* which is executed on the internal {@link java.security.Signature} object.
|
||||
*
|
||||
* @return the result of the {@link java.security.Signature#sign()} method
|
||||
* @throws XMLSignatureException
|
||||
*/
|
||||
protected abstract byte[] engineSign() throws XMLSignatureException;
|
||||
|
||||
/**
|
||||
* Method engineInitVerify
|
||||
*
|
||||
* @param verificationKey
|
||||
* @throws XMLSignatureException
|
||||
*/
|
||||
protected abstract void engineInitVerify(Key verificationKey)
|
||||
throws XMLSignatureException;
|
||||
/**
|
||||
* Method engineInitVerify
|
||||
*
|
||||
* @param verificationKey
|
||||
* @throws XMLSignatureException
|
||||
*/
|
||||
protected abstract void engineInitVerify(Key verificationKey) throws XMLSignatureException;
|
||||
|
||||
/**
|
||||
* Proxy method for {@link java.security.Signature#verify(byte[])}
|
||||
* which is executed on the internal {@link java.security.Signature} object.
|
||||
*
|
||||
* @param signature
|
||||
* @return true if the signature is correct
|
||||
* @throws XMLSignatureException
|
||||
*/
|
||||
protected abstract boolean engineVerify(byte[] signature)
|
||||
throws XMLSignatureException;
|
||||
/**
|
||||
* Proxy method for {@link java.security.Signature#verify(byte[])}
|
||||
* which is executed on the internal {@link java.security.Signature} object.
|
||||
*
|
||||
* @param signature
|
||||
* @return true if the signature is correct
|
||||
* @throws XMLSignatureException
|
||||
*/
|
||||
protected abstract boolean engineVerify(byte[] signature) throws XMLSignatureException;
|
||||
|
||||
/**
|
||||
* Proxy method for {@link java.security.Signature#setParameter(java.security.spec.AlgorithmParameterSpec)}
|
||||
* which is executed on the internal {@link java.security.Signature} object.
|
||||
*
|
||||
* @param params
|
||||
* @throws XMLSignatureException
|
||||
*/
|
||||
protected abstract void engineSetParameter(AlgorithmParameterSpec params)
|
||||
throws XMLSignatureException;
|
||||
/**
|
||||
* Proxy method for {@link java.security.Signature#setParameter(
|
||||
* java.security.spec.AlgorithmParameterSpec)}
|
||||
* which is executed on the internal {@link java.security.Signature} object.
|
||||
*
|
||||
* @param params
|
||||
* @throws XMLSignatureException
|
||||
*/
|
||||
protected abstract void engineSetParameter(AlgorithmParameterSpec params)
|
||||
throws XMLSignatureException;
|
||||
|
||||
|
||||
/**
|
||||
* Method engineGetContextFromElement
|
||||
*
|
||||
* @param element
|
||||
*/
|
||||
protected void engineGetContextFromElement(Element element) {
|
||||
}
|
||||
/**
|
||||
* Method engineGetContextFromElement
|
||||
*
|
||||
* @param element
|
||||
*/
|
||||
protected void engineGetContextFromElement(Element element) {
|
||||
}
|
||||
|
||||
/**
|
||||
* Method engineSetHMACOutputLength
|
||||
*
|
||||
* @param HMACOutputLength
|
||||
* @throws XMLSignatureException
|
||||
*/
|
||||
protected abstract void engineSetHMACOutputLength(int HMACOutputLength)
|
||||
throws XMLSignatureException;
|
||||
/**
|
||||
* Method engineSetHMACOutputLength
|
||||
*
|
||||
* @param HMACOutputLength
|
||||
* @throws XMLSignatureException
|
||||
*/
|
||||
protected abstract void engineSetHMACOutputLength(int HMACOutputLength)
|
||||
throws XMLSignatureException;
|
||||
|
||||
public void reset() {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -2,21 +2,23 @@
|
||||
* reserved comment block
|
||||
* DO NOT REMOVE OR ALTER!
|
||||
*/
|
||||
/*
|
||||
* Copyright 1999-2007 The Apache Software Foundation.
|
||||
/**
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package com.sun.org.apache.xml.internal.security.algorithms.implementations;
|
||||
|
||||
@ -36,22 +38,17 @@ import com.sun.org.apache.xml.internal.security.algorithms.SignatureAlgorithmSpi
|
||||
import com.sun.org.apache.xml.internal.security.signature.XMLSignature;
|
||||
import com.sun.org.apache.xml.internal.security.signature.XMLSignatureException;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author $Author: mullan $
|
||||
*/
|
||||
public abstract class SignatureBaseRSA extends SignatureAlgorithmSpi {
|
||||
|
||||
/** {@link java.util.logging} logging facility */
|
||||
static java.util.logging.Logger log =
|
||||
java.util.logging.Logger.getLogger
|
||||
(SignatureBaseRSA.class.getName());
|
||||
/** {@link org.apache.commons.logging} logging facility */
|
||||
private static java.util.logging.Logger log =
|
||||
java.util.logging.Logger.getLogger(SignatureBaseRSA.class.getName());
|
||||
|
||||
/** @inheritDoc */
|
||||
public abstract String engineGetURI();
|
||||
|
||||
/** Field algorithm */
|
||||
private java.security.Signature _signatureAlgorithm = null;
|
||||
private java.security.Signature signatureAlgorithm = null;
|
||||
|
||||
/**
|
||||
* Constructor SignatureRSA
|
||||
@ -59,17 +56,17 @@ public abstract class SignatureBaseRSA extends SignatureAlgorithmSpi {
|
||||
* @throws XMLSignatureException
|
||||
*/
|
||||
public SignatureBaseRSA() throws XMLSignatureException {
|
||||
|
||||
String algorithmID = JCEMapper.translateURItoJCEID(this.engineGetURI());
|
||||
|
||||
if (log.isLoggable(java.util.logging.Level.FINE))
|
||||
if (log.isLoggable(java.util.logging.Level.FINE)) {
|
||||
log.log(java.util.logging.Level.FINE, "Created SignatureRSA using " + algorithmID);
|
||||
String provider=JCEMapper.getProviderId();
|
||||
}
|
||||
String provider = JCEMapper.getProviderId();
|
||||
try {
|
||||
if (provider==null) {
|
||||
this._signatureAlgorithm = Signature.getInstance(algorithmID);
|
||||
if (provider == null) {
|
||||
this.signatureAlgorithm = Signature.getInstance(algorithmID);
|
||||
} else {
|
||||
this._signatureAlgorithm = Signature.getInstance(algorithmID,provider);
|
||||
this.signatureAlgorithm = Signature.getInstance(algorithmID,provider);
|
||||
}
|
||||
} catch (java.security.NoSuchAlgorithmException ex) {
|
||||
Object[] exArgs = { algorithmID, ex.getLocalizedMessage() };
|
||||
@ -85,20 +82,17 @@ public abstract class SignatureBaseRSA extends SignatureAlgorithmSpi {
|
||||
/** @inheritDoc */
|
||||
protected void engineSetParameter(AlgorithmParameterSpec params)
|
||||
throws XMLSignatureException {
|
||||
|
||||
try {
|
||||
this._signatureAlgorithm.setParameter(params);
|
||||
this.signatureAlgorithm.setParameter(params);
|
||||
} catch (InvalidAlgorithmParameterException ex) {
|
||||
throw new XMLSignatureException("empty", ex);
|
||||
}
|
||||
}
|
||||
|
||||
/** @inheritDoc */
|
||||
protected boolean engineVerify(byte[] signature)
|
||||
throws XMLSignatureException {
|
||||
|
||||
protected boolean engineVerify(byte[] signature) throws XMLSignatureException {
|
||||
try {
|
||||
return this._signatureAlgorithm.verify(signature);
|
||||
return this.signatureAlgorithm.verify(signature);
|
||||
} catch (SignatureException ex) {
|
||||
throw new XMLSignatureException("empty", ex);
|
||||
}
|
||||
@ -106,32 +100,29 @@ public abstract class SignatureBaseRSA extends SignatureAlgorithmSpi {
|
||||
|
||||
/** @inheritDoc */
|
||||
protected void engineInitVerify(Key publicKey) throws XMLSignatureException {
|
||||
|
||||
if (!(publicKey instanceof PublicKey)) {
|
||||
String supplied = publicKey.getClass().getName();
|
||||
String needed = PublicKey.class.getName();
|
||||
Object exArgs[] = { supplied, needed };
|
||||
|
||||
throw new XMLSignatureException
|
||||
("algorithms.WrongKeyForThisOperation", exArgs);
|
||||
throw new XMLSignatureException("algorithms.WrongKeyForThisOperation", exArgs);
|
||||
}
|
||||
|
||||
try {
|
||||
this._signatureAlgorithm.initVerify((PublicKey) publicKey);
|
||||
this.signatureAlgorithm.initVerify((PublicKey) publicKey);
|
||||
} catch (InvalidKeyException ex) {
|
||||
// reinstantiate Signature object to work around bug in JDK
|
||||
// see: http://bugs.sun.com/view_bug.do?bug_id=4953555
|
||||
Signature sig = this._signatureAlgorithm;
|
||||
Signature sig = this.signatureAlgorithm;
|
||||
try {
|
||||
this._signatureAlgorithm = Signature.getInstance
|
||||
(_signatureAlgorithm.getAlgorithm());
|
||||
this.signatureAlgorithm = Signature.getInstance(signatureAlgorithm.getAlgorithm());
|
||||
} catch (Exception e) {
|
||||
// this shouldn't occur, but if it does, restore previous
|
||||
// Signature
|
||||
if (log.isLoggable(java.util.logging.Level.FINE)) {
|
||||
log.log(java.util.logging.Level.FINE, "Exception when reinstantiating Signature:" + e);
|
||||
}
|
||||
this._signatureAlgorithm = sig;
|
||||
this.signatureAlgorithm = sig;
|
||||
}
|
||||
throw new XMLSignatureException("empty", ex);
|
||||
}
|
||||
@ -140,7 +131,7 @@ public abstract class SignatureBaseRSA extends SignatureAlgorithmSpi {
|
||||
/** @inheritDoc */
|
||||
protected byte[] engineSign() throws XMLSignatureException {
|
||||
try {
|
||||
return this._signatureAlgorithm.sign();
|
||||
return this.signatureAlgorithm.sign();
|
||||
} catch (SignatureException ex) {
|
||||
throw new XMLSignatureException("empty", ex);
|
||||
}
|
||||
@ -149,19 +140,16 @@ public abstract class SignatureBaseRSA extends SignatureAlgorithmSpi {
|
||||
/** @inheritDoc */
|
||||
protected void engineInitSign(Key privateKey, SecureRandom secureRandom)
|
||||
throws XMLSignatureException {
|
||||
|
||||
if (!(privateKey instanceof PrivateKey)) {
|
||||
String supplied = privateKey.getClass().getName();
|
||||
String needed = PrivateKey.class.getName();
|
||||
Object exArgs[] = { supplied, needed };
|
||||
|
||||
throw new XMLSignatureException
|
||||
("algorithms.WrongKeyForThisOperation", exArgs);
|
||||
throw new XMLSignatureException("algorithms.WrongKeyForThisOperation", exArgs);
|
||||
}
|
||||
|
||||
try {
|
||||
this._signatureAlgorithm.initSign
|
||||
((PrivateKey) privateKey, secureRandom);
|
||||
this.signatureAlgorithm.initSign((PrivateKey) privateKey, secureRandom);
|
||||
} catch (InvalidKeyException ex) {
|
||||
throw new XMLSignatureException("empty", ex);
|
||||
}
|
||||
@ -169,18 +157,16 @@ public abstract class SignatureBaseRSA extends SignatureAlgorithmSpi {
|
||||
|
||||
/** @inheritDoc */
|
||||
protected void engineInitSign(Key privateKey) throws XMLSignatureException {
|
||||
|
||||
if (!(privateKey instanceof PrivateKey)) {
|
||||
String supplied = privateKey.getClass().getName();
|
||||
String needed = PrivateKey.class.getName();
|
||||
Object exArgs[] = { supplied, needed };
|
||||
|
||||
throw new XMLSignatureException
|
||||
("algorithms.WrongKeyForThisOperation", exArgs);
|
||||
throw new XMLSignatureException("algorithms.WrongKeyForThisOperation", exArgs);
|
||||
}
|
||||
|
||||
try {
|
||||
this._signatureAlgorithm.initSign((PrivateKey) privateKey);
|
||||
this.signatureAlgorithm.initSign((PrivateKey) privateKey);
|
||||
} catch (InvalidKeyException ex) {
|
||||
throw new XMLSignatureException("empty", ex);
|
||||
}
|
||||
@ -189,7 +175,7 @@ public abstract class SignatureBaseRSA extends SignatureAlgorithmSpi {
|
||||
/** @inheritDoc */
|
||||
protected void engineUpdate(byte[] input) throws XMLSignatureException {
|
||||
try {
|
||||
this._signatureAlgorithm.update(input);
|
||||
this.signatureAlgorithm.update(input);
|
||||
} catch (SignatureException ex) {
|
||||
throw new XMLSignatureException("empty", ex);
|
||||
}
|
||||
@ -198,17 +184,16 @@ public abstract class SignatureBaseRSA extends SignatureAlgorithmSpi {
|
||||
/** @inheritDoc */
|
||||
protected void engineUpdate(byte input) throws XMLSignatureException {
|
||||
try {
|
||||
this._signatureAlgorithm.update(input);
|
||||
this.signatureAlgorithm.update(input);
|
||||
} catch (SignatureException ex) {
|
||||
throw new XMLSignatureException("empty", ex);
|
||||
}
|
||||
}
|
||||
|
||||
/** @inheritDoc */
|
||||
protected void engineUpdate(byte buf[], int offset, int len)
|
||||
throws XMLSignatureException {
|
||||
protected void engineUpdate(byte buf[], int offset, int len) throws XMLSignatureException {
|
||||
try {
|
||||
this._signatureAlgorithm.update(buf, offset, len);
|
||||
this.signatureAlgorithm.update(buf, offset, len);
|
||||
} catch (SignatureException ex) {
|
||||
throw new XMLSignatureException("empty", ex);
|
||||
}
|
||||
@ -216,34 +201,29 @@ public abstract class SignatureBaseRSA extends SignatureAlgorithmSpi {
|
||||
|
||||
/** @inheritDoc */
|
||||
protected String engineGetJCEAlgorithmString() {
|
||||
return this._signatureAlgorithm.getAlgorithm();
|
||||
return this.signatureAlgorithm.getAlgorithm();
|
||||
}
|
||||
|
||||
/** @inheritDoc */
|
||||
protected String engineGetJCEProviderName() {
|
||||
return this._signatureAlgorithm.getProvider().getName();
|
||||
return this.signatureAlgorithm.getProvider().getName();
|
||||
}
|
||||
|
||||
/** @inheritDoc */
|
||||
protected void engineSetHMACOutputLength(int HMACOutputLength)
|
||||
throws XMLSignatureException {
|
||||
throw new XMLSignatureException
|
||||
("algorithms.HMACOutputLengthOnlyForHMAC");
|
||||
throw new XMLSignatureException("algorithms.HMACOutputLengthOnlyForHMAC");
|
||||
}
|
||||
|
||||
/** @inheritDoc */
|
||||
protected void engineInitSign(
|
||||
Key signingKey, AlgorithmParameterSpec algorithmParameterSpec)
|
||||
throws XMLSignatureException {
|
||||
throw new XMLSignatureException(
|
||||
"algorithms.CannotUseAlgorithmParameterSpecOnRSA");
|
||||
Key signingKey, AlgorithmParameterSpec algorithmParameterSpec
|
||||
) throws XMLSignatureException {
|
||||
throw new XMLSignatureException("algorithms.CannotUseAlgorithmParameterSpecOnRSA");
|
||||
}
|
||||
|
||||
/**
|
||||
* Class SignatureRSASHA1
|
||||
*
|
||||
* @author $Author: mullan $
|
||||
* @version $Revision: 1.5 $
|
||||
*/
|
||||
public static class SignatureRSASHA1 extends SignatureBaseRSA {
|
||||
|
||||
@ -264,9 +244,6 @@ public abstract class SignatureBaseRSA extends SignatureAlgorithmSpi {
|
||||
|
||||
/**
|
||||
* Class SignatureRSASHA256
|
||||
*
|
||||
* @author $Author: mullan $
|
||||
* @version $Revision: 1.5 $
|
||||
*/
|
||||
public static class SignatureRSASHA256 extends SignatureBaseRSA {
|
||||
|
||||
@ -287,9 +264,6 @@ public abstract class SignatureBaseRSA extends SignatureAlgorithmSpi {
|
||||
|
||||
/**
|
||||
* Class SignatureRSASHA384
|
||||
*
|
||||
* @author $Author: mullan $
|
||||
* @version $Revision: 1.5 $
|
||||
*/
|
||||
public static class SignatureRSASHA384 extends SignatureBaseRSA {
|
||||
|
||||
@ -310,9 +284,6 @@ public abstract class SignatureBaseRSA extends SignatureAlgorithmSpi {
|
||||
|
||||
/**
|
||||
* Class SignatureRSASHA512
|
||||
*
|
||||
* @author $Author: mullan $
|
||||
* @version $Revision: 1.5 $
|
||||
*/
|
||||
public static class SignatureRSASHA512 extends SignatureBaseRSA {
|
||||
|
||||
@ -333,9 +304,6 @@ public abstract class SignatureBaseRSA extends SignatureAlgorithmSpi {
|
||||
|
||||
/**
|
||||
* Class SignatureRSARIPEMD160
|
||||
*
|
||||
* @author $Author: mullan $
|
||||
* @version $Revision: 1.5 $
|
||||
*/
|
||||
public static class SignatureRSARIPEMD160 extends SignatureBaseRSA {
|
||||
|
||||
@ -356,9 +324,6 @@ public abstract class SignatureBaseRSA extends SignatureAlgorithmSpi {
|
||||
|
||||
/**
|
||||
* Class SignatureRSAMD5
|
||||
*
|
||||
* @author $Author: mullan $
|
||||
* @version $Revision: 1.5 $
|
||||
*/
|
||||
public static class SignatureRSAMD5 extends SignatureBaseRSA {
|
||||
|
||||
|
@ -2,21 +2,23 @@
|
||||
* reserved comment block
|
||||
* DO NOT REMOVE OR ALTER!
|
||||
*/
|
||||
/*
|
||||
* Copyright 1999-2004 The Apache Software Foundation.
|
||||
/**
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package com.sun.org.apache.xml.internal.security.algorithms.implementations;
|
||||
|
||||
@ -37,21 +39,17 @@ import com.sun.org.apache.xml.internal.security.signature.XMLSignatureException;
|
||||
import com.sun.org.apache.xml.internal.security.utils.Base64;
|
||||
import com.sun.org.apache.xml.internal.security.utils.Constants;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author $Author: mullan $
|
||||
*/
|
||||
public class SignatureDSA extends SignatureAlgorithmSpi {
|
||||
|
||||
/** {@link java.util.logging} logging facility */
|
||||
static java.util.logging.Logger log =
|
||||
/** {@link org.apache.commons.logging} logging facility */
|
||||
private static java.util.logging.Logger log =
|
||||
java.util.logging.Logger.getLogger(SignatureDSA.class.getName());
|
||||
|
||||
/** Field _URI */
|
||||
public static final String _URI = Constants.SignatureSpecNS + "dsa-sha1";
|
||||
/** Field URI */
|
||||
public static final String URI = Constants.SignatureSpecNS + "dsa-sha1";
|
||||
|
||||
/** Field algorithm */
|
||||
private java.security.Signature _signatureAlgorithm = null;
|
||||
private java.security.Signature signatureAlgorithm = null;
|
||||
|
||||
/**
|
||||
* Method engineGetURI
|
||||
@ -59,7 +57,7 @@ public class SignatureDSA extends SignatureAlgorithmSpi {
|
||||
* @inheritDoc
|
||||
*/
|
||||
protected String engineGetURI() {
|
||||
return SignatureDSA._URI;
|
||||
return SignatureDSA.URI;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -68,17 +66,17 @@ public class SignatureDSA extends SignatureAlgorithmSpi {
|
||||
* @throws XMLSignatureException
|
||||
*/
|
||||
public SignatureDSA() throws XMLSignatureException {
|
||||
|
||||
String algorithmID = JCEMapper.translateURItoJCEID(SignatureDSA._URI);
|
||||
if (log.isLoggable(java.util.logging.Level.FINE))
|
||||
String algorithmID = JCEMapper.translateURItoJCEID(SignatureDSA.URI);
|
||||
if (log.isLoggable(java.util.logging.Level.FINE)) {
|
||||
log.log(java.util.logging.Level.FINE, "Created SignatureDSA using " + algorithmID);
|
||||
}
|
||||
|
||||
String provider = JCEMapper.getProviderId();
|
||||
try {
|
||||
if (provider == null) {
|
||||
this._signatureAlgorithm = Signature.getInstance(algorithmID);
|
||||
this.signatureAlgorithm = Signature.getInstance(algorithmID);
|
||||
} else {
|
||||
this._signatureAlgorithm =
|
||||
this.signatureAlgorithm =
|
||||
Signature.getInstance(algorithmID, provider);
|
||||
}
|
||||
} catch (java.security.NoSuchAlgorithmException ex) {
|
||||
@ -95,9 +93,8 @@ public class SignatureDSA extends SignatureAlgorithmSpi {
|
||||
*/
|
||||
protected void engineSetParameter(AlgorithmParameterSpec params)
|
||||
throws XMLSignatureException {
|
||||
|
||||
try {
|
||||
this._signatureAlgorithm.setParameter(params);
|
||||
this.signatureAlgorithm.setParameter(params);
|
||||
} catch (InvalidAlgorithmParameterException ex) {
|
||||
throw new XMLSignatureException("empty", ex);
|
||||
}
|
||||
@ -107,15 +104,15 @@ public class SignatureDSA extends SignatureAlgorithmSpi {
|
||||
* @inheritDoc
|
||||
*/
|
||||
protected boolean engineVerify(byte[] signature)
|
||||
throws XMLSignatureException {
|
||||
|
||||
throws XMLSignatureException {
|
||||
try {
|
||||
if (log.isLoggable(java.util.logging.Level.FINE))
|
||||
if (log.isLoggable(java.util.logging.Level.FINE)) {
|
||||
log.log(java.util.logging.Level.FINE, "Called DSA.verify() on " + Base64.encode(signature));
|
||||
}
|
||||
|
||||
byte[] jcebytes = SignatureDSA.convertXMLDSIGtoASN1(signature);
|
||||
|
||||
return this._signatureAlgorithm.verify(jcebytes);
|
||||
return this.signatureAlgorithm.verify(jcebytes);
|
||||
} catch (SignatureException ex) {
|
||||
throw new XMLSignatureException("empty", ex);
|
||||
} catch (IOException ex) {
|
||||
@ -127,32 +124,29 @@ public class SignatureDSA extends SignatureAlgorithmSpi {
|
||||
* @inheritDoc
|
||||
*/
|
||||
protected void engineInitVerify(Key publicKey) throws XMLSignatureException {
|
||||
|
||||
if (!(publicKey instanceof PublicKey)) {
|
||||
String supplied = publicKey.getClass().getName();
|
||||
String needed = PublicKey.class.getName();
|
||||
Object exArgs[] = { supplied, needed };
|
||||
|
||||
throw new XMLSignatureException
|
||||
("algorithms.WrongKeyForThisOperation", exArgs);
|
||||
throw new XMLSignatureException("algorithms.WrongKeyForThisOperation", exArgs);
|
||||
}
|
||||
|
||||
try {
|
||||
this._signatureAlgorithm.initVerify((PublicKey) publicKey);
|
||||
this.signatureAlgorithm.initVerify((PublicKey) publicKey);
|
||||
} catch (InvalidKeyException ex) {
|
||||
// reinstantiate Signature object to work around bug in JDK
|
||||
// see: http://bugs.sun.com/view_bug.do?bug_id=4953555
|
||||
Signature sig = this._signatureAlgorithm;
|
||||
Signature sig = this.signatureAlgorithm;
|
||||
try {
|
||||
this._signatureAlgorithm = Signature.getInstance
|
||||
(_signatureAlgorithm.getAlgorithm());
|
||||
this.signatureAlgorithm = Signature.getInstance(signatureAlgorithm.getAlgorithm());
|
||||
} catch (Exception e) {
|
||||
// this shouldn't occur, but if it does, restore previous
|
||||
// Signature
|
||||
if (log.isLoggable(java.util.logging.Level.FINE)) {
|
||||
log.log(java.util.logging.Level.FINE, "Exception when reinstantiating Signature:" + e);
|
||||
}
|
||||
this._signatureAlgorithm = sig;
|
||||
this.signatureAlgorithm = sig;
|
||||
}
|
||||
throw new XMLSignatureException("empty", ex);
|
||||
}
|
||||
@ -162,9 +156,8 @@ public class SignatureDSA extends SignatureAlgorithmSpi {
|
||||
* @inheritDoc
|
||||
*/
|
||||
protected byte[] engineSign() throws XMLSignatureException {
|
||||
|
||||
try {
|
||||
byte jcebytes[] = this._signatureAlgorithm.sign();
|
||||
byte jcebytes[] = this.signatureAlgorithm.sign();
|
||||
|
||||
return SignatureDSA.convertASN1toXMLDSIG(jcebytes);
|
||||
} catch (IOException ex) {
|
||||
@ -178,20 +171,17 @@ public class SignatureDSA extends SignatureAlgorithmSpi {
|
||||
* @inheritDoc
|
||||
*/
|
||||
protected void engineInitSign(Key privateKey, SecureRandom secureRandom)
|
||||
throws XMLSignatureException {
|
||||
|
||||
throws XMLSignatureException {
|
||||
if (!(privateKey instanceof PrivateKey)) {
|
||||
String supplied = privateKey.getClass().getName();
|
||||
String needed = PrivateKey.class.getName();
|
||||
Object exArgs[] = { supplied, needed };
|
||||
|
||||
throw new XMLSignatureException
|
||||
("algorithms.WrongKeyForThisOperation", exArgs);
|
||||
throw new XMLSignatureException("algorithms.WrongKeyForThisOperation", exArgs);
|
||||
}
|
||||
|
||||
try {
|
||||
this._signatureAlgorithm.initSign((PrivateKey) privateKey,
|
||||
secureRandom);
|
||||
this.signatureAlgorithm.initSign((PrivateKey) privateKey, secureRandom);
|
||||
} catch (InvalidKeyException ex) {
|
||||
throw new XMLSignatureException("empty", ex);
|
||||
}
|
||||
@ -201,18 +191,16 @@ public class SignatureDSA extends SignatureAlgorithmSpi {
|
||||
* @inheritDoc
|
||||
*/
|
||||
protected void engineInitSign(Key privateKey) throws XMLSignatureException {
|
||||
|
||||
if (!(privateKey instanceof PrivateKey)) {
|
||||
String supplied = privateKey.getClass().getName();
|
||||
String needed = PrivateKey.class.getName();
|
||||
Object exArgs[] = { supplied, needed };
|
||||
|
||||
throw new XMLSignatureException
|
||||
("algorithms.WrongKeyForThisOperation", exArgs);
|
||||
throw new XMLSignatureException("algorithms.WrongKeyForThisOperation", exArgs);
|
||||
}
|
||||
|
||||
try {
|
||||
this._signatureAlgorithm.initSign((PrivateKey) privateKey);
|
||||
this.signatureAlgorithm.initSign((PrivateKey) privateKey);
|
||||
} catch (InvalidKeyException ex) {
|
||||
throw new XMLSignatureException("empty", ex);
|
||||
}
|
||||
@ -223,7 +211,7 @@ public class SignatureDSA extends SignatureAlgorithmSpi {
|
||||
*/
|
||||
protected void engineUpdate(byte[] input) throws XMLSignatureException {
|
||||
try {
|
||||
this._signatureAlgorithm.update(input);
|
||||
this.signatureAlgorithm.update(input);
|
||||
} catch (SignatureException ex) {
|
||||
throw new XMLSignatureException("empty", ex);
|
||||
}
|
||||
@ -234,7 +222,7 @@ public class SignatureDSA extends SignatureAlgorithmSpi {
|
||||
*/
|
||||
protected void engineUpdate(byte input) throws XMLSignatureException {
|
||||
try {
|
||||
this._signatureAlgorithm.update(input);
|
||||
this.signatureAlgorithm.update(input);
|
||||
} catch (SignatureException ex) {
|
||||
throw new XMLSignatureException("empty", ex);
|
||||
}
|
||||
@ -243,10 +231,9 @@ public class SignatureDSA extends SignatureAlgorithmSpi {
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
protected void engineUpdate(byte buf[], int offset, int len)
|
||||
throws XMLSignatureException {
|
||||
protected void engineUpdate(byte buf[], int offset, int len) throws XMLSignatureException {
|
||||
try {
|
||||
this._signatureAlgorithm.update(buf, offset, len);
|
||||
this.signatureAlgorithm.update(buf, offset, len);
|
||||
} catch (SignatureException ex) {
|
||||
throw new XMLSignatureException("empty", ex);
|
||||
}
|
||||
@ -258,7 +245,7 @@ public class SignatureDSA extends SignatureAlgorithmSpi {
|
||||
* @inheritDoc
|
||||
*/
|
||||
protected String engineGetJCEAlgorithmString() {
|
||||
return this._signatureAlgorithm.getAlgorithm();
|
||||
return this.signatureAlgorithm.getAlgorithm();
|
||||
}
|
||||
|
||||
/**
|
||||
@ -267,7 +254,7 @@ public class SignatureDSA extends SignatureAlgorithmSpi {
|
||||
* @inheritDoc
|
||||
*/
|
||||
protected String engineGetJCEProviderName() {
|
||||
return this._signatureAlgorithm.getProvider().getName();
|
||||
return this.signatureAlgorithm.getProvider().getName();
|
||||
}
|
||||
|
||||
/**
|
||||
@ -282,8 +269,7 @@ public class SignatureDSA extends SignatureAlgorithmSpi {
|
||||
* @throws IOException
|
||||
* @see <A HREF="http://www.w3.org/TR/xmldsig-core/#dsa-sha1">6.4.1 DSA</A>
|
||||
*/
|
||||
private static byte[] convertASN1toXMLDSIG(byte asn1Bytes[])
|
||||
throws IOException {
|
||||
private static byte[] convertASN1toXMLDSIG(byte asn1Bytes[]) throws IOException {
|
||||
|
||||
byte rLength = asn1Bytes[3];
|
||||
int i;
|
||||
@ -294,19 +280,18 @@ public class SignatureDSA extends SignatureAlgorithmSpi {
|
||||
int j;
|
||||
|
||||
for (j = sLength;
|
||||
(j > 0) && (asn1Bytes[(6 + rLength + sLength) - j] == 0); j--);
|
||||
(j > 0) && (asn1Bytes[(6 + rLength + sLength) - j] == 0); j--);
|
||||
|
||||
if ((asn1Bytes[0] != 48) || (asn1Bytes[1] != asn1Bytes.length - 2)
|
||||
|| (asn1Bytes[2] != 2) || (i > 20)
|
||||
|| (asn1Bytes[4 + rLength] != 2) || (j > 20)) {
|
||||
|| (asn1Bytes[2] != 2) || (i > 20)
|
||||
|| (asn1Bytes[4 + rLength] != 2) || (j > 20)) {
|
||||
throw new IOException("Invalid ASN.1 format of DSA signature");
|
||||
}
|
||||
byte xmldsigBytes[] = new byte[40];
|
||||
|
||||
System.arraycopy(asn1Bytes, (4 + rLength) - i, xmldsigBytes, 20 - i,
|
||||
i);
|
||||
System.arraycopy(asn1Bytes, (4 + rLength) - i, xmldsigBytes, 20 - i, i);
|
||||
System.arraycopy(asn1Bytes, (6 + rLength + sLength) - j, xmldsigBytes,
|
||||
40 - j, j);
|
||||
40 - j, j);
|
||||
|
||||
return xmldsigBytes;
|
||||
}
|
||||
@ -323,8 +308,7 @@ public class SignatureDSA extends SignatureAlgorithmSpi {
|
||||
* @throws IOException
|
||||
* @see <A HREF="http://www.w3.org/TR/xmldsig-core/#dsa-sha1">6.4.1 DSA</A>
|
||||
*/
|
||||
private static byte[] convertXMLDSIGtoASN1(byte xmldsigBytes[])
|
||||
throws IOException {
|
||||
private static byte[] convertXMLDSIGtoASN1(byte xmldsigBytes[]) throws IOException {
|
||||
|
||||
if (xmldsigBytes.length != 40) {
|
||||
throw new IOException("Invalid XMLDSIG format of DSA signature");
|
||||
@ -337,7 +321,7 @@ public class SignatureDSA extends SignatureAlgorithmSpi {
|
||||
int j = i;
|
||||
|
||||
if (xmldsigBytes[20 - i] < 0) {
|
||||
j += 1;
|
||||
j += 1;
|
||||
}
|
||||
|
||||
int k;
|
||||
@ -373,10 +357,8 @@ public class SignatureDSA extends SignatureAlgorithmSpi {
|
||||
* @param HMACOutputLength
|
||||
* @throws XMLSignatureException
|
||||
*/
|
||||
protected void engineSetHMACOutputLength(int HMACOutputLength)
|
||||
throws XMLSignatureException {
|
||||
throw new XMLSignatureException(
|
||||
"algorithms.HMACOutputLengthOnlyForHMAC");
|
||||
protected void engineSetHMACOutputLength(int HMACOutputLength) throws XMLSignatureException {
|
||||
throw new XMLSignatureException("algorithms.HMACOutputLengthOnlyForHMAC");
|
||||
}
|
||||
|
||||
/**
|
||||
@ -387,9 +369,8 @@ public class SignatureDSA extends SignatureAlgorithmSpi {
|
||||
* @throws XMLSignatureException
|
||||
*/
|
||||
protected void engineInitSign(
|
||||
Key signingKey, AlgorithmParameterSpec algorithmParameterSpec)
|
||||
throws XMLSignatureException {
|
||||
throw new XMLSignatureException(
|
||||
"algorithms.CannotUseAlgorithmParameterSpecOnDSA");
|
||||
Key signingKey, AlgorithmParameterSpec algorithmParameterSpec
|
||||
) throws XMLSignatureException {
|
||||
throw new XMLSignatureException("algorithms.CannotUseAlgorithmParameterSpecOnDSA");
|
||||
}
|
||||
}
|
||||
|
@ -2,26 +2,26 @@
|
||||
* reserved comment block
|
||||
* DO NOT REMOVE OR ALTER!
|
||||
*/
|
||||
/*
|
||||
* Copyright 1999-2004 The Apache Software Foundation.
|
||||
/**
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package com.sun.org.apache.xml.internal.security.algorithms.implementations;
|
||||
|
||||
|
||||
|
||||
import java.io.IOException;
|
||||
import java.security.InvalidAlgorithmParameterException;
|
||||
import java.security.InvalidKeyException;
|
||||
@ -40,345 +40,417 @@ import com.sun.org.apache.xml.internal.security.signature.XMLSignature;
|
||||
import com.sun.org.apache.xml.internal.security.signature.XMLSignatureException;
|
||||
import com.sun.org.apache.xml.internal.security.utils.Base64;
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
* @author $Author: mullan $
|
||||
* @author $Author: raul $
|
||||
* @author Alex Dupre
|
||||
*/
|
||||
public abstract class SignatureECDSA extends SignatureAlgorithmSpi {
|
||||
|
||||
/** {@link java.util.logging} logging facility */
|
||||
static java.util.logging.Logger log =
|
||||
/** {@link org.apache.commons.logging} logging facility */
|
||||
private static java.util.logging.Logger log =
|
||||
java.util.logging.Logger.getLogger(SignatureECDSA.class.getName());
|
||||
|
||||
/** @inheritDoc */
|
||||
public abstract String engineGetURI();
|
||||
public abstract String engineGetURI();
|
||||
|
||||
/** Field algorithm */
|
||||
private java.security.Signature _signatureAlgorithm = null;
|
||||
/** Field algorithm */
|
||||
private java.security.Signature signatureAlgorithm = null;
|
||||
|
||||
/**
|
||||
* Converts an ASN.1 ECDSA value to a XML Signature ECDSA Value.
|
||||
*
|
||||
* The JAVA JCE ECDSA Signature algorithm creates ASN.1 encoded (r,s) value
|
||||
* pairs; the XML Signature requires the core BigInteger values.
|
||||
*
|
||||
* @param asn1Bytes
|
||||
* @return the decode bytes
|
||||
*
|
||||
* @throws IOException
|
||||
* @see <A HREF="http://www.w3.org/TR/xmldsig-core/#dsa-sha1">6.4.1 DSA</A>
|
||||
* @see <A HREF="ftp://ftp.rfc-editor.org/in-notes/rfc4050.txt">3.3. ECDSA Signatures</A>
|
||||
*/
|
||||
private static byte[] convertASN1toXMLDSIG(byte asn1Bytes[])
|
||||
throws IOException {
|
||||
/**
|
||||
* Converts an ASN.1 ECDSA value to a XML Signature ECDSA Value.
|
||||
*
|
||||
* The JAVA JCE ECDSA Signature algorithm creates ASN.1 encoded (r,s) value
|
||||
* pairs; the XML Signature requires the core BigInteger values.
|
||||
*
|
||||
* @param asn1Bytes
|
||||
* @return the decode bytes
|
||||
*
|
||||
* @throws IOException
|
||||
* @see <A HREF="http://www.w3.org/TR/xmldsig-core/#dsa-sha1">6.4.1 DSA</A>
|
||||
* @see <A HREF="ftp://ftp.rfc-editor.org/in-notes/rfc4050.txt">3.3. ECDSA Signatures</A>
|
||||
*/
|
||||
public static byte[] convertASN1toXMLDSIG(byte asn1Bytes[]) throws IOException {
|
||||
|
||||
byte rLength = asn1Bytes[3];
|
||||
int i;
|
||||
|
||||
for (i = rLength; (i > 0) && (asn1Bytes[(4 + rLength) - i] == 0); i--);
|
||||
|
||||
byte sLength = asn1Bytes[5 + rLength];
|
||||
int j;
|
||||
|
||||
for (j = sLength;
|
||||
(j > 0) && (asn1Bytes[(6 + rLength + sLength) - j] == 0); j--);
|
||||
|
||||
if ((asn1Bytes[0] != 48) || (asn1Bytes[1] != asn1Bytes.length - 2)
|
||||
|| (asn1Bytes[2] != 2) || (i > 24)
|
||||
|| (asn1Bytes[4 + rLength] != 2) || (j > 24)) {
|
||||
throw new IOException("Invalid ASN.1 format of ECDSA signature");
|
||||
}
|
||||
byte xmldsigBytes[] = new byte[48];
|
||||
|
||||
System.arraycopy(asn1Bytes, (4 + rLength) - i, xmldsigBytes, 24 - i,
|
||||
i);
|
||||
System.arraycopy(asn1Bytes, (6 + rLength + sLength) - j, xmldsigBytes,
|
||||
48 - j, j);
|
||||
|
||||
return xmldsigBytes;
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts a XML Signature ECDSA Value to an ASN.1 DSA value.
|
||||
*
|
||||
* The JAVA JCE ECDSA Signature algorithm creates ASN.1 encoded (r,s) value
|
||||
* pairs; the XML Signature requires the core BigInteger values.
|
||||
*
|
||||
* @param xmldsigBytes
|
||||
* @return the encoded ASN.1 bytes
|
||||
*
|
||||
* @throws IOException
|
||||
* @see <A HREF="http://www.w3.org/TR/xmldsig-core/#dsa-sha1">6.4.1 DSA</A>
|
||||
* @see <A HREF="ftp://ftp.rfc-editor.org/in-notes/rfc4050.txt">3.3. ECDSA Signatures</A>
|
||||
*/
|
||||
private static byte[] convertXMLDSIGtoASN1(byte xmldsigBytes[])
|
||||
throws IOException {
|
||||
|
||||
if (xmldsigBytes.length != 48) {
|
||||
throw new IOException("Invalid XMLDSIG format of ECDSA signature");
|
||||
}
|
||||
|
||||
int i;
|
||||
|
||||
for (i = 24; (i > 0) && (xmldsigBytes[24 - i] == 0); i--);
|
||||
|
||||
int j = i;
|
||||
|
||||
if (xmldsigBytes[24 - i] < 0) {
|
||||
j += 1;
|
||||
}
|
||||
|
||||
int k;
|
||||
|
||||
for (k = 24; (k > 0) && (xmldsigBytes[48 - k] == 0); k--);
|
||||
|
||||
int l = k;
|
||||
|
||||
if (xmldsigBytes[48 - k] < 0) {
|
||||
l += 1;
|
||||
}
|
||||
|
||||
byte asn1Bytes[] = new byte[6 + j + l];
|
||||
|
||||
asn1Bytes[0] = 48;
|
||||
asn1Bytes[1] = (byte) (4 + j + l);
|
||||
asn1Bytes[2] = 2;
|
||||
asn1Bytes[3] = (byte) j;
|
||||
|
||||
System.arraycopy(xmldsigBytes, 24 - i, asn1Bytes, (4 + j) - i, i);
|
||||
|
||||
asn1Bytes[4 + j] = 2;
|
||||
asn1Bytes[5 + j] = (byte) l;
|
||||
|
||||
System.arraycopy(xmldsigBytes, 48 - k, asn1Bytes, (6 + j + l) - k, k);
|
||||
|
||||
return asn1Bytes;
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructor SignatureRSA
|
||||
*
|
||||
* @throws XMLSignatureException
|
||||
*/
|
||||
public SignatureECDSA() throws XMLSignatureException {
|
||||
|
||||
String algorithmID = JCEMapper.translateURItoJCEID(this.engineGetURI());
|
||||
|
||||
if (log.isLoggable(java.util.logging.Level.FINE))
|
||||
log.log(java.util.logging.Level.FINE, "Created SignatureECDSA using " + algorithmID);
|
||||
String provider=JCEMapper.getProviderId();
|
||||
try {
|
||||
if (provider==null) {
|
||||
this._signatureAlgorithm = Signature.getInstance(algorithmID);
|
||||
} else {
|
||||
this._signatureAlgorithm = Signature.getInstance(algorithmID,provider);
|
||||
}
|
||||
} catch (java.security.NoSuchAlgorithmException ex) {
|
||||
Object[] exArgs = { algorithmID,
|
||||
ex.getLocalizedMessage() };
|
||||
|
||||
throw new XMLSignatureException("algorithms.NoSuchAlgorithm", exArgs);
|
||||
} catch (NoSuchProviderException ex) {
|
||||
Object[] exArgs = { algorithmID,
|
||||
ex.getLocalizedMessage() };
|
||||
|
||||
throw new XMLSignatureException("algorithms.NoSuchAlgorithm", exArgs);
|
||||
if (asn1Bytes.length < 8 || asn1Bytes[0] != 48) {
|
||||
throw new IOException("Invalid ASN.1 format of ECDSA signature");
|
||||
}
|
||||
int offset;
|
||||
if (asn1Bytes[1] > 0) {
|
||||
offset = 2;
|
||||
} else if (asn1Bytes[1] == (byte) 0x81) {
|
||||
offset = 3;
|
||||
} else {
|
||||
throw new IOException("Invalid ASN.1 format of ECDSA signature");
|
||||
}
|
||||
}
|
||||
|
||||
/** @inheritDoc */
|
||||
protected void engineSetParameter(AlgorithmParameterSpec params)
|
||||
throws XMLSignatureException {
|
||||
byte rLength = asn1Bytes[offset + 1];
|
||||
int i;
|
||||
|
||||
try {
|
||||
this._signatureAlgorithm.setParameter(params);
|
||||
} catch (InvalidAlgorithmParameterException ex) {
|
||||
throw new XMLSignatureException("empty", ex);
|
||||
}
|
||||
}
|
||||
for (i = rLength; (i > 0) && (asn1Bytes[(offset + 2 + rLength) - i] == 0); i--);
|
||||
|
||||
/** @inheritDoc */
|
||||
protected boolean engineVerify(byte[] signature)
|
||||
throws XMLSignatureException {
|
||||
byte sLength = asn1Bytes[offset + 2 + rLength + 1];
|
||||
int j;
|
||||
|
||||
try {
|
||||
byte[] jcebytes = SignatureECDSA.convertXMLDSIGtoASN1(signature);
|
||||
for (j = sLength;
|
||||
(j > 0) && (asn1Bytes[(offset + 2 + rLength + 2 + sLength) - j] == 0); j--);
|
||||
|
||||
if (log.isLoggable(java.util.logging.Level.FINE))
|
||||
log.log(java.util.logging.Level.FINE, "Called ECDSA.verify() on " + Base64.encode(signature));
|
||||
int rawLen = Math.max(i, j);
|
||||
|
||||
return this._signatureAlgorithm.verify(jcebytes);
|
||||
} catch (SignatureException ex) {
|
||||
throw new XMLSignatureException("empty", ex);
|
||||
} catch (IOException ex) {
|
||||
throw new XMLSignatureException("empty", ex);
|
||||
}
|
||||
}
|
||||
if ((asn1Bytes[offset - 1] & 0xff) != asn1Bytes.length - offset
|
||||
|| (asn1Bytes[offset - 1] & 0xff) != 2 + rLength + 2 + sLength
|
||||
|| asn1Bytes[offset] != 2
|
||||
|| asn1Bytes[offset + 2 + rLength] != 2) {
|
||||
throw new IOException("Invalid ASN.1 format of ECDSA signature");
|
||||
}
|
||||
byte xmldsigBytes[] = new byte[2*rawLen];
|
||||
|
||||
/** @inheritDoc */
|
||||
protected void engineInitVerify(Key publicKey) throws XMLSignatureException {
|
||||
System.arraycopy(asn1Bytes, (offset + 2 + rLength) - i, xmldsigBytes, rawLen - i, i);
|
||||
System.arraycopy(asn1Bytes, (offset + 2 + rLength + 2 + sLength) - j, xmldsigBytes,
|
||||
2*rawLen - j, j);
|
||||
|
||||
if (!(publicKey instanceof PublicKey)) {
|
||||
String supplied = publicKey.getClass().getName();
|
||||
String needed = PublicKey.class.getName();
|
||||
Object exArgs[] = { supplied, needed };
|
||||
return xmldsigBytes;
|
||||
}
|
||||
|
||||
throw new XMLSignatureException("algorithms.WrongKeyForThisOperation",
|
||||
exArgs);
|
||||
}
|
||||
/**
|
||||
* Converts a XML Signature ECDSA Value to an ASN.1 DSA value.
|
||||
*
|
||||
* The JAVA JCE ECDSA Signature algorithm creates ASN.1 encoded (r,s) value
|
||||
* pairs; the XML Signature requires the core BigInteger values.
|
||||
*
|
||||
* @param xmldsigBytes
|
||||
* @return the encoded ASN.1 bytes
|
||||
*
|
||||
* @throws IOException
|
||||
* @see <A HREF="http://www.w3.org/TR/xmldsig-core/#dsa-sha1">6.4.1 DSA</A>
|
||||
* @see <A HREF="ftp://ftp.rfc-editor.org/in-notes/rfc4050.txt">3.3. ECDSA Signatures</A>
|
||||
*/
|
||||
public static byte[] convertXMLDSIGtoASN1(byte xmldsigBytes[]) throws IOException {
|
||||
|
||||
try {
|
||||
this._signatureAlgorithm.initVerify((PublicKey) publicKey);
|
||||
} catch (InvalidKeyException ex) {
|
||||
int rawLen = xmldsigBytes.length/2;
|
||||
|
||||
int i;
|
||||
|
||||
for (i = rawLen; (i > 0) && (xmldsigBytes[rawLen - i] == 0); i--);
|
||||
|
||||
int j = i;
|
||||
|
||||
if (xmldsigBytes[rawLen - i] < 0) {
|
||||
j += 1;
|
||||
}
|
||||
|
||||
int k;
|
||||
|
||||
for (k = rawLen; (k > 0) && (xmldsigBytes[2*rawLen - k] == 0); k--);
|
||||
|
||||
int l = k;
|
||||
|
||||
if (xmldsigBytes[2*rawLen - k] < 0) {
|
||||
l += 1;
|
||||
}
|
||||
|
||||
int len = 2 + j + 2 + l;
|
||||
if (len > 255) {
|
||||
throw new IOException("Invalid XMLDSIG format of ECDSA signature");
|
||||
}
|
||||
int offset;
|
||||
byte asn1Bytes[];
|
||||
if (len < 128) {
|
||||
asn1Bytes = new byte[2 + 2 + j + 2 + l];
|
||||
offset = 1;
|
||||
} else {
|
||||
asn1Bytes = new byte[3 + 2 + j + 2 + l];
|
||||
asn1Bytes[1] = (byte) 0x81;
|
||||
offset = 2;
|
||||
}
|
||||
asn1Bytes[0] = 48;
|
||||
asn1Bytes[offset++] = (byte) len;
|
||||
asn1Bytes[offset++] = 2;
|
||||
asn1Bytes[offset++] = (byte) j;
|
||||
|
||||
System.arraycopy(xmldsigBytes, rawLen - i, asn1Bytes, (offset + j) - i, i);
|
||||
|
||||
offset += j;
|
||||
|
||||
asn1Bytes[offset++] = 2;
|
||||
asn1Bytes[offset++] = (byte) l;
|
||||
|
||||
System.arraycopy(xmldsigBytes, 2*rawLen - k, asn1Bytes, (offset + l) - k, k);
|
||||
|
||||
return asn1Bytes;
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructor SignatureRSA
|
||||
*
|
||||
* @throws XMLSignatureException
|
||||
*/
|
||||
public SignatureECDSA() throws XMLSignatureException {
|
||||
|
||||
String algorithmID = JCEMapper.translateURItoJCEID(this.engineGetURI());
|
||||
|
||||
if (log.isLoggable(java.util.logging.Level.FINE)) {
|
||||
log.log(java.util.logging.Level.FINE, "Created SignatureECDSA using " + algorithmID);
|
||||
}
|
||||
String provider = JCEMapper.getProviderId();
|
||||
try {
|
||||
if (provider == null) {
|
||||
this.signatureAlgorithm = Signature.getInstance(algorithmID);
|
||||
} else {
|
||||
this.signatureAlgorithm = Signature.getInstance(algorithmID,provider);
|
||||
}
|
||||
} catch (java.security.NoSuchAlgorithmException ex) {
|
||||
Object[] exArgs = { algorithmID, ex.getLocalizedMessage() };
|
||||
|
||||
throw new XMLSignatureException("algorithms.NoSuchAlgorithm", exArgs);
|
||||
} catch (NoSuchProviderException ex) {
|
||||
Object[] exArgs = { algorithmID, ex.getLocalizedMessage() };
|
||||
|
||||
throw new XMLSignatureException("algorithms.NoSuchAlgorithm", exArgs);
|
||||
}
|
||||
}
|
||||
|
||||
/** @inheritDoc */
|
||||
protected void engineSetParameter(AlgorithmParameterSpec params)
|
||||
throws XMLSignatureException {
|
||||
try {
|
||||
this.signatureAlgorithm.setParameter(params);
|
||||
} catch (InvalidAlgorithmParameterException ex) {
|
||||
throw new XMLSignatureException("empty", ex);
|
||||
}
|
||||
}
|
||||
|
||||
/** @inheritDoc */
|
||||
protected boolean engineVerify(byte[] signature) throws XMLSignatureException {
|
||||
try {
|
||||
byte[] jcebytes = SignatureECDSA.convertXMLDSIGtoASN1(signature);
|
||||
|
||||
if (log.isLoggable(java.util.logging.Level.FINE)) {
|
||||
log.log(java.util.logging.Level.FINE, "Called ECDSA.verify() on " + Base64.encode(signature));
|
||||
}
|
||||
|
||||
return this.signatureAlgorithm.verify(jcebytes);
|
||||
} catch (SignatureException ex) {
|
||||
throw new XMLSignatureException("empty", ex);
|
||||
} catch (IOException ex) {
|
||||
throw new XMLSignatureException("empty", ex);
|
||||
}
|
||||
}
|
||||
|
||||
/** @inheritDoc */
|
||||
protected void engineInitVerify(Key publicKey) throws XMLSignatureException {
|
||||
|
||||
if (!(publicKey instanceof PublicKey)) {
|
||||
String supplied = publicKey.getClass().getName();
|
||||
String needed = PublicKey.class.getName();
|
||||
Object exArgs[] = { supplied, needed };
|
||||
|
||||
throw new XMLSignatureException("algorithms.WrongKeyForThisOperation", exArgs);
|
||||
}
|
||||
|
||||
try {
|
||||
this.signatureAlgorithm.initVerify((PublicKey) publicKey);
|
||||
} catch (InvalidKeyException ex) {
|
||||
// reinstantiate Signature object to work around bug in JDK
|
||||
// see: http://bugs.sun.com/view_bug.do?bug_id=4953555
|
||||
Signature sig = this._signatureAlgorithm;
|
||||
Signature sig = this.signatureAlgorithm;
|
||||
try {
|
||||
this._signatureAlgorithm = Signature.getInstance
|
||||
(_signatureAlgorithm.getAlgorithm());
|
||||
this.signatureAlgorithm = Signature.getInstance(signatureAlgorithm.getAlgorithm());
|
||||
} catch (Exception e) {
|
||||
// this shouldn't occur, but if it does, restore previous
|
||||
// Signature
|
||||
if (log.isLoggable(java.util.logging.Level.FINE)) {
|
||||
log.log(java.util.logging.Level.FINE, "Exception when reinstantiating Signature:" + e);
|
||||
}
|
||||
this._signatureAlgorithm = sig;
|
||||
this.signatureAlgorithm = sig;
|
||||
}
|
||||
throw new XMLSignatureException("empty", ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** @inheritDoc */
|
||||
protected byte[] engineSign() throws XMLSignatureException {
|
||||
/** @inheritDoc */
|
||||
protected byte[] engineSign() throws XMLSignatureException {
|
||||
try {
|
||||
byte jcebytes[] = this.signatureAlgorithm.sign();
|
||||
|
||||
try {
|
||||
byte jcebytes[] = this._signatureAlgorithm.sign();
|
||||
return SignatureECDSA.convertASN1toXMLDSIG(jcebytes);
|
||||
} catch (SignatureException ex) {
|
||||
throw new XMLSignatureException("empty", ex);
|
||||
} catch (IOException ex) {
|
||||
throw new XMLSignatureException("empty", ex);
|
||||
}
|
||||
}
|
||||
|
||||
return SignatureECDSA.convertASN1toXMLDSIG(jcebytes);
|
||||
} catch (SignatureException ex) {
|
||||
throw new XMLSignatureException("empty", ex);
|
||||
} catch (IOException ex) {
|
||||
throw new XMLSignatureException("empty", ex);
|
||||
}
|
||||
}
|
||||
/** @inheritDoc */
|
||||
protected void engineInitSign(Key privateKey, SecureRandom secureRandom)
|
||||
throws XMLSignatureException {
|
||||
if (!(privateKey instanceof PrivateKey)) {
|
||||
String supplied = privateKey.getClass().getName();
|
||||
String needed = PrivateKey.class.getName();
|
||||
Object exArgs[] = { supplied, needed };
|
||||
|
||||
/** @inheritDoc */
|
||||
protected void engineInitSign(Key privateKey, SecureRandom secureRandom)
|
||||
throws XMLSignatureException {
|
||||
throw new XMLSignatureException("algorithms.WrongKeyForThisOperation", exArgs);
|
||||
}
|
||||
|
||||
if (!(privateKey instanceof PrivateKey)) {
|
||||
String supplied = privateKey.getClass().getName();
|
||||
String needed = PrivateKey.class.getName();
|
||||
Object exArgs[] = { supplied, needed };
|
||||
try {
|
||||
this.signatureAlgorithm.initSign((PrivateKey) privateKey, secureRandom);
|
||||
} catch (InvalidKeyException ex) {
|
||||
throw new XMLSignatureException("empty", ex);
|
||||
}
|
||||
}
|
||||
|
||||
throw new XMLSignatureException("algorithms.WrongKeyForThisOperation",
|
||||
exArgs);
|
||||
}
|
||||
/** @inheritDoc */
|
||||
protected void engineInitSign(Key privateKey) throws XMLSignatureException {
|
||||
if (!(privateKey instanceof PrivateKey)) {
|
||||
String supplied = privateKey.getClass().getName();
|
||||
String needed = PrivateKey.class.getName();
|
||||
Object exArgs[] = { supplied, needed };
|
||||
|
||||
try {
|
||||
this._signatureAlgorithm.initSign((PrivateKey) privateKey,
|
||||
secureRandom);
|
||||
} catch (InvalidKeyException ex) {
|
||||
throw new XMLSignatureException("empty", ex);
|
||||
}
|
||||
}
|
||||
throw new XMLSignatureException("algorithms.WrongKeyForThisOperation", exArgs);
|
||||
}
|
||||
|
||||
/** @inheritDoc */
|
||||
protected void engineInitSign(Key privateKey) throws XMLSignatureException {
|
||||
try {
|
||||
this.signatureAlgorithm.initSign((PrivateKey) privateKey);
|
||||
} catch (InvalidKeyException ex) {
|
||||
throw new XMLSignatureException("empty", ex);
|
||||
}
|
||||
}
|
||||
|
||||
if (!(privateKey instanceof PrivateKey)) {
|
||||
String supplied = privateKey.getClass().getName();
|
||||
String needed = PrivateKey.class.getName();
|
||||
Object exArgs[] = { supplied, needed };
|
||||
/** @inheritDoc */
|
||||
protected void engineUpdate(byte[] input) throws XMLSignatureException {
|
||||
try {
|
||||
this.signatureAlgorithm.update(input);
|
||||
} catch (SignatureException ex) {
|
||||
throw new XMLSignatureException("empty", ex);
|
||||
}
|
||||
}
|
||||
|
||||
throw new XMLSignatureException("algorithms.WrongKeyForThisOperation",
|
||||
exArgs);
|
||||
}
|
||||
/** @inheritDoc */
|
||||
protected void engineUpdate(byte input) throws XMLSignatureException {
|
||||
try {
|
||||
this.signatureAlgorithm.update(input);
|
||||
} catch (SignatureException ex) {
|
||||
throw new XMLSignatureException("empty", ex);
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
this._signatureAlgorithm.initSign((PrivateKey) privateKey);
|
||||
} catch (InvalidKeyException ex) {
|
||||
throw new XMLSignatureException("empty", ex);
|
||||
}
|
||||
}
|
||||
/** @inheritDoc */
|
||||
protected void engineUpdate(byte buf[], int offset, int len) throws XMLSignatureException {
|
||||
try {
|
||||
this.signatureAlgorithm.update(buf, offset, len);
|
||||
} catch (SignatureException ex) {
|
||||
throw new XMLSignatureException("empty", ex);
|
||||
}
|
||||
}
|
||||
|
||||
/** @inheritDoc */
|
||||
protected void engineUpdate(byte[] input) throws XMLSignatureException {
|
||||
/** @inheritDoc */
|
||||
protected String engineGetJCEAlgorithmString() {
|
||||
return this.signatureAlgorithm.getAlgorithm();
|
||||
}
|
||||
|
||||
try {
|
||||
this._signatureAlgorithm.update(input);
|
||||
} catch (SignatureException ex) {
|
||||
throw new XMLSignatureException("empty", ex);
|
||||
}
|
||||
}
|
||||
/** @inheritDoc */
|
||||
protected String engineGetJCEProviderName() {
|
||||
return this.signatureAlgorithm.getProvider().getName();
|
||||
}
|
||||
|
||||
/** @inheritDoc */
|
||||
protected void engineUpdate(byte input) throws XMLSignatureException {
|
||||
/** @inheritDoc */
|
||||
protected void engineSetHMACOutputLength(int HMACOutputLength)
|
||||
throws XMLSignatureException {
|
||||
throw new XMLSignatureException("algorithms.HMACOutputLengthOnlyForHMAC");
|
||||
}
|
||||
|
||||
try {
|
||||
this._signatureAlgorithm.update(input);
|
||||
} catch (SignatureException ex) {
|
||||
throw new XMLSignatureException("empty", ex);
|
||||
}
|
||||
}
|
||||
/** @inheritDoc */
|
||||
protected void engineInitSign(
|
||||
Key signingKey, AlgorithmParameterSpec algorithmParameterSpec
|
||||
) throws XMLSignatureException {
|
||||
throw new XMLSignatureException("algorithms.CannotUseAlgorithmParameterSpecOnRSA");
|
||||
}
|
||||
|
||||
/** @inheritDoc */
|
||||
protected void engineUpdate(byte buf[], int offset, int len)
|
||||
throws XMLSignatureException {
|
||||
/**
|
||||
* Class SignatureRSASHA1
|
||||
*
|
||||
* @author $Author: marcx $
|
||||
*/
|
||||
public static class SignatureECDSASHA1 extends SignatureECDSA {
|
||||
/**
|
||||
* Constructor SignatureRSASHA1
|
||||
*
|
||||
* @throws XMLSignatureException
|
||||
*/
|
||||
public SignatureECDSASHA1() throws XMLSignatureException {
|
||||
super();
|
||||
}
|
||||
|
||||
try {
|
||||
this._signatureAlgorithm.update(buf, offset, len);
|
||||
} catch (SignatureException ex) {
|
||||
throw new XMLSignatureException("empty", ex);
|
||||
}
|
||||
}
|
||||
/** @inheritDoc */
|
||||
public String engineGetURI() {
|
||||
return XMLSignature.ALGO_ID_SIGNATURE_ECDSA_SHA1;
|
||||
}
|
||||
}
|
||||
|
||||
/** @inheritDoc */
|
||||
protected String engineGetJCEAlgorithmString() {
|
||||
return this._signatureAlgorithm.getAlgorithm();
|
||||
}
|
||||
/**
|
||||
* Class SignatureRSASHA256
|
||||
*
|
||||
* @author Alex Dupre
|
||||
*/
|
||||
public static class SignatureECDSASHA256 extends SignatureECDSA {
|
||||
|
||||
/** @inheritDoc */
|
||||
protected String engineGetJCEProviderName() {
|
||||
return this._signatureAlgorithm.getProvider().getName();
|
||||
}
|
||||
/**
|
||||
* Constructor SignatureRSASHA256
|
||||
*
|
||||
* @throws XMLSignatureException
|
||||
*/
|
||||
public SignatureECDSASHA256() throws XMLSignatureException {
|
||||
super();
|
||||
}
|
||||
|
||||
/** @inheritDoc */
|
||||
protected void engineSetHMACOutputLength(int HMACOutputLength)
|
||||
throws XMLSignatureException {
|
||||
throw new XMLSignatureException("algorithms.HMACOutputLengthOnlyForHMAC");
|
||||
}
|
||||
/** @inheritDoc */
|
||||
public String engineGetURI() {
|
||||
return XMLSignature.ALGO_ID_SIGNATURE_ECDSA_SHA256;
|
||||
}
|
||||
}
|
||||
|
||||
/** @inheritDoc */
|
||||
protected void engineInitSign(
|
||||
Key signingKey, AlgorithmParameterSpec algorithmParameterSpec)
|
||||
throws XMLSignatureException {
|
||||
throw new XMLSignatureException(
|
||||
"algorithms.CannotUseAlgorithmParameterSpecOnRSA");
|
||||
}
|
||||
/**
|
||||
* Class SignatureRSASHA384
|
||||
*
|
||||
* @author Alex Dupre
|
||||
*/
|
||||
public static class SignatureECDSASHA384 extends SignatureECDSA {
|
||||
|
||||
/**
|
||||
* Class SignatureRSASHA1
|
||||
*
|
||||
* @author $Author: mullan $
|
||||
* @version $Revision: 1.2 $
|
||||
*/
|
||||
public static class SignatureECDSASHA1 extends SignatureECDSA {
|
||||
/**
|
||||
* Constructor SignatureRSASHA384
|
||||
*
|
||||
* @throws XMLSignatureException
|
||||
*/
|
||||
public SignatureECDSASHA384() throws XMLSignatureException {
|
||||
super();
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructor SignatureRSASHA1
|
||||
*
|
||||
* @throws XMLSignatureException
|
||||
*/
|
||||
public SignatureECDSASHA1() throws XMLSignatureException {
|
||||
super();
|
||||
}
|
||||
/** @inheritDoc */
|
||||
public String engineGetURI() {
|
||||
return XMLSignature.ALGO_ID_SIGNATURE_ECDSA_SHA384;
|
||||
}
|
||||
}
|
||||
|
||||
/** @inheritDoc */
|
||||
public String engineGetURI() {
|
||||
return XMLSignature.ALGO_ID_SIGNATURE_ECDSA_SHA1;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Class SignatureRSASHA512
|
||||
*
|
||||
* @author Alex Dupre
|
||||
*/
|
||||
public static class SignatureECDSASHA512 extends SignatureECDSA {
|
||||
|
||||
/**
|
||||
* Constructor SignatureRSASHA512
|
||||
*
|
||||
* @throws XMLSignatureException
|
||||
*/
|
||||
public SignatureECDSASHA512() throws XMLSignatureException {
|
||||
super();
|
||||
}
|
||||
|
||||
/** @inheritDoc */
|
||||
public String engineGetURI() {
|
||||
return XMLSignature.ALGO_ID_SIGNATURE_ECDSA_SHA512;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -2,29 +2,28 @@
|
||||
* reserved comment block
|
||||
* DO NOT REMOVE OR ALTER!
|
||||
*/
|
||||
/*
|
||||
* Copyright 1999-2004 The Apache Software Foundation.
|
||||
/**
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package com.sun.org.apache.xml.internal.security.c14n;
|
||||
|
||||
|
||||
|
||||
import com.sun.org.apache.xml.internal.security.exceptions.XMLSecurityException;
|
||||
|
||||
|
||||
/**
|
||||
* Class CanonicalizationException
|
||||
*
|
||||
@ -32,57 +31,58 @@ import com.sun.org.apache.xml.internal.security.exceptions.XMLSecurityException;
|
||||
*/
|
||||
public class CanonicalizationException extends XMLSecurityException {
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
private static final long serialVersionUID = 1L;
|
||||
/**
|
||||
*
|
||||
*/
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
* Constructor CanonicalizationException
|
||||
*
|
||||
*/
|
||||
public CanonicalizationException() {
|
||||
super();
|
||||
}
|
||||
/**
|
||||
* Constructor CanonicalizationException
|
||||
*
|
||||
*/
|
||||
public CanonicalizationException() {
|
||||
super();
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructor CanonicalizationException
|
||||
*
|
||||
* @param _msgID
|
||||
*/
|
||||
public CanonicalizationException(String _msgID) {
|
||||
super(_msgID);
|
||||
}
|
||||
/**
|
||||
* Constructor CanonicalizationException
|
||||
*
|
||||
* @param msgID
|
||||
*/
|
||||
public CanonicalizationException(String msgID) {
|
||||
super(msgID);
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructor CanonicalizationException
|
||||
*
|
||||
* @param _msgID
|
||||
* @param exArgs
|
||||
*/
|
||||
public CanonicalizationException(String _msgID, Object exArgs[]) {
|
||||
super(_msgID, exArgs);
|
||||
}
|
||||
/**
|
||||
* Constructor CanonicalizationException
|
||||
*
|
||||
* @param msgID
|
||||
* @param exArgs
|
||||
*/
|
||||
public CanonicalizationException(String msgID, Object exArgs[]) {
|
||||
super(msgID, exArgs);
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructor CanonicalizationException
|
||||
*
|
||||
* @param _msgID
|
||||
* @param _originalException
|
||||
*/
|
||||
public CanonicalizationException(String _msgID, Exception _originalException) {
|
||||
super(_msgID, _originalException);
|
||||
}
|
||||
/**
|
||||
* Constructor CanonicalizationException
|
||||
*
|
||||
* @param msgID
|
||||
* @param originalException
|
||||
*/
|
||||
public CanonicalizationException(String msgID, Exception originalException) {
|
||||
super(msgID, originalException);
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructor CanonicalizationException
|
||||
*
|
||||
* @param _msgID
|
||||
* @param exArgs
|
||||
* @param _originalException
|
||||
*/
|
||||
public CanonicalizationException(String _msgID, Object exArgs[],
|
||||
Exception _originalException) {
|
||||
super(_msgID, exArgs, _originalException);
|
||||
}
|
||||
/**
|
||||
* Constructor CanonicalizationException
|
||||
*
|
||||
* @param msgID
|
||||
* @param exArgs
|
||||
* @param originalException
|
||||
*/
|
||||
public CanonicalizationException(
|
||||
String msgID, Object exArgs[], Exception originalException
|
||||
) {
|
||||
super(msgID, exArgs, originalException);
|
||||
}
|
||||
}
|
||||
|
@ -39,6 +39,7 @@ import com.sun.org.apache.xml.internal.security.c14n.implementations.Canonicaliz
|
||||
import com.sun.org.apache.xml.internal.security.c14n.implementations.Canonicalizer20010315ExclWithComments;
|
||||
import com.sun.org.apache.xml.internal.security.c14n.implementations.Canonicalizer20010315OmitComments;
|
||||
import com.sun.org.apache.xml.internal.security.c14n.implementations.Canonicalizer20010315WithComments;
|
||||
import com.sun.org.apache.xml.internal.security.c14n.implementations.CanonicalizerPhysical;
|
||||
import com.sun.org.apache.xml.internal.security.exceptions.AlgorithmAlreadyRegisteredException;
|
||||
import org.w3c.dom.Document;
|
||||
import org.w3c.dom.Node;
|
||||
@ -91,6 +92,11 @@ public class Canonicalizer {
|
||||
*/
|
||||
public static final String ALGO_ID_C14N11_WITH_COMMENTS =
|
||||
ALGO_ID_C14N11_OMIT_COMMENTS + "#WithComments";
|
||||
/**
|
||||
* Non-standard algorithm to serialize the physical representation for XML Encryption
|
||||
*/
|
||||
public static final String ALGO_ID_C14N_PHYSICAL =
|
||||
"http://santuario.apache.org/c14n/physical";
|
||||
|
||||
private static Map<String, Class<? extends CanonicalizerSpi>> canonicalizerHash =
|
||||
new ConcurrentHashMap<String, Class<? extends CanonicalizerSpi>>();
|
||||
@ -202,6 +208,10 @@ public class Canonicalizer {
|
||||
Canonicalizer.ALGO_ID_C14N11_WITH_COMMENTS,
|
||||
Canonicalizer11_WithComments.class
|
||||
);
|
||||
canonicalizerHash.put(
|
||||
Canonicalizer.ALGO_ID_C14N_PHYSICAL,
|
||||
CanonicalizerPhysical.class
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -2,26 +2,26 @@
|
||||
* reserved comment block
|
||||
* DO NOT REMOVE OR ALTER!
|
||||
*/
|
||||
/*
|
||||
* Copyright 1999-2004 The Apache Software Foundation.
|
||||
/**
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package com.sun.org.apache.xml.internal.security.c14n;
|
||||
|
||||
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.util.Set;
|
||||
@ -29,7 +29,6 @@ import java.util.Set;
|
||||
import javax.xml.XMLConstants;
|
||||
import javax.xml.parsers.DocumentBuilder;
|
||||
import javax.xml.parsers.DocumentBuilderFactory;
|
||||
import javax.xml.xpath.XPath;
|
||||
|
||||
import com.sun.org.apache.xml.internal.security.utils.XMLUtils;
|
||||
import org.w3c.dom.Document;
|
||||
@ -37,166 +36,134 @@ import org.w3c.dom.Node;
|
||||
import org.w3c.dom.NodeList;
|
||||
import org.xml.sax.InputSource;
|
||||
|
||||
|
||||
/**
|
||||
* Base class which all Caninicalization algorithms extend.
|
||||
* Base class which all Canonicalization algorithms extend.
|
||||
*
|
||||
* $todo$ cange JavaDoc
|
||||
* @author Christian Geuer-Pollmann
|
||||
*/
|
||||
public abstract class CanonicalizerSpi {
|
||||
|
||||
/**
|
||||
* Method canonicalize
|
||||
*
|
||||
*
|
||||
* @param inputBytes
|
||||
* @return the c14n bytes.
|
||||
*
|
||||
*
|
||||
* @throws CanonicalizationException
|
||||
* @throws java.io.IOException
|
||||
* @throws javax.xml.parsers.ParserConfigurationException
|
||||
* @throws org.xml.sax.SAXException
|
||||
*
|
||||
*/
|
||||
public byte[] engineCanonicalize(byte[] inputBytes)
|
||||
throws javax.xml.parsers.ParserConfigurationException,
|
||||
java.io.IOException, org.xml.sax.SAXException,
|
||||
CanonicalizationException {
|
||||
/** Reset the writer after a c14n */
|
||||
protected boolean reset = false;
|
||||
|
||||
java.io.ByteArrayInputStream bais = new ByteArrayInputStream(inputBytes);
|
||||
InputSource in = new InputSource(bais);
|
||||
DocumentBuilderFactory dfactory = DocumentBuilderFactory.newInstance();
|
||||
dfactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, Boolean.TRUE);
|
||||
/**
|
||||
* Method canonicalize
|
||||
*
|
||||
* @param inputBytes
|
||||
* @return the c14n bytes.
|
||||
*
|
||||
* @throws CanonicalizationException
|
||||
* @throws java.io.IOException
|
||||
* @throws javax.xml.parsers.ParserConfigurationException
|
||||
* @throws org.xml.sax.SAXException
|
||||
*/
|
||||
public byte[] engineCanonicalize(byte[] inputBytes)
|
||||
throws javax.xml.parsers.ParserConfigurationException, java.io.IOException,
|
||||
org.xml.sax.SAXException, CanonicalizationException {
|
||||
|
||||
// needs to validate for ID attribute nomalization
|
||||
dfactory.setNamespaceAware(true);
|
||||
java.io.InputStream bais = new ByteArrayInputStream(inputBytes);
|
||||
InputSource in = new InputSource(bais);
|
||||
DocumentBuilderFactory dfactory = DocumentBuilderFactory.newInstance();
|
||||
dfactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, Boolean.TRUE);
|
||||
|
||||
DocumentBuilder db = dfactory.newDocumentBuilder();
|
||||
// needs to validate for ID attribute normalization
|
||||
dfactory.setNamespaceAware(true);
|
||||
|
||||
/*
|
||||
* for some of the test vectors from the specification,
|
||||
* there has to be a validatin parser for ID attributes, default
|
||||
* attribute values, NMTOKENS, etc.
|
||||
* Unfortunaltely, the test vectors do use different DTDs or
|
||||
* even no DTD. So Xerces 1.3.1 fires many warnings about using
|
||||
* ErrorHandlers.
|
||||
*
|
||||
* Text from the spec:
|
||||
*
|
||||
* The input octet stream MUST contain a well-formed XML document,
|
||||
* but the input need not be validated. However, the attribute
|
||||
* value normalization and entity reference resolution MUST be
|
||||
* performed in accordance with the behaviors of a validating
|
||||
* XML processor. As well, nodes for default attributes (declared
|
||||
* in the ATTLIST with an AttValue but not specified) are created
|
||||
* in each element. Thus, the declarations in the document type
|
||||
* declaration are used to help create the canonical form, even
|
||||
* though the document type declaration is not retained in the
|
||||
* canonical form.
|
||||
*
|
||||
*/
|
||||
DocumentBuilder db = dfactory.newDocumentBuilder();
|
||||
|
||||
// ErrorHandler eh = new C14NErrorHandler();
|
||||
// db.setErrorHandler(eh);
|
||||
Document document = db.parse(in);
|
||||
byte result[] = this.engineCanonicalizeSubTree(document);
|
||||
return result;
|
||||
}
|
||||
Document document = db.parse(in);
|
||||
return this.engineCanonicalizeSubTree(document);
|
||||
}
|
||||
|
||||
/**
|
||||
* Method engineCanonicalizeXPathNodeSet
|
||||
*
|
||||
* @param xpathNodeSet
|
||||
* @return the c14n bytes
|
||||
* @throws CanonicalizationException
|
||||
*/
|
||||
public byte[] engineCanonicalizeXPathNodeSet(NodeList xpathNodeSet)
|
||||
throws CanonicalizationException {
|
||||
/**
|
||||
* Method engineCanonicalizeXPathNodeSet
|
||||
*
|
||||
* @param xpathNodeSet
|
||||
* @return the c14n bytes
|
||||
* @throws CanonicalizationException
|
||||
*/
|
||||
public byte[] engineCanonicalizeXPathNodeSet(NodeList xpathNodeSet)
|
||||
throws CanonicalizationException {
|
||||
return this.engineCanonicalizeXPathNodeSet(
|
||||
XMLUtils.convertNodelistToSet(xpathNodeSet)
|
||||
);
|
||||
}
|
||||
|
||||
return this
|
||||
.engineCanonicalizeXPathNodeSet(XMLUtils
|
||||
.convertNodelistToSet(xpathNodeSet));
|
||||
}
|
||||
/**
|
||||
* Method engineCanonicalizeXPathNodeSet
|
||||
*
|
||||
* @param xpathNodeSet
|
||||
* @param inclusiveNamespaces
|
||||
* @return the c14n bytes
|
||||
* @throws CanonicalizationException
|
||||
*/
|
||||
public byte[] engineCanonicalizeXPathNodeSet(NodeList xpathNodeSet, String inclusiveNamespaces)
|
||||
throws CanonicalizationException {
|
||||
return this.engineCanonicalizeXPathNodeSet(
|
||||
XMLUtils.convertNodelistToSet(xpathNodeSet), inclusiveNamespaces
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Method engineCanonicalizeXPathNodeSet
|
||||
*
|
||||
* @param xpathNodeSet
|
||||
* @param inclusiveNamespaces
|
||||
* @return the c14n bytes
|
||||
* @throws CanonicalizationException
|
||||
*/
|
||||
public byte[] engineCanonicalizeXPathNodeSet(NodeList xpathNodeSet, String inclusiveNamespaces)
|
||||
throws CanonicalizationException {
|
||||
/**
|
||||
* Returns the URI of this engine.
|
||||
* @return the URI
|
||||
*/
|
||||
public abstract String engineGetURI();
|
||||
|
||||
return this
|
||||
.engineCanonicalizeXPathNodeSet(XMLUtils
|
||||
.convertNodelistToSet(xpathNodeSet), inclusiveNamespaces);
|
||||
}
|
||||
/**
|
||||
* Returns true if comments are included
|
||||
* @return true if comments are included
|
||||
*/
|
||||
public abstract boolean engineGetIncludeComments();
|
||||
|
||||
//J-
|
||||
/** Returns the URI of this engine.
|
||||
* @return the URI
|
||||
*/
|
||||
public abstract String engineGetURI();
|
||||
/**
|
||||
* C14n a nodeset
|
||||
*
|
||||
* @param xpathNodeSet
|
||||
* @return the c14n bytes
|
||||
* @throws CanonicalizationException
|
||||
*/
|
||||
public abstract byte[] engineCanonicalizeXPathNodeSet(Set<Node> xpathNodeSet)
|
||||
throws CanonicalizationException;
|
||||
|
||||
/** Returns the URI if include comments
|
||||
* @return true if include.
|
||||
*/
|
||||
public abstract boolean engineGetIncludeComments();
|
||||
/**
|
||||
* C14n a nodeset
|
||||
*
|
||||
* @param xpathNodeSet
|
||||
* @param inclusiveNamespaces
|
||||
* @return the c14n bytes
|
||||
* @throws CanonicalizationException
|
||||
*/
|
||||
public abstract byte[] engineCanonicalizeXPathNodeSet(
|
||||
Set<Node> xpathNodeSet, String inclusiveNamespaces
|
||||
) throws CanonicalizationException;
|
||||
|
||||
/**
|
||||
* C14n a nodeset
|
||||
*
|
||||
* @param xpathNodeSet
|
||||
* @return the c14n bytes
|
||||
* @throws CanonicalizationException
|
||||
*/
|
||||
public abstract byte[] engineCanonicalizeXPathNodeSet(Set<Node> xpathNodeSet)
|
||||
throws CanonicalizationException;
|
||||
/**
|
||||
* C14n a node tree.
|
||||
*
|
||||
* @param rootNode
|
||||
* @return the c14n bytes
|
||||
* @throws CanonicalizationException
|
||||
*/
|
||||
public abstract byte[] engineCanonicalizeSubTree(Node rootNode)
|
||||
throws CanonicalizationException;
|
||||
|
||||
/**
|
||||
* C14n a nodeset
|
||||
*
|
||||
* @param xpathNodeSet
|
||||
* @param inclusiveNamespaces
|
||||
* @return the c14n bytes
|
||||
* @throws CanonicalizationException
|
||||
*/
|
||||
public abstract byte[] engineCanonicalizeXPathNodeSet(Set<Node> xpathNodeSet, String inclusiveNamespaces)
|
||||
throws CanonicalizationException;
|
||||
/**
|
||||
* C14n a node tree.
|
||||
*
|
||||
* @param rootNode
|
||||
* @param inclusiveNamespaces
|
||||
* @return the c14n bytes
|
||||
* @throws CanonicalizationException
|
||||
*/
|
||||
public abstract byte[] engineCanonicalizeSubTree(Node rootNode, String inclusiveNamespaces)
|
||||
throws CanonicalizationException;
|
||||
|
||||
/**
|
||||
* C14n a node tree.
|
||||
*
|
||||
* @param rootNode
|
||||
* @return the c14n bytes
|
||||
* @throws CanonicalizationException
|
||||
*/
|
||||
public abstract byte[] engineCanonicalizeSubTree(Node rootNode)
|
||||
throws CanonicalizationException;
|
||||
/**
|
||||
* Sets the writer where the canonicalization ends. ByteArrayOutputStream if
|
||||
* none is set.
|
||||
* @param os
|
||||
*/
|
||||
public abstract void setWriter(OutputStream os);
|
||||
|
||||
/**
|
||||
* C14n a node tree.
|
||||
*
|
||||
* @param rootNode
|
||||
* @param inclusiveNamespaces
|
||||
* @return the c14n bytes
|
||||
* @throws CanonicalizationException
|
||||
*/
|
||||
public abstract byte[] engineCanonicalizeSubTree(Node rootNode, String inclusiveNamespaces)
|
||||
throws CanonicalizationException;
|
||||
|
||||
/**
|
||||
* Sets the writter where the cannocalization ends. ByteArrayOutputStream if
|
||||
* none is setted.
|
||||
* @param os
|
||||
*/
|
||||
public abstract void setWriter(OutputStream os);
|
||||
|
||||
/** Reset the writter after a c14n */
|
||||
protected boolean reset=false;
|
||||
//J+
|
||||
}
|
||||
|
@ -2,87 +2,82 @@
|
||||
* reserved comment block
|
||||
* DO NOT REMOVE OR ALTER!
|
||||
*/
|
||||
/*
|
||||
* Copyright 1999-2004 The Apache Software Foundation.
|
||||
/**
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package com.sun.org.apache.xml.internal.security.c14n;
|
||||
|
||||
|
||||
|
||||
import com.sun.org.apache.xml.internal.security.exceptions.XMLSecurityException;
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Christian Geuer-Pollmann
|
||||
*/
|
||||
public class InvalidCanonicalizerException extends XMLSecurityException {
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
private static final long serialVersionUID = 1L;
|
||||
/**
|
||||
*
|
||||
*/
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
* Constructor InvalidCanonicalizerException
|
||||
*
|
||||
*/
|
||||
public InvalidCanonicalizerException() {
|
||||
super();
|
||||
}
|
||||
/**
|
||||
* Constructor InvalidCanonicalizerException
|
||||
*
|
||||
*/
|
||||
public InvalidCanonicalizerException() {
|
||||
super();
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructor InvalidCanonicalizerException
|
||||
*
|
||||
* @param _msgID
|
||||
*/
|
||||
public InvalidCanonicalizerException(String _msgID) {
|
||||
super(_msgID);
|
||||
}
|
||||
/**
|
||||
* Constructor InvalidCanonicalizerException
|
||||
*
|
||||
* @param msgID
|
||||
*/
|
||||
public InvalidCanonicalizerException(String msgID) {
|
||||
super(msgID);
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructor InvalidCanonicalizerException
|
||||
*
|
||||
* @param _msgID
|
||||
* @param exArgs
|
||||
*/
|
||||
public InvalidCanonicalizerException(String _msgID, Object exArgs[]) {
|
||||
super(_msgID, exArgs);
|
||||
}
|
||||
/**
|
||||
* Constructor InvalidCanonicalizerException
|
||||
*
|
||||
* @param msgID
|
||||
* @param exArgs
|
||||
*/
|
||||
public InvalidCanonicalizerException(String msgID, Object exArgs[]) {
|
||||
super(msgID, exArgs);
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructor InvalidCanonicalizerException
|
||||
*
|
||||
* @param _msgID
|
||||
* @param _originalException
|
||||
*/
|
||||
public InvalidCanonicalizerException(String _msgID,
|
||||
Exception _originalException) {
|
||||
super(_msgID, _originalException);
|
||||
}
|
||||
/**
|
||||
* Constructor InvalidCanonicalizerException
|
||||
*
|
||||
* @param msgID
|
||||
* @param originalException
|
||||
*/
|
||||
public InvalidCanonicalizerException(String msgID, Exception originalException) {
|
||||
super(msgID, originalException);
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructor InvalidCanonicalizerException
|
||||
*
|
||||
* @param _msgID
|
||||
* @param exArgs
|
||||
* @param _originalException
|
||||
*/
|
||||
public InvalidCanonicalizerException(String _msgID, Object exArgs[],
|
||||
Exception _originalException) {
|
||||
super(_msgID, exArgs, _originalException);
|
||||
}
|
||||
/**
|
||||
* Constructor InvalidCanonicalizerException
|
||||
*
|
||||
* @param msgID
|
||||
* @param exArgs
|
||||
* @param originalException
|
||||
*/
|
||||
public InvalidCanonicalizerException(
|
||||
String msgID, Object exArgs[], Exception originalException
|
||||
) {
|
||||
super(msgID, exArgs, originalException);
|
||||
}
|
||||
}
|
||||
|
@ -2,21 +2,23 @@
|
||||
* reserved comment block
|
||||
* DO NOT REMOVE OR ALTER!
|
||||
*/
|
||||
/*
|
||||
* Copyright 1999-2004 The Apache Software Foundation.
|
||||
/**
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package com.sun.org.apache.xml.internal.security.c14n.helper;
|
||||
|
||||
@ -43,10 +45,10 @@ import java.util.Comparator;
|
||||
*/
|
||||
public class AttrCompare implements Comparator<Attr>, Serializable {
|
||||
|
||||
private final static long serialVersionUID = -7113259629930576230L;
|
||||
private final static int ATTR0_BEFORE_ATTR1 = -1;
|
||||
private final static int ATTR1_BEFORE_ATTR0 = 1;
|
||||
private final static String XMLNS=Constants.NamespaceSpecNS;
|
||||
private static final long serialVersionUID = -7113259629930576230L;
|
||||
private static final int ATTR0_BEFORE_ATTR1 = -1;
|
||||
private static final int ATTR1_BEFORE_ATTR0 = 1;
|
||||
private static final String XMLNS = Constants.NamespaceSpecNS;
|
||||
|
||||
/**
|
||||
* Compares two attributes based on the C14n specification.
|
||||
@ -69,12 +71,11 @@ public class AttrCompare implements Comparator<Attr>, Serializable {
|
||||
*
|
||||
*/
|
||||
public int compare(Attr attr0, Attr attr1) {
|
||||
|
||||
String namespaceURI0 = attr0.getNamespaceURI();
|
||||
String namespaceURI1 = attr1.getNamespaceURI();
|
||||
|
||||
boolean isNamespaceAttr0 = XMLNS==namespaceURI0;
|
||||
boolean isNamespaceAttr1 = XMLNS==namespaceURI1;
|
||||
boolean isNamespaceAttr0 = XMLNS.equals(namespaceURI0);
|
||||
boolean isNamespaceAttr1 = XMLNS.equals(namespaceURI1);
|
||||
|
||||
if (isNamespaceAttr0) {
|
||||
if (isNamespaceAttr1) {
|
||||
@ -82,11 +83,11 @@ public class AttrCompare implements Comparator<Attr>, Serializable {
|
||||
String localname0 = attr0.getLocalName();
|
||||
String localname1 = attr1.getLocalName();
|
||||
|
||||
if (localname0.equals("xmlns")) {
|
||||
if ("xmlns".equals(localname0)) {
|
||||
localname0 = "";
|
||||
}
|
||||
|
||||
if (localname1.equals("xmlns")) {
|
||||
if ("xmlns".equals(localname1)) {
|
||||
localname1 = "";
|
||||
}
|
||||
|
||||
@ -94,9 +95,7 @@ public class AttrCompare implements Comparator<Attr>, Serializable {
|
||||
}
|
||||
// attr0 is a namespace, attr1 is not
|
||||
return ATTR0_BEFORE_ATTR1;
|
||||
}
|
||||
|
||||
if (isNamespaceAttr1) {
|
||||
} else if (isNamespaceAttr1) {
|
||||
// attr1 is a namespace, attr0 is not
|
||||
return ATTR1_BEFORE_ATTR0;
|
||||
}
|
||||
@ -109,9 +108,7 @@ public class AttrCompare implements Comparator<Attr>, Serializable {
|
||||
return name0.compareTo(name1);
|
||||
}
|
||||
return ATTR0_BEFORE_ATTR1;
|
||||
}
|
||||
|
||||
if (namespaceURI1 == null) {
|
||||
} else if (namespaceURI1 == null) {
|
||||
return ATTR1_BEFORE_ATTR0;
|
||||
}
|
||||
|
||||
|
@ -2,33 +2,32 @@
|
||||
* reserved comment block
|
||||
* DO NOT REMOVE OR ALTER!
|
||||
*/
|
||||
/*
|
||||
* Copyright 1999-2004 The Apache Software Foundation.
|
||||
/**
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package com.sun.org.apache.xml.internal.security.c14n.helper;
|
||||
|
||||
|
||||
|
||||
import com.sun.org.apache.xml.internal.security.c14n.CanonicalizationException;
|
||||
import org.w3c.dom.Attr;
|
||||
import org.w3c.dom.Document;
|
||||
import org.w3c.dom.Element;
|
||||
import org.w3c.dom.NamedNodeMap;
|
||||
|
||||
|
||||
/**
|
||||
* Temporary swapped static functions from the normalizer Section
|
||||
*
|
||||
@ -36,129 +35,121 @@ import org.w3c.dom.NamedNodeMap;
|
||||
*/
|
||||
public class C14nHelper {
|
||||
|
||||
/**
|
||||
* Constructor C14nHelper
|
||||
*
|
||||
*/
|
||||
private C14nHelper() {
|
||||
/**
|
||||
* Constructor C14nHelper
|
||||
*
|
||||
*/
|
||||
private C14nHelper() {
|
||||
// don't allow instantiation
|
||||
}
|
||||
|
||||
// don't allow instantiation
|
||||
}
|
||||
/**
|
||||
* Method namespaceIsRelative
|
||||
*
|
||||
* @param namespace
|
||||
* @return true if the given namespace is relative.
|
||||
*/
|
||||
public static boolean namespaceIsRelative(Attr namespace) {
|
||||
return !namespaceIsAbsolute(namespace);
|
||||
}
|
||||
|
||||
/**
|
||||
* Method namespaceIsRelative
|
||||
*
|
||||
* @param namespace
|
||||
* @return true if the given namespace is relative.
|
||||
*/
|
||||
public static boolean namespaceIsRelative(Attr namespace) {
|
||||
return !namespaceIsAbsolute(namespace);
|
||||
}
|
||||
/**
|
||||
* Method namespaceIsRelative
|
||||
*
|
||||
* @param namespaceValue
|
||||
* @return true if the given namespace is relative.
|
||||
*/
|
||||
public static boolean namespaceIsRelative(String namespaceValue) {
|
||||
return !namespaceIsAbsolute(namespaceValue);
|
||||
}
|
||||
|
||||
/**
|
||||
* Method namespaceIsRelative
|
||||
*
|
||||
* @param namespaceValue
|
||||
* @return true if the given namespace is relative.
|
||||
*/
|
||||
public static boolean namespaceIsRelative(String namespaceValue) {
|
||||
return !namespaceIsAbsolute(namespaceValue);
|
||||
}
|
||||
/**
|
||||
* Method namespaceIsAbsolute
|
||||
*
|
||||
* @param namespace
|
||||
* @return true if the given namespace is absolute.
|
||||
*/
|
||||
public static boolean namespaceIsAbsolute(Attr namespace) {
|
||||
return namespaceIsAbsolute(namespace.getValue());
|
||||
}
|
||||
|
||||
/**
|
||||
* Method namespaceIsAbsolute
|
||||
*
|
||||
* @param namespace
|
||||
* @return true if the given namespace is absolute.
|
||||
*/
|
||||
public static boolean namespaceIsAbsolute(Attr namespace) {
|
||||
return namespaceIsAbsolute(namespace.getValue());
|
||||
}
|
||||
/**
|
||||
* Method namespaceIsAbsolute
|
||||
*
|
||||
* @param namespaceValue
|
||||
* @return true if the given namespace is absolute.
|
||||
*/
|
||||
public static boolean namespaceIsAbsolute(String namespaceValue) {
|
||||
// assume empty namespaces are absolute
|
||||
if (namespaceValue.length() == 0) {
|
||||
return true;
|
||||
}
|
||||
return namespaceValue.indexOf(':') > 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Method namespaceIsAbsolute
|
||||
*
|
||||
* @param namespaceValue
|
||||
* @return true if the given namespace is absolute.
|
||||
*/
|
||||
public static boolean namespaceIsAbsolute(String namespaceValue) {
|
||||
/**
|
||||
* This method throws an exception if the Attribute value contains
|
||||
* a relative URI.
|
||||
*
|
||||
* @param attr
|
||||
* @throws CanonicalizationException
|
||||
*/
|
||||
public static void assertNotRelativeNS(Attr attr) throws CanonicalizationException {
|
||||
if (attr == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
// assume empty namespaces are absolute
|
||||
if (namespaceValue.length() == 0) {
|
||||
return true;
|
||||
}
|
||||
return namespaceValue.indexOf(':')>0;
|
||||
}
|
||||
String nodeAttrName = attr.getNodeName();
|
||||
boolean definesDefaultNS = nodeAttrName.equals("xmlns");
|
||||
boolean definesNonDefaultNS = nodeAttrName.startsWith("xmlns:");
|
||||
|
||||
/**
|
||||
* This method throws an exception if the Attribute value contains
|
||||
* a relative URI.
|
||||
*
|
||||
* @param attr
|
||||
* @throws CanonicalizationException
|
||||
*/
|
||||
public static void assertNotRelativeNS(Attr attr)
|
||||
throws CanonicalizationException {
|
||||
|
||||
if (attr == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
String nodeAttrName = attr.getNodeName();
|
||||
boolean definesDefaultNS = nodeAttrName.equals("xmlns");
|
||||
boolean definesNonDefaultNS = nodeAttrName.startsWith("xmlns:");
|
||||
|
||||
if (definesDefaultNS || definesNonDefaultNS) {
|
||||
if (namespaceIsRelative(attr)) {
|
||||
if ((definesDefaultNS || definesNonDefaultNS) && namespaceIsRelative(attr)) {
|
||||
String parentName = attr.getOwnerElement().getTagName();
|
||||
String attrValue = attr.getValue();
|
||||
Object exArgs[] = { parentName, nodeAttrName, attrValue };
|
||||
|
||||
throw new CanonicalizationException(
|
||||
"c14n.Canonicalizer.RelativeNamespace", exArgs);
|
||||
}
|
||||
}
|
||||
}
|
||||
"c14n.Canonicalizer.RelativeNamespace", exArgs
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* This method throws a CanonicalizationException if the supplied Document
|
||||
* is not able to be traversed using a TreeWalker.
|
||||
*
|
||||
* @param document
|
||||
* @throws CanonicalizationException
|
||||
*/
|
||||
public static void checkTraversability(Document document)
|
||||
throws CanonicalizationException {
|
||||
/**
|
||||
* This method throws a CanonicalizationException if the supplied Document
|
||||
* is not able to be traversed using a TreeWalker.
|
||||
*
|
||||
* @param document
|
||||
* @throws CanonicalizationException
|
||||
*/
|
||||
public static void checkTraversability(Document document)
|
||||
throws CanonicalizationException {
|
||||
if (!document.isSupported("Traversal", "2.0")) {
|
||||
Object exArgs[] = {document.getImplementation().getClass().getName() };
|
||||
|
||||
if (!document.isSupported("Traversal", "2.0")) {
|
||||
Object exArgs[] = {
|
||||
document.getImplementation().getClass().getName() };
|
||||
throw new CanonicalizationException(
|
||||
"c14n.Canonicalizer.TraversalNotSupported", exArgs
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
throw new CanonicalizationException(
|
||||
"c14n.Canonicalizer.TraversalNotSupported", exArgs);
|
||||
}
|
||||
}
|
||||
/**
|
||||
* This method throws a CanonicalizationException if the supplied Element
|
||||
* contains any relative namespaces.
|
||||
*
|
||||
* @param ctxNode
|
||||
* @throws CanonicalizationException
|
||||
* @see C14nHelper#assertNotRelativeNS(Attr)
|
||||
*/
|
||||
public static void checkForRelativeNamespace(Element ctxNode)
|
||||
throws CanonicalizationException {
|
||||
if (ctxNode != null) {
|
||||
NamedNodeMap attributes = ctxNode.getAttributes();
|
||||
|
||||
/**
|
||||
* This method throws a CanonicalizationException if the supplied Element
|
||||
* contains any relative namespaces.
|
||||
*
|
||||
* @param ctxNode
|
||||
* @throws CanonicalizationException
|
||||
* @see C14nHelper#assertNotRelativeNS(Attr)
|
||||
*/
|
||||
public static void checkForRelativeNamespace(Element ctxNode)
|
||||
throws CanonicalizationException {
|
||||
|
||||
if (ctxNode != null) {
|
||||
NamedNodeMap attributes = ctxNode.getAttributes();
|
||||
|
||||
for (int i = 0; i < attributes.getLength(); i++) {
|
||||
C14nHelper.assertNotRelativeNS((Attr) attributes.item(i));
|
||||
}
|
||||
} else {
|
||||
throw new CanonicalizationException(
|
||||
"Called checkForRelativeNamespace() on null");
|
||||
}
|
||||
}
|
||||
for (int i = 0; i < attributes.getLength(); i++) {
|
||||
C14nHelper.assertNotRelativeNS((Attr) attributes.item(i));
|
||||
}
|
||||
} else {
|
||||
throw new CanonicalizationException("Called checkForRelativeNamespace() on null");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2,21 +2,23 @@
|
||||
* reserved comment block
|
||||
* DO NOT REMOVE OR ALTER!
|
||||
*/
|
||||
/*
|
||||
* Copyright 2008 The Apache Software Foundation.
|
||||
/**
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package com.sun.org.apache.xml.internal.security.c14n.implementations;
|
||||
|
||||
@ -25,7 +27,6 @@ import java.net.URI;
|
||||
import java.net.URISyntaxException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Comparator;
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
@ -34,7 +35,6 @@ import java.util.Set;
|
||||
import java.util.SortedSet;
|
||||
import java.util.TreeSet;
|
||||
import javax.xml.parsers.ParserConfigurationException;
|
||||
import javax.xml.xpath.XPath;
|
||||
import org.w3c.dom.Attr;
|
||||
import org.w3c.dom.Document;
|
||||
import org.w3c.dom.Element;
|
||||
@ -42,8 +42,6 @@ import org.w3c.dom.NamedNodeMap;
|
||||
import org.w3c.dom.Node;
|
||||
import org.xml.sax.SAXException;
|
||||
|
||||
import java.util.logging.Logger;
|
||||
import java.util.logging.Logger;
|
||||
import com.sun.org.apache.xml.internal.security.c14n.CanonicalizationException;
|
||||
import com.sun.org.apache.xml.internal.security.c14n.helper.C14nHelper;
|
||||
import com.sun.org.apache.xml.internal.security.signature.XMLSignatureInput;
|
||||
@ -57,40 +55,46 @@ import com.sun.org.apache.xml.internal.security.utils.XMLUtils;
|
||||
*
|
||||
* @author Sean Mullan
|
||||
* @author Raul Benito
|
||||
* @version $Revision: 1.2 $
|
||||
*/
|
||||
public abstract class Canonicalizer11 extends CanonicalizerBase {
|
||||
boolean firstCall = true;
|
||||
final SortedSet<Attr> result = new TreeSet<Attr>(COMPARE);
|
||||
static final String XMLNS_URI = Constants.NamespaceSpecNS;
|
||||
static final String XML_LANG_URI = Constants.XML_LANG_SPACE_SpecNS;
|
||||
|
||||
static Logger log = Logger.getLogger(Canonicalizer11.class.getName());
|
||||
private static final String XMLNS_URI = Constants.NamespaceSpecNS;
|
||||
private static final String XML_LANG_URI = Constants.XML_LANG_SPACE_SpecNS;
|
||||
private static java.util.logging.Logger log =
|
||||
java.util.logging.Logger.getLogger(Canonicalizer11.class.getName());
|
||||
private final SortedSet<Attr> result = new TreeSet<Attr>(COMPARE);
|
||||
|
||||
static class XmlAttrStack {
|
||||
int currentLevel = 0;
|
||||
int lastlevel = 0;
|
||||
XmlsStackElement cur;
|
||||
private boolean firstCall = true;
|
||||
|
||||
private static class XmlAttrStack {
|
||||
static class XmlsStackElement {
|
||||
int level;
|
||||
boolean rendered = false;
|
||||
List<Attr> nodes = new ArrayList<Attr>();
|
||||
};
|
||||
|
||||
int currentLevel = 0;
|
||||
int lastlevel = 0;
|
||||
XmlsStackElement cur;
|
||||
List<XmlsStackElement> levels = new ArrayList<XmlsStackElement>();
|
||||
|
||||
void push(int level) {
|
||||
currentLevel = level;
|
||||
if (currentLevel == -1)
|
||||
if (currentLevel == -1) {
|
||||
return;
|
||||
}
|
||||
cur = null;
|
||||
while (lastlevel >= currentLevel) {
|
||||
levels.remove(levels.size() - 1);
|
||||
if (levels.size() == 0) {
|
||||
int newSize = levels.size();
|
||||
if (newSize == 0) {
|
||||
lastlevel = 0;
|
||||
return;
|
||||
}
|
||||
lastlevel=(levels.get(levels.size()-1)).level;
|
||||
lastlevel = (levels.get(newSize - 1)).level;
|
||||
}
|
||||
}
|
||||
|
||||
void addXmlnsAttr(Attr n) {
|
||||
if (cur == null) {
|
||||
cur = new XmlsStackElement();
|
||||
@ -100,22 +104,24 @@ public abstract class Canonicalizer11 extends CanonicalizerBase {
|
||||
}
|
||||
cur.nodes.add(n);
|
||||
}
|
||||
|
||||
void getXmlnsAttr(Collection<Attr> col) {
|
||||
int size = levels.size() - 1;
|
||||
if (cur == null) {
|
||||
cur = new XmlsStackElement();
|
||||
cur.level = currentLevel;
|
||||
lastlevel = currentLevel;
|
||||
levels.add(cur);
|
||||
}
|
||||
int size = levels.size() - 2;
|
||||
boolean parentRendered = false;
|
||||
XmlsStackElement e = null;
|
||||
if (size == -1) {
|
||||
parentRendered = true;
|
||||
} else {
|
||||
e = levels.get(size);
|
||||
if (e.rendered && e.level+1 == currentLevel)
|
||||
if (e.rendered && e.level + 1 == currentLevel) {
|
||||
parentRendered = true;
|
||||
}
|
||||
}
|
||||
if (parentRendered) {
|
||||
col.addAll(cur.nodes);
|
||||
@ -126,7 +132,7 @@ public abstract class Canonicalizer11 extends CanonicalizerBase {
|
||||
Map<String, Attr> loa = new HashMap<String, Attr>();
|
||||
List<Attr> baseAttrs = new ArrayList<Attr>();
|
||||
boolean successiveOmitted = true;
|
||||
for (;size>=0;size--) {
|
||||
for (; size >= 0; size--) {
|
||||
e = levels.get(size);
|
||||
if (e.rendered) {
|
||||
successiveOmitted = false;
|
||||
@ -134,16 +140,15 @@ public abstract class Canonicalizer11 extends CanonicalizerBase {
|
||||
Iterator<Attr> it = e.nodes.iterator();
|
||||
while (it.hasNext() && successiveOmitted) {
|
||||
Attr n = it.next();
|
||||
if (n.getLocalName().equals("base")) {
|
||||
if (!e.rendered) {
|
||||
baseAttrs.add(n);
|
||||
}
|
||||
} else if (!loa.containsKey(n.getName()))
|
||||
if (n.getLocalName().equals("base") && !e.rendered) {
|
||||
baseAttrs.add(n);
|
||||
} else if (!loa.containsKey(n.getName())) {
|
||||
loa.put(n.getName(), n);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!baseAttrs.isEmpty()) {
|
||||
Iterator<Attr> it = cur.nodes.iterator();
|
||||
Iterator<Attr> it = col.iterator();
|
||||
String base = null;
|
||||
Attr baseAttr = null;
|
||||
while (it.hasNext()) {
|
||||
@ -164,7 +169,9 @@ public abstract class Canonicalizer11 extends CanonicalizerBase {
|
||||
try {
|
||||
base = joinURI(n.getValue(), base);
|
||||
} catch (URISyntaxException ue) {
|
||||
ue.printStackTrace();
|
||||
if (log.isLoggable(java.util.logging.Level.FINE)) {
|
||||
log.log(java.util.logging.Level.FINE, ue.getMessage(), ue);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -178,7 +185,8 @@ public abstract class Canonicalizer11 extends CanonicalizerBase {
|
||||
col.addAll(loa.values());
|
||||
}
|
||||
};
|
||||
XmlAttrStack xmlattrStack = new XmlAttrStack();
|
||||
|
||||
private XmlAttrStack xmlattrStack = new XmlAttrStack();
|
||||
|
||||
/**
|
||||
* Constructor Canonicalizer11
|
||||
@ -189,194 +197,6 @@ public abstract class Canonicalizer11 extends CanonicalizerBase {
|
||||
super(includeComments);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the Attr[]s to be outputted for the given element.
|
||||
* <br>
|
||||
* The code of this method is a copy of {@link #handleAttributes(Element,
|
||||
* NameSpaceSymbTable)},
|
||||
* whereas it takes into account that subtree-c14n is -- well --
|
||||
* subtree-based.
|
||||
* So if the element in question isRoot of c14n, it's parent is not in the
|
||||
* node set, as well as all other ancestors.
|
||||
*
|
||||
* @param E
|
||||
* @param ns
|
||||
* @return the Attr[]s to be outputted
|
||||
* @throws CanonicalizationException
|
||||
*/
|
||||
Iterator<Attr> handleAttributesSubtree(Element E, NameSpaceSymbTable ns)
|
||||
throws CanonicalizationException {
|
||||
if (!E.hasAttributes() && !firstCall) {
|
||||
return null;
|
||||
}
|
||||
// result will contain the attrs which have to be outputted
|
||||
final SortedSet<Attr> result = this.result;
|
||||
result.clear();
|
||||
NamedNodeMap attrs = E.getAttributes();
|
||||
int attrsLength = attrs.getLength();
|
||||
|
||||
for (int i = 0; i < attrsLength; i++) {
|
||||
Attr N = (Attr) attrs.item(i);
|
||||
String NUri = N.getNamespaceURI();
|
||||
|
||||
if (XMLNS_URI != NUri) {
|
||||
// It's not a namespace attr node. Add to the result and
|
||||
// continue.
|
||||
result.add(N);
|
||||
continue;
|
||||
}
|
||||
|
||||
String NName = N.getLocalName();
|
||||
String NValue = N.getValue();
|
||||
if (XML.equals(NName)
|
||||
&& XML_LANG_URI.equals(NValue)) {
|
||||
// The default mapping for xml must not be output.
|
||||
continue;
|
||||
}
|
||||
|
||||
Node n = ns.addMappingAndRender(NName, NValue, N);
|
||||
|
||||
if (n != null) {
|
||||
// Render the ns definition
|
||||
result.add((Attr)n);
|
||||
if (C14nHelper.namespaceIsRelative(N)) {
|
||||
Object exArgs[] = {E.getTagName(), NName, N.getNodeValue()};
|
||||
throw new CanonicalizationException(
|
||||
"c14n.Canonicalizer.RelativeNamespace", exArgs);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (firstCall) {
|
||||
// It is the first node of the subtree
|
||||
// Obtain all the namespaces defined in the parents, and added
|
||||
// to the output.
|
||||
ns.getUnrenderedNodes(result);
|
||||
// output the attributes in the xml namespace.
|
||||
xmlattrStack.getXmlnsAttr(getSortedSetAsCollection(result));
|
||||
firstCall = false;
|
||||
}
|
||||
|
||||
return result.iterator();
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Returns the Attr[]s to be outputted for the given element.
|
||||
* <br>
|
||||
* IMPORTANT: This method expects to work on a modified DOM tree, i.e. a
|
||||
* DOM which has been prepared using
|
||||
* {@link com.sun.org.apache.xml.internal.security.utils.XMLUtils#circumventBug2650(
|
||||
* org.w3c.dom.Document)}.
|
||||
*
|
||||
* @param E
|
||||
* @param ns
|
||||
* @return the Attr[]s to be outputted
|
||||
* @throws CanonicalizationException
|
||||
*/
|
||||
Iterator<Attr> handleAttributes(Element E, NameSpaceSymbTable ns)
|
||||
throws CanonicalizationException {
|
||||
// result will contain the attrs which have to be output
|
||||
xmlattrStack.push(ns.getLevel());
|
||||
boolean isRealVisible = isVisibleDO(E, ns.getLevel()) == 1;
|
||||
NamedNodeMap attrs = null;
|
||||
int attrsLength = 0;
|
||||
if (E.hasAttributes()) {
|
||||
attrs = E.getAttributes();
|
||||
attrsLength = attrs.getLength();
|
||||
}
|
||||
|
||||
SortedSet<Attr> result = this.result;
|
||||
result.clear();
|
||||
|
||||
for (int i = 0; i < attrsLength; i++) {
|
||||
Attr N = (Attr)attrs.item(i);
|
||||
String NUri = N.getNamespaceURI();
|
||||
|
||||
if (XMLNS_URI != NUri) {
|
||||
// A non namespace definition node.
|
||||
if (XML_LANG_URI == NUri) {
|
||||
if (N.getLocalName().equals("id")) {
|
||||
if (isRealVisible) {
|
||||
// treat xml:id like any other attribute
|
||||
// (emit it, but don't inherit it)
|
||||
result.add(N);
|
||||
}
|
||||
} else {
|
||||
xmlattrStack.addXmlnsAttr(N);
|
||||
}
|
||||
} else if (isRealVisible) {
|
||||
// The node is visible add the attribute to the list of
|
||||
// output attributes.
|
||||
result.add(N);
|
||||
}
|
||||
// keep working
|
||||
continue;
|
||||
}
|
||||
|
||||
String NName = N.getLocalName();
|
||||
String NValue = N.getValue();
|
||||
if ("xml".equals(NName)
|
||||
&& XML_LANG_URI.equals(NValue)) {
|
||||
/* except omit namespace node with local name xml, which defines
|
||||
* the xml prefix, if its string value is
|
||||
* http://www.w3.org/XML/1998/namespace.
|
||||
*/
|
||||
continue;
|
||||
}
|
||||
// add the prefix binding to the ns symb table.
|
||||
// ns.addInclusiveMapping(NName,NValue,N,isRealVisible);
|
||||
if (isVisible(N)) {
|
||||
if (!isRealVisible && ns.removeMappingIfRender(NName)) {
|
||||
continue;
|
||||
}
|
||||
// The xpath select this node output it if needed.
|
||||
// Node n = ns.addMappingAndRenderXNodeSet
|
||||
// (NName, NValue, N, isRealVisible);
|
||||
Node n = ns.addMappingAndRender(NName, NValue, N);
|
||||
if (n != null) {
|
||||
result.add((Attr)n);
|
||||
if (C14nHelper.namespaceIsRelative(N)) {
|
||||
Object exArgs[] =
|
||||
{ E.getTagName(), NName, N.getNodeValue() };
|
||||
throw new CanonicalizationException(
|
||||
"c14n.Canonicalizer.RelativeNamespace", exArgs);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (isRealVisible && NName != XMLNS) {
|
||||
ns.removeMapping(NName);
|
||||
} else {
|
||||
ns.addMapping(NName, NValue, N);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (isRealVisible) {
|
||||
// The element is visible, handle the xmlns definition
|
||||
Attr xmlns = E.getAttributeNodeNS(XMLNS_URI, XMLNS);
|
||||
Node n = null;
|
||||
if (xmlns == null) {
|
||||
// No xmlns def just get the already defined.
|
||||
n = ns.getMapping(XMLNS);
|
||||
} else if (!isVisible(xmlns)) {
|
||||
// There is a defn but the xmlns is not selected by the xpath.
|
||||
// then xmlns=""
|
||||
n = ns.addMappingAndRender(XMLNS, "", nullNode);
|
||||
}
|
||||
// output the xmlns def if needed.
|
||||
if (n != null) {
|
||||
result.add((Attr)n);
|
||||
}
|
||||
// Float all xml:* attributes of the unselected parent elements to
|
||||
// this one. addXmlAttributes(E,result);
|
||||
xmlattrStack.getXmlnsAttr(result);
|
||||
ns.getUnrenderedNodes(result);
|
||||
}
|
||||
|
||||
return result.iterator();
|
||||
}
|
||||
|
||||
/**
|
||||
* Always throws a CanonicalizationException because this is inclusive c14n.
|
||||
*
|
||||
@ -385,10 +205,10 @@ public abstract class Canonicalizer11 extends CanonicalizerBase {
|
||||
* @return none it always fails
|
||||
* @throws CanonicalizationException always
|
||||
*/
|
||||
public byte[] engineCanonicalizeXPathNodeSet(Set<Node> xpathNodeSet,
|
||||
String inclusiveNamespaces) throws CanonicalizationException {
|
||||
throw new CanonicalizationException(
|
||||
"c14n.Canonicalizer.UnsupportedOperation");
|
||||
public byte[] engineCanonicalizeXPathNodeSet(
|
||||
Set<Node> xpathNodeSet, String inclusiveNamespaces
|
||||
) throws CanonicalizationException {
|
||||
throw new CanonicalizationException("c14n.Canonicalizer.UnsupportedOperation");
|
||||
}
|
||||
|
||||
/**
|
||||
@ -399,17 +219,189 @@ public abstract class Canonicalizer11 extends CanonicalizerBase {
|
||||
* @return none it always fails
|
||||
* @throws CanonicalizationException
|
||||
*/
|
||||
public byte[] engineCanonicalizeSubTree(Node rootNode,
|
||||
String inclusiveNamespaces) throws CanonicalizationException {
|
||||
throw new CanonicalizationException(
|
||||
"c14n.Canonicalizer.UnsupportedOperation");
|
||||
public byte[] engineCanonicalizeSubTree(
|
||||
Node rootNode, String inclusiveNamespaces
|
||||
) throws CanonicalizationException {
|
||||
throw new CanonicalizationException("c14n.Canonicalizer.UnsupportedOperation");
|
||||
}
|
||||
|
||||
void circumventBugIfNeeded(XMLSignatureInput input)
|
||||
/**
|
||||
* Returns the Attr[]s to be output for the given element.
|
||||
* <br>
|
||||
* The code of this method is a copy of {@link #handleAttributes(Element,
|
||||
* NameSpaceSymbTable)},
|
||||
* whereas it takes into account that subtree-c14n is -- well --
|
||||
* subtree-based.
|
||||
* So if the element in question isRoot of c14n, it's parent is not in the
|
||||
* node set, as well as all other ancestors.
|
||||
*
|
||||
* @param element
|
||||
* @param ns
|
||||
* @return the Attr[]s to be output
|
||||
* @throws CanonicalizationException
|
||||
*/
|
||||
@Override
|
||||
protected Iterator<Attr> handleAttributesSubtree(Element element, NameSpaceSymbTable ns)
|
||||
throws CanonicalizationException {
|
||||
if (!element.hasAttributes() && !firstCall) {
|
||||
return null;
|
||||
}
|
||||
// result will contain the attrs which have to be output
|
||||
final SortedSet<Attr> result = this.result;
|
||||
result.clear();
|
||||
|
||||
if (element.hasAttributes()) {
|
||||
NamedNodeMap attrs = element.getAttributes();
|
||||
int attrsLength = attrs.getLength();
|
||||
|
||||
for (int i = 0; i < attrsLength; i++) {
|
||||
Attr attribute = (Attr) attrs.item(i);
|
||||
String NUri = attribute.getNamespaceURI();
|
||||
String NName = attribute.getLocalName();
|
||||
String NValue = attribute.getValue();
|
||||
|
||||
if (!XMLNS_URI.equals(NUri)) {
|
||||
// It's not a namespace attr node. Add to the result and continue.
|
||||
result.add(attribute);
|
||||
} else if (!(XML.equals(NName) && XML_LANG_URI.equals(NValue))) {
|
||||
// The default mapping for xml must not be output.
|
||||
Node n = ns.addMappingAndRender(NName, NValue, attribute);
|
||||
|
||||
if (n != null) {
|
||||
// Render the ns definition
|
||||
result.add((Attr)n);
|
||||
if (C14nHelper.namespaceIsRelative(attribute)) {
|
||||
Object exArgs[] = {element.getTagName(), NName, attribute.getNodeValue()};
|
||||
throw new CanonicalizationException(
|
||||
"c14n.Canonicalizer.RelativeNamespace", exArgs
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (firstCall) {
|
||||
// It is the first node of the subtree
|
||||
// Obtain all the namespaces defined in the parents, and added to the output.
|
||||
ns.getUnrenderedNodes(result);
|
||||
// output the attributes in the xml namespace.
|
||||
xmlattrStack.getXmlnsAttr(result);
|
||||
firstCall = false;
|
||||
}
|
||||
|
||||
return result.iterator();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the Attr[]s to be output for the given element.
|
||||
* <br>
|
||||
* IMPORTANT: This method expects to work on a modified DOM tree, i.e. a
|
||||
* DOM which has been prepared using
|
||||
* {@link com.sun.org.apache.xml.internal.security.utils.XMLUtils#circumventBug2650(
|
||||
* org.w3c.dom.Document)}.
|
||||
*
|
||||
* @param element
|
||||
* @param ns
|
||||
* @return the Attr[]s to be output
|
||||
* @throws CanonicalizationException
|
||||
*/
|
||||
@Override
|
||||
protected Iterator<Attr> handleAttributes(Element element, NameSpaceSymbTable ns)
|
||||
throws CanonicalizationException {
|
||||
// result will contain the attrs which have to be output
|
||||
xmlattrStack.push(ns.getLevel());
|
||||
boolean isRealVisible = isVisibleDO(element, ns.getLevel()) == 1;
|
||||
final SortedSet<Attr> result = this.result;
|
||||
result.clear();
|
||||
|
||||
if (element.hasAttributes()) {
|
||||
NamedNodeMap attrs = element.getAttributes();
|
||||
int attrsLength = attrs.getLength();
|
||||
|
||||
for (int i = 0; i < attrsLength; i++) {
|
||||
Attr attribute = (Attr) attrs.item(i);
|
||||
String NUri = attribute.getNamespaceURI();
|
||||
String NName = attribute.getLocalName();
|
||||
String NValue = attribute.getValue();
|
||||
|
||||
if (!XMLNS_URI.equals(NUri)) {
|
||||
//A non namespace definition node.
|
||||
if (XML_LANG_URI.equals(NUri)) {
|
||||
if (NName.equals("id")) {
|
||||
if (isRealVisible) {
|
||||
// treat xml:id like any other attribute
|
||||
// (emit it, but don't inherit it)
|
||||
result.add(attribute);
|
||||
}
|
||||
} else {
|
||||
xmlattrStack.addXmlnsAttr(attribute);
|
||||
}
|
||||
} else if (isRealVisible) {
|
||||
//The node is visible add the attribute to the list of output attributes.
|
||||
result.add(attribute);
|
||||
}
|
||||
} else if (!XML.equals(NName) || !XML_LANG_URI.equals(NValue)) {
|
||||
/* except omit namespace node with local name xml, which defines
|
||||
* the xml prefix, if its string value is
|
||||
* http://www.w3.org/XML/1998/namespace.
|
||||
*/
|
||||
// add the prefix binding to the ns symb table.
|
||||
if (isVisible(attribute)) {
|
||||
if (isRealVisible || !ns.removeMappingIfRender(NName)) {
|
||||
// The xpath select this node output it if needed.
|
||||
Node n = ns.addMappingAndRender(NName, NValue, attribute);
|
||||
if (n != null) {
|
||||
result.add((Attr)n);
|
||||
if (C14nHelper.namespaceIsRelative(attribute)) {
|
||||
Object exArgs[] = { element.getTagName(), NName, attribute.getNodeValue() };
|
||||
throw new CanonicalizationException(
|
||||
"c14n.Canonicalizer.RelativeNamespace", exArgs
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (isRealVisible && !XMLNS.equals(NName)) {
|
||||
ns.removeMapping(NName);
|
||||
} else {
|
||||
ns.addMapping(NName, NValue, attribute);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (isRealVisible) {
|
||||
//The element is visible, handle the xmlns definition
|
||||
Attr xmlns = element.getAttributeNodeNS(XMLNS_URI, XMLNS);
|
||||
Node n = null;
|
||||
if (xmlns == null) {
|
||||
//No xmlns def just get the already defined.
|
||||
n = ns.getMapping(XMLNS);
|
||||
} else if (!isVisible(xmlns)) {
|
||||
//There is a definition but the xmlns is not selected by the xpath.
|
||||
//then xmlns=""
|
||||
n = ns.addMappingAndRender(XMLNS, "", nullNode);
|
||||
}
|
||||
//output the xmlns def if needed.
|
||||
if (n != null) {
|
||||
result.add((Attr)n);
|
||||
}
|
||||
//Float all xml:* attributes of the unselected parent elements to this one.
|
||||
xmlattrStack.getXmlnsAttr(result);
|
||||
ns.getUnrenderedNodes(result);
|
||||
}
|
||||
|
||||
return result.iterator();
|
||||
}
|
||||
|
||||
protected void circumventBugIfNeeded(XMLSignatureInput input)
|
||||
throws CanonicalizationException, ParserConfigurationException,
|
||||
IOException, SAXException {
|
||||
if (!input.isNeedsToBeExpanded())
|
||||
if (!input.isNeedsToBeExpanded()) {
|
||||
return;
|
||||
}
|
||||
Document doc = null;
|
||||
if (input.getSubNode() != null) {
|
||||
doc = XMLUtils.getOwnerDocument(input.getSubNode());
|
||||
@ -419,40 +411,47 @@ public abstract class Canonicalizer11 extends CanonicalizerBase {
|
||||
XMLUtils.circumventBug2650(doc);
|
||||
}
|
||||
|
||||
void handleParent(Element e, NameSpaceSymbTable ns) {
|
||||
if (!e.hasAttributes()) {
|
||||
protected void handleParent(Element e, NameSpaceSymbTable ns) {
|
||||
if (!e.hasAttributes() && e.getNamespaceURI() == null) {
|
||||
return;
|
||||
}
|
||||
xmlattrStack.push(-1);
|
||||
NamedNodeMap attrs = e.getAttributes();
|
||||
int attrsLength = attrs.getLength();
|
||||
for (int i = 0; i < attrsLength; i++) {
|
||||
Attr N = (Attr) attrs.item(i);
|
||||
if (Constants.NamespaceSpecNS != N.getNamespaceURI()) {
|
||||
// Not a namespace definition, ignore.
|
||||
if (XML_LANG_URI == N.getNamespaceURI()) {
|
||||
xmlattrStack.addXmlnsAttr(N);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
Attr attribute = (Attr) attrs.item(i);
|
||||
String NName = attribute.getLocalName();
|
||||
String NValue = attribute.getNodeValue();
|
||||
|
||||
String NName = N.getLocalName();
|
||||
String NValue = N.getNodeValue();
|
||||
if (XML.equals(NName)
|
||||
&& Constants.XML_LANG_SPACE_SpecNS.equals(NValue)) {
|
||||
continue;
|
||||
if (Constants.NamespaceSpecNS.equals(attribute.getNamespaceURI())) {
|
||||
if (!XML.equals(NName) || !Constants.XML_LANG_SPACE_SpecNS.equals(NValue)) {
|
||||
ns.addMapping(NName, NValue, attribute);
|
||||
}
|
||||
} else if (!"id".equals(NName) && XML_LANG_URI.equals(attribute.getNamespaceURI())) {
|
||||
xmlattrStack.addXmlnsAttr(attribute);
|
||||
}
|
||||
ns.addMapping(NName,NValue,N);
|
||||
}
|
||||
if (e.getNamespaceURI() != null) {
|
||||
String NName = e.getPrefix();
|
||||
String NValue = e.getNamespaceURI();
|
||||
String Name;
|
||||
if (NName == null || NName.equals("")) {
|
||||
NName = "xmlns";
|
||||
Name = "xmlns";
|
||||
} else {
|
||||
Name = "xmlns:" + NName;
|
||||
}
|
||||
Attr n = e.getOwnerDocument().createAttributeNS("http://www.w3.org/2000/xmlns/", Name);
|
||||
n.setValue(NValue);
|
||||
ns.addMapping(NName, NValue, n);
|
||||
}
|
||||
}
|
||||
|
||||
private static String joinURI(String baseURI, String relativeURI)
|
||||
throws URISyntaxException {
|
||||
private static String joinURI(String baseURI, String relativeURI) throws URISyntaxException {
|
||||
String bscheme = null;
|
||||
String bauthority = null;
|
||||
String bpath = "";
|
||||
String bquery = null;
|
||||
String bfragment = null; // Is this correct?
|
||||
|
||||
// pre-parse the baseURI
|
||||
if (baseURI != null) {
|
||||
@ -464,7 +463,6 @@ public abstract class Canonicalizer11 extends CanonicalizerBase {
|
||||
bauthority = base.getAuthority();
|
||||
bpath = base.getPath();
|
||||
bquery = base.getQuery();
|
||||
bfragment = base.getFragment();
|
||||
}
|
||||
|
||||
URI r = new URI(relativeURI);
|
||||
@ -472,9 +470,8 @@ public abstract class Canonicalizer11 extends CanonicalizerBase {
|
||||
String rauthority = r.getAuthority();
|
||||
String rpath = r.getPath();
|
||||
String rquery = r.getQuery();
|
||||
String rfragment = null;
|
||||
|
||||
String tscheme, tauthority, tpath, tquery, tfragment;
|
||||
String tscheme, tauthority, tpath, tquery;
|
||||
if (rscheme != null && rscheme.equals(bscheme)) {
|
||||
rscheme = null;
|
||||
}
|
||||
@ -518,13 +515,13 @@ public abstract class Canonicalizer11 extends CanonicalizerBase {
|
||||
}
|
||||
tscheme = bscheme;
|
||||
}
|
||||
tfragment = rfragment;
|
||||
return new URI(tscheme, tauthority, tpath, tquery, tfragment).toString();
|
||||
return new URI(tscheme, tauthority, tpath, tquery, null).toString();
|
||||
}
|
||||
|
||||
private static String removeDotSegments(String path) {
|
||||
|
||||
log.log(java.util.logging.Level.FINE, "STEP OUTPUT BUFFER\t\tINPUT BUFFER");
|
||||
if (log.isLoggable(java.util.logging.Level.FINE)) {
|
||||
log.log(java.util.logging.Level.FINE, "STEP OUTPUT BUFFER\t\tINPUT BUFFER");
|
||||
}
|
||||
|
||||
// 1. The input buffer is initialized with the now-appended path
|
||||
// components then replace occurrences of "//" in the input buffer
|
||||
@ -535,7 +532,7 @@ public abstract class Canonicalizer11 extends CanonicalizerBase {
|
||||
}
|
||||
|
||||
// Initialize the output buffer with the empty string.
|
||||
StringBuffer output = new StringBuffer();
|
||||
StringBuilder output = new StringBuilder();
|
||||
|
||||
// If the input buffer starts with a root slash "/" then move this
|
||||
// character to the output buffer.
|
||||
@ -563,9 +560,9 @@ public abstract class Canonicalizer11 extends CanonicalizerBase {
|
||||
output.append("../");
|
||||
}
|
||||
printStep("2A", output.toString(), input);
|
||||
// 2B. if the input buffer begins with a prefix of "/./" or "/.",
|
||||
// where "." is a complete path segment, then replace that prefix
|
||||
// with "/" in the input buffer; otherwise,
|
||||
// 2B. if the input buffer begins with a prefix of "/./" or "/.",
|
||||
// where "." is a complete path segment, then replace that prefix
|
||||
// with "/" in the input buffer; otherwise,
|
||||
} else if (input.startsWith("/./")) {
|
||||
input = input.substring(2);
|
||||
printStep("2B", output.toString(), input);
|
||||
@ -573,16 +570,16 @@ public abstract class Canonicalizer11 extends CanonicalizerBase {
|
||||
// FIXME: what is complete path segment?
|
||||
input = input.replaceFirst("/.", "/");
|
||||
printStep("2B", output.toString(), input);
|
||||
// 2C. if the input buffer begins with a prefix of "/../" or "/..",
|
||||
// where ".." is a complete path segment, then replace that prefix
|
||||
// with "/" in the input buffer and if also the output buffer is
|
||||
// empty, last segment in the output buffer equals "../" or "..",
|
||||
// where ".." is a complete path segment, then append ".." or "/.."
|
||||
// for the latter case respectively to the output buffer else
|
||||
// remove the last segment and its preceding "/" (if any) from the
|
||||
// output buffer and if hereby the first character in the output
|
||||
// buffer was removed and it was not the root slash then delete a
|
||||
// leading slash from the input buffer; otherwise,
|
||||
// 2C. if the input buffer begins with a prefix of "/../" or "/..",
|
||||
// where ".." is a complete path segment, then replace that prefix
|
||||
// with "/" in the input buffer and if also the output buffer is
|
||||
// empty, last segment in the output buffer equals "../" or "..",
|
||||
// where ".." is a complete path segment, then append ".." or "/.."
|
||||
// for the latter case respectively to the output buffer else
|
||||
// remove the last segment and its preceding "/" (if any) from the
|
||||
// output buffer and if hereby the first character in the output
|
||||
// buffer was removed and it was not the root slash then delete a
|
||||
// leading slash from the input buffer; otherwise,
|
||||
} else if (input.startsWith("/../")) {
|
||||
input = input.substring(3);
|
||||
if (output.length() == 0) {
|
||||
@ -594,7 +591,7 @@ public abstract class Canonicalizer11 extends CanonicalizerBase {
|
||||
} else {
|
||||
int index = output.lastIndexOf("/");
|
||||
if (index == -1) {
|
||||
output = new StringBuffer();
|
||||
output = new StringBuilder();
|
||||
if (input.charAt(0) == '/') {
|
||||
input = input.substring(1);
|
||||
}
|
||||
@ -615,7 +612,7 @@ public abstract class Canonicalizer11 extends CanonicalizerBase {
|
||||
} else {
|
||||
int index = output.lastIndexOf("/");
|
||||
if (index == -1) {
|
||||
output = new StringBuffer();
|
||||
output = new StringBuilder();
|
||||
if (input.charAt(0) == '/') {
|
||||
input = input.substring(1);
|
||||
}
|
||||
@ -624,23 +621,24 @@ public abstract class Canonicalizer11 extends CanonicalizerBase {
|
||||
}
|
||||
}
|
||||
printStep("2C", output.toString(), input);
|
||||
// 2D. if the input buffer consists only of ".", then remove
|
||||
// that from the input buffer else if the input buffer consists
|
||||
// only of ".." and if the output buffer does not contain only
|
||||
// the root slash "/", then move the ".." to the output buffer
|
||||
// else delte it.; otherwise,
|
||||
// 2D. if the input buffer consists only of ".", then remove
|
||||
// that from the input buffer else if the input buffer consists
|
||||
// only of ".." and if the output buffer does not contain only
|
||||
// the root slash "/", then move the ".." to the output buffer
|
||||
// else delte it.; otherwise,
|
||||
} else if (input.equals(".")) {
|
||||
input = "";
|
||||
printStep("2D", output.toString(), input);
|
||||
} else if (input.equals("..")) {
|
||||
if (!output.toString().equals("/"))
|
||||
if (!output.toString().equals("/")) {
|
||||
output.append("..");
|
||||
}
|
||||
input = "";
|
||||
printStep("2D", output.toString(), input);
|
||||
// 2E. move the first path segment (if any) in the input buffer
|
||||
// to the end of the output buffer, including the initial "/"
|
||||
// character (if any) and any subsequent characters up to, but not
|
||||
// including, the next "/" character or the end of the input buffer.
|
||||
// 2E. move the first path segment (if any) in the input buffer
|
||||
// to the end of the output buffer, including the initial "/"
|
||||
// character (if any) and any subsequent characters up to, but not
|
||||
// including, the next "/" character or the end of the input buffer.
|
||||
} else {
|
||||
int end = -1;
|
||||
int begin = input.indexOf('/');
|
||||
|
@ -2,21 +2,23 @@
|
||||
* reserved comment block
|
||||
* DO NOT REMOVE OR ALTER!
|
||||
*/
|
||||
/*
|
||||
* Copyright 2008 The Apache Software Foundation.
|
||||
/**
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package com.sun.org.apache.xml.internal.security.c14n.implementations;
|
||||
|
||||
|
@ -2,21 +2,23 @@
|
||||
* reserved comment block
|
||||
* DO NOT REMOVE OR ALTER!
|
||||
*/
|
||||
/*
|
||||
* Copyright 2008 The Apache Software Foundation.
|
||||
/**
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package com.sun.org.apache.xml.internal.security.c14n.implementations;
|
||||
|
||||
|
@ -2,26 +2,26 @@
|
||||
* reserved comment block
|
||||
* DO NOT REMOVE OR ALTER!
|
||||
*/
|
||||
/*
|
||||
* Copyright 1999-2004 The Apache Software Foundation.
|
||||
/**
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package com.sun.org.apache.xml.internal.security.c14n.implementations;
|
||||
|
||||
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
@ -47,344 +47,348 @@ import org.w3c.dom.NamedNodeMap;
|
||||
import org.w3c.dom.Node;
|
||||
import org.xml.sax.SAXException;
|
||||
|
||||
|
||||
/**
|
||||
* Implements <A HREF="http://www.w3.org/TR/2001/REC-xml-c14n-20010315">Canonical
|
||||
* XML Version 1.0</A>, a W3C Recommendation from 15 March 2001.
|
||||
*
|
||||
* @author Christian Geuer-Pollmann <geuerp@apache.org>
|
||||
* @version $Revision: 1.5 $
|
||||
*/
|
||||
public abstract class Canonicalizer20010315 extends CanonicalizerBase {
|
||||
boolean firstCall=true;
|
||||
final SortedSet<Attr> result= new TreeSet<Attr>(COMPARE);
|
||||
static final String XMLNS_URI=Constants.NamespaceSpecNS;
|
||||
static final String XML_LANG_URI=Constants.XML_LANG_SPACE_SpecNS;
|
||||
static class XmlAttrStack {
|
||||
int currentLevel=0;
|
||||
int lastlevel=0;
|
||||
XmlsStackElement cur;
|
||||
private static final String XMLNS_URI = Constants.NamespaceSpecNS;
|
||||
private static final String XML_LANG_URI = Constants.XML_LANG_SPACE_SpecNS;
|
||||
|
||||
private boolean firstCall = true;
|
||||
private final SortedSet<Attr> result = new TreeSet<Attr>(COMPARE);
|
||||
|
||||
private static class XmlAttrStack {
|
||||
static class XmlsStackElement {
|
||||
int level;
|
||||
boolean rendered=false;
|
||||
List<Attr> nodes=new ArrayList<Attr>();
|
||||
int level;
|
||||
boolean rendered = false;
|
||||
List<Attr> nodes = new ArrayList<Attr>();
|
||||
};
|
||||
List<XmlsStackElement> levels=new ArrayList<XmlsStackElement>();
|
||||
|
||||
int currentLevel = 0;
|
||||
int lastlevel = 0;
|
||||
XmlsStackElement cur;
|
||||
List<XmlsStackElement> levels = new ArrayList<XmlsStackElement>();
|
||||
|
||||
void push(int level) {
|
||||
currentLevel=level;
|
||||
if (currentLevel==-1)
|
||||
return;
|
||||
cur=null;
|
||||
while (lastlevel>=currentLevel) {
|
||||
levels.remove(levels.size()-1);
|
||||
if (levels.size()==0) {
|
||||
lastlevel=0;
|
||||
return;
|
||||
}
|
||||
lastlevel=(levels.get(levels.size()-1)).level;
|
||||
currentLevel = level;
|
||||
if (currentLevel == -1) {
|
||||
return;
|
||||
}
|
||||
cur = null;
|
||||
while (lastlevel >= currentLevel) {
|
||||
levels.remove(levels.size() - 1);
|
||||
int newSize = levels.size();
|
||||
if (newSize == 0) {
|
||||
lastlevel = 0;
|
||||
return;
|
||||
}
|
||||
lastlevel = (levels.get(newSize - 1)).level;
|
||||
}
|
||||
}
|
||||
|
||||
void addXmlnsAttr(Attr n) {
|
||||
if (cur==null) {
|
||||
cur=new XmlsStackElement();
|
||||
cur.level=currentLevel;
|
||||
levels.add(cur);
|
||||
lastlevel=currentLevel;
|
||||
}
|
||||
cur.nodes.add(n);
|
||||
if (cur == null) {
|
||||
cur = new XmlsStackElement();
|
||||
cur.level = currentLevel;
|
||||
levels.add(cur);
|
||||
lastlevel = currentLevel;
|
||||
}
|
||||
cur.nodes.add(n);
|
||||
}
|
||||
|
||||
void getXmlnsAttr(Collection<Attr> col) {
|
||||
int size=levels.size()-1;
|
||||
if (cur==null) {
|
||||
cur=new XmlsStackElement();
|
||||
cur.level=currentLevel;
|
||||
lastlevel=currentLevel;
|
||||
levels.add(cur);
|
||||
int size = levels.size() - 1;
|
||||
if (cur == null) {
|
||||
cur = new XmlsStackElement();
|
||||
cur.level = currentLevel;
|
||||
lastlevel = currentLevel;
|
||||
levels.add(cur);
|
||||
}
|
||||
boolean parentRendered = false;
|
||||
XmlsStackElement e = null;
|
||||
if (size == -1) {
|
||||
parentRendered = true;
|
||||
} else {
|
||||
e = levels.get(size);
|
||||
if (e.rendered && e.level + 1 == currentLevel) {
|
||||
parentRendered = true;
|
||||
}
|
||||
boolean parentRendered=false;
|
||||
XmlsStackElement e=null;
|
||||
if (size==-1) {
|
||||
parentRendered=true;
|
||||
} else {
|
||||
e=levels.get(size);
|
||||
if (e.rendered && e.level+1==currentLevel)
|
||||
parentRendered=true;
|
||||
}
|
||||
if (parentRendered) {
|
||||
col.addAll(cur.nodes);
|
||||
cur.rendered = true;
|
||||
return;
|
||||
}
|
||||
|
||||
Map<String, Attr> loa = new HashMap<String, Attr>();
|
||||
for (; size >= 0; size--) {
|
||||
e = levels.get(size);
|
||||
Iterator<Attr> it = e.nodes.iterator();
|
||||
while (it.hasNext()) {
|
||||
Attr n = it.next();
|
||||
if (!loa.containsKey(n.getName())) {
|
||||
loa.put(n.getName(), n);
|
||||
}
|
||||
}
|
||||
if (parentRendered) {
|
||||
col.addAll(cur.nodes);
|
||||
cur.rendered=true;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
Map<String,Attr> loa = new HashMap<String,Attr>();
|
||||
for (;size>=0;size--) {
|
||||
e=levels.get(size);
|
||||
Iterator<Attr> it=e.nodes.iterator();
|
||||
while (it.hasNext()) {
|
||||
Attr n=it.next();
|
||||
if (!loa.containsKey(n.getName()))
|
||||
loa.put(n.getName(),n);
|
||||
}
|
||||
//if (e.rendered)
|
||||
//break;
|
||||
|
||||
};
|
||||
//cur.nodes.clear();
|
||||
//cur.nodes.addAll(loa.values());
|
||||
cur.rendered=true;
|
||||
col.addAll(loa.values());
|
||||
cur.rendered = true;
|
||||
col.addAll(loa.values());
|
||||
}
|
||||
|
||||
}
|
||||
XmlAttrStack xmlattrStack=new XmlAttrStack();
|
||||
|
||||
private XmlAttrStack xmlattrStack = new XmlAttrStack();
|
||||
|
||||
/**
|
||||
* Constructor Canonicalizer20010315
|
||||
*
|
||||
* @param includeComments
|
||||
*/
|
||||
public Canonicalizer20010315(boolean includeComments) {
|
||||
super(includeComments);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the Attr[]s to be outputted for the given element.
|
||||
* <br>
|
||||
* The code of this method is a copy of {@link #handleAttributes(Element,
|
||||
* NameSpaceSymbTable)},
|
||||
* whereas it takes into account that subtree-c14n is -- well -- subtree-based.
|
||||
* So if the element in question isRoot of c14n, it's parent is not in the
|
||||
* node set, as well as all other ancestors.
|
||||
*
|
||||
* @param E
|
||||
* @param ns
|
||||
* @return the Attr[]s to be outputted
|
||||
* @throws CanonicalizationException
|
||||
*/
|
||||
Iterator<Attr> handleAttributesSubtree(Element E, NameSpaceSymbTable ns )
|
||||
throws CanonicalizationException {
|
||||
if (!E.hasAttributes() && !firstCall) {
|
||||
return null;
|
||||
}
|
||||
// result will contain the attrs which have to be outputted
|
||||
final SortedSet<Attr> result = this.result;
|
||||
result.clear();
|
||||
NamedNodeMap attrs = E.getAttributes();
|
||||
int attrsLength = attrs.getLength();
|
||||
|
||||
for (int i = 0; i < attrsLength; i++) {
|
||||
Attr N = (Attr) attrs.item(i);
|
||||
String NUri =N.getNamespaceURI();
|
||||
|
||||
if (XMLNS_URI!=NUri) {
|
||||
//It's not a namespace attr node. Add to the result and continue.
|
||||
result.add(N);
|
||||
continue;
|
||||
}
|
||||
|
||||
String NName=N.getLocalName();
|
||||
String NValue=N.getValue();
|
||||
if (XML.equals(NName)
|
||||
&& XML_LANG_URI.equals(NValue)) {
|
||||
//The default mapping for xml must not be output.
|
||||
continue;
|
||||
}
|
||||
|
||||
Node n=ns.addMappingAndRender(NName,NValue,N);
|
||||
|
||||
if (n!=null) {
|
||||
//Render the ns definition
|
||||
result.add((Attr)n);
|
||||
if (C14nHelper.namespaceIsRelative(N)) {
|
||||
Object exArgs[] = { E.getTagName(), NName, N.getNodeValue() };
|
||||
throw new CanonicalizationException(
|
||||
"c14n.Canonicalizer.RelativeNamespace", exArgs);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (firstCall) {
|
||||
//It is the first node of the subtree
|
||||
//Obtain all the namespaces defined in the parents, and added to the output.
|
||||
ns.getUnrenderedNodes(getSortedSetAsCollection(result));
|
||||
//output the attributes in the xml namespace.
|
||||
xmlattrStack.getXmlnsAttr(result);
|
||||
firstCall=false;
|
||||
}
|
||||
|
||||
return result.iterator();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the Attr[]s to be outputted for the given element.
|
||||
* <br>
|
||||
* IMPORTANT: This method expects to work on a modified DOM tree, i.e. a DOM which has
|
||||
* been prepared using {@link com.sun.org.apache.xml.internal.security.utils.XMLUtils#circumventBug2650(
|
||||
* org.w3c.dom.Document)}.
|
||||
*
|
||||
* @param E
|
||||
* @param ns
|
||||
* @return the Attr[]s to be outputted
|
||||
* @throws CanonicalizationException
|
||||
*/
|
||||
Iterator<Attr> handleAttributes(Element E, NameSpaceSymbTable ns ) throws CanonicalizationException {
|
||||
// result will contain the attrs which have to be outputted
|
||||
xmlattrStack.push(ns.getLevel());
|
||||
boolean isRealVisible=isVisibleDO(E,ns.getLevel())==1;
|
||||
NamedNodeMap attrs = null;
|
||||
int attrsLength = 0;
|
||||
if (E.hasAttributes()) {
|
||||
attrs=E.getAttributes();
|
||||
attrsLength= attrs.getLength();
|
||||
* Constructor Canonicalizer20010315
|
||||
*
|
||||
* @param includeComments
|
||||
*/
|
||||
public Canonicalizer20010315(boolean includeComments) {
|
||||
super(includeComments);
|
||||
}
|
||||
|
||||
/**
|
||||
* Always throws a CanonicalizationException because this is inclusive c14n.
|
||||
*
|
||||
* @param xpathNodeSet
|
||||
* @param inclusiveNamespaces
|
||||
* @return none it always fails
|
||||
* @throws CanonicalizationException always
|
||||
*/
|
||||
public byte[] engineCanonicalizeXPathNodeSet(Set<Node> xpathNodeSet, String inclusiveNamespaces)
|
||||
throws CanonicalizationException {
|
||||
|
||||
SortedSet<Attr> result = this.result;
|
||||
result.clear();
|
||||
/** $todo$ well, should we throw UnsupportedOperationException ? */
|
||||
throw new CanonicalizationException("c14n.Canonicalizer.UnsupportedOperation");
|
||||
}
|
||||
|
||||
for (int i = 0; i < attrsLength; i++) {
|
||||
Attr N = (Attr) attrs.item(i);
|
||||
String NUri =N.getNamespaceURI();
|
||||
/**
|
||||
* Always throws a CanonicalizationException because this is inclusive c14n.
|
||||
*
|
||||
* @param rootNode
|
||||
* @param inclusiveNamespaces
|
||||
* @return none it always fails
|
||||
* @throws CanonicalizationException
|
||||
*/
|
||||
public byte[] engineCanonicalizeSubTree(Node rootNode, String inclusiveNamespaces)
|
||||
throws CanonicalizationException {
|
||||
|
||||
if (XMLNS_URI!=NUri) {
|
||||
//A non namespace definition node.
|
||||
if (XML_LANG_URI==NUri) {
|
||||
xmlattrStack.addXmlnsAttr(N);
|
||||
} else if (isRealVisible){
|
||||
//The node is visible add the attribute to the list of output attributes.
|
||||
result.add(N);
|
||||
}
|
||||
//keep working
|
||||
continue;
|
||||
}
|
||||
/** $todo$ well, should we throw UnsupportedOperationException ? */
|
||||
throw new CanonicalizationException("c14n.Canonicalizer.UnsupportedOperation");
|
||||
}
|
||||
|
||||
String NName=N.getLocalName();
|
||||
String NValue=N.getValue();
|
||||
if ("xml".equals(NName)
|
||||
&& XML_LANG_URI.equals(NValue)) {
|
||||
/* except omit namespace node with local name xml, which defines
|
||||
* the xml prefix, if its string value is http://www.w3.org/XML/1998/namespace.
|
||||
*/
|
||||
continue;
|
||||
}
|
||||
//add the prefix binding to the ns symb table.
|
||||
//ns.addInclusiveMapping(NName,NValue,N,isRealVisible);
|
||||
if (isVisible(N)) {
|
||||
if (!isRealVisible && ns.removeMappingIfRender(NName)) {
|
||||
continue;
|
||||
}
|
||||
//The xpath select this node output it if needed.
|
||||
//Node n=ns.addMappingAndRenderXNodeSet(NName,NValue,N,isRealVisible);
|
||||
Node n=ns.addMappingAndRender(NName,NValue,N);
|
||||
if (n!=null) {
|
||||
result.add((Attr)n);
|
||||
if (C14nHelper.namespaceIsRelative(N)) {
|
||||
Object exArgs[] = { E.getTagName(), NName, N.getNodeValue() };
|
||||
throw new CanonicalizationException(
|
||||
"c14n.Canonicalizer.RelativeNamespace", exArgs);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (isRealVisible && NName!=XMLNS) {
|
||||
ns.removeMapping(NName);
|
||||
} else {
|
||||
ns.addMapping(NName,NValue,N);
|
||||
}
|
||||
/**
|
||||
* Returns the Attr[]s to be output for the given element.
|
||||
* <br>
|
||||
* The code of this method is a copy of {@link #handleAttributes(Element,
|
||||
* NameSpaceSymbTable)},
|
||||
* whereas it takes into account that subtree-c14n is -- well -- subtree-based.
|
||||
* So if the element in question isRoot of c14n, it's parent is not in the
|
||||
* node set, as well as all other ancestors.
|
||||
*
|
||||
* @param element
|
||||
* @param ns
|
||||
* @return the Attr[]s to be output
|
||||
* @throws CanonicalizationException
|
||||
*/
|
||||
@Override
|
||||
protected Iterator<Attr> handleAttributesSubtree(Element element, NameSpaceSymbTable ns)
|
||||
throws CanonicalizationException {
|
||||
if (!element.hasAttributes() && !firstCall) {
|
||||
return null;
|
||||
}
|
||||
// result will contain the attrs which have to be output
|
||||
final SortedSet<Attr> result = this.result;
|
||||
result.clear();
|
||||
|
||||
if (element.hasAttributes()) {
|
||||
NamedNodeMap attrs = element.getAttributes();
|
||||
int attrsLength = attrs.getLength();
|
||||
|
||||
for (int i = 0; i < attrsLength; i++) {
|
||||
Attr attribute = (Attr) attrs.item(i);
|
||||
String NUri = attribute.getNamespaceURI();
|
||||
String NName = attribute.getLocalName();
|
||||
String NValue = attribute.getValue();
|
||||
|
||||
if (!XMLNS_URI.equals(NUri)) {
|
||||
//It's not a namespace attr node. Add to the result and continue.
|
||||
result.add(attribute);
|
||||
} else if (!(XML.equals(NName) && XML_LANG_URI.equals(NValue))) {
|
||||
//The default mapping for xml must not be output.
|
||||
Node n = ns.addMappingAndRender(NName, NValue, attribute);
|
||||
|
||||
if (n != null) {
|
||||
//Render the ns definition
|
||||
result.add((Attr)n);
|
||||
if (C14nHelper.namespaceIsRelative(attribute)) {
|
||||
Object exArgs[] = { element.getTagName(), NName, attribute.getNodeValue() };
|
||||
throw new CanonicalizationException(
|
||||
"c14n.Canonicalizer.RelativeNamespace", exArgs
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (firstCall) {
|
||||
//It is the first node of the subtree
|
||||
//Obtain all the namespaces defined in the parents, and added to the output.
|
||||
ns.getUnrenderedNodes(result);
|
||||
//output the attributes in the xml namespace.
|
||||
xmlattrStack.getXmlnsAttr(result);
|
||||
firstCall = false;
|
||||
}
|
||||
|
||||
return result.iterator();
|
||||
}
|
||||
if (isRealVisible) {
|
||||
//The element is visible, handle the xmlns definition
|
||||
Attr xmlns = E.getAttributeNodeNS(XMLNS_URI, XMLNS);
|
||||
Node n=null;
|
||||
if (xmlns == null) {
|
||||
|
||||
/**
|
||||
* Returns the Attr[]s to be output for the given element.
|
||||
* <br>
|
||||
* IMPORTANT: This method expects to work on a modified DOM tree, i.e. a DOM which has
|
||||
* been prepared using {@link com.sun.org.apache.xml.internal.security.utils.XMLUtils#circumventBug2650(
|
||||
* org.w3c.dom.Document)}.
|
||||
*
|
||||
* @param element
|
||||
* @param ns
|
||||
* @return the Attr[]s to be output
|
||||
* @throws CanonicalizationException
|
||||
*/
|
||||
@Override
|
||||
protected Iterator<Attr> handleAttributes(Element element, NameSpaceSymbTable ns)
|
||||
throws CanonicalizationException {
|
||||
// result will contain the attrs which have to be output
|
||||
xmlattrStack.push(ns.getLevel());
|
||||
boolean isRealVisible = isVisibleDO(element, ns.getLevel()) == 1;
|
||||
final SortedSet<Attr> result = this.result;
|
||||
result.clear();
|
||||
|
||||
if (element.hasAttributes()) {
|
||||
NamedNodeMap attrs = element.getAttributes();
|
||||
int attrsLength = attrs.getLength();
|
||||
|
||||
for (int i = 0; i < attrsLength; i++) {
|
||||
Attr attribute = (Attr) attrs.item(i);
|
||||
String NUri = attribute.getNamespaceURI();
|
||||
String NName = attribute.getLocalName();
|
||||
String NValue = attribute.getValue();
|
||||
|
||||
if (!XMLNS_URI.equals(NUri)) {
|
||||
//A non namespace definition node.
|
||||
if (XML_LANG_URI.equals(NUri)) {
|
||||
xmlattrStack.addXmlnsAttr(attribute);
|
||||
} else if (isRealVisible) {
|
||||
//The node is visible add the attribute to the list of output attributes.
|
||||
result.add(attribute);
|
||||
}
|
||||
} else if (!XML.equals(NName) || !XML_LANG_URI.equals(NValue)) {
|
||||
/* except omit namespace node with local name xml, which defines
|
||||
* the xml prefix, if its string value is http://www.w3.org/XML/1998/namespace.
|
||||
*/
|
||||
//add the prefix binding to the ns symb table.
|
||||
if (isVisible(attribute)) {
|
||||
if (isRealVisible || !ns.removeMappingIfRender(NName)) {
|
||||
//The xpath select this node output it if needed.
|
||||
Node n = ns.addMappingAndRender(NName, NValue, attribute);
|
||||
if (n != null) {
|
||||
result.add((Attr)n);
|
||||
if (C14nHelper.namespaceIsRelative(attribute)) {
|
||||
Object exArgs[] = { element.getTagName(), NName, attribute.getNodeValue() };
|
||||
throw new CanonicalizationException(
|
||||
"c14n.Canonicalizer.RelativeNamespace", exArgs
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (isRealVisible && !XMLNS.equals(NName)) {
|
||||
ns.removeMapping(NName);
|
||||
} else {
|
||||
ns.addMapping(NName, NValue, attribute);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (isRealVisible) {
|
||||
//The element is visible, handle the xmlns definition
|
||||
Attr xmlns = element.getAttributeNodeNS(XMLNS_URI, XMLNS);
|
||||
Node n = null;
|
||||
if (xmlns == null) {
|
||||
//No xmlns def just get the already defined.
|
||||
n=ns.getMapping(XMLNS);
|
||||
} else if ( !isVisible(xmlns)) {
|
||||
n = ns.getMapping(XMLNS);
|
||||
} else if (!isVisible(xmlns)) {
|
||||
//There is a definition but the xmlns is not selected by the xpath.
|
||||
//then xmlns=""
|
||||
n=ns.addMappingAndRender(XMLNS,"",nullNode);
|
||||
n = ns.addMappingAndRender(XMLNS, "", nullNode);
|
||||
}
|
||||
//output the xmlns def if needed.
|
||||
if (n != null) {
|
||||
result.add((Attr)n);
|
||||
}
|
||||
//Float all xml:* attributes of the unselected parent elements to this one.
|
||||
xmlattrStack.getXmlnsAttr(result);
|
||||
ns.getUnrenderedNodes(result);
|
||||
}
|
||||
//output the xmlns def if needed.
|
||||
if (n!=null) {
|
||||
result.add((Attr)n);
|
||||
}
|
||||
//Float all xml:* attributes of the unselected parent elements to this one.
|
||||
//addXmlAttributes(E,result);
|
||||
xmlattrStack.getXmlnsAttr(result);
|
||||
ns.getUnrenderedNodes(getSortedSetAsCollection(result));
|
||||
|
||||
return result.iterator();
|
||||
}
|
||||
|
||||
return result.iterator();
|
||||
}
|
||||
/**
|
||||
* Always throws a CanonicalizationException because this is inclusive c14n.
|
||||
*
|
||||
* @param xpathNodeSet
|
||||
* @param inclusiveNamespaces
|
||||
* @return none it always fails
|
||||
* @throws CanonicalizationException always
|
||||
*/
|
||||
public byte[] engineCanonicalizeXPathNodeSet(Set<Node> xpathNodeSet, String inclusiveNamespaces)
|
||||
throws CanonicalizationException {
|
||||
protected void circumventBugIfNeeded(XMLSignatureInput input)
|
||||
throws CanonicalizationException, ParserConfigurationException, IOException, SAXException {
|
||||
if (!input.isNeedsToBeExpanded()) {
|
||||
return;
|
||||
}
|
||||
Document doc = null;
|
||||
if (input.getSubNode() != null) {
|
||||
doc = XMLUtils.getOwnerDocument(input.getSubNode());
|
||||
} else {
|
||||
doc = XMLUtils.getOwnerDocument(input.getNodeSet());
|
||||
}
|
||||
XMLUtils.circumventBug2650(doc);
|
||||
}
|
||||
|
||||
/** $todo$ well, should we throw UnsupportedOperationException ? */
|
||||
throw new CanonicalizationException(
|
||||
"c14n.Canonicalizer.UnsupportedOperation");
|
||||
}
|
||||
@Override
|
||||
protected void handleParent(Element e, NameSpaceSymbTable ns) {
|
||||
if (!e.hasAttributes() && e.getNamespaceURI() == null) {
|
||||
return;
|
||||
}
|
||||
xmlattrStack.push(-1);
|
||||
NamedNodeMap attrs = e.getAttributes();
|
||||
int attrsLength = attrs.getLength();
|
||||
for (int i = 0; i < attrsLength; i++) {
|
||||
Attr attribute = (Attr) attrs.item(i);
|
||||
String NName = attribute.getLocalName();
|
||||
String NValue = attribute.getNodeValue();
|
||||
|
||||
/**
|
||||
* Always throws a CanonicalizationException because this is inclusive c14n.
|
||||
*
|
||||
* @param rootNode
|
||||
* @param inclusiveNamespaces
|
||||
* @return none it always fails
|
||||
* @throws CanonicalizationException
|
||||
*/
|
||||
public byte[] engineCanonicalizeSubTree(Node rootNode, String inclusiveNamespaces)
|
||||
throws CanonicalizationException {
|
||||
|
||||
/** $todo$ well, should we throw UnsupportedOperationException ? */
|
||||
throw new CanonicalizationException(
|
||||
"c14n.Canonicalizer.UnsupportedOperation");
|
||||
}
|
||||
void circumventBugIfNeeded(XMLSignatureInput input) throws CanonicalizationException, ParserConfigurationException, IOException, SAXException {
|
||||
if (!input.isNeedsToBeExpanded())
|
||||
return;
|
||||
Document doc = null;
|
||||
if (input.getSubNode() != null) {
|
||||
doc=XMLUtils.getOwnerDocument(input.getSubNode());
|
||||
} else {
|
||||
doc=XMLUtils.getOwnerDocument(input.getNodeSet());
|
||||
}
|
||||
XMLUtils.circumventBug2650(doc);
|
||||
|
||||
}
|
||||
|
||||
void handleParent(Element e, NameSpaceSymbTable ns) {
|
||||
if (!e.hasAttributes()) {
|
||||
return;
|
||||
}
|
||||
xmlattrStack.push(-1);
|
||||
NamedNodeMap attrs = e.getAttributes();
|
||||
int attrsLength = attrs.getLength();
|
||||
for (int i = 0; i < attrsLength; i++) {
|
||||
Attr N = (Attr) attrs.item(i);
|
||||
if (Constants.NamespaceSpecNS!=N.getNamespaceURI()) {
|
||||
//Not a namespace definition, ignore.
|
||||
if (XML_LANG_URI==N.getNamespaceURI()) {
|
||||
xmlattrStack.addXmlnsAttr(N);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
String NName=N.getLocalName();
|
||||
String NValue=N.getNodeValue();
|
||||
if (XML.equals(NName)
|
||||
&& Constants.XML_LANG_SPACE_SpecNS.equals(NValue)) {
|
||||
continue;
|
||||
}
|
||||
ns.addMapping(NName,NValue,N);
|
||||
}
|
||||
}
|
||||
if (Constants.NamespaceSpecNS.equals(attribute.getNamespaceURI())) {
|
||||
if (!XML.equals(NName) || !Constants.XML_LANG_SPACE_SpecNS.equals(NValue)) {
|
||||
ns.addMapping(NName, NValue, attribute);
|
||||
}
|
||||
} else if (XML_LANG_URI.equals(attribute.getNamespaceURI())) {
|
||||
xmlattrStack.addXmlnsAttr(attribute);
|
||||
}
|
||||
}
|
||||
if (e.getNamespaceURI() != null) {
|
||||
String NName = e.getPrefix();
|
||||
String NValue = e.getNamespaceURI();
|
||||
String Name;
|
||||
if (NName == null || NName.equals("")) {
|
||||
NName = "xmlns";
|
||||
Name = "xmlns";
|
||||
} else {
|
||||
Name = "xmlns:" + NName;
|
||||
}
|
||||
Attr n = e.getOwnerDocument().createAttributeNS("http://www.w3.org/2000/xmlns/", Name);
|
||||
n.setValue(NValue);
|
||||
ns.addMapping(NName, NValue, n);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2,21 +2,23 @@
|
||||
* reserved comment block
|
||||
* DO NOT REMOVE OR ALTER!
|
||||
*/
|
||||
/*
|
||||
* Copyright 1999-2004 The Apache Software Foundation.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
|
||||
* use this file except in compliance with the License. You may obtain a copy of
|
||||
* the License at
|
||||
/**
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations under
|
||||
* the License.
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package com.sun.org.apache.xml.internal.security.c14n.implementations;
|
||||
|
||||
@ -25,7 +27,6 @@ import java.util.Iterator;
|
||||
import java.util.Set;
|
||||
import java.util.SortedSet;
|
||||
import java.util.TreeSet;
|
||||
|
||||
import javax.xml.parsers.ParserConfigurationException;
|
||||
|
||||
import com.sun.org.apache.xml.internal.security.c14n.CanonicalizationException;
|
||||
@ -40,6 +41,7 @@ import org.w3c.dom.Element;
|
||||
import org.w3c.dom.NamedNodeMap;
|
||||
import org.w3c.dom.Node;
|
||||
import org.xml.sax.SAXException;
|
||||
|
||||
/**
|
||||
* Implements " <A
|
||||
* HREF="http://www.w3.org/TR/2002/REC-xml-exc-c14n-20020718/">Exclusive XML
|
||||
@ -52,301 +54,279 @@ import org.xml.sax.SAXException;
|
||||
* <i>THIS </i> implementation is a complete rewrite of the algorithm.
|
||||
*
|
||||
* @author Christian Geuer-Pollmann <geuerp@apache.org>
|
||||
* @version $Revision: 1.5 $
|
||||
* @version $Revision: 1147448 $
|
||||
* @see <a href="http://www.w3.org/TR/2002/REC-xml-exc-c14n-20020718/ Exclusive#">
|
||||
* XML Canonicalization, Version 1.0</a>
|
||||
*/
|
||||
public abstract class Canonicalizer20010315Excl extends CanonicalizerBase {
|
||||
|
||||
private static final String XML_LANG_URI = Constants.XML_LANG_SPACE_SpecNS;
|
||||
private static final String XMLNS_URI = Constants.NamespaceSpecNS;
|
||||
|
||||
/**
|
||||
* This Set contains the names (Strings like "xmlns" or "xmlns:foo") of
|
||||
* the inclusive namespaces.
|
||||
*/
|
||||
TreeSet<String> _inclusiveNSSet = new TreeSet<String>();
|
||||
static final String XMLNS_URI=Constants.NamespaceSpecNS;
|
||||
final SortedSet<Attr> result = new TreeSet<Attr>(COMPARE);
|
||||
/**
|
||||
* Constructor Canonicalizer20010315Excl
|
||||
*
|
||||
* @param includeComments
|
||||
*/
|
||||
public Canonicalizer20010315Excl(boolean includeComments) {
|
||||
super(includeComments);
|
||||
}
|
||||
private SortedSet<String> inclusiveNSSet;
|
||||
|
||||
/**
|
||||
* Method engineCanonicalizeSubTree
|
||||
* @inheritDoc
|
||||
* @param rootNode
|
||||
*
|
||||
* @throws CanonicalizationException
|
||||
*/
|
||||
public byte[] engineCanonicalizeSubTree(Node rootNode)
|
||||
throws CanonicalizationException {
|
||||
return this.engineCanonicalizeSubTree(rootNode, "",null);
|
||||
}
|
||||
/**
|
||||
* Method engineCanonicalizeSubTree
|
||||
* @inheritDoc
|
||||
* @param rootNode
|
||||
* @param inclusiveNamespaces
|
||||
*
|
||||
* @throws CanonicalizationException
|
||||
*/
|
||||
public byte[] engineCanonicalizeSubTree(Node rootNode,
|
||||
String inclusiveNamespaces) throws CanonicalizationException {
|
||||
return this.engineCanonicalizeSubTree(rootNode, inclusiveNamespaces,null);
|
||||
}
|
||||
/**
|
||||
* Method engineCanonicalizeSubTree
|
||||
* @param rootNode
|
||||
private final SortedSet<Attr> result = new TreeSet<Attr>(COMPARE);
|
||||
|
||||
/**
|
||||
* Constructor Canonicalizer20010315Excl
|
||||
*
|
||||
* @param includeComments
|
||||
*/
|
||||
public Canonicalizer20010315Excl(boolean includeComments) {
|
||||
super(includeComments);
|
||||
}
|
||||
|
||||
/**
|
||||
* Method engineCanonicalizeSubTree
|
||||
* @inheritDoc
|
||||
* @param rootNode
|
||||
*
|
||||
* @throws CanonicalizationException
|
||||
*/
|
||||
public byte[] engineCanonicalizeSubTree(Node rootNode)
|
||||
throws CanonicalizationException {
|
||||
return engineCanonicalizeSubTree(rootNode, "", null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Method engineCanonicalizeSubTree
|
||||
* @inheritDoc
|
||||
* @param rootNode
|
||||
* @param inclusiveNamespaces
|
||||
*
|
||||
* @throws CanonicalizationException
|
||||
*/
|
||||
public byte[] engineCanonicalizeSubTree(
|
||||
Node rootNode, String inclusiveNamespaces
|
||||
) throws CanonicalizationException {
|
||||
return engineCanonicalizeSubTree(rootNode, inclusiveNamespaces, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Method engineCanonicalizeSubTree
|
||||
* @param rootNode
|
||||
* @param inclusiveNamespaces
|
||||
* @param excl A element to exclude from the c14n process.
|
||||
* @return the rootNode c14n.
|
||||
* @throws CanonicalizationException
|
||||
*/
|
||||
public byte[] engineCanonicalizeSubTree(Node rootNode,
|
||||
String inclusiveNamespaces,Node excl) throws CanonicalizationException {
|
||||
this._inclusiveNSSet = getInclusiveNameSpace(inclusiveNamespaces);
|
||||
return super.engineCanonicalizeSubTree(rootNode,excl);
|
||||
}
|
||||
/**
|
||||
*
|
||||
* @param rootNode
|
||||
* @param inclusiveNamespaces
|
||||
* @return the rootNode c14n.
|
||||
* @throws CanonicalizationException
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public byte[] engineCanonicalize(XMLSignatureInput rootNode,
|
||||
String inclusiveNamespaces) throws CanonicalizationException {
|
||||
this._inclusiveNSSet = getInclusiveNameSpace(inclusiveNamespaces);
|
||||
return super.engineCanonicalize(rootNode);
|
||||
}
|
||||
|
||||
/**
|
||||
* Method handleAttributesSubtree
|
||||
* @inheritDoc
|
||||
* @param E
|
||||
* @throws CanonicalizationException
|
||||
*/
|
||||
Iterator<Attr> handleAttributesSubtree(Element E,NameSpaceSymbTable ns)
|
||||
throws CanonicalizationException {
|
||||
// System.out.println("During the traversal, I encountered " +
|
||||
// XMLUtils.getXPath(E));
|
||||
// result will contain the attrs which have to be outputted
|
||||
SortedSet<Attr> result = this.result;
|
||||
result.clear();
|
||||
NamedNodeMap attrs=null;
|
||||
|
||||
int attrsLength = 0;
|
||||
if (E.hasAttributes()) {
|
||||
attrs = E.getAttributes();
|
||||
attrsLength = attrs.getLength();
|
||||
}
|
||||
//The prefix visibly utilized(in the attribute or in the name) in the element
|
||||
SortedSet<String> visiblyUtilized = getNSSetClone();
|
||||
|
||||
for (int i = 0; i < attrsLength; i++) {
|
||||
Attr N = (Attr) attrs.item(i);
|
||||
|
||||
if (XMLNS_URI!=N.getNamespaceURI()) {
|
||||
//Not a namespace definition.
|
||||
//The Element is output element, add his prefix(if used) to visibyUtilized
|
||||
String prefix = N.getPrefix();
|
||||
if ( (prefix != null) && (!prefix.equals(XML) && !prefix.equals(XMLNS)) ) {
|
||||
visiblyUtilized.add(prefix);
|
||||
}
|
||||
//Add to the result.
|
||||
result.add(N);
|
||||
continue;
|
||||
}
|
||||
String NName=N.getLocalName();
|
||||
String NNodeValue=N.getNodeValue();
|
||||
|
||||
if (ns.addMapping(NName, NNodeValue,N)) {
|
||||
//New definition check if it is relative.
|
||||
if (C14nHelper.namespaceIsRelative(NNodeValue)) {
|
||||
Object exArgs[] = {E.getTagName(), NName,
|
||||
N.getNodeValue()};
|
||||
throw new CanonicalizationException(
|
||||
"c14n.Canonicalizer.RelativeNamespace", exArgs);
|
||||
}
|
||||
}
|
||||
}
|
||||
String prefix;
|
||||
if (E.getNamespaceURI() != null) {
|
||||
prefix = E.getPrefix();
|
||||
if ((prefix == null) || (prefix.length() == 0)) {
|
||||
prefix=XMLNS;
|
||||
}
|
||||
|
||||
} else {
|
||||
prefix=XMLNS;
|
||||
}
|
||||
visiblyUtilized.add(prefix);
|
||||
|
||||
//This can be optimezed by I don't have time
|
||||
Iterator<String> it=visiblyUtilized.iterator();
|
||||
while (it.hasNext()) {
|
||||
String s=it.next();
|
||||
Attr key=ns.getMapping(s);
|
||||
if (key==null) {
|
||||
continue;
|
||||
}
|
||||
result.add(key);
|
||||
}
|
||||
|
||||
return result.iterator();
|
||||
}
|
||||
|
||||
/**
|
||||
* Method engineCanonicalizeXPathNodeSet
|
||||
* @inheritDoc
|
||||
* @param xpathNodeSet
|
||||
* @param inclusiveNamespaces
|
||||
* @throws CanonicalizationException
|
||||
*/
|
||||
public byte[] engineCanonicalizeXPathNodeSet(Set<Node> xpathNodeSet,
|
||||
String inclusiveNamespaces) throws CanonicalizationException {
|
||||
|
||||
this._inclusiveNSSet = getInclusiveNameSpace(inclusiveNamespaces);
|
||||
return super.engineCanonicalizeXPathNodeSet(xpathNodeSet);
|
||||
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
private TreeSet<String> getInclusiveNameSpace(String inclusiveNameSpaces) {
|
||||
return (TreeSet<String>)InclusiveNamespaces.prefixStr2Set(inclusiveNameSpaces);
|
||||
* @return the rootNode c14n.
|
||||
* @throws CanonicalizationException
|
||||
*/
|
||||
public byte[] engineCanonicalizeSubTree(
|
||||
Node rootNode, String inclusiveNamespaces, Node excl
|
||||
) throws CanonicalizationException{
|
||||
inclusiveNSSet = InclusiveNamespaces.prefixStr2Set(inclusiveNamespaces);
|
||||
return super.engineCanonicalizeSubTree(rootNode, excl);
|
||||
}
|
||||
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
private SortedSet<String> getNSSetClone() {
|
||||
return (SortedSet<String>) this._inclusiveNSSet.clone();
|
||||
/**
|
||||
*
|
||||
* @param rootNode
|
||||
* @param inclusiveNamespaces
|
||||
* @return the rootNode c14n.
|
||||
* @throws CanonicalizationException
|
||||
*/
|
||||
public byte[] engineCanonicalize(
|
||||
XMLSignatureInput rootNode, String inclusiveNamespaces
|
||||
) throws CanonicalizationException {
|
||||
inclusiveNSSet = InclusiveNamespaces.prefixStr2Set(inclusiveNamespaces);
|
||||
return super.engineCanonicalize(rootNode);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
/**
|
||||
* Method engineCanonicalizeXPathNodeSet
|
||||
* @inheritDoc
|
||||
* @param E
|
||||
* @throws CanonicalizationException
|
||||
*/
|
||||
final Iterator<Attr> handleAttributes(Element E, NameSpaceSymbTable ns)
|
||||
throws CanonicalizationException {
|
||||
// result will contain the attrs which have to be outputted
|
||||
SortedSet<Attr> result = this.result;
|
||||
result.clear();
|
||||
NamedNodeMap attrs = null;
|
||||
int attrsLength = 0;
|
||||
if (E.hasAttributes()) {
|
||||
attrs = E.getAttributes();
|
||||
attrsLength = attrs.getLength();
|
||||
* @param xpathNodeSet
|
||||
* @param inclusiveNamespaces
|
||||
* @throws CanonicalizationException
|
||||
*/
|
||||
public byte[] engineCanonicalizeXPathNodeSet(
|
||||
Set<Node> xpathNodeSet, String inclusiveNamespaces
|
||||
) throws CanonicalizationException {
|
||||
inclusiveNSSet = InclusiveNamespaces.prefixStr2Set(inclusiveNamespaces);
|
||||
return super.engineCanonicalizeXPathNodeSet(xpathNodeSet);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Iterator<Attr> handleAttributesSubtree(Element element, NameSpaceSymbTable ns)
|
||||
throws CanonicalizationException {
|
||||
// result will contain the attrs which have to be output
|
||||
final SortedSet<Attr> result = this.result;
|
||||
result.clear();
|
||||
|
||||
// The prefix visibly utilized (in the attribute or in the name) in
|
||||
// the element
|
||||
SortedSet<String> visiblyUtilized = new TreeSet<String>();
|
||||
if (inclusiveNSSet != null && !inclusiveNSSet.isEmpty()) {
|
||||
visiblyUtilized.addAll(inclusiveNSSet);
|
||||
}
|
||||
//The prefix visibly utilized(in the attribute or in the name) in the element
|
||||
Set<String> visiblyUtilized =null;
|
||||
//It's the output selected.
|
||||
boolean isOutputElement=isVisibleDO(E,ns.getLevel())==1;
|
||||
if (isOutputElement) {
|
||||
visiblyUtilized = getNSSetClone();
|
||||
}
|
||||
|
||||
for (int i = 0; i < attrsLength; i++) {
|
||||
Attr N = (Attr) attrs.item(i);
|
||||
if (element.hasAttributes()) {
|
||||
NamedNodeMap attrs = element.getAttributes();
|
||||
int attrsLength = attrs.getLength();
|
||||
for (int i = 0; i < attrsLength; i++) {
|
||||
Attr attribute = (Attr) attrs.item(i);
|
||||
String NName = attribute.getLocalName();
|
||||
String NNodeValue = attribute.getNodeValue();
|
||||
|
||||
|
||||
if (XMLNS_URI!=N.getNamespaceURI()) {
|
||||
if ( !isVisible(N) ) {
|
||||
//The node is not in the nodeset(if there is a nodeset)
|
||||
continue;
|
||||
}
|
||||
//Not a namespace definition.
|
||||
if (isOutputElement) {
|
||||
//The Element is output element, add his prefix(if used) to visibyUtilized
|
||||
String prefix = N.getPrefix();
|
||||
if ((prefix != null) && (!prefix.equals(XML) && !prefix.equals(XMLNS)) ){
|
||||
visiblyUtilized.add(prefix);
|
||||
}
|
||||
//Add to the result.
|
||||
result.add(N);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
String NName=N.getLocalName();
|
||||
if (isOutputElement && !isVisible(N) && NName!=XMLNS) {
|
||||
ns.removeMappingIfNotRender(NName);
|
||||
continue;
|
||||
}
|
||||
String NNodeValue=N.getNodeValue();
|
||||
|
||||
if (!isOutputElement && isVisible(N) && _inclusiveNSSet.contains(NName) && !ns.removeMappingIfRender(NName)) {
|
||||
Node n=ns.addMappingAndRender(NName,NNodeValue,N);
|
||||
if (n!=null) {
|
||||
result.add((Attr)n);
|
||||
if (C14nHelper.namespaceIsRelative(N)) {
|
||||
Object exArgs[] = { E.getTagName(), NName, N.getNodeValue() };
|
||||
throw new CanonicalizationException(
|
||||
"c14n.Canonicalizer.RelativeNamespace", exArgs);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
if (ns.addMapping(NName, NNodeValue,N)) {
|
||||
//New definiton check if it is relative
|
||||
if (C14nHelper.namespaceIsRelative(NNodeValue)) {
|
||||
Object exArgs[] = {E.getTagName(), NName,
|
||||
N.getNodeValue()};
|
||||
if (!XMLNS_URI.equals(attribute.getNamespaceURI())) {
|
||||
// Not a namespace definition.
|
||||
// The Element is output element, add the prefix (if used) to
|
||||
// visiblyUtilized
|
||||
String prefix = attribute.getPrefix();
|
||||
if (prefix != null && !(prefix.equals(XML) || prefix.equals(XMLNS))) {
|
||||
visiblyUtilized.add(prefix);
|
||||
}
|
||||
// Add to the result.
|
||||
result.add(attribute);
|
||||
} else if (!(XML.equals(NName) && XML_LANG_URI.equals(NNodeValue))
|
||||
&& ns.addMapping(NName, NNodeValue, attribute)
|
||||
&& C14nHelper.namespaceIsRelative(NNodeValue)) {
|
||||
// The default mapping for xml must not be output.
|
||||
// New definition check if it is relative.
|
||||
Object exArgs[] = {element.getTagName(), NName, attribute.getNodeValue()};
|
||||
throw new CanonicalizationException(
|
||||
"c14n.Canonicalizer.RelativeNamespace", exArgs);
|
||||
"c14n.Canonicalizer.RelativeNamespace", exArgs
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (isOutputElement) {
|
||||
//The element is visible, handle the xmlns definition
|
||||
Attr xmlns = E.getAttributeNodeNS(XMLNS_URI, XMLNS);
|
||||
if ((xmlns!=null) && (!isVisible(xmlns))) {
|
||||
//There is a definition but the xmlns is not selected by the xpath.
|
||||
//then xmlns=""
|
||||
ns.addMapping(XMLNS,"",nullNode);
|
||||
}
|
||||
|
||||
if (E.getNamespaceURI() != null) {
|
||||
String prefix = E.getPrefix();
|
||||
if ((prefix == null) || (prefix.length() == 0)) {
|
||||
visiblyUtilized.add(XMLNS);
|
||||
} else {
|
||||
visiblyUtilized.add( prefix);
|
||||
}
|
||||
} else {
|
||||
visiblyUtilized.add(XMLNS);
|
||||
}
|
||||
//This can be optimezed by I don't have time
|
||||
//visiblyUtilized.addAll(this._inclusiveNSSet);
|
||||
Iterator<String> it=visiblyUtilized.iterator();
|
||||
while (it.hasNext()) {
|
||||
String s=it.next();
|
||||
Attr key=ns.getMapping(s);
|
||||
if (key==null) {
|
||||
continue;
|
||||
}
|
||||
result.add(key);
|
||||
}
|
||||
}
|
||||
|
||||
return result.iterator();
|
||||
}
|
||||
void circumventBugIfNeeded(XMLSignatureInput input) throws CanonicalizationException, ParserConfigurationException, IOException, SAXException {
|
||||
if (!input.isNeedsToBeExpanded() || _inclusiveNSSet.isEmpty())
|
||||
return;
|
||||
Document doc = null;
|
||||
if (input.getSubNode() != null) {
|
||||
doc=XMLUtils.getOwnerDocument(input.getSubNode());
|
||||
} else {
|
||||
doc=XMLUtils.getOwnerDocument(input.getNodeSet());
|
||||
}
|
||||
String prefix = null;
|
||||
if (element.getNamespaceURI() != null
|
||||
&& !(element.getPrefix() == null || element.getPrefix().length() == 0)) {
|
||||
prefix = element.getPrefix();
|
||||
} else {
|
||||
prefix = XMLNS;
|
||||
}
|
||||
visiblyUtilized.add(prefix);
|
||||
|
||||
XMLUtils.circumventBug2650(doc);
|
||||
}
|
||||
for (String s : visiblyUtilized) {
|
||||
Attr key = ns.getMapping(s);
|
||||
if (key != null) {
|
||||
result.add(key);
|
||||
}
|
||||
}
|
||||
|
||||
return result.iterator();
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
* @param element
|
||||
* @throws CanonicalizationException
|
||||
*/
|
||||
@Override
|
||||
protected final Iterator<Attr> handleAttributes(Element element, NameSpaceSymbTable ns)
|
||||
throws CanonicalizationException {
|
||||
// result will contain the attrs which have to be output
|
||||
final SortedSet<Attr> result = this.result;
|
||||
result.clear();
|
||||
|
||||
// The prefix visibly utilized (in the attribute or in the name) in
|
||||
// the element
|
||||
Set<String> visiblyUtilized = null;
|
||||
// It's the output selected.
|
||||
boolean isOutputElement = isVisibleDO(element, ns.getLevel()) == 1;
|
||||
if (isOutputElement) {
|
||||
visiblyUtilized = new TreeSet<String>();
|
||||
if (inclusiveNSSet != null && !inclusiveNSSet.isEmpty()) {
|
||||
visiblyUtilized.addAll(inclusiveNSSet);
|
||||
}
|
||||
}
|
||||
|
||||
if (element.hasAttributes()) {
|
||||
NamedNodeMap attrs = element.getAttributes();
|
||||
int attrsLength = attrs.getLength();
|
||||
for (int i = 0; i < attrsLength; i++) {
|
||||
Attr attribute = (Attr) attrs.item(i);
|
||||
|
||||
String NName = attribute.getLocalName();
|
||||
String NNodeValue = attribute.getNodeValue();
|
||||
|
||||
if (!XMLNS_URI.equals(attribute.getNamespaceURI())) {
|
||||
if (isVisible(attribute) && isOutputElement) {
|
||||
// The Element is output element, add the prefix (if used)
|
||||
// to visibyUtilized
|
||||
String prefix = attribute.getPrefix();
|
||||
if (prefix != null && !(prefix.equals(XML) || prefix.equals(XMLNS))) {
|
||||
visiblyUtilized.add(prefix);
|
||||
}
|
||||
// Add to the result.
|
||||
result.add(attribute);
|
||||
}
|
||||
} else if (isOutputElement && !isVisible(attribute) && !XMLNS.equals(NName)) {
|
||||
ns.removeMappingIfNotRender(NName);
|
||||
} else {
|
||||
if (!isOutputElement && isVisible(attribute)
|
||||
&& inclusiveNSSet.contains(NName)
|
||||
&& !ns.removeMappingIfRender(NName)) {
|
||||
Node n = ns.addMappingAndRender(NName, NNodeValue, attribute);
|
||||
if (n != null) {
|
||||
result.add((Attr)n);
|
||||
if (C14nHelper.namespaceIsRelative(attribute)) {
|
||||
Object exArgs[] = { element.getTagName(), NName, attribute.getNodeValue() };
|
||||
throw new CanonicalizationException(
|
||||
"c14n.Canonicalizer.RelativeNamespace", exArgs
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (ns.addMapping(NName, NNodeValue, attribute)
|
||||
&& C14nHelper.namespaceIsRelative(NNodeValue)) {
|
||||
// New definition check if it is relative
|
||||
Object exArgs[] = { element.getTagName(), NName, attribute.getNodeValue() };
|
||||
throw new CanonicalizationException(
|
||||
"c14n.Canonicalizer.RelativeNamespace", exArgs
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (isOutputElement) {
|
||||
// The element is visible, handle the xmlns definition
|
||||
Attr xmlns = element.getAttributeNodeNS(XMLNS_URI, XMLNS);
|
||||
if (xmlns != null && !isVisible(xmlns)) {
|
||||
// There is a definition but the xmlns is not selected by the
|
||||
// xpath. then xmlns=""
|
||||
ns.addMapping(XMLNS, "", nullNode);
|
||||
}
|
||||
|
||||
String prefix = null;
|
||||
if (element.getNamespaceURI() != null
|
||||
&& !(element.getPrefix() == null || element.getPrefix().length() == 0)) {
|
||||
prefix = element.getPrefix();
|
||||
} else {
|
||||
prefix = XMLNS;
|
||||
}
|
||||
visiblyUtilized.add(prefix);
|
||||
|
||||
for (String s : visiblyUtilized) {
|
||||
Attr key = ns.getMapping(s);
|
||||
if (key != null) {
|
||||
result.add(key);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return result.iterator();
|
||||
}
|
||||
|
||||
protected void circumventBugIfNeeded(XMLSignatureInput input)
|
||||
throws CanonicalizationException, ParserConfigurationException,
|
||||
IOException, SAXException {
|
||||
if (!input.isNeedsToBeExpanded() || inclusiveNSSet.isEmpty() || inclusiveNSSet.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
Document doc = null;
|
||||
if (input.getSubNode() != null) {
|
||||
doc = XMLUtils.getOwnerDocument(input.getSubNode());
|
||||
} else {
|
||||
doc = XMLUtils.getOwnerDocument(input.getNodeSet());
|
||||
}
|
||||
XMLUtils.circumventBug2650(doc);
|
||||
}
|
||||
}
|
||||
|
@ -2,48 +2,44 @@
|
||||
* reserved comment block
|
||||
* DO NOT REMOVE OR ALTER!
|
||||
*/
|
||||
/*
|
||||
* Copyright 1999-2004 The Apache Software Foundation.
|
||||
/**
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package com.sun.org.apache.xml.internal.security.c14n.implementations;
|
||||
|
||||
import com.sun.org.apache.xml.internal.security.c14n.Canonicalizer;
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
*/
|
||||
public class Canonicalizer20010315ExclOmitComments
|
||||
extends Canonicalizer20010315Excl {
|
||||
public class Canonicalizer20010315ExclOmitComments extends Canonicalizer20010315Excl {
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public Canonicalizer20010315ExclOmitComments() {
|
||||
super(false);
|
||||
}
|
||||
/**
|
||||
*
|
||||
*/
|
||||
public Canonicalizer20010315ExclOmitComments() {
|
||||
super(false);
|
||||
}
|
||||
|
||||
/** @inheritDoc */
|
||||
public final String engineGetURI() {
|
||||
return Canonicalizer.ALGO_ID_C14N_EXCL_OMIT_COMMENTS;
|
||||
}
|
||||
/** @inheritDoc */
|
||||
public final String engineGetURI() {
|
||||
return Canonicalizer.ALGO_ID_C14N_EXCL_OMIT_COMMENTS;
|
||||
}
|
||||
|
||||
/** @inheritDoc */
|
||||
public final boolean engineGetIncludeComments() {
|
||||
return false;
|
||||
}
|
||||
/** @inheritDoc */
|
||||
public final boolean engineGetIncludeComments() {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
@ -2,52 +2,48 @@
|
||||
* reserved comment block
|
||||
* DO NOT REMOVE OR ALTER!
|
||||
*/
|
||||
/*
|
||||
* Copyright 1999-2004 The Apache Software Foundation.
|
||||
/**
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package com.sun.org.apache.xml.internal.security.c14n.implementations;
|
||||
|
||||
|
||||
|
||||
import com.sun.org.apache.xml.internal.security.c14n.Canonicalizer;
|
||||
|
||||
|
||||
/**
|
||||
* Class Canonicalizer20010315ExclWithComments
|
||||
*
|
||||
* @version $Revision: 1.5 $
|
||||
*/
|
||||
public class Canonicalizer20010315ExclWithComments
|
||||
extends Canonicalizer20010315Excl {
|
||||
public class Canonicalizer20010315ExclWithComments extends Canonicalizer20010315Excl {
|
||||
|
||||
/**
|
||||
* Constructor Canonicalizer20010315ExclWithComments
|
||||
*
|
||||
*/
|
||||
public Canonicalizer20010315ExclWithComments() {
|
||||
super(true);
|
||||
}
|
||||
/**
|
||||
* Constructor Canonicalizer20010315ExclWithComments
|
||||
*
|
||||
*/
|
||||
public Canonicalizer20010315ExclWithComments() {
|
||||
super(true);
|
||||
}
|
||||
|
||||
/** @inheritDoc */
|
||||
public final String engineGetURI() {
|
||||
return Canonicalizer.ALGO_ID_C14N_EXCL_WITH_COMMENTS;
|
||||
}
|
||||
/** @inheritDoc */
|
||||
public final String engineGetURI() {
|
||||
return Canonicalizer.ALGO_ID_C14N_EXCL_WITH_COMMENTS;
|
||||
}
|
||||
|
||||
/** @inheritDoc */
|
||||
public final boolean engineGetIncludeComments() {
|
||||
return true;
|
||||
}
|
||||
/** @inheritDoc */
|
||||
public final boolean engineGetIncludeComments() {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
@ -2,50 +2,48 @@
|
||||
* reserved comment block
|
||||
* DO NOT REMOVE OR ALTER!
|
||||
*/
|
||||
/*
|
||||
* Copyright 1999-2004 The Apache Software Foundation.
|
||||
/**
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package com.sun.org.apache.xml.internal.security.c14n.implementations;
|
||||
|
||||
|
||||
|
||||
import com.sun.org.apache.xml.internal.security.c14n.Canonicalizer;
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Christian Geuer-Pollmann
|
||||
*/
|
||||
public class Canonicalizer20010315OmitComments extends Canonicalizer20010315 {
|
||||
|
||||
/**
|
||||
* Constructor Canonicalizer20010315WithXPathOmitComments
|
||||
*
|
||||
*/
|
||||
public Canonicalizer20010315OmitComments() {
|
||||
super(false);
|
||||
}
|
||||
/**
|
||||
* Constructor Canonicalizer20010315WithXPathOmitComments
|
||||
*
|
||||
*/
|
||||
public Canonicalizer20010315OmitComments() {
|
||||
super(false);
|
||||
}
|
||||
|
||||
/** @inheritDoc */
|
||||
public final String engineGetURI() {
|
||||
return Canonicalizer.ALGO_ID_C14N_OMIT_COMMENTS;
|
||||
}
|
||||
/** @inheritDoc */
|
||||
public final String engineGetURI() {
|
||||
return Canonicalizer.ALGO_ID_C14N_OMIT_COMMENTS;
|
||||
}
|
||||
|
||||
/** @inheritDoc */
|
||||
public final boolean engineGetIncludeComments() {
|
||||
return false;
|
||||
}
|
||||
/** @inheritDoc */
|
||||
public final boolean engineGetIncludeComments() {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
@ -2,47 +2,47 @@
|
||||
* reserved comment block
|
||||
* DO NOT REMOVE OR ALTER!
|
||||
*/
|
||||
/*
|
||||
* Copyright 1999-2004 The Apache Software Foundation.
|
||||
/**
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package com.sun.org.apache.xml.internal.security.c14n.implementations;
|
||||
|
||||
import com.sun.org.apache.xml.internal.security.c14n.Canonicalizer;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Christian Geuer-Pollmann
|
||||
*/
|
||||
public class Canonicalizer20010315WithComments extends Canonicalizer20010315 {
|
||||
|
||||
/**
|
||||
* Constructor Canonicalizer20010315WithXPathWithComments
|
||||
*
|
||||
*/
|
||||
public Canonicalizer20010315WithComments() {
|
||||
super(true);
|
||||
}
|
||||
/**
|
||||
* Constructor Canonicalizer20010315WithXPathWithComments
|
||||
*/
|
||||
public Canonicalizer20010315WithComments() {
|
||||
super(true);
|
||||
}
|
||||
|
||||
/** @inheritDoc */
|
||||
public final String engineGetURI() {
|
||||
return Canonicalizer.ALGO_ID_C14N_WITH_COMMENTS;
|
||||
}
|
||||
/** @inheritDoc */
|
||||
public final String engineGetURI() {
|
||||
return Canonicalizer.ALGO_ID_C14N_WITH_COMMENTS;
|
||||
}
|
||||
|
||||
/** @inheritDoc */
|
||||
public final boolean engineGetIncludeComments() {
|
||||
return true;
|
||||
}
|
||||
/** @inheritDoc */
|
||||
public final boolean engineGetIncludeComments() {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,184 @@
|
||||
/*
|
||||
* reserved comment block
|
||||
* DO NOT REMOVE OR ALTER!
|
||||
*/
|
||||
/**
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package com.sun.org.apache.xml.internal.security.c14n.implementations;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStream;
|
||||
import java.util.Iterator;
|
||||
import java.util.Set;
|
||||
import java.util.SortedSet;
|
||||
import java.util.TreeSet;
|
||||
|
||||
import javax.xml.parsers.ParserConfigurationException;
|
||||
|
||||
import com.sun.org.apache.xml.internal.security.c14n.CanonicalizationException;
|
||||
import com.sun.org.apache.xml.internal.security.c14n.Canonicalizer;
|
||||
import com.sun.org.apache.xml.internal.security.signature.XMLSignatureInput;
|
||||
import org.w3c.dom.Attr;
|
||||
import org.w3c.dom.Comment;
|
||||
import org.w3c.dom.Element;
|
||||
import org.w3c.dom.NamedNodeMap;
|
||||
import org.w3c.dom.Node;
|
||||
import org.w3c.dom.ProcessingInstruction;
|
||||
import org.xml.sax.SAXException;
|
||||
|
||||
/**
|
||||
* Serializes the physical representation of the subtree. All the attributes
|
||||
* present in the subtree are emitted. The attributes are sorted within an element,
|
||||
* with the namespace declarations appearing before the regular attributes.
|
||||
* This algorithm is not a true canonicalization since equivalent subtrees
|
||||
* may produce different output. It is therefore unsuitable for digital signatures.
|
||||
* This same property makes it ideal for XML Encryption Syntax and Processing,
|
||||
* because the decrypted XML content will share the same physical representation
|
||||
* as the original XML content that was encrypted.
|
||||
*/
|
||||
public class CanonicalizerPhysical extends CanonicalizerBase {
|
||||
|
||||
private final SortedSet<Attr> result = new TreeSet<Attr>(COMPARE);
|
||||
|
||||
/**
|
||||
* Constructor Canonicalizer20010315
|
||||
*/
|
||||
public CanonicalizerPhysical() {
|
||||
super(true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Always throws a CanonicalizationException.
|
||||
*
|
||||
* @param xpathNodeSet
|
||||
* @param inclusiveNamespaces
|
||||
* @return none it always fails
|
||||
* @throws CanonicalizationException always
|
||||
*/
|
||||
public byte[] engineCanonicalizeXPathNodeSet(Set<Node> xpathNodeSet, String inclusiveNamespaces)
|
||||
throws CanonicalizationException {
|
||||
|
||||
/** $todo$ well, should we throw UnsupportedOperationException ? */
|
||||
throw new CanonicalizationException("c14n.Canonicalizer.UnsupportedOperation");
|
||||
}
|
||||
|
||||
/**
|
||||
* Always throws a CanonicalizationException.
|
||||
*
|
||||
* @param rootNode
|
||||
* @param inclusiveNamespaces
|
||||
* @return none it always fails
|
||||
* @throws CanonicalizationException
|
||||
*/
|
||||
public byte[] engineCanonicalizeSubTree(Node rootNode, String inclusiveNamespaces)
|
||||
throws CanonicalizationException {
|
||||
|
||||
/** $todo$ well, should we throw UnsupportedOperationException ? */
|
||||
throw new CanonicalizationException("c14n.Canonicalizer.UnsupportedOperation");
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the Attr[]s to be output for the given element.
|
||||
* <br>
|
||||
* The code of this method is a copy of {@link #handleAttributes(Element,
|
||||
* NameSpaceSymbTable)},
|
||||
* whereas it takes into account that subtree-c14n is -- well -- subtree-based.
|
||||
* So if the element in question isRoot of c14n, it's parent is not in the
|
||||
* node set, as well as all other ancestors.
|
||||
*
|
||||
* @param element
|
||||
* @param ns
|
||||
* @return the Attr[]s to be output
|
||||
* @throws CanonicalizationException
|
||||
*/
|
||||
@Override
|
||||
protected Iterator<Attr> handleAttributesSubtree(Element element, NameSpaceSymbTable ns)
|
||||
throws CanonicalizationException {
|
||||
if (!element.hasAttributes()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// result will contain all the attrs declared directly on that element
|
||||
final SortedSet<Attr> result = this.result;
|
||||
result.clear();
|
||||
|
||||
if (element.hasAttributes()) {
|
||||
NamedNodeMap attrs = element.getAttributes();
|
||||
int attrsLength = attrs.getLength();
|
||||
|
||||
for (int i = 0; i < attrsLength; i++) {
|
||||
Attr attribute = (Attr) attrs.item(i);
|
||||
result.add(attribute);
|
||||
}
|
||||
}
|
||||
|
||||
return result.iterator();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the Attr[]s to be output for the given element.
|
||||
*
|
||||
* @param element
|
||||
* @param ns
|
||||
* @return the Attr[]s to be output
|
||||
* @throws CanonicalizationException
|
||||
*/
|
||||
@Override
|
||||
protected Iterator<Attr> handleAttributes(Element element, NameSpaceSymbTable ns)
|
||||
throws CanonicalizationException {
|
||||
|
||||
/** $todo$ well, should we throw UnsupportedOperationException ? */
|
||||
throw new CanonicalizationException("c14n.Canonicalizer.UnsupportedOperation");
|
||||
}
|
||||
|
||||
protected void circumventBugIfNeeded(XMLSignatureInput input)
|
||||
throws CanonicalizationException, ParserConfigurationException, IOException, SAXException {
|
||||
// nothing to do
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void handleParent(Element e, NameSpaceSymbTable ns) {
|
||||
// nothing to do
|
||||
}
|
||||
|
||||
/** @inheritDoc */
|
||||
public final String engineGetURI() {
|
||||
return Canonicalizer.ALGO_ID_C14N_PHYSICAL;
|
||||
}
|
||||
|
||||
/** @inheritDoc */
|
||||
public final boolean engineGetIncludeComments() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void outputPItoWriter(ProcessingInstruction currentPI,
|
||||
OutputStream writer, int position) throws IOException {
|
||||
// Processing Instructions before or after the document element are not treated specially
|
||||
super.outputPItoWriter(currentPI, writer, NODE_NOT_BEFORE_OR_AFTER_DOCUMENT_ELEMENT);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void outputCommentToWriter(Comment currentComment,
|
||||
OutputStream writer, int position) throws IOException {
|
||||
// Comments before or after the document element are not treated specially
|
||||
super.outputCommentToWriter(currentComment, writer, NODE_NOT_BEFORE_OR_AFTER_DOCUMENT_ELEMENT);
|
||||
}
|
||||
|
||||
}
|
@ -2,21 +2,23 @@
|
||||
* reserved comment block
|
||||
* DO NOT REMOVE OR ALTER!
|
||||
*/
|
||||
/*
|
||||
* Copyright 1999-2004 The Apache Software Foundation.
|
||||
/**
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package com.sun.org.apache.xml.internal.security.c14n.implementations;
|
||||
|
||||
@ -29,191 +31,185 @@ import java.util.List;
|
||||
import org.w3c.dom.Attr;
|
||||
import org.w3c.dom.Node;
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* A stack based Symble Table.
|
||||
* A stack based Symbol Table.
|
||||
*<br>For speed reasons all the symbols are introduced in the same map,
|
||||
* and at the same time in a list so it can be removed when the frame is pop back.
|
||||
* @author Raul Benito
|
||||
**/
|
||||
*/
|
||||
public class NameSpaceSymbTable {
|
||||
|
||||
/**The map betwen prefix-> entry table. */
|
||||
SymbMap symb;
|
||||
/**The level of nameSpaces (for Inclusive visibility).*/
|
||||
int nameSpaces=0;
|
||||
/**The stacks for removing the definitions when doing pop.*/
|
||||
List<SymbMap> level;
|
||||
boolean cloned=true;
|
||||
static final String XMLNS="xmlns";
|
||||
final static SymbMap initialMap=new SymbMap();
|
||||
static {
|
||||
NameSpaceSymbEntry ne=new NameSpaceSymbEntry("",null,true,XMLNS);
|
||||
ne.lastrendered="";
|
||||
initialMap.put(XMLNS,ne);
|
||||
}
|
||||
private static final String XMLNS = "xmlns";
|
||||
private static final SymbMap initialMap = new SymbMap();
|
||||
|
||||
static {
|
||||
NameSpaceSymbEntry ne = new NameSpaceSymbEntry("", null, true, XMLNS);
|
||||
ne.lastrendered = "";
|
||||
initialMap.put(XMLNS, ne);
|
||||
}
|
||||
|
||||
/**The map betwen prefix-> entry table. */
|
||||
private SymbMap symb;
|
||||
|
||||
/**The stacks for removing the definitions when doing pop.*/
|
||||
private List<SymbMap> level;
|
||||
private boolean cloned = true;
|
||||
|
||||
/**
|
||||
* Default constractor
|
||||
**/
|
||||
public NameSpaceSymbTable() {
|
||||
level = new ArrayList<SymbMap>(10);
|
||||
level = new ArrayList<SymbMap>();
|
||||
//Insert the default binding for xmlns.
|
||||
symb=(SymbMap) initialMap.clone();
|
||||
symb = (SymbMap) initialMap.clone();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all the unrendered nodes in the name space.
|
||||
* For Inclusive rendering
|
||||
* Get all the unrendered nodes in the name space.
|
||||
* For Inclusive rendering
|
||||
* @param result the list where to fill the unrendered xmlns definitions.
|
||||
**/
|
||||
public void getUnrenderedNodes(Collection<Attr> result) {
|
||||
//List result=new ArrayList();
|
||||
Iterator<NameSpaceSymbEntry> it=symb.entrySet().iterator();
|
||||
while (it.hasNext()) {
|
||||
NameSpaceSymbEntry n= it.next();
|
||||
//put them rendered?
|
||||
if ((!n.rendered) && (n.n!=null)) {
|
||||
n=(NameSpaceSymbEntry) n.clone();
|
||||
**/
|
||||
public void getUnrenderedNodes(Collection<Attr> result) {
|
||||
Iterator<NameSpaceSymbEntry> it = symb.entrySet().iterator();
|
||||
while (it.hasNext()) {
|
||||
NameSpaceSymbEntry n = it.next();
|
||||
//put them rendered?
|
||||
if ((!n.rendered) && (n.n != null)) {
|
||||
n = (NameSpaceSymbEntry) n.clone();
|
||||
needsClone();
|
||||
symb.put(n.prefix,n);
|
||||
n.lastrendered=n.uri;
|
||||
n.rendered=true;
|
||||
symb.put(n.prefix, n);
|
||||
n.lastrendered = n.uri;
|
||||
n.rendered = true;
|
||||
|
||||
result.add(n.n);
|
||||
|
||||
}
|
||||
}
|
||||
result.add(n.n);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
/**
|
||||
* Push a frame for visible namespace.
|
||||
* For Inclusive rendering.
|
||||
**/
|
||||
public void outputNodePush() {
|
||||
nameSpaces++;
|
||||
push();
|
||||
}
|
||||
public void outputNodePush() {
|
||||
push();
|
||||
}
|
||||
|
||||
/**
|
||||
/**
|
||||
* Pop a frame for visible namespace.
|
||||
**/
|
||||
public void outputNodePop() {
|
||||
nameSpaces--;
|
||||
pop();
|
||||
}
|
||||
public void outputNodePop() {
|
||||
pop();
|
||||
}
|
||||
|
||||
/**
|
||||
/**
|
||||
* Push a frame for a node.
|
||||
* Inclusive or Exclusive.
|
||||
**/
|
||||
public void push() {
|
||||
//Put the number of namespace definitions in the stack.
|
||||
public void push() {
|
||||
//Put the number of namespace definitions in the stack.
|
||||
level.add(null);
|
||||
cloned=false;
|
||||
}
|
||||
cloned = false;
|
||||
}
|
||||
|
||||
/**
|
||||
/**
|
||||
* Pop a frame.
|
||||
* Inclusive or Exclusive.
|
||||
**/
|
||||
public void pop() {
|
||||
int size=level.size()-1;
|
||||
Object ob= level.remove(size);
|
||||
if (ob!=null) {
|
||||
symb=(SymbMap)ob;
|
||||
if (size==0) {
|
||||
cloned=false;
|
||||
} else
|
||||
cloned=(level.get(size-1)!=symb);
|
||||
public void pop() {
|
||||
int size = level.size() - 1;
|
||||
Object ob = level.remove(size);
|
||||
if (ob != null) {
|
||||
symb = (SymbMap)ob;
|
||||
if (size == 0) {
|
||||
cloned = false;
|
||||
} else {
|
||||
cloned = (level.get(size - 1) != symb);
|
||||
}
|
||||
} else {
|
||||
cloned=false;
|
||||
cloned = false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
final void needsClone() {
|
||||
if (!cloned) {
|
||||
level.set(level.size()-1,symb);
|
||||
symb=(SymbMap) symb.clone();
|
||||
cloned=true;
|
||||
final void needsClone() {
|
||||
if (!cloned) {
|
||||
level.set(level.size() - 1, symb);
|
||||
symb = (SymbMap) symb.clone();
|
||||
cloned = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Gets the attribute node that defines the binding for the prefix.
|
||||
/**
|
||||
* Gets the attribute node that defines the binding for the prefix.
|
||||
* @param prefix the prefix to obtain the attribute.
|
||||
* @return null if there is no need to render the prefix. Otherwise the node of
|
||||
* definition.
|
||||
**/
|
||||
public Attr getMapping(String prefix) {
|
||||
NameSpaceSymbEntry entry=symb.get(prefix);
|
||||
if (entry==null) {
|
||||
//There is no definition for the prefix(a bug?).
|
||||
return null;
|
||||
}
|
||||
if (entry.rendered) {
|
||||
//No need to render an entry already rendered.
|
||||
return null;
|
||||
}
|
||||
// Mark this entry as render.
|
||||
entry=(NameSpaceSymbEntry) entry.clone();
|
||||
needsClone();
|
||||
symb.put(prefix,entry);
|
||||
entry.rendered=true;
|
||||
entry.level=nameSpaces;
|
||||
entry.lastrendered=entry.uri;
|
||||
// Return the node for outputing.
|
||||
return entry.n;
|
||||
public Attr getMapping(String prefix) {
|
||||
NameSpaceSymbEntry entry = symb.get(prefix);
|
||||
if (entry == null) {
|
||||
//There is no definition for the prefix(a bug?).
|
||||
return null;
|
||||
}
|
||||
if (entry.rendered) {
|
||||
//No need to render an entry already rendered.
|
||||
return null;
|
||||
}
|
||||
// Mark this entry as render.
|
||||
entry = (NameSpaceSymbEntry) entry.clone();
|
||||
needsClone();
|
||||
symb.put(prefix, entry);
|
||||
entry.rendered = true;
|
||||
entry.lastrendered = entry.uri;
|
||||
// Return the node for outputing.
|
||||
return entry.n;
|
||||
}
|
||||
|
||||
/**
|
||||
/**
|
||||
* Gets a definition without mark it as render.
|
||||
* For render in exclusive c14n the namespaces in the include prefixes.
|
||||
* @param prefix The prefix whose definition is neaded.
|
||||
* @return the attr to render, null if there is no need to render
|
||||
**/
|
||||
public Attr getMappingWithoutRendered(String prefix) {
|
||||
NameSpaceSymbEntry entry= symb.get(prefix);
|
||||
if (entry==null) {
|
||||
return null;
|
||||
}
|
||||
if (entry.rendered) {
|
||||
return null;
|
||||
}
|
||||
return entry.n;
|
||||
public Attr getMappingWithoutRendered(String prefix) {
|
||||
NameSpaceSymbEntry entry = symb.get(prefix);
|
||||
if (entry == null) {
|
||||
return null;
|
||||
}
|
||||
if (entry.rendered) {
|
||||
return null;
|
||||
}
|
||||
return entry.n;
|
||||
}
|
||||
|
||||
/**
|
||||
/**
|
||||
* Adds the mapping for a prefix.
|
||||
* @param prefix the prefix of definition
|
||||
* @param uri the Uri of the definition
|
||||
* @param n the attribute that have the definition
|
||||
* @return true if there is already defined.
|
||||
**/
|
||||
public boolean addMapping(String prefix, String uri,Attr n) {
|
||||
NameSpaceSymbEntry ob = symb.get(prefix);
|
||||
if ((ob!=null) && uri.equals(ob.uri)) {
|
||||
//If we have it previously defined. Don't keep working.
|
||||
return false;
|
||||
}
|
||||
//Creates and entry in the table for this new definition.
|
||||
NameSpaceSymbEntry ne=new NameSpaceSymbEntry(uri,n,false,prefix);
|
||||
needsClone();
|
||||
symb.put(prefix, ne);
|
||||
if (ob != null) {
|
||||
//We have a previous definition store it for the pop.
|
||||
//Check if a previous definition(not the inmidiatly one) has been rendered.
|
||||
ne.lastrendered=ob.lastrendered;
|
||||
if ((ob.lastrendered!=null)&& (ob.lastrendered.equals(uri))) {
|
||||
//Yes it is. Mark as rendered.
|
||||
ne.rendered=true;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
public boolean addMapping(String prefix, String uri, Attr n) {
|
||||
NameSpaceSymbEntry ob = symb.get(prefix);
|
||||
if ((ob != null) && uri.equals(ob.uri)) {
|
||||
//If we have it previously defined. Don't keep working.
|
||||
return false;
|
||||
}
|
||||
//Creates and entry in the table for this new definition.
|
||||
NameSpaceSymbEntry ne = new NameSpaceSymbEntry(uri, n, false, prefix);
|
||||
needsClone();
|
||||
symb.put(prefix, ne);
|
||||
if (ob != null) {
|
||||
//We have a previous definition store it for the pop.
|
||||
//Check if a previous definition(not the inmidiatly one) has been rendered.
|
||||
ne.lastrendered = ob.lastrendered;
|
||||
if ((ob.lastrendered != null) && (ob.lastrendered.equals(uri))) {
|
||||
//Yes it is. Mark as rendered.
|
||||
ne.rendered = true;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a definition and mark it as render.
|
||||
@ -223,79 +219,91 @@ public class NameSpaceSymbTable {
|
||||
* @param n the attribute that have the definition
|
||||
* @return the attr to render, null if there is no need to render
|
||||
**/
|
||||
public Node addMappingAndRender(String prefix, String uri,Attr n) {
|
||||
public Node addMappingAndRender(String prefix, String uri, Attr n) {
|
||||
NameSpaceSymbEntry ob = symb.get(prefix);
|
||||
|
||||
if ((ob!=null) && uri.equals(ob.uri)) {
|
||||
if ((ob != null) && uri.equals(ob.uri)) {
|
||||
if (!ob.rendered) {
|
||||
ob=(NameSpaceSymbEntry) ob.clone();
|
||||
ob = (NameSpaceSymbEntry) ob.clone();
|
||||
needsClone();
|
||||
symb.put(prefix,ob);
|
||||
ob.lastrendered=uri;
|
||||
ob.rendered=true;
|
||||
symb.put(prefix, ob);
|
||||
ob.lastrendered = uri;
|
||||
ob.rendered = true;
|
||||
return ob.n;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
NameSpaceSymbEntry ne=new NameSpaceSymbEntry(uri,n,true,prefix);
|
||||
ne.lastrendered=uri;
|
||||
NameSpaceSymbEntry ne = new NameSpaceSymbEntry(uri,n,true,prefix);
|
||||
ne.lastrendered = uri;
|
||||
needsClone();
|
||||
symb.put(prefix, ne);
|
||||
if (ob != null) {
|
||||
|
||||
if ((ob.lastrendered!=null)&& (ob.lastrendered.equals(uri))) {
|
||||
ne.rendered=true;
|
||||
return null;
|
||||
}
|
||||
if ((ob != null) && (ob.lastrendered != null) && (ob.lastrendered.equals(uri))) {
|
||||
ne.rendered = true;
|
||||
return null;
|
||||
}
|
||||
return ne.n;
|
||||
}
|
||||
|
||||
public int getLevel() {
|
||||
// TODO Auto-generated method stub
|
||||
return level.size();
|
||||
}
|
||||
public int getLevel() {
|
||||
return level.size();
|
||||
}
|
||||
|
||||
public void removeMapping(String prefix) {
|
||||
NameSpaceSymbEntry ob = symb.get(prefix);
|
||||
public void removeMapping(String prefix) {
|
||||
NameSpaceSymbEntry ob = symb.get(prefix);
|
||||
|
||||
if (ob!=null) {
|
||||
if (ob != null) {
|
||||
needsClone();
|
||||
symb.put(prefix,null);
|
||||
}
|
||||
symb.put(prefix, null);
|
||||
}
|
||||
}
|
||||
|
||||
public void removeMappingIfNotRender(String prefix) {
|
||||
NameSpaceSymbEntry ob = symb.get(prefix);
|
||||
public void removeMappingIfNotRender(String prefix) {
|
||||
NameSpaceSymbEntry ob = symb.get(prefix);
|
||||
|
||||
if (ob!=null && !ob.rendered) {
|
||||
if (ob != null && !ob.rendered) {
|
||||
needsClone();
|
||||
symb.put(prefix,null);
|
||||
}
|
||||
symb.put(prefix, null);
|
||||
}
|
||||
}
|
||||
|
||||
public boolean removeMappingIfRender(String prefix) {
|
||||
NameSpaceSymbEntry ob = symb.get(prefix);
|
||||
public boolean removeMappingIfRender(String prefix) {
|
||||
NameSpaceSymbEntry ob = symb.get(prefix);
|
||||
|
||||
if (ob!=null && ob.rendered) {
|
||||
if (ob != null && ob.rendered) {
|
||||
needsClone();
|
||||
symb.put(prefix,null);
|
||||
symb.put(prefix, null);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* The internal structure of NameSpaceSymbTable.
|
||||
**/
|
||||
class NameSpaceSymbEntry implements Cloneable {
|
||||
NameSpaceSymbEntry(String name,Attr n,boolean rendered,String prefix) {
|
||||
this.uri=name;
|
||||
this.rendered=rendered;
|
||||
this.n=n;
|
||||
this.prefix=prefix;
|
||||
|
||||
String prefix;
|
||||
|
||||
/**The URI that the prefix defines */
|
||||
String uri;
|
||||
|
||||
/**The last output in the URI for this prefix (This for speed reason).*/
|
||||
String lastrendered = null;
|
||||
|
||||
/**This prefix-URI has been already render or not.*/
|
||||
boolean rendered = false;
|
||||
|
||||
/**The attribute to include.*/
|
||||
Attr n;
|
||||
|
||||
NameSpaceSymbEntry(String name, Attr n, boolean rendered, String prefix) {
|
||||
this.uri = name;
|
||||
this.rendered = rendered;
|
||||
this.n = n;
|
||||
this.prefix = prefix;
|
||||
}
|
||||
|
||||
/** @inheritDoc */
|
||||
public Object clone() {
|
||||
try {
|
||||
@ -304,46 +312,35 @@ class NameSpaceSymbEntry implements Cloneable {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
/** The level where the definition was rendered(Only for inclusive) */
|
||||
int level=0;
|
||||
String prefix;
|
||||
/**The URI that the prefix defines */
|
||||
String uri;
|
||||
/**The last output in the URI for this prefix (This for speed reason).*/
|
||||
String lastrendered=null;
|
||||
/**This prefix-URI has been already render or not.*/
|
||||
boolean rendered=false;
|
||||
/**The attribute to include.*/
|
||||
Attr n;
|
||||
};
|
||||
|
||||
class SymbMap implements Cloneable {
|
||||
int free=23;
|
||||
int free = 23;
|
||||
NameSpaceSymbEntry[] entries;
|
||||
String[] keys;
|
||||
SymbMap() {
|
||||
entries=new NameSpaceSymbEntry[free];
|
||||
keys=new String[free];
|
||||
}
|
||||
|
||||
SymbMap() {
|
||||
entries = new NameSpaceSymbEntry[free];
|
||||
keys = new String[free];
|
||||
}
|
||||
|
||||
void put(String key, NameSpaceSymbEntry value) {
|
||||
int index = index(key);
|
||||
Object oldKey = keys[index];
|
||||
keys[index] = key;
|
||||
entries[index] = value;
|
||||
if (oldKey==null || !oldKey.equals(key)) {
|
||||
if (--free == 0) {
|
||||
free=entries.length;
|
||||
int newCapacity = free<<2;
|
||||
rehash(newCapacity);
|
||||
}
|
||||
if ((oldKey == null || !oldKey.equals(key)) && (--free == 0)) {
|
||||
free = entries.length;
|
||||
int newCapacity = free << 2;
|
||||
rehash(newCapacity);
|
||||
}
|
||||
}
|
||||
|
||||
List<NameSpaceSymbEntry> entrySet() {
|
||||
List<NameSpaceSymbEntry> a=new ArrayList<NameSpaceSymbEntry>();
|
||||
for (int i=0;i<entries.length;i++) {
|
||||
if ((entries[i]!=null) && !("".equals(entries[i].uri))) {
|
||||
a.add(entries[i]);
|
||||
List<NameSpaceSymbEntry> a = new ArrayList<NameSpaceSymbEntry>();
|
||||
for (int i = 0;i < entries.length;i++) {
|
||||
if ((entries[i] != null) && !("".equals(entries[i].uri))) {
|
||||
a.add(entries[i]);
|
||||
}
|
||||
}
|
||||
return a;
|
||||
@ -353,16 +350,16 @@ class SymbMap implements Cloneable {
|
||||
Object[] set = keys;
|
||||
int length = set.length;
|
||||
//abs of index
|
||||
int index = (obj.hashCode() & 0x7fffffff) % length;
|
||||
int index = (obj.hashCode() & 0x7fffffff) % length;
|
||||
Object cur = set[index];
|
||||
|
||||
if (cur == null || (cur.equals( obj))) {
|
||||
return index;
|
||||
if (cur == null || (cur.equals(obj))) {
|
||||
return index;
|
||||
}
|
||||
length=length-1;
|
||||
length--;
|
||||
do {
|
||||
index=index==length? 0:++index;
|
||||
cur = set[index];
|
||||
index = index == length ? 0 : ++index;
|
||||
cur = set[index];
|
||||
} while (cur != null && (!cur.equals(obj)));
|
||||
return index;
|
||||
}
|
||||
@ -381,7 +378,7 @@ class SymbMap implements Cloneable {
|
||||
entries = new NameSpaceSymbEntry[newCapacity];
|
||||
|
||||
for (int i = oldCapacity; i-- > 0;) {
|
||||
if(oldKeys[i] != null) {
|
||||
if (oldKeys[i] != null) {
|
||||
String o = oldKeys[i];
|
||||
int index = index(o);
|
||||
keys[index] = o;
|
||||
@ -391,20 +388,19 @@ class SymbMap implements Cloneable {
|
||||
}
|
||||
|
||||
NameSpaceSymbEntry get(String key) {
|
||||
return entries[index(key)];
|
||||
return entries[index(key)];
|
||||
}
|
||||
|
||||
protected Object clone() {
|
||||
try {
|
||||
SymbMap copy=(SymbMap) super.clone();
|
||||
copy.entries=new NameSpaceSymbEntry[entries.length];
|
||||
System.arraycopy(entries,0,copy.entries,0,entries.length);
|
||||
copy.keys=new String[keys.length];
|
||||
System.arraycopy(keys,0,copy.keys,0,keys.length);
|
||||
SymbMap copy = (SymbMap) super.clone();
|
||||
copy.entries = new NameSpaceSymbEntry[entries.length];
|
||||
System.arraycopy(entries, 0, copy.entries, 0, entries.length);
|
||||
copy.keys = new String[keys.length];
|
||||
System.arraycopy(keys, 0, copy.keys, 0, keys.length);
|
||||
|
||||
return copy;
|
||||
return copy;
|
||||
} catch (CloneNotSupportedException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
|
@ -1,3 +1,25 @@
|
||||
/*
|
||||
* reserved comment block
|
||||
* DO NOT REMOVE OR ALTER!
|
||||
*/
|
||||
/**
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package com.sun.org.apache.xml.internal.security.c14n.implementations;
|
||||
|
||||
import java.io.IOException;
|
||||
@ -6,150 +28,153 @@ import java.util.Map;
|
||||
|
||||
public class UtfHelpper {
|
||||
|
||||
final static void writeByte(final String str,final OutputStream out,Map<String,byte[]> cache) throws IOException {
|
||||
byte []result= cache.get(str);
|
||||
if (result==null) {
|
||||
result=getStringInUtf8(str);
|
||||
cache.put(str,result);
|
||||
}
|
||||
static final void writeByte(
|
||||
final String str,
|
||||
final OutputStream out,
|
||||
Map<String, byte[]> cache
|
||||
) throws IOException {
|
||||
byte[] result = cache.get(str);
|
||||
if (result == null) {
|
||||
result = getStringInUtf8(str);
|
||||
cache.put(str, result);
|
||||
}
|
||||
|
||||
out.write(result);
|
||||
out.write(result);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
final static void writeCharToUtf8(final char c,final OutputStream out) throws IOException{
|
||||
if (c < 0x80) {
|
||||
out.write(c);
|
||||
return;
|
||||
static final void writeCharToUtf8(final char c, final OutputStream out) throws IOException {
|
||||
if (c < 0x80) {
|
||||
out.write(c);
|
||||
return;
|
||||
}
|
||||
if ((c >= 0xD800 && c <= 0xDBFF) || (c >= 0xDC00 && c <= 0xDFFF)) {
|
||||
//No Surrogates in sun java
|
||||
out.write(0x3f);
|
||||
return;
|
||||
}
|
||||
int bias;
|
||||
int write;
|
||||
char ch;
|
||||
if (c > 0x07FF) {
|
||||
ch = (char)(c>>>12);
|
||||
write = 0xE0;
|
||||
if (ch > 0) {
|
||||
write |= (ch & 0x0F);
|
||||
}
|
||||
if ((c >= 0xD800 && c <= 0xDBFF) || (c >= 0xDC00 && c <= 0xDFFF) ){
|
||||
out.write(write);
|
||||
write = 0x80;
|
||||
bias = 0x3F;
|
||||
} else {
|
||||
write = 0xC0;
|
||||
bias = 0x1F;
|
||||
}
|
||||
ch = (char)(c>>>6);
|
||||
if (ch > 0) {
|
||||
write |= (ch & bias);
|
||||
}
|
||||
out.write(write);
|
||||
out.write(0x80 | ((c) & 0x3F));
|
||||
|
||||
}
|
||||
|
||||
static final void writeStringToUtf8(
|
||||
final String str,
|
||||
final OutputStream out
|
||||
) throws IOException{
|
||||
final int length = str.length();
|
||||
int i = 0;
|
||||
char c;
|
||||
while (i < length) {
|
||||
c = str.charAt(i++);
|
||||
if (c < 0x80) {
|
||||
out.write(c);
|
||||
continue;
|
||||
}
|
||||
if ((c >= 0xD800 && c <= 0xDBFF) || (c >= 0xDC00 && c <= 0xDFFF)) {
|
||||
//No Surrogates in sun java
|
||||
out.write(0x3f);
|
||||
return;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
char ch;
|
||||
int bias;
|
||||
int write;
|
||||
char ch;
|
||||
if (c > 0x07FF) {
|
||||
ch=(char)(c>>>12);
|
||||
write=0xE0;
|
||||
if (ch>0) {
|
||||
write |= ( ch & 0x0F);
|
||||
ch = (char)(c>>>12);
|
||||
write = 0xE0;
|
||||
if (ch > 0) {
|
||||
write |= (ch & 0x0F);
|
||||
}
|
||||
out.write(write);
|
||||
write=0x80;
|
||||
bias=0x3F;
|
||||
write = 0x80;
|
||||
bias = 0x3F;
|
||||
} else {
|
||||
write=0xC0;
|
||||
bias=0x1F;
|
||||
write = 0xC0;
|
||||
bias = 0x1F;
|
||||
}
|
||||
ch=(char)(c>>>6);
|
||||
if (ch>0) {
|
||||
write|= (ch & bias);
|
||||
ch = (char)(c>>>6);
|
||||
if (ch > 0) {
|
||||
write |= (ch & bias);
|
||||
}
|
||||
out.write(write);
|
||||
out.write(0x80 | ((c) & 0x3F));
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
final static void writeStringToUtf8(final String str,final OutputStream out) throws IOException{
|
||||
final int length=str.length();
|
||||
int i=0;
|
||||
char c;
|
||||
while (i<length) {
|
||||
c=str.charAt(i++);
|
||||
if (c < 0x80) {
|
||||
out.write(c);
|
||||
continue;
|
||||
}
|
||||
|
||||
public static final byte[] getStringInUtf8(final String str) {
|
||||
final int length = str.length();
|
||||
boolean expanded = false;
|
||||
byte[] result = new byte[length];
|
||||
int i = 0;
|
||||
int out = 0;
|
||||
char c;
|
||||
while (i < length) {
|
||||
c = str.charAt(i++);
|
||||
if (c < 0x80) {
|
||||
result[out++] = (byte)c;
|
||||
continue;
|
||||
}
|
||||
if ((c >= 0xD800 && c <= 0xDBFF) || (c >= 0xDC00 && c <= 0xDFFF)) {
|
||||
//No Surrogates in sun java
|
||||
result[out++] = 0x3f;
|
||||
continue;
|
||||
}
|
||||
if (!expanded) {
|
||||
byte newResult[] = new byte[3*length];
|
||||
System.arraycopy(result, 0, newResult, 0, out);
|
||||
result = newResult;
|
||||
expanded = true;
|
||||
}
|
||||
char ch;
|
||||
int bias;
|
||||
byte write;
|
||||
if (c > 0x07FF) {
|
||||
ch = (char)(c>>>12);
|
||||
write = (byte)0xE0;
|
||||
if (ch > 0) {
|
||||
write |= (ch & 0x0F);
|
||||
}
|
||||
if ((c >= 0xD800 && c <= 0xDBFF) || (c >= 0xDC00 && c <= 0xDFFF) ){
|
||||
//No Surrogates in sun java
|
||||
out.write(0x3f);
|
||||
continue;
|
||||
}
|
||||
char ch;
|
||||
int bias;
|
||||
int write;
|
||||
if (c > 0x07FF) {
|
||||
ch=(char)(c>>>12);
|
||||
write=0xE0;
|
||||
if (ch>0) {
|
||||
write |= ( ch & 0x0F);
|
||||
}
|
||||
out.write(write);
|
||||
write=0x80;
|
||||
bias=0x3F;
|
||||
} else {
|
||||
write=0xC0;
|
||||
bias=0x1F;
|
||||
}
|
||||
ch=(char)(c>>>6);
|
||||
if (ch>0) {
|
||||
write|= (ch & bias);
|
||||
}
|
||||
out.write(write);
|
||||
out.write(0x80 | ((c) & 0x3F));
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
public final static byte[] getStringInUtf8(final String str) {
|
||||
final int length=str.length();
|
||||
boolean expanded=false;
|
||||
byte []result=new byte[length];
|
||||
int i=0;
|
||||
int out=0;
|
||||
char c;
|
||||
while (i<length) {
|
||||
c=str.charAt(i++);
|
||||
if ( c < 0x80 ) {
|
||||
result[out++]=(byte)c;
|
||||
continue;
|
||||
}
|
||||
if ((c >= 0xD800 && c <= 0xDBFF) || (c >= 0xDC00 && c <= 0xDFFF) ){
|
||||
//No Surrogates in sun java
|
||||
result[out++]=0x3f;
|
||||
|
||||
continue;
|
||||
}
|
||||
if (!expanded) {
|
||||
byte newResult[]=new byte[3*length];
|
||||
System.arraycopy(result, 0, newResult, 0, out);
|
||||
result=newResult;
|
||||
expanded=true;
|
||||
}
|
||||
char ch;
|
||||
int bias;
|
||||
byte write;
|
||||
if (c > 0x07FF) {
|
||||
ch=(char)(c>>>12);
|
||||
write=(byte)0xE0;
|
||||
if (ch>0) {
|
||||
write |= ( ch & 0x0F);
|
||||
}
|
||||
result[out++]=write;
|
||||
write=(byte)0x80;
|
||||
bias=0x3F;
|
||||
} else {
|
||||
write=(byte)0xC0;
|
||||
bias=0x1F;
|
||||
}
|
||||
ch=(char)(c>>>6);
|
||||
if (ch>0) {
|
||||
write|= (ch & bias);
|
||||
}
|
||||
result[out++]=write;
|
||||
result[out++]=(byte)(0x80 | ((c) & 0x3F));/**/
|
||||
|
||||
}
|
||||
if (expanded) {
|
||||
byte newResult[]=new byte[out];
|
||||
System.arraycopy(result, 0, newResult, 0, out);
|
||||
result=newResult;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
result[out++] = write;
|
||||
write = (byte)0x80;
|
||||
bias = 0x3F;
|
||||
} else {
|
||||
write = (byte)0xC0;
|
||||
bias = 0x1F;
|
||||
}
|
||||
ch = (char)(c>>>6);
|
||||
if (ch > 0) {
|
||||
write |= (ch & bias);
|
||||
}
|
||||
result[out++] = write;
|
||||
result[out++] = (byte)(0x80 | ((c) & 0x3F));
|
||||
}
|
||||
if (expanded) {
|
||||
byte newResult[] = new byte[out];
|
||||
System.arraycopy(result, 0, newResult, 0, out);
|
||||
result = newResult;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -0,0 +1,249 @@
|
||||
/*
|
||||
* reserved comment block
|
||||
* DO NOT REMOVE OR ALTER!
|
||||
*/
|
||||
/**
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package com.sun.org.apache.xml.internal.security.encryption;
|
||||
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStreamWriter;
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import com.sun.org.apache.xml.internal.security.c14n.Canonicalizer;
|
||||
import org.w3c.dom.Element;
|
||||
import org.w3c.dom.NamedNodeMap;
|
||||
import org.w3c.dom.Node;
|
||||
import org.w3c.dom.NodeList;
|
||||
|
||||
/**
|
||||
* Converts <code>String</code>s into <code>Node</code>s and visa versa.
|
||||
*
|
||||
* An abstract class for common Serializer functionality
|
||||
*/
|
||||
public abstract class AbstractSerializer implements Serializer {
|
||||
|
||||
protected Canonicalizer canon;
|
||||
|
||||
public void setCanonicalizer(Canonicalizer canon) {
|
||||
this.canon = canon;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a <code>String</code> representation of the specified
|
||||
* <code>Element</code>.
|
||||
* <p/>
|
||||
* Refer also to comments about setup of format.
|
||||
*
|
||||
* @param element the <code>Element</code> to serialize.
|
||||
* @return the <code>String</code> representation of the serilaized
|
||||
* <code>Element</code>.
|
||||
* @throws Exception
|
||||
*/
|
||||
public String serialize(Element element) throws Exception {
|
||||
return canonSerialize(element);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a <code>byte[]</code> representation of the specified
|
||||
* <code>Element</code>.
|
||||
*
|
||||
* @param element the <code>Element</code> to serialize.
|
||||
* @return the <code>byte[]</code> representation of the serilaized
|
||||
* <code>Element</code>.
|
||||
* @throws Exception
|
||||
*/
|
||||
public byte[] serializeToByteArray(Element element) throws Exception {
|
||||
return canonSerializeToByteArray(element);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a <code>String</code> representation of the specified
|
||||
* <code>NodeList</code>.
|
||||
* <p/>
|
||||
* This is a special case because the NodeList may represent a
|
||||
* <code>DocumentFragment</code>. A document fragment may be a
|
||||
* non-valid XML document (refer to appropriate description of
|
||||
* W3C) because it my start with a non-element node, e.g. a text
|
||||
* node.
|
||||
* <p/>
|
||||
* The methods first converts the node list into a document fragment.
|
||||
* Special care is taken to not destroy the current document, thus
|
||||
* the method clones the nodes (deep cloning) before it appends
|
||||
* them to the document fragment.
|
||||
* <p/>
|
||||
* Refer also to comments about setup of format.
|
||||
*
|
||||
* @param content the <code>NodeList</code> to serialize.
|
||||
* @return the <code>String</code> representation of the serialized
|
||||
* <code>NodeList</code>.
|
||||
* @throws Exception
|
||||
*/
|
||||
public String serialize(NodeList content) throws Exception {
|
||||
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||
canon.setWriter(baos);
|
||||
canon.notReset();
|
||||
for (int i = 0; i < content.getLength(); i++) {
|
||||
canon.canonicalizeSubtree(content.item(i));
|
||||
}
|
||||
String ret = baos.toString("UTF-8");
|
||||
baos.reset();
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a <code>byte[]</code> representation of the specified
|
||||
* <code>NodeList</code>.
|
||||
*
|
||||
* @param content the <code>NodeList</code> to serialize.
|
||||
* @return the <code>byte[]</code> representation of the serialized
|
||||
* <code>NodeList</code>.
|
||||
* @throws Exception
|
||||
*/
|
||||
public byte[] serializeToByteArray(NodeList content) throws Exception {
|
||||
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||
canon.setWriter(baos);
|
||||
canon.notReset();
|
||||
for (int i = 0; i < content.getLength(); i++) {
|
||||
canon.canonicalizeSubtree(content.item(i));
|
||||
}
|
||||
return baos.toByteArray();
|
||||
}
|
||||
|
||||
/**
|
||||
* Use the Canonicalizer to serialize the node
|
||||
* @param node
|
||||
* @return the canonicalization of the node
|
||||
* @throws Exception
|
||||
*/
|
||||
public String canonSerialize(Node node) throws Exception {
|
||||
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||
canon.setWriter(baos);
|
||||
canon.notReset();
|
||||
canon.canonicalizeSubtree(node);
|
||||
String ret = baos.toString("UTF-8");
|
||||
baos.reset();
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* Use the Canonicalizer to serialize the node
|
||||
* @param node
|
||||
* @return the (byte[]) canonicalization of the node
|
||||
* @throws Exception
|
||||
*/
|
||||
public byte[] canonSerializeToByteArray(Node node) throws Exception {
|
||||
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||
canon.setWriter(baos);
|
||||
canon.notReset();
|
||||
canon.canonicalizeSubtree(node);
|
||||
return baos.toByteArray();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param source
|
||||
* @param ctx
|
||||
* @return the Node resulting from the parse of the source
|
||||
* @throws XMLEncryptionException
|
||||
*/
|
||||
public abstract Node deserialize(String source, Node ctx) throws XMLEncryptionException;
|
||||
|
||||
/**
|
||||
* @param source
|
||||
* @param ctx
|
||||
* @return the Node resulting from the parse of the source
|
||||
* @throws XMLEncryptionException
|
||||
*/
|
||||
public abstract Node deserialize(byte[] source, Node ctx) throws XMLEncryptionException;
|
||||
|
||||
protected static byte[] createContext(byte[] source, Node ctx) throws XMLEncryptionException {
|
||||
// Create the context to parse the document against
|
||||
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
|
||||
try {
|
||||
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(byteArrayOutputStream, "UTF-8");
|
||||
outputStreamWriter.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?><dummy");
|
||||
|
||||
// Run through each node up to the document node and find any xmlns: nodes
|
||||
Map<String, String> storedNamespaces = new HashMap<String, String>();
|
||||
Node wk = ctx;
|
||||
while (wk != null) {
|
||||
NamedNodeMap atts = wk.getAttributes();
|
||||
if (atts != null) {
|
||||
for (int i = 0; i < atts.getLength(); ++i) {
|
||||
Node att = atts.item(i);
|
||||
String nodeName = att.getNodeName();
|
||||
if ((nodeName.equals("xmlns") || nodeName.startsWith("xmlns:"))
|
||||
&& !storedNamespaces.containsKey(att.getNodeName())) {
|
||||
outputStreamWriter.write(" ");
|
||||
outputStreamWriter.write(nodeName);
|
||||
outputStreamWriter.write("=\"");
|
||||
outputStreamWriter.write(att.getNodeValue());
|
||||
outputStreamWriter.write("\"");
|
||||
storedNamespaces.put(nodeName, att.getNodeValue());
|
||||
}
|
||||
}
|
||||
}
|
||||
wk = wk.getParentNode();
|
||||
}
|
||||
outputStreamWriter.write(">");
|
||||
outputStreamWriter.flush();
|
||||
byteArrayOutputStream.write(source);
|
||||
|
||||
outputStreamWriter.write("</dummy>");
|
||||
outputStreamWriter.close();
|
||||
|
||||
return byteArrayOutputStream.toByteArray();
|
||||
} catch (UnsupportedEncodingException e) {
|
||||
throw new XMLEncryptionException("empty", e);
|
||||
} catch (IOException e) {
|
||||
throw new XMLEncryptionException("empty", e);
|
||||
}
|
||||
}
|
||||
|
||||
protected static String createContext(String source, Node ctx) {
|
||||
// Create the context to parse the document against
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?><dummy");
|
||||
|
||||
// Run through each node up to the document node and find any xmlns: nodes
|
||||
Map<String, String> storedNamespaces = new HashMap<String, String>();
|
||||
Node wk = ctx;
|
||||
while (wk != null) {
|
||||
NamedNodeMap atts = wk.getAttributes();
|
||||
if (atts != null) {
|
||||
for (int i = 0; i < atts.getLength(); ++i) {
|
||||
Node att = atts.item(i);
|
||||
String nodeName = att.getNodeName();
|
||||
if ((nodeName.equals("xmlns") || nodeName.startsWith("xmlns:"))
|
||||
&& !storedNamespaces.containsKey(att.getNodeName())) {
|
||||
sb.append(" " + nodeName + "=\"" + att.getNodeValue() + "\"");
|
||||
storedNamespaces.put(nodeName, att.getNodeValue());
|
||||
}
|
||||
}
|
||||
}
|
||||
wk = wk.getParentNode();
|
||||
}
|
||||
sb.append(">" + source + "</dummy>");
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
}
|
@ -2,30 +2,30 @@
|
||||
* reserved comment block
|
||||
* DO NOT REMOVE OR ALTER!
|
||||
*/
|
||||
/*
|
||||
* Copyright 2003-2004 The Apache Software Foundation.
|
||||
/**
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package com.sun.org.apache.xml.internal.security.encryption;
|
||||
|
||||
|
||||
import java.util.Iterator;
|
||||
import com.sun.org.apache.xml.internal.security.keys.KeyInfo;
|
||||
import org.w3c.dom.Element;
|
||||
|
||||
|
||||
/**
|
||||
* A Key Agreement algorithm provides for the derivation of a shared secret key
|
||||
* based on a shared secret computed from certain types of compatible public
|
||||
@ -79,9 +79,10 @@ import org.w3c.dom.Element;
|
||||
* @author Axl Mattheus
|
||||
*/
|
||||
public interface AgreementMethod {
|
||||
|
||||
/**
|
||||
* Returns an <code>byte</code> array.
|
||||
* @return
|
||||
* Returns a <code>byte</code> array.
|
||||
* @return a <code>byte</code> array.
|
||||
*/
|
||||
byte[] getKANonce();
|
||||
|
||||
@ -92,8 +93,8 @@ public interface AgreementMethod {
|
||||
void setKANonce(byte[] kanonce);
|
||||
|
||||
/**
|
||||
* Returns aditional information regarding the <code>AgreementMethod</code>.
|
||||
* @return
|
||||
* Returns additional information regarding the <code>AgreementMethod</code>.
|
||||
* @return additional information regarding the <code>AgreementMethod</code>.
|
||||
*/
|
||||
Iterator<Element> getAgreementMethodInformation();
|
||||
|
||||
@ -134,7 +135,7 @@ public interface AgreementMethod {
|
||||
void setOriginatorKeyInfo(KeyInfo keyInfo);
|
||||
|
||||
/**
|
||||
* Retruns information relating to the recipient's shared secret.
|
||||
* Returns information relating to the recipient's shared secret.
|
||||
*
|
||||
* @return information relating to the recipient's shared secret.
|
||||
*/
|
||||
|
@ -2,25 +2,26 @@
|
||||
* reserved comment block
|
||||
* DO NOT REMOVE OR ALTER!
|
||||
*/
|
||||
/*
|
||||
* Copyright 2003-2004 The Apache Software Foundation.
|
||||
/**
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package com.sun.org.apache.xml.internal.security.encryption;
|
||||
|
||||
|
||||
/**
|
||||
* <code>CipherData</code> provides encrypted data. It must either contain the
|
||||
* encrypted octet sequence as base64 encoded text of the
|
||||
@ -42,10 +43,12 @@ package com.sun.org.apache.xml.internal.security.encryption;
|
||||
* @author Axl Mattheus
|
||||
*/
|
||||
public interface CipherData {
|
||||
|
||||
/** VALUE_TYPE ASN */
|
||||
public static final int VALUE_TYPE = 0x00000001;
|
||||
int VALUE_TYPE = 0x00000001;
|
||||
|
||||
/** REFERENCE_TYPE ASN */
|
||||
public static final int REFERENCE_TYPE = 0x00000002;
|
||||
int REFERENCE_TYPE = 0x00000002;
|
||||
|
||||
/**
|
||||
* Returns the type of encrypted data contained in the
|
||||
@ -76,18 +79,17 @@ public interface CipherData {
|
||||
* Returns a reference to an external location containing the encrypted
|
||||
* octet sequence (<code>byte</code> array).
|
||||
*
|
||||
* @return the reference to an external location containing the enctrypted
|
||||
* octet sequence.
|
||||
* @return the reference to an external location containing the encrypted
|
||||
* octet sequence.
|
||||
*/
|
||||
CipherReference getCipherReference();
|
||||
|
||||
/**
|
||||
* Sets the <code>CipherData</code>'s reference.
|
||||
*
|
||||
* @param reference an external location containing the enctrypted octet
|
||||
* sequence.
|
||||
* @param reference an external location containing the encrypted octet sequence.
|
||||
* @throws XMLEncryptionException
|
||||
*/
|
||||
void setCipherReference(CipherReference reference) throws
|
||||
XMLEncryptionException;
|
||||
void setCipherReference(CipherReference reference) throws XMLEncryptionException;
|
||||
}
|
||||
|
||||
|
@ -2,34 +2,34 @@
|
||||
* reserved comment block
|
||||
* DO NOT REMOVE OR ALTER!
|
||||
*/
|
||||
/*
|
||||
* Copyright 2003-2004 The Apache Software Foundation.
|
||||
/**
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package com.sun.org.apache.xml.internal.security.encryption;
|
||||
|
||||
import org.w3c.dom.Attr;
|
||||
|
||||
|
||||
/**
|
||||
* <code>CipherReference</code> identifies a source which, when processed,
|
||||
* yields the encrypted octet sequence.
|
||||
* <p>
|
||||
* The actual value is obtained as follows. The <code>CipherReference URI</code>
|
||||
* contains an identifier that is dereferenced. Should the
|
||||
* <code>CipherReference</code> element contain an OPTIONAL sequence of
|
||||
* Transforms, the data resulting from dereferencing the <code>URI</code> is
|
||||
* transformed as specified so as to yield the intended cipher value. For
|
||||
* example, if the value is base64 encoded within an XML document; the
|
||||
@ -62,20 +62,21 @@ public interface CipherReference {
|
||||
/**
|
||||
* Returns an <code>URI</code> that contains an identifier that should be
|
||||
* dereferenced.
|
||||
* @return
|
||||
* @return an <code>URI</code> that contains an identifier that should be
|
||||
* dereferenced.
|
||||
*/
|
||||
String getURI();
|
||||
|
||||
/**
|
||||
* Gets the URI as an Attribute node. Used to meld the CipherREference
|
||||
* with the XMLSignature ResourceResolvers
|
||||
* @return
|
||||
*/
|
||||
public Attr getURIAsAttr();
|
||||
/**
|
||||
* Gets the URI as an Attribute node. Used to meld the CipherReference
|
||||
* with the XMLSignature ResourceResolvers
|
||||
* @return the URI as an Attribute node
|
||||
*/
|
||||
Attr getURIAsAttr();
|
||||
|
||||
/**
|
||||
* Returns the <code>Transforms</code> that specifies how to transform the
|
||||
* <code>URI</code> to yield the appropiate cipher value.
|
||||
* <code>URI</code> to yield the appropriate cipher value.
|
||||
*
|
||||
* @return the transform that specifies how to transform the reference to
|
||||
* yield the intended cipher value.
|
||||
@ -84,10 +85,11 @@ public interface CipherReference {
|
||||
|
||||
/**
|
||||
* Sets the <code>Transforms</code> that specifies how to transform the
|
||||
* <code>URI</code> to yield the appropiate cipher value.
|
||||
* <code>URI</code> to yield the appropriate cipher value.
|
||||
*
|
||||
* @param transforms the set of <code>Transforms</code> that specifies how
|
||||
* to transform the reference to yield the intended cipher value.
|
||||
*/
|
||||
void setTransforms(Transforms transforms);
|
||||
}
|
||||
|
||||
|
@ -2,25 +2,26 @@
|
||||
* reserved comment block
|
||||
* DO NOT REMOVE OR ALTER!
|
||||
*/
|
||||
/*
|
||||
* Copyright 2003-2004 The Apache Software Foundation.
|
||||
/**
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package com.sun.org.apache.xml.internal.security.encryption;
|
||||
|
||||
|
||||
/**
|
||||
* <code>CipherValue</code> is the wrapper for cipher text.
|
||||
*
|
||||
@ -28,20 +29,18 @@ package com.sun.org.apache.xml.internal.security.encryption;
|
||||
*/
|
||||
public interface CipherValue {
|
||||
/**
|
||||
* Resturns the Base 64 encoded, encrypted octets that is the
|
||||
* <code>CihperValue</code>.
|
||||
* Returns the Base 64 encoded, encrypted octets that is the
|
||||
* <code>CipherValue</code>.
|
||||
*
|
||||
* @return cipher value.
|
||||
*/
|
||||
String getValue();
|
||||
// byte[] getValue();
|
||||
String getValue();
|
||||
|
||||
/**
|
||||
* Sets the Base 64 encoded, encrypted octets that is the
|
||||
* <code>CihperValue</code>.
|
||||
* <code>CipherValue</code>.
|
||||
*
|
||||
* @param value the cipher value.
|
||||
*/
|
||||
void setValue(String value);
|
||||
// void setValue(byte[] value);
|
||||
void setValue(String value);
|
||||
}
|
||||
|
@ -0,0 +1,114 @@
|
||||
/*
|
||||
* reserved comment block
|
||||
* DO NOT REMOVE OR ALTER!
|
||||
*/
|
||||
/**
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package com.sun.org.apache.xml.internal.security.encryption;
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.StringReader;
|
||||
|
||||
import javax.xml.XMLConstants;
|
||||
import javax.xml.parsers.DocumentBuilder;
|
||||
import javax.xml.parsers.DocumentBuilderFactory;
|
||||
import javax.xml.parsers.ParserConfigurationException;
|
||||
|
||||
import org.w3c.dom.Document;
|
||||
import org.w3c.dom.DocumentFragment;
|
||||
import org.w3c.dom.Element;
|
||||
import org.w3c.dom.Node;
|
||||
import org.xml.sax.InputSource;
|
||||
import org.xml.sax.SAXException;
|
||||
|
||||
/**
|
||||
* Converts <code>String</code>s into <code>Node</code>s and visa versa.
|
||||
*/
|
||||
public class DocumentSerializer extends AbstractSerializer {
|
||||
|
||||
protected DocumentBuilderFactory dbf;
|
||||
|
||||
/**
|
||||
* @param source
|
||||
* @param ctx
|
||||
* @return the Node resulting from the parse of the source
|
||||
* @throws XMLEncryptionException
|
||||
*/
|
||||
public Node deserialize(byte[] source, Node ctx) throws XMLEncryptionException {
|
||||
byte[] fragment = createContext(source, ctx);
|
||||
return deserialize(ctx, new InputSource(new ByteArrayInputStream(fragment)));
|
||||
}
|
||||
|
||||
/**
|
||||
* @param source
|
||||
* @param ctx
|
||||
* @return the Node resulting from the parse of the source
|
||||
* @throws XMLEncryptionException
|
||||
*/
|
||||
public Node deserialize(String source, Node ctx) throws XMLEncryptionException {
|
||||
String fragment = createContext(source, ctx);
|
||||
return deserialize(ctx, new InputSource(new StringReader(fragment)));
|
||||
}
|
||||
|
||||
/**
|
||||
* @param ctx
|
||||
* @param inputSource
|
||||
* @return the Node resulting from the parse of the source
|
||||
* @throws XMLEncryptionException
|
||||
*/
|
||||
private Node deserialize(Node ctx, InputSource inputSource) throws XMLEncryptionException {
|
||||
try {
|
||||
if (dbf == null) {
|
||||
dbf = DocumentBuilderFactory.newInstance();
|
||||
dbf.setNamespaceAware(true);
|
||||
dbf.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, Boolean.TRUE);
|
||||
dbf.setAttribute("http://xml.org/sax/features/namespaces", Boolean.TRUE);
|
||||
dbf.setValidating(false);
|
||||
}
|
||||
DocumentBuilder db = dbf.newDocumentBuilder();
|
||||
Document d = db.parse(inputSource);
|
||||
|
||||
Document contextDocument = null;
|
||||
if (Node.DOCUMENT_NODE == ctx.getNodeType()) {
|
||||
contextDocument = (Document)ctx;
|
||||
} else {
|
||||
contextDocument = ctx.getOwnerDocument();
|
||||
}
|
||||
|
||||
Element fragElt =
|
||||
(Element) contextDocument.importNode(d.getDocumentElement(), true);
|
||||
DocumentFragment result = contextDocument.createDocumentFragment();
|
||||
Node child = fragElt.getFirstChild();
|
||||
while (child != null) {
|
||||
fragElt.removeChild(child);
|
||||
result.appendChild(child);
|
||||
child = fragElt.getFirstChild();
|
||||
}
|
||||
return result;
|
||||
} catch (SAXException se) {
|
||||
throw new XMLEncryptionException("empty", se);
|
||||
} catch (ParserConfigurationException pce) {
|
||||
throw new XMLEncryptionException("empty", pce);
|
||||
} catch (IOException ioe) {
|
||||
throw new XMLEncryptionException("empty", ioe);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -2,25 +2,26 @@
|
||||
* reserved comment block
|
||||
* DO NOT REMOVE OR ALTER!
|
||||
*/
|
||||
/*
|
||||
* Copyright 2003-2004 The Apache Software Foundation.
|
||||
/**
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package com.sun.org.apache.xml.internal.security.encryption;
|
||||
|
||||
|
||||
/**
|
||||
* The <code>EncryptedData</code> element is the core element in the syntax. Not
|
||||
* only does its <code>CipherData</code> child contain the encrypted data, but
|
||||
@ -42,3 +43,4 @@ package com.sun.org.apache.xml.internal.security.encryption;
|
||||
*/
|
||||
public interface EncryptedData extends EncryptedType {
|
||||
}
|
||||
|
||||
|
@ -2,26 +2,26 @@
|
||||
* reserved comment block
|
||||
* DO NOT REMOVE OR ALTER!
|
||||
*/
|
||||
/*
|
||||
* Copyright 2003-2004 The Apache Software Foundation.
|
||||
/**
|
||||
* Licensed to the Apache Software Foundation (ASF) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. The ASF licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package com.sun.org.apache.xml.internal.security.encryption;
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* The <code>EncryptedKey</code> element is used to transport encryption keys
|
||||
* from the originator to a known recipient(s). It may be used as a stand-alone
|
||||
@ -51,9 +51,9 @@ package com.sun.org.apache.xml.internal.security.encryption;
|
||||
* @author Axl Mattheus
|
||||
*/
|
||||
public interface EncryptedKey extends EncryptedType {
|
||||
|
||||
/**
|
||||
* Returns a hint as to which recipient this encrypted key value is intended
|
||||
* for.
|
||||
* Returns a hint as to which recipient this encrypted key value is intended for.
|
||||
*
|
||||
* @return the recipient of the <code>EncryptedKey</code>.
|
||||
*/
|
||||
@ -110,3 +110,4 @@ public interface EncryptedKey extends EncryptedType {
|
||||
*/
|
||||
void setCarriedName(String name);
|
||||
}
|
||||
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user