1 /*
   2  * Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 
  26 package javax.crypto.spec;
  27 
  28 /**
  29  * This class specifies the source for encoding input P in OAEP Padding,
  30  * as defined in the
  31  * <a href="https://tools.ietf.org/rfc/rfc8017.txt">PKCS#1 v2.2</a> standard.
  32  * <pre>
  33  * PSourceAlgorithm ::= AlgorithmIdentifier {
  34  *   {PKCS1PSourceAlgorithms}
  35  * }
  36  * </pre>
  37  * where
  38  * <pre>
  39  * PKCS1PSourceAlgorithms    ALGORITHM-IDENTIFIER ::= {
  40  *   { OID id-pSpecified PARAMETERS EncodingParameters },
  41  *   ...  -- Allows for future expansion --
  42  * }
  43  * EncodingParameters ::= OCTET STRING(SIZE(0..MAX))
  44  * </pre>
  45  * @author Valerie Peng
  46  *
  47  * @since 1.5
  48  */
  49 public class PSource {
  50 
  51     private String pSrcName;
  52 
  53     /**
  54      * Constructs a source of the encoding input P for OAEP
  55      * padding as defined in the PKCS #1 standard using the
  56      * specified PSource algorithm.
  57      * @param pSrcName the algorithm for the source of the
  58      * encoding input P.
  59      * @exception NullPointerException if <code>pSrcName</code>
  60      * is null.
  61      */
  62     protected PSource(String pSrcName) {
  63         if (pSrcName == null) {
  64             throw new NullPointerException("pSource algorithm is null");
  65         }
  66         this.pSrcName = pSrcName;
  67     }
  68     /**
  69      * Returns the PSource algorithm name.
  70      *
  71      * @return the PSource algorithm name.
  72      */
  73     public String getAlgorithm() {
  74         return pSrcName;
  75     }
  76 
  77     /**
  78      * This class is used to explicitly specify the value for
  79      * encoding input P in OAEP Padding.
  80      *
  81      * @since 1.5
  82      */
  83     public static final class PSpecified extends PSource {
  84 
  85         private byte[] p = new byte[0];
  86 
  87         /**
  88          * The encoding input P whose value equals byte[0].
  89          */
  90         public static final PSpecified DEFAULT = new PSpecified(new byte[0]);
  91 
  92         /**
  93          * Constructs the source explicitly with the specified
  94          * value <code>p</code> as the encoding input P.
  95          * Note:
  96          * @param p the value of the encoding input. The contents
  97          * of the array are copied to protect against subsequent
  98          * modification.
  99          * @exception NullPointerException if <code>p</code> is null.
 100          */
 101         public PSpecified(byte[] p) {
 102             super("PSpecified");
 103             this.p = p.clone();
 104         }
 105         /**
 106          * Returns the value of encoding input P.
 107          * @return the value of encoding input P. A new array is
 108          * returned each time this method is called.
 109          */
 110         public byte[] getValue() {
 111             return (p.length==0? p: p.clone());
 112         }
 113     }
 114 }