3636import java .security .interfaces .DSAKey ;
3737import java .security .interfaces .ECPrivateKey ;
3838import java .security .spec .AlgorithmParameterSpec ;
39+ import java .security .spec .MGF1ParameterSpec ;
40+ import java .security .spec .PSSParameterSpec ;
3941
4042import javax .xml .crypto .MarshalException ;
4143import javax .xml .crypto .dsig .SignatureMethod ;
@@ -108,6 +110,14 @@ public abstract class DOMSignatureMethod extends AbstractDOMSignatureMethod {
108110 "http://www.w3.org/2007/05/xmldsig-more#sha512-rsa-MGF1" ;
109111 static final String RSA_RIPEMD160_MGF1 =
110112 "http://www.w3.org/2007/05/xmldsig-more#ripemd160-rsa-MGF1" ;
113+ static final String RSA_SHA3_224_MGF1 =
114+ "http://www.w3.org/2007/05/xmldsig-more#sha3-224-rsa-MGF1" ;
115+ static final String RSA_SHA3_256_MGF1 =
116+ "http://www.w3.org/2007/05/xmldsig-more#sha3-256-rsa-MGF1" ;
117+ static final String RSA_SHA3_384_MGF1 =
118+ "http://www.w3.org/2007/05/xmldsig-more#sha3-384-rsa-MGF1" ;
119+ static final String RSA_SHA3_512_MGF1 =
120+ "http://www.w3.org/2007/05/xmldsig-more#sha3-512-rsa-MGF1" ;
111121
112122 /**
113123 * Creates a <code>DOMSignatureMethod</code>.
@@ -199,6 +209,14 @@ static SignatureMethod unmarshal(Element smElem) throws MarshalException {
199209 return new SHA384withRSAandMGF1 (smElem );
200210 } else if (alg .equals (RSA_SHA512_MGF1 )) {
201211 return new SHA512withRSAandMGF1 (smElem );
212+ } else if (alg .equals (RSA_SHA3_224_MGF1 )) {
213+ return new SHA3_224withRSAandMGF1 (smElem );
214+ } else if (alg .equals (RSA_SHA3_256_MGF1 )) {
215+ return new SHA3_256withRSAandMGF1 (smElem );
216+ } else if (alg .equals (RSA_SHA3_384_MGF1 )) {
217+ return new SHA3_384withRSAandMGF1 (smElem );
218+ } else if (alg .equals (RSA_SHA3_512_MGF1 )) {
219+ return new SHA3_512withRSAandMGF1 (smElem );
202220 } else if (alg .equals (DOMRSAPSSSignatureMethod .RSA_PSS )) {
203221 return new DOMRSAPSSSignatureMethod .RSAPSS (smElem );
204222 } else if (alg .equals (RSA_RIPEMD160_MGF1 )) {
@@ -362,6 +380,40 @@ byte[] preVerifyFormat(Key key, byte[] sig) {
362380 }
363381 }
364382
383+ abstract static class AbstractRSAPSSSignatureMethod
384+ extends AbstractRSASignatureMethod {
385+
386+ AbstractRSAPSSSignatureMethod (AlgorithmParameterSpec params )
387+ throws InvalidAlgorithmParameterException {
388+ super (params );
389+ }
390+
391+ AbstractRSAPSSSignatureMethod (Element dmElem ) throws MarshalException {
392+ super (dmElem );
393+ }
394+
395+ public abstract PSSParameterSpec getPSSParameterSpec ();
396+
397+ @ Override
398+ Signature getSignature (Provider p )
399+ throws NoSuchAlgorithmException {
400+ try {
401+ Signature s = (p == null )
402+ ? Signature .getInstance ("RSASSA-PSS" )
403+ : Signature .getInstance ("RSASSA-PSS" , p );
404+ try {
405+ s .setParameter (getPSSParameterSpec ());
406+ } catch (InvalidAlgorithmParameterException e ) {
407+ throw new NoSuchAlgorithmException ("Should not happen" , e );
408+ }
409+ return s ;
410+ } catch (NoSuchAlgorithmException nsae ) {
411+ return (p == null )
412+ ? Signature .getInstance (getJCAAlgorithm ())
413+ : Signature .getInstance (getJCAAlgorithm (), p );
414+ }
415+ }
416+ }
365417 /**
366418 * Abstract class to support signature algorithms that sign and verify
367419 * signatures in the IEEE P1363 format. The P1363 format is the
@@ -660,7 +712,12 @@ Type getAlgorithmType() {
660712 }
661713 }
662714
663- static final class SHA1withRSAandMGF1 extends AbstractRSASignatureMethod {
715+ static final class SHA1withRSAandMGF1 extends AbstractRSAPSSSignatureMethod {
716+
717+ private static PSSParameterSpec spec
718+ = new PSSParameterSpec ("SHA-1" , "MGF1" , MGF1ParameterSpec .SHA1 ,
719+ 20 , PSSParameterSpec .TRAILER_FIELD_BC );
720+
664721 SHA1withRSAandMGF1 (AlgorithmParameterSpec params )
665722 throws InvalidAlgorithmParameterException {
666723 super (params );
@@ -673,6 +730,10 @@ public String getAlgorithm() {
673730 return RSA_SHA1_MGF1 ;
674731 }
675732 @ Override
733+ public PSSParameterSpec getPSSParameterSpec () {
734+ return spec ;
735+ }
736+ @ Override
676737 String getJCAAlgorithm () {
677738 return "SHA1withRSAandMGF1" ;
678739 }
@@ -682,7 +743,12 @@ Type getAlgorithmType() {
682743 }
683744 }
684745
685- static final class SHA224withRSAandMGF1 extends AbstractRSASignatureMethod {
746+ static final class SHA224withRSAandMGF1 extends AbstractRSAPSSSignatureMethod {
747+
748+ private static PSSParameterSpec spec
749+ = new PSSParameterSpec ("SHA-224" , "MGF1" , MGF1ParameterSpec .SHA224 ,
750+ 28 , PSSParameterSpec .TRAILER_FIELD_BC );
751+
686752 SHA224withRSAandMGF1 (AlgorithmParameterSpec params )
687753 throws InvalidAlgorithmParameterException {
688754 super (params );
@@ -695,6 +761,10 @@ public String getAlgorithm() {
695761 return RSA_SHA224_MGF1 ;
696762 }
697763 @ Override
764+ public PSSParameterSpec getPSSParameterSpec () {
765+ return spec ;
766+ }
767+ @ Override
698768 String getJCAAlgorithm () {
699769 return "SHA224withRSAandMGF1" ;
700770 }
@@ -704,7 +774,12 @@ Type getAlgorithmType() {
704774 }
705775 }
706776
707- static final class SHA256withRSAandMGF1 extends AbstractRSASignatureMethod {
777+ static final class SHA256withRSAandMGF1 extends AbstractRSAPSSSignatureMethod {
778+
779+ private static PSSParameterSpec spec
780+ = new PSSParameterSpec ("SHA-256" , "MGF1" , MGF1ParameterSpec .SHA256 ,
781+ 32 , PSSParameterSpec .TRAILER_FIELD_BC );
782+
708783 SHA256withRSAandMGF1 (AlgorithmParameterSpec params )
709784 throws InvalidAlgorithmParameterException {
710785 super (params );
@@ -717,6 +792,10 @@ public String getAlgorithm() {
717792 return RSA_SHA256_MGF1 ;
718793 }
719794 @ Override
795+ public PSSParameterSpec getPSSParameterSpec () {
796+ return spec ;
797+ }
798+ @ Override
720799 String getJCAAlgorithm () {
721800 return "SHA256withRSAandMGF1" ;
722801 }
@@ -726,7 +805,12 @@ Type getAlgorithmType() {
726805 }
727806 }
728807
729- static final class SHA384withRSAandMGF1 extends AbstractRSASignatureMethod {
808+ static final class SHA384withRSAandMGF1 extends AbstractRSAPSSSignatureMethod {
809+
810+ private static PSSParameterSpec spec
811+ = new PSSParameterSpec ("SHA-384" , "MGF1" , MGF1ParameterSpec .SHA384 ,
812+ 48 , PSSParameterSpec .TRAILER_FIELD_BC );
813+
730814 SHA384withRSAandMGF1 (AlgorithmParameterSpec params )
731815 throws InvalidAlgorithmParameterException {
732816 super (params );
@@ -739,6 +823,10 @@ public String getAlgorithm() {
739823 return RSA_SHA384_MGF1 ;
740824 }
741825 @ Override
826+ public PSSParameterSpec getPSSParameterSpec () {
827+ return spec ;
828+ }
829+ @ Override
742830 String getJCAAlgorithm () {
743831 return "SHA384withRSAandMGF1" ;
744832 }
@@ -748,7 +836,12 @@ Type getAlgorithmType() {
748836 }
749837 }
750838
751- static final class SHA512withRSAandMGF1 extends AbstractRSASignatureMethod {
839+ static final class SHA512withRSAandMGF1 extends AbstractRSAPSSSignatureMethod {
840+
841+ private static PSSParameterSpec spec
842+ = new PSSParameterSpec ("SHA-512" , "MGF1" , MGF1ParameterSpec .SHA512 ,
843+ 64 , PSSParameterSpec .TRAILER_FIELD_BC );
844+
752845 SHA512withRSAandMGF1 (AlgorithmParameterSpec params )
753846 throws InvalidAlgorithmParameterException {
754847 super (params );
@@ -761,6 +854,10 @@ public String getAlgorithm() {
761854 return RSA_SHA512_MGF1 ;
762855 }
763856 @ Override
857+ public PSSParameterSpec getPSSParameterSpec () {
858+ return spec ;
859+ }
860+ @ Override
764861 String getJCAAlgorithm () {
765862 return "SHA512withRSAandMGF1" ;
766863 }
@@ -770,6 +867,134 @@ Type getAlgorithmType() {
770867 }
771868 }
772869
870+ static final class SHA3_224withRSAandMGF1 extends AbstractRSAPSSSignatureMethod {
871+
872+ private static PSSParameterSpec spec
873+ = new PSSParameterSpec ("SHA3-224" , "MGF1" ,
874+ new MGF1ParameterSpec ("SHA3-224" ), 28 ,
875+ PSSParameterSpec .TRAILER_FIELD_BC );
876+
877+ SHA3_224withRSAandMGF1 (AlgorithmParameterSpec params )
878+ throws InvalidAlgorithmParameterException {
879+ super (params );
880+ }
881+ SHA3_224withRSAandMGF1 (Element dmElem ) throws MarshalException {
882+ super (dmElem );
883+ }
884+ @ Override
885+ public String getAlgorithm () {
886+ return RSA_SHA3_224_MGF1 ;
887+ }
888+ @ Override
889+ public PSSParameterSpec getPSSParameterSpec () {
890+ return spec ;
891+ }
892+ @ Override
893+ String getJCAAlgorithm () {
894+ return "SHA3-224withRSAandMGF1" ;
895+ }
896+ @ Override
897+ Type getAlgorithmType () {
898+ return Type .RSA ;
899+ }
900+ }
901+
902+ static final class SHA3_256withRSAandMGF1 extends AbstractRSAPSSSignatureMethod {
903+
904+ private static PSSParameterSpec spec
905+ = new PSSParameterSpec ("SHA3-256" , "MGF1" ,
906+ new MGF1ParameterSpec ("SHA3-256" ), 32 ,
907+ PSSParameterSpec .TRAILER_FIELD_BC );
908+
909+ SHA3_256withRSAandMGF1 (AlgorithmParameterSpec params )
910+ throws InvalidAlgorithmParameterException {
911+ super (params );
912+ }
913+ SHA3_256withRSAandMGF1 (Element dmElem ) throws MarshalException {
914+ super (dmElem );
915+ }
916+ @ Override
917+ public String getAlgorithm () {
918+ return RSA_SHA3_256_MGF1 ;
919+ }
920+ @ Override
921+ public PSSParameterSpec getPSSParameterSpec () {
922+ return spec ;
923+ }
924+ @ Override
925+ String getJCAAlgorithm () {
926+ return "SHA3-256withRSAandMGF1" ;
927+ }
928+ @ Override
929+ Type getAlgorithmType () {
930+ return Type .RSA ;
931+ }
932+ }
933+
934+ static final class SHA3_384withRSAandMGF1 extends AbstractRSAPSSSignatureMethod {
935+
936+ private static PSSParameterSpec spec
937+ = new PSSParameterSpec ("SHA3-384" , "MGF1" ,
938+ new MGF1ParameterSpec ("SHA3-384" ), 48 ,
939+ PSSParameterSpec .TRAILER_FIELD_BC );
940+
941+ SHA3_384withRSAandMGF1 (AlgorithmParameterSpec params )
942+ throws InvalidAlgorithmParameterException {
943+ super (params );
944+ }
945+ SHA3_384withRSAandMGF1 (Element dmElem ) throws MarshalException {
946+ super (dmElem );
947+ }
948+ @ Override
949+ public String getAlgorithm () {
950+ return RSA_SHA3_384_MGF1 ;
951+ }
952+ @ Override
953+ public PSSParameterSpec getPSSParameterSpec () {
954+ return spec ;
955+ }
956+ @ Override
957+ String getJCAAlgorithm () {
958+ return "SHA3-384withRSAandMGF1" ;
959+ }
960+ @ Override
961+ Type getAlgorithmType () {
962+ return Type .RSA ;
963+ }
964+ }
965+
966+ static final class SHA3_512withRSAandMGF1 extends AbstractRSAPSSSignatureMethod {
967+
968+ private static PSSParameterSpec spec
969+ = new PSSParameterSpec ("SHA3-512" , "MGF1" ,
970+ new MGF1ParameterSpec ("SHA3-512" ), 64 ,
971+ PSSParameterSpec .TRAILER_FIELD_BC );
972+
973+ SHA3_512withRSAandMGF1 (AlgorithmParameterSpec params )
974+ throws InvalidAlgorithmParameterException {
975+ super (params );
976+ }
977+ SHA3_512withRSAandMGF1 (Element dmElem ) throws MarshalException {
978+ super (dmElem );
979+ }
980+ @ Override
981+ public String getAlgorithm () {
982+ return RSA_SHA3_512_MGF1 ;
983+ }
984+ @ Override
985+ public PSSParameterSpec getPSSParameterSpec () {
986+ return spec ;
987+ }
988+ @ Override
989+ String getJCAAlgorithm () {
990+ return "SHA3-512withRSAandMGF1" ;
991+ }
992+ @ Override
993+ Type getAlgorithmType () {
994+ return Type .RSA ;
995+ }
996+ }
997+
773998 static final class RIPEMD160withRSAandMGF1 extends AbstractRSASignatureMethod {
774999 RIPEMD160withRSAandMGF1 (AlgorithmParameterSpec params )
7751000 throws InvalidAlgorithmParameterException {
0 commit comments