src/java.base/share/classes/sun/security/ssl/CipherBox.java
changeset 50768 68fa3d4026ea
parent 50767 356eaea05bf0
child 50769 1bf8f9840705
equal deleted inserted replaced
50767:356eaea05bf0 50768:68fa3d4026ea
     1 /*
       
     2  * Copyright (c) 1996, 2015, 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 
       
    27 package sun.security.ssl;
       
    28 
       
    29 import java.io.ByteArrayInputStream;
       
    30 import java.io.IOException;
       
    31 import java.util.Hashtable;
       
    32 import java.util.Arrays;
       
    33 
       
    34 import java.security.*;
       
    35 import javax.crypto.*;
       
    36 import javax.crypto.spec.IvParameterSpec;
       
    37 import javax.crypto.spec.GCMParameterSpec;
       
    38 
       
    39 import java.nio.*;
       
    40 
       
    41 import sun.security.ssl.CipherSuite.*;
       
    42 import static sun.security.ssl.CipherSuite.*;
       
    43 import static sun.security.ssl.CipherSuite.CipherType.*;
       
    44 
       
    45 import sun.security.util.HexDumpEncoder;
       
    46 
       
    47 
       
    48 /**
       
    49  * This class handles bulk data enciphering/deciphering for each SSLv3
       
    50  * message.  This provides data confidentiality.  Stream ciphers (such
       
    51  * as RC4) don't need to do padding; block ciphers (e.g. DES) need it.
       
    52  *
       
    53  * Individual instances are obtained by calling the static method
       
    54  * newCipherBox(), which should only be invoked by BulkCipher.newCipher().
       
    55  *
       
    56  * In RFC 2246, with bock ciphers in CBC mode, the Initialization
       
    57  * Vector (IV) for the first record is generated with the other keys
       
    58  * and secrets when the security parameters are set.  The IV for
       
    59  * subsequent records is the last ciphertext block from the previous
       
    60  * record.
       
    61  *
       
    62  * In RFC 4346, the implicit Initialization Vector (IV) is replaced
       
    63  * with an explicit IV to protect against CBC attacks.  RFC 4346
       
    64  * recommends two algorithms used to generated the per-record IV.
       
    65  * The implementation uses the algorithm (2)(b), as described at
       
    66  * section 6.2.3.2 of RFC 4346.
       
    67  *
       
    68  * The usage of IV in CBC block cipher can be illustrated in
       
    69  * the following diagrams.
       
    70  *
       
    71  *   (random)
       
    72  *        R         P1                    IV        C1
       
    73  *        |          |                     |         |
       
    74  *  SIV---+    |-----+    |-...            |-----    |------
       
    75  *        |    |     |    |                |    |    |     |
       
    76  *     +----+  |  +----+  |             +----+  |  +----+  |
       
    77  *     | Ek |  |  + Ek +  |             | Dk |  |  | Dk |  |
       
    78  *     +----+  |  +----+  |             +----+  |  +----+  |
       
    79  *        |    |     |    |                |    |    |     |
       
    80  *        |----|     |----|           SIV--+    |----|     |-...
       
    81  *        |          |                     |       |
       
    82  *       IV         C1                     R      P1
       
    83  *                                     (discard)
       
    84  *
       
    85  *       CBC Encryption                    CBC Decryption
       
    86  *
       
    87  * NOTE that any ciphering involved in key exchange (e.g. with RSA) is
       
    88  * handled separately.
       
    89  *
       
    90  * @author David Brownell
       
    91  * @author Andreas Sterbenz
       
    92  */
       
    93 final class CipherBox {
       
    94 
       
    95     // A CipherBox that implements the identity operation
       
    96     static final CipherBox NULL = new CipherBox();
       
    97 
       
    98     /* Class and subclass dynamic debugging support */
       
    99     private static final Debug debug = Debug.getInstance("ssl");
       
   100 
       
   101     // the protocol version this cipher conforms to
       
   102     private final ProtocolVersion protocolVersion;
       
   103 
       
   104     // cipher object
       
   105     private final Cipher cipher;
       
   106 
       
   107     /**
       
   108      * secure random
       
   109      */
       
   110     private SecureRandom random;
       
   111 
       
   112     /**
       
   113      * fixed IV, the implicit nonce of AEAD cipher suite, only apply to
       
   114      * AEAD cipher suites
       
   115      */
       
   116     private final byte[] fixedIv;
       
   117 
       
   118     /**
       
   119      * the key, reserved only for AEAD cipher initialization
       
   120      */
       
   121     private final Key key;
       
   122 
       
   123     /**
       
   124      * the operation mode, reserved for AEAD cipher initialization
       
   125      */
       
   126     private final int mode;
       
   127 
       
   128     /**
       
   129      * the authentication tag size, only apply to AEAD cipher suites
       
   130      */
       
   131     private final int tagSize;
       
   132 
       
   133     /**
       
   134      * the record IV length, only apply to AEAD cipher suites
       
   135      */
       
   136     private final int recordIvSize;
       
   137 
       
   138     /**
       
   139      * cipher type
       
   140      */
       
   141     private final CipherType cipherType;
       
   142 
       
   143     /**
       
   144      * Fixed masks of various block size, as the initial decryption IVs
       
   145      * for TLS 1.1 or later.
       
   146      *
       
   147      * For performance, we do not use random IVs. As the initial decryption
       
   148      * IVs will be discarded by TLS decryption processes, so the fixed masks
       
   149      * do not hurt cryptographic strength.
       
   150      */
       
   151     private static Hashtable<Integer, IvParameterSpec> masks;
       
   152 
       
   153     /**
       
   154      * NULL cipherbox. Identity operation, no encryption.
       
   155      */
       
   156     private CipherBox() {
       
   157         this.protocolVersion = ProtocolVersion.DEFAULT_TLS;
       
   158         this.cipher = null;
       
   159         this.cipherType = NULL_CIPHER;
       
   160         this.fixedIv = new byte[0];
       
   161         this.key = null;
       
   162         this.mode = Cipher.ENCRYPT_MODE;    // choose at random
       
   163         this.random = null;
       
   164         this.tagSize = 0;
       
   165         this.recordIvSize = 0;
       
   166     }
       
   167 
       
   168     /**
       
   169      * Construct a new CipherBox using the cipher transformation.
       
   170      *
       
   171      * @exception NoSuchAlgorithmException if no appropriate JCE Cipher
       
   172      * implementation could be found.
       
   173      */
       
   174     private CipherBox(ProtocolVersion protocolVersion, BulkCipher bulkCipher,
       
   175             SecretKey key, IvParameterSpec iv, SecureRandom random,
       
   176             boolean encrypt) throws NoSuchAlgorithmException {
       
   177         try {
       
   178             this.protocolVersion = protocolVersion;
       
   179             this.cipher = JsseJce.getCipher(bulkCipher.transformation);
       
   180             this.mode = encrypt ? Cipher.ENCRYPT_MODE : Cipher.DECRYPT_MODE;
       
   181 
       
   182             if (random == null) {
       
   183                 random = JsseJce.getSecureRandom();
       
   184             }
       
   185             this.random = random;
       
   186             this.cipherType = bulkCipher.cipherType;
       
   187 
       
   188             /*
       
   189              * RFC 4346 recommends two algorithms used to generated the
       
   190              * per-record IV. The implementation uses the algorithm (2)(b),
       
   191              * as described at section 6.2.3.2 of RFC 4346.
       
   192              *
       
   193              * As we don't care about the initial IV value for TLS 1.1 or
       
   194              * later, so if the "iv" parameter is null, we use the default
       
   195              * value generated by Cipher.init() for encryption, and a fixed
       
   196              * mask for decryption.
       
   197              */
       
   198             if (iv == null && bulkCipher.ivSize != 0 &&
       
   199                     mode == Cipher.DECRYPT_MODE &&
       
   200                     protocolVersion.useTLS11PlusSpec()) {
       
   201                 iv = getFixedMask(bulkCipher.ivSize);
       
   202             }
       
   203 
       
   204             if (cipherType == AEAD_CIPHER) {
       
   205                 // AEAD must completely initialize the cipher for each packet,
       
   206                 // and so we save initialization parameters for packet
       
   207                 // processing time.
       
   208 
       
   209                 // Set the tag size for AEAD cipher
       
   210                 tagSize = bulkCipher.tagSize;
       
   211 
       
   212                 // Reserve the key for AEAD cipher initialization
       
   213                 this.key = key;
       
   214 
       
   215                 fixedIv = iv.getIV();
       
   216                 if (fixedIv == null ||
       
   217                         fixedIv.length != bulkCipher.fixedIvSize) {
       
   218                     throw new RuntimeException("Improper fixed IV for AEAD");
       
   219                 }
       
   220 
       
   221                 // Set the record IV length for AEAD cipher
       
   222                 recordIvSize = bulkCipher.ivSize - bulkCipher.fixedIvSize;
       
   223 
       
   224                 // DON'T initialize the cipher for AEAD!
       
   225             } else {
       
   226                 // CBC only requires one initialization during its lifetime
       
   227                 // (future packets/IVs set the proper CBC state), so we can
       
   228                 // initialize now.
       
   229 
       
   230                 // Zeroize the variables that only apply to AEAD cipher
       
   231                 this.tagSize = 0;
       
   232                 this.fixedIv = new byte[0];
       
   233                 this.recordIvSize = 0;
       
   234                 this.key = null;
       
   235 
       
   236                 // Initialize the cipher
       
   237                 cipher.init(mode, key, iv, random);
       
   238             }
       
   239         } catch (NoSuchAlgorithmException e) {
       
   240             throw e;
       
   241         } catch (Exception e) {
       
   242             throw new NoSuchAlgorithmException
       
   243                     ("Could not create cipher " + bulkCipher, e);
       
   244         } catch (ExceptionInInitializerError e) {
       
   245             throw new NoSuchAlgorithmException
       
   246                     ("Could not create cipher " + bulkCipher, e);
       
   247         }
       
   248     }
       
   249 
       
   250     /*
       
   251      * Factory method to obtain a new CipherBox object.
       
   252      */
       
   253     static CipherBox newCipherBox(ProtocolVersion version, BulkCipher cipher,
       
   254             SecretKey key, IvParameterSpec iv, SecureRandom random,
       
   255             boolean encrypt) throws NoSuchAlgorithmException {
       
   256         if (cipher.allowed == false) {
       
   257             throw new NoSuchAlgorithmException("Unsupported cipher " + cipher);
       
   258         }
       
   259 
       
   260         if (cipher == BulkCipher.B_NULL) {
       
   261             return NULL;
       
   262         } else {
       
   263             return new CipherBox(version, cipher, key, iv, random, encrypt);
       
   264         }
       
   265     }
       
   266 
       
   267     /*
       
   268      * Get a fixed mask, as the initial decryption IVs for TLS 1.1 or later.
       
   269      */
       
   270     private static IvParameterSpec getFixedMask(int ivSize) {
       
   271         if (masks == null) {
       
   272             masks = new Hashtable<Integer, IvParameterSpec>(5);
       
   273         }
       
   274 
       
   275         IvParameterSpec iv = masks.get(ivSize);
       
   276         if (iv == null) {
       
   277             iv = new IvParameterSpec(new byte[ivSize]);
       
   278             masks.put(ivSize, iv);
       
   279         }
       
   280 
       
   281         return iv;
       
   282     }
       
   283 
       
   284     /*
       
   285      * Encrypts a block of data, returning the size of the
       
   286      * resulting block.
       
   287      */
       
   288     int encrypt(byte[] buf, int offset, int len) {
       
   289         if (cipher == null) {
       
   290             return len;
       
   291         }
       
   292 
       
   293         try {
       
   294             int blockSize = cipher.getBlockSize();
       
   295             if (cipherType == BLOCK_CIPHER) {
       
   296                 len = addPadding(buf, offset, len, blockSize);
       
   297             }
       
   298 
       
   299             if (debug != null && Debug.isOn("plaintext")) {
       
   300                 try {
       
   301                     HexDumpEncoder hd = new HexDumpEncoder();
       
   302 
       
   303                     System.out.println(
       
   304                         "Padded plaintext before ENCRYPTION:  len = "
       
   305                         + len);
       
   306                     hd.encodeBuffer(
       
   307                         new ByteArrayInputStream(buf, offset, len),
       
   308                         System.out);
       
   309                 } catch (IOException e) { }
       
   310             }
       
   311 
       
   312 
       
   313             if (cipherType == AEAD_CIPHER) {
       
   314                 try {
       
   315                     return cipher.doFinal(buf, offset, len, buf, offset);
       
   316                 } catch (IllegalBlockSizeException | BadPaddingException ibe) {
       
   317                     // unlikely to happen
       
   318                     throw new RuntimeException(
       
   319                         "Cipher error in AEAD mode in JCE provider " +
       
   320                         cipher.getProvider().getName(), ibe);
       
   321                 }
       
   322             } else {
       
   323                 int newLen = cipher.update(buf, offset, len, buf, offset);
       
   324                 if (newLen != len) {
       
   325                     // catch BouncyCastle buffering error
       
   326                     throw new RuntimeException("Cipher buffering error " +
       
   327                         "in JCE provider " + cipher.getProvider().getName());
       
   328                 }
       
   329                 return newLen;
       
   330             }
       
   331         } catch (ShortBufferException e) {
       
   332             // unlikely to happen, we should have enough buffer space here
       
   333             throw new ArrayIndexOutOfBoundsException(e.toString());
       
   334         }
       
   335     }
       
   336 
       
   337     /*
       
   338      * Encrypts a ByteBuffer block of data, returning the size of the
       
   339      * resulting block.
       
   340      *
       
   341      * The byte buffers position and limit initially define the amount
       
   342      * to encrypt.  On return, the position and limit are
       
   343      * set to last position padded/encrypted.  The limit may have changed
       
   344      * because of the added padding bytes.
       
   345      */
       
   346     int encrypt(ByteBuffer bb, int outLimit) {
       
   347 
       
   348         int len = bb.remaining();
       
   349 
       
   350         if (cipher == null) {
       
   351             bb.position(bb.limit());
       
   352             return len;
       
   353         }
       
   354 
       
   355         int pos = bb.position();
       
   356 
       
   357         int blockSize = cipher.getBlockSize();
       
   358         if (cipherType == BLOCK_CIPHER) {
       
   359             // addPadding adjusts pos/limit
       
   360             len = addPadding(bb, blockSize);
       
   361             bb.position(pos);
       
   362         }
       
   363 
       
   364         if (debug != null && Debug.isOn("plaintext")) {
       
   365             try {
       
   366                 HexDumpEncoder hd = new HexDumpEncoder();
       
   367 
       
   368                 System.out.println(
       
   369                     "Padded plaintext before ENCRYPTION:  len = "
       
   370                     + len);
       
   371                 hd.encodeBuffer(bb.duplicate(), System.out);
       
   372 
       
   373             } catch (IOException e) { }
       
   374         }
       
   375 
       
   376         /*
       
   377          * Encrypt "in-place".  This does not add its own padding.
       
   378          */
       
   379         ByteBuffer dup = bb.duplicate();
       
   380         if (cipherType == AEAD_CIPHER) {
       
   381             try {
       
   382                 int outputSize = cipher.getOutputSize(dup.remaining());
       
   383                 if (outputSize > bb.remaining()) {
       
   384                     // need to expand the limit of the output buffer for
       
   385                     // the authentication tag.
       
   386                     //
       
   387                     // DON'T worry about the buffer's capacity, we have
       
   388                     // reserved space for the authentication tag.
       
   389                     if (outLimit < pos + outputSize) {
       
   390                         // unlikely to happen
       
   391                         throw new ShortBufferException(
       
   392                                     "need more space in output buffer");
       
   393                     }
       
   394                     bb.limit(pos + outputSize);
       
   395                 }
       
   396                 int newLen = cipher.doFinal(dup, bb);
       
   397                 if (newLen != outputSize) {
       
   398                     throw new RuntimeException(
       
   399                             "Cipher buffering error in JCE provider " +
       
   400                             cipher.getProvider().getName());
       
   401                 }
       
   402                 return newLen;
       
   403             } catch (IllegalBlockSizeException |
       
   404                            BadPaddingException | ShortBufferException ibse) {
       
   405                 // unlikely to happen
       
   406                 throw new RuntimeException(
       
   407                         "Cipher error in AEAD mode in JCE provider " +
       
   408                         cipher.getProvider().getName(), ibse);
       
   409             }
       
   410         } else {
       
   411             int newLen;
       
   412             try {
       
   413                 newLen = cipher.update(dup, bb);
       
   414             } catch (ShortBufferException sbe) {
       
   415                 // unlikely to happen
       
   416                 throw new RuntimeException("Cipher buffering error " +
       
   417                     "in JCE provider " + cipher.getProvider().getName());
       
   418             }
       
   419 
       
   420             if (bb.position() != dup.position()) {
       
   421                 throw new RuntimeException("bytebuffer padding error");
       
   422             }
       
   423 
       
   424             if (newLen != len) {
       
   425                 // catch BouncyCastle buffering error
       
   426                 throw new RuntimeException("Cipher buffering error " +
       
   427                     "in JCE provider " + cipher.getProvider().getName());
       
   428             }
       
   429             return newLen;
       
   430         }
       
   431     }
       
   432 
       
   433 
       
   434     /*
       
   435      * Decrypts a block of data, returning the size of the
       
   436      * resulting block if padding was required.
       
   437      *
       
   438      * For SSLv3 and TLSv1.0, with block ciphers in CBC mode the
       
   439      * Initialization Vector (IV) for the first record is generated by
       
   440      * the handshake protocol, the IV for subsequent records is the
       
   441      * last ciphertext block from the previous record.
       
   442      *
       
   443      * From TLSv1.1, the implicit IV is replaced with an explicit IV to
       
   444      * protect against CBC attacks.
       
   445      *
       
   446      * Differentiating between bad_record_mac and decryption_failed alerts
       
   447      * may permit certain attacks against CBC mode. It is preferable to
       
   448      * uniformly use the bad_record_mac alert to hide the specific type of
       
   449      * the error.
       
   450      */
       
   451     int decrypt(byte[] buf, int offset, int len,
       
   452             int tagLen) throws BadPaddingException {
       
   453         if (cipher == null) {
       
   454             return len;
       
   455         }
       
   456 
       
   457         try {
       
   458             int newLen;
       
   459             if (cipherType == AEAD_CIPHER) {
       
   460                 try {
       
   461                     newLen = cipher.doFinal(buf, offset, len, buf, offset);
       
   462                 } catch (IllegalBlockSizeException ibse) {
       
   463                     // unlikely to happen
       
   464                     throw new RuntimeException(
       
   465                         "Cipher error in AEAD mode in JCE provider " +
       
   466                         cipher.getProvider().getName(), ibse);
       
   467                 }
       
   468             } else {
       
   469                 newLen = cipher.update(buf, offset, len, buf, offset);
       
   470                 if (newLen != len) {
       
   471                     // catch BouncyCastle buffering error
       
   472                     throw new RuntimeException("Cipher buffering error " +
       
   473                         "in JCE provider " + cipher.getProvider().getName());
       
   474                 }
       
   475             }
       
   476             if (debug != null && Debug.isOn("plaintext")) {
       
   477                 try {
       
   478                     HexDumpEncoder hd = new HexDumpEncoder();
       
   479 
       
   480                     System.out.println(
       
   481                         "Padded plaintext after DECRYPTION:  len = "
       
   482                         + newLen);
       
   483                     hd.encodeBuffer(
       
   484                         new ByteArrayInputStream(buf, offset, newLen),
       
   485                         System.out);
       
   486                 } catch (IOException e) { }
       
   487             }
       
   488 
       
   489             if (cipherType == BLOCK_CIPHER) {
       
   490                 int blockSize = cipher.getBlockSize();
       
   491                 newLen = removePadding(
       
   492                     buf, offset, newLen, tagLen, blockSize, protocolVersion);
       
   493 
       
   494                 if (protocolVersion.useTLS11PlusSpec()) {
       
   495                     if (newLen < blockSize) {
       
   496                         throw new BadPaddingException("The length after " +
       
   497                         "padding removal (" + newLen + ") should be larger " +
       
   498                         "than <" + blockSize + "> since explicit IV used");
       
   499                     }
       
   500                 }
       
   501             }
       
   502             return newLen;
       
   503         } catch (ShortBufferException e) {
       
   504             // unlikely to happen, we should have enough buffer space here
       
   505             throw new ArrayIndexOutOfBoundsException(e.toString());
       
   506         }
       
   507     }
       
   508 
       
   509     /*
       
   510      * Decrypts a block of data, returning the size of the
       
   511      * resulting block if padding was required.  position and limit
       
   512      * point to the end of the decrypted/depadded data.  The initial
       
   513      * limit and new limit may be different, given we may
       
   514      * have stripped off some padding bytes.
       
   515      *
       
   516      *  @see decrypt(byte[], int, int)
       
   517      */
       
   518     int decrypt(ByteBuffer bb, int tagLen) throws BadPaddingException {
       
   519 
       
   520         int len = bb.remaining();
       
   521 
       
   522         if (cipher == null) {
       
   523             bb.position(bb.limit());
       
   524             return len;
       
   525         }
       
   526 
       
   527         try {
       
   528             /*
       
   529              * Decrypt "in-place".
       
   530              */
       
   531             int pos = bb.position();
       
   532             ByteBuffer dup = bb.duplicate();
       
   533             int newLen;
       
   534             if (cipherType == AEAD_CIPHER) {
       
   535                 try {
       
   536                     newLen = cipher.doFinal(dup, bb);
       
   537                 } catch (IllegalBlockSizeException ibse) {
       
   538                     // unlikely to happen
       
   539                     throw new RuntimeException(
       
   540                         "Cipher error in AEAD mode \"" + ibse.getMessage() +
       
   541                         " \"in JCE provider " + cipher.getProvider().getName());
       
   542                 }
       
   543             } else {
       
   544                 newLen = cipher.update(dup, bb);
       
   545                 if (newLen != len) {
       
   546                     // catch BouncyCastle buffering error
       
   547                     throw new RuntimeException("Cipher buffering error " +
       
   548                         "in JCE provider " + cipher.getProvider().getName());
       
   549                 }
       
   550             }
       
   551 
       
   552             // reset the limit to the end of the decryted data
       
   553             bb.limit(pos + newLen);
       
   554 
       
   555             if (debug != null && Debug.isOn("plaintext")) {
       
   556                 try {
       
   557                     HexDumpEncoder hd = new HexDumpEncoder();
       
   558 
       
   559                     System.out.println(
       
   560                         "Padded plaintext after DECRYPTION:  len = "
       
   561                         + newLen);
       
   562 
       
   563                     hd.encodeBuffer(
       
   564                         bb.duplicate().position(pos), System.out);
       
   565                 } catch (IOException e) { }
       
   566             }
       
   567 
       
   568             /*
       
   569              * Remove the block padding.
       
   570              */
       
   571             if (cipherType == BLOCK_CIPHER) {
       
   572                 int blockSize = cipher.getBlockSize();
       
   573                 bb.position(pos);
       
   574                 newLen = removePadding(bb, tagLen, blockSize, protocolVersion);
       
   575 
       
   576                 // check the explicit IV of TLS v1.1 or later
       
   577                 if (protocolVersion.useTLS11PlusSpec()) {
       
   578                     if (newLen < blockSize) {
       
   579                         throw new BadPaddingException("The length after " +
       
   580                         "padding removal (" + newLen + ") should be larger " +
       
   581                         "than <" + blockSize + "> since explicit IV used");
       
   582                     }
       
   583 
       
   584                     // reset the position to the end of the decrypted data
       
   585                     bb.position(bb.limit());
       
   586                 }
       
   587             }
       
   588             return newLen;
       
   589         } catch (ShortBufferException e) {
       
   590             // unlikely to happen, we should have enough buffer space here
       
   591             throw new ArrayIndexOutOfBoundsException(e.toString());
       
   592         }
       
   593     }
       
   594 
       
   595     private static int addPadding(byte[] buf, int offset, int len,
       
   596             int blockSize) {
       
   597         int     newlen = len + 1;
       
   598         byte    pad;
       
   599         int     i;
       
   600 
       
   601         if ((newlen % blockSize) != 0) {
       
   602             newlen += blockSize - 1;
       
   603             newlen -= newlen % blockSize;
       
   604         }
       
   605         pad = (byte) (newlen - len);
       
   606 
       
   607         if (buf.length < (newlen + offset)) {
       
   608             throw new IllegalArgumentException("no space to pad buffer");
       
   609         }
       
   610 
       
   611         /*
       
   612          * TLS version of the padding works for both SSLv3 and TLSv1
       
   613          */
       
   614         for (i = 0, offset += len; i < pad; i++) {
       
   615             buf [offset++] = (byte) (pad - 1);
       
   616         }
       
   617         return newlen;
       
   618     }
       
   619 
       
   620     /*
       
   621      * Apply the padding to the buffer.
       
   622      *
       
   623      * Limit is advanced to the new buffer length.
       
   624      * Position is equal to limit.
       
   625      */
       
   626     private static int addPadding(ByteBuffer bb, int blockSize) {
       
   627 
       
   628         int     len = bb.remaining();
       
   629         int     offset = bb.position();
       
   630 
       
   631         int     newlen = len + 1;
       
   632         byte    pad;
       
   633         int     i;
       
   634 
       
   635         if ((newlen % blockSize) != 0) {
       
   636             newlen += blockSize - 1;
       
   637             newlen -= newlen % blockSize;
       
   638         }
       
   639         pad = (byte) (newlen - len);
       
   640 
       
   641         /*
       
   642          * Update the limit to what will be padded.
       
   643          */
       
   644         bb.limit(newlen + offset);
       
   645 
       
   646         /*
       
   647          * TLS version of the padding works for both SSLv3 and TLSv1
       
   648          */
       
   649         for (i = 0, offset += len; i < pad; i++) {
       
   650             bb.put(offset++, (byte) (pad - 1));
       
   651         }
       
   652 
       
   653         bb.position(offset);
       
   654         bb.limit(offset);
       
   655 
       
   656         return newlen;
       
   657     }
       
   658 
       
   659     /*
       
   660      * A constant-time check of the padding.
       
   661      *
       
   662      * NOTE that we are checking both the padding and the padLen bytes here.
       
   663      *
       
   664      * The caller MUST ensure that the len parameter is a positive number.
       
   665      */
       
   666     private static int[] checkPadding(
       
   667             byte[] buf, int offset, int len, byte pad) {
       
   668 
       
   669         if (len <= 0) {
       
   670             throw new RuntimeException("padding len must be positive");
       
   671         }
       
   672 
       
   673         // An array of hits is used to prevent Hotspot optimization for
       
   674         // the purpose of a constant-time check.
       
   675         int[] results = {0, 0};    // {missed #, matched #}
       
   676         for (int i = 0; i <= 256;) {
       
   677             for (int j = 0; j < len && i <= 256; j++, i++) {     // j <= i
       
   678                 if (buf[offset + j] != pad) {
       
   679                     results[0]++;       // mismatched padding data
       
   680                 } else {
       
   681                     results[1]++;       // matched padding data
       
   682                 }
       
   683             }
       
   684         }
       
   685 
       
   686         return results;
       
   687     }
       
   688 
       
   689     /*
       
   690      * A constant-time check of the padding.
       
   691      *
       
   692      * NOTE that we are checking both the padding and the padLen bytes here.
       
   693      *
       
   694      * The caller MUST ensure that the bb parameter has remaining.
       
   695      */
       
   696     private static int[] checkPadding(ByteBuffer bb, byte pad) {
       
   697 
       
   698         if (!bb.hasRemaining()) {
       
   699             throw new RuntimeException("hasRemaining() must be positive");
       
   700         }
       
   701 
       
   702         // An array of hits is used to prevent Hotspot optimization for
       
   703         // the purpose of a constant-time check.
       
   704         int[] results = {0, 0};    // {missed #, matched #}
       
   705         bb.mark();
       
   706         for (int i = 0; i <= 256; bb.reset()) {
       
   707             for (; bb.hasRemaining() && i <= 256; i++) {
       
   708                 if (bb.get() != pad) {
       
   709                     results[0]++;       // mismatched padding data
       
   710                 } else {
       
   711                     results[1]++;       // matched padding data
       
   712                 }
       
   713             }
       
   714         }
       
   715 
       
   716         return results;
       
   717     }
       
   718 
       
   719     /*
       
   720      * Typical TLS padding format for a 64 bit block cipher is as follows:
       
   721      *   xx xx xx xx xx xx xx 00
       
   722      *   xx xx xx xx xx xx 01 01
       
   723      *   ...
       
   724      *   xx 06 06 06 06 06 06 06
       
   725      *   07 07 07 07 07 07 07 07
       
   726      * TLS also allows any amount of padding from 1 and 256 bytes as long
       
   727      * as it makes the data a multiple of the block size
       
   728      */
       
   729     private static int removePadding(byte[] buf, int offset, int len,
       
   730             int tagLen, int blockSize,
       
   731             ProtocolVersion protocolVersion) throws BadPaddingException {
       
   732 
       
   733         // last byte is length byte (i.e. actual padding length - 1)
       
   734         int padOffset = offset + len - 1;
       
   735         int padLen = buf[padOffset] & 0xFF;
       
   736 
       
   737         int newLen = len - (padLen + 1);
       
   738         if ((newLen - tagLen) < 0) {
       
   739             // If the buffer is not long enough to contain the padding plus
       
   740             // a MAC tag, do a dummy constant-time padding check.
       
   741             //
       
   742             // Note that it is a dummy check, so we won't care about what is
       
   743             // the actual padding data.
       
   744             checkPadding(buf, offset, len, (byte)(padLen & 0xFF));
       
   745 
       
   746             throw new BadPaddingException("Invalid Padding length: " + padLen);
       
   747         }
       
   748 
       
   749         // The padding data should be filled with the padding length value.
       
   750         int[] results = checkPadding(buf, offset + newLen,
       
   751                         padLen + 1, (byte)(padLen & 0xFF));
       
   752         if (protocolVersion.useTLS10PlusSpec()) {
       
   753             if (results[0] != 0) {          // padding data has invalid bytes
       
   754                 throw new BadPaddingException("Invalid TLS padding data");
       
   755             }
       
   756         } else { // SSLv3
       
   757             // SSLv3 requires 0 <= length byte < block size
       
   758             // some implementations do 1 <= length byte <= block size,
       
   759             // so accept that as well
       
   760             // v3 does not require any particular value for the other bytes
       
   761             if (padLen > blockSize) {
       
   762                 throw new BadPaddingException("Padding length (" +
       
   763                 padLen + ") of SSLv3 message should not be bigger " +
       
   764                 "than the block size (" + blockSize + ")");
       
   765             }
       
   766         }
       
   767         return newLen;
       
   768     }
       
   769 
       
   770     /*
       
   771      * Position/limit is equal the removed padding.
       
   772      */
       
   773     private static int removePadding(ByteBuffer bb,
       
   774             int tagLen, int blockSize,
       
   775             ProtocolVersion protocolVersion) throws BadPaddingException {
       
   776 
       
   777         int len = bb.remaining();
       
   778         int offset = bb.position();
       
   779 
       
   780         // last byte is length byte (i.e. actual padding length - 1)
       
   781         int padOffset = offset + len - 1;
       
   782         int padLen = bb.get(padOffset) & 0xFF;
       
   783 
       
   784         int newLen = len - (padLen + 1);
       
   785         if ((newLen - tagLen) < 0) {
       
   786             // If the buffer is not long enough to contain the padding plus
       
   787             // a MAC tag, do a dummy constant-time padding check.
       
   788             //
       
   789             // Note that it is a dummy check, so we won't care about what is
       
   790             // the actual padding data.
       
   791             checkPadding(bb.duplicate(), (byte)(padLen & 0xFF));
       
   792 
       
   793             throw new BadPaddingException("Invalid Padding length: " + padLen);
       
   794         }
       
   795 
       
   796         // The padding data should be filled with the padding length value.
       
   797         int[] results = checkPadding(
       
   798                 bb.duplicate().position(offset + newLen),
       
   799                 (byte)(padLen & 0xFF));
       
   800         if (protocolVersion.useTLS10PlusSpec()) {
       
   801             if (results[0] != 0) {          // padding data has invalid bytes
       
   802                 throw new BadPaddingException("Invalid TLS padding data");
       
   803             }
       
   804         } else { // SSLv3
       
   805             // SSLv3 requires 0 <= length byte < block size
       
   806             // some implementations do 1 <= length byte <= block size,
       
   807             // so accept that as well
       
   808             // v3 does not require any particular value for the other bytes
       
   809             if (padLen > blockSize) {
       
   810                 throw new BadPaddingException("Padding length (" +
       
   811                 padLen + ") of SSLv3 message should not be bigger " +
       
   812                 "than the block size (" + blockSize + ")");
       
   813             }
       
   814         }
       
   815 
       
   816         /*
       
   817          * Reset buffer limit to remove padding.
       
   818          */
       
   819         bb.position(offset + newLen);
       
   820         bb.limit(offset + newLen);
       
   821 
       
   822         return newLen;
       
   823     }
       
   824 
       
   825     /*
       
   826      * Dispose of any intermediate state in the underlying cipher.
       
   827      * For PKCS11 ciphers, this will release any attached sessions, and
       
   828      * thus make finalization faster.
       
   829      */
       
   830     void dispose() {
       
   831         try {
       
   832             if (cipher != null) {
       
   833                 // ignore return value.
       
   834                 cipher.doFinal();
       
   835             }
       
   836         } catch (Exception e) {
       
   837             // swallow all types of exceptions.
       
   838         }
       
   839     }
       
   840 
       
   841     /*
       
   842      * Does the cipher use CBC mode?
       
   843      *
       
   844      * @return true if the cipher use CBC mode, false otherwise.
       
   845      */
       
   846     boolean isCBCMode() {
       
   847         return cipherType == BLOCK_CIPHER;
       
   848     }
       
   849 
       
   850     /*
       
   851      * Does the cipher use AEAD mode?
       
   852      *
       
   853      * @return true if the cipher use AEAD mode, false otherwise.
       
   854      */
       
   855     boolean isAEADMode() {
       
   856         return cipherType == AEAD_CIPHER;
       
   857     }
       
   858 
       
   859     /*
       
   860      * Is the cipher null?
       
   861      *
       
   862      * @return true if the cipher is null, false otherwise.
       
   863      */
       
   864     boolean isNullCipher() {
       
   865         return cipher == null;
       
   866     }
       
   867 
       
   868     /*
       
   869      * Gets the explicit nonce/IV size of the cipher.
       
   870      *
       
   871      * The returned value is the SecurityParameters.record_iv_length in
       
   872      * RFC 4346/5246.  It is the size of explicit IV for CBC mode, and the
       
   873      * size of explicit nonce for AEAD mode.
       
   874      *
       
   875      * @return the explicit nonce size of the cipher.
       
   876      */
       
   877     int getExplicitNonceSize() {
       
   878         switch (cipherType) {
       
   879             case BLOCK_CIPHER:
       
   880                 // For block ciphers, the explicit IV length is of length
       
   881                 // SecurityParameters.record_iv_length, which is equal to
       
   882                 // the SecurityParameters.block_size.
       
   883                 if (protocolVersion.useTLS11PlusSpec()) {
       
   884                     return cipher.getBlockSize();
       
   885                 }
       
   886                 break;
       
   887             case AEAD_CIPHER:
       
   888                 return recordIvSize;
       
   889                         // It is also the length of sequence number, which is
       
   890                         // used as the nonce_explicit for AEAD cipher suites.
       
   891         }
       
   892 
       
   893         return 0;
       
   894     }
       
   895 
       
   896     /*
       
   897      * Applies the explicit nonce/IV to this cipher. This method is used to
       
   898      * decrypt an SSL/TLS input record.
       
   899      *
       
   900      * The returned value is the SecurityParameters.record_iv_length in
       
   901      * RFC 4346/5246.  It is the size of explicit IV for CBC mode, and the
       
   902      * size of explicit nonce for AEAD mode.
       
   903      *
       
   904      * @param  authenticator the authenticator to get the additional
       
   905      *         authentication data
       
   906      * @param  contentType the content type of the input record
       
   907      * @param  bb the byte buffer to get the explicit nonce from
       
   908      *
       
   909      * @return the explicit nonce size of the cipher.
       
   910      */
       
   911     int applyExplicitNonce(Authenticator authenticator, byte contentType,
       
   912             ByteBuffer bb, byte[] sequence) throws BadPaddingException {
       
   913         switch (cipherType) {
       
   914             case BLOCK_CIPHER:
       
   915                 // sanity check length of the ciphertext
       
   916                 int tagLen = (authenticator instanceof MAC) ?
       
   917                                     ((MAC)authenticator).MAClen() : 0;
       
   918                 if (tagLen != 0) {
       
   919                     if (!sanityCheck(tagLen, bb.remaining())) {
       
   920                         throw new BadPaddingException(
       
   921                                 "ciphertext sanity check failed");
       
   922                     }
       
   923                 }
       
   924 
       
   925                 // For block ciphers, the explicit IV length is of length
       
   926                 // SecurityParameters.record_iv_length, which is equal to
       
   927                 // the SecurityParameters.block_size.
       
   928                 if (protocolVersion.useTLS11PlusSpec()) {
       
   929                     return cipher.getBlockSize();
       
   930                 }
       
   931                 break;
       
   932             case AEAD_CIPHER:
       
   933                 if (bb.remaining() < (recordIvSize + tagSize)) {
       
   934                     throw new BadPaddingException(
       
   935                         "Insufficient buffer remaining for AEAD cipher " +
       
   936                         "fragment (" + bb.remaining() + "). Needs to be " +
       
   937                         "more than or equal to IV size (" + recordIvSize +
       
   938                          ") + tag size (" + tagSize + ")");
       
   939                 }
       
   940 
       
   941                 // initialize the AEAD cipher for the unique IV
       
   942                 byte[] iv = Arrays.copyOf(fixedIv,
       
   943                                     fixedIv.length + recordIvSize);
       
   944                 bb.get(iv, fixedIv.length, recordIvSize);
       
   945                 bb.position(bb.position() - recordIvSize);
       
   946                 GCMParameterSpec spec = new GCMParameterSpec(tagSize * 8, iv);
       
   947                 try {
       
   948                     cipher.init(mode, key, spec, random);
       
   949                 } catch (InvalidKeyException |
       
   950                             InvalidAlgorithmParameterException ikae) {
       
   951                     // unlikely to happen
       
   952                     throw new RuntimeException(
       
   953                                 "invalid key or spec in GCM mode", ikae);
       
   954                 }
       
   955 
       
   956                 // update the additional authentication data
       
   957                 byte[] aad = authenticator.acquireAuthenticationBytes(
       
   958                         contentType, bb.remaining() - recordIvSize - tagSize,
       
   959                         sequence);
       
   960                 cipher.updateAAD(aad);
       
   961 
       
   962                 return recordIvSize;
       
   963                         // It is also the length of sequence number, which is
       
   964                         // used as the nonce_explicit for AEAD cipher suites.
       
   965         }
       
   966 
       
   967        return 0;
       
   968     }
       
   969 
       
   970     /*
       
   971      * Creates the explicit nonce/IV to this cipher. This method is used to
       
   972      * encrypt an SSL/TLS output record.
       
   973      *
       
   974      * The size of the returned array is the SecurityParameters.record_iv_length
       
   975      * in RFC 4346/5246.  It is the size of explicit IV for CBC mode, and the
       
   976      * size of explicit nonce for AEAD mode.
       
   977      *
       
   978      * @param  authenticator the authenticator to get the additional
       
   979      *         authentication data
       
   980      * @param  contentType the content type of the input record
       
   981      * @param  fragmentLength the fragment length of the output record, it is
       
   982      *         the TLSCompressed.length in RFC 4346/5246.
       
   983      *
       
   984      * @return the explicit nonce of the cipher.
       
   985      */
       
   986     byte[] createExplicitNonce(Authenticator authenticator,
       
   987             byte contentType, int fragmentLength) {
       
   988 
       
   989         byte[] nonce = new byte[0];
       
   990         switch (cipherType) {
       
   991             case BLOCK_CIPHER:
       
   992                 if (protocolVersion.useTLS11PlusSpec()) {
       
   993                     // For block ciphers, the explicit IV length is of length
       
   994                     // SecurityParameters.record_iv_length, which is equal to
       
   995                     // the SecurityParameters.block_size.
       
   996                     //
       
   997                     // Generate a random number as the explicit IV parameter.
       
   998                     nonce = new byte[cipher.getBlockSize()];
       
   999                     random.nextBytes(nonce);
       
  1000                 }
       
  1001                 break;
       
  1002             case AEAD_CIPHER:
       
  1003                 // To be unique and aware of overflow-wrap, sequence number
       
  1004                 // is used as the nonce_explicit of AEAD cipher suites.
       
  1005                 nonce = authenticator.sequenceNumber();
       
  1006 
       
  1007                 // initialize the AEAD cipher for the unique IV
       
  1008                 byte[] iv = Arrays.copyOf(fixedIv,
       
  1009                                             fixedIv.length + nonce.length);
       
  1010                 System.arraycopy(nonce, 0, iv, fixedIv.length, nonce.length);
       
  1011                 GCMParameterSpec spec = new GCMParameterSpec(tagSize * 8, iv);
       
  1012                 try {
       
  1013                     cipher.init(mode, key, spec, random);
       
  1014                 } catch (InvalidKeyException |
       
  1015                             InvalidAlgorithmParameterException ikae) {
       
  1016                     // unlikely to happen
       
  1017                     throw new RuntimeException(
       
  1018                                 "invalid key or spec in GCM mode", ikae);
       
  1019                 }
       
  1020 
       
  1021                 // Update the additional authentication data, using the
       
  1022                 // implicit sequence number of the authenticator.
       
  1023                 byte[] aad = authenticator.acquireAuthenticationBytes(
       
  1024                                         contentType, fragmentLength, null);
       
  1025                 cipher.updateAAD(aad);
       
  1026                 break;
       
  1027         }
       
  1028 
       
  1029         return nonce;
       
  1030     }
       
  1031 
       
  1032     // See also CipherSuite.calculatePacketSize().
       
  1033     int calculatePacketSize(int fragmentSize, int macLen, int headerSize) {
       
  1034         int packetSize = fragmentSize;
       
  1035         if (cipher != null) {
       
  1036             int blockSize = cipher.getBlockSize();
       
  1037             switch (cipherType) {
       
  1038                 case BLOCK_CIPHER:
       
  1039                     packetSize += macLen;
       
  1040                     packetSize += 1;        // 1 byte padding length field
       
  1041                     packetSize +=           // use the minimal padding
       
  1042                             (blockSize - (packetSize % blockSize)) % blockSize;
       
  1043                     if (protocolVersion.useTLS11PlusSpec()) {
       
  1044                         packetSize += blockSize;        // explicit IV
       
  1045                     }
       
  1046 
       
  1047                     break;
       
  1048                 case AEAD_CIPHER:
       
  1049                     packetSize += recordIvSize;
       
  1050                     packetSize += tagSize;
       
  1051 
       
  1052                     break;
       
  1053                 default:    // NULL_CIPHER or STREAM_CIPHER
       
  1054                     packetSize += macLen;
       
  1055             }
       
  1056         }
       
  1057 
       
  1058         return packetSize + headerSize;
       
  1059     }
       
  1060 
       
  1061     // See also CipherSuite.calculateFragSize().
       
  1062     int calculateFragmentSize(int packetLimit, int macLen, int headerSize) {
       
  1063         int fragLen = packetLimit - headerSize;
       
  1064         if (cipher != null) {
       
  1065             int blockSize = cipher.getBlockSize();
       
  1066             switch (cipherType) {
       
  1067                 case BLOCK_CIPHER:
       
  1068                     if (protocolVersion.useTLS11PlusSpec()) {
       
  1069                         fragLen -= blockSize;           // explicit IV
       
  1070                     }
       
  1071                     fragLen -= (fragLen % blockSize);   // cannot hold a block
       
  1072                     // No padding for a maximum fragment.
       
  1073                     fragLen -= 1;       // 1 byte padding length field: 0x00
       
  1074                     fragLen -= macLen;
       
  1075 
       
  1076                     break;
       
  1077                 case AEAD_CIPHER:
       
  1078                     fragLen -= recordIvSize;
       
  1079                     fragLen -= tagSize;
       
  1080 
       
  1081                     break;
       
  1082                 default:    // NULL_CIPHER or STREAM_CIPHER
       
  1083                     fragLen -= macLen;
       
  1084             }
       
  1085         }
       
  1086 
       
  1087         return fragLen;
       
  1088     }
       
  1089 
       
  1090     // Estimate the maximum fragment size of a received packet.
       
  1091     int estimateFragmentSize(int packetSize, int macLen, int headerSize) {
       
  1092         int fragLen = packetSize - headerSize;
       
  1093         if (cipher != null) {
       
  1094             int blockSize = cipher.getBlockSize();
       
  1095             switch (cipherType) {
       
  1096                 case BLOCK_CIPHER:
       
  1097                     if (protocolVersion.useTLS11PlusSpec()) {
       
  1098                         fragLen -= blockSize;       // explicit IV
       
  1099                     }
       
  1100                     // No padding for a maximum fragment.
       
  1101                     fragLen -= 1;       // 1 byte padding length field: 0x00
       
  1102                     fragLen -= macLen;
       
  1103 
       
  1104                     break;
       
  1105                 case AEAD_CIPHER:
       
  1106                     fragLen -= recordIvSize;
       
  1107                     fragLen -= tagSize;
       
  1108 
       
  1109                     break;
       
  1110                 default:    // NULL_CIPHER or STREAM_CIPHER
       
  1111                     fragLen -= macLen;
       
  1112             }
       
  1113         }
       
  1114 
       
  1115         return fragLen;
       
  1116     }
       
  1117 
       
  1118     /**
       
  1119      * Sanity check the length of a fragment before decryption.
       
  1120      *
       
  1121      * In CBC mode, check that the fragment length is one or multiple times
       
  1122      * of the block size of the cipher suite, and is at least one (one is the
       
  1123      * smallest size of padding in CBC mode) bigger than the tag size of the
       
  1124      * MAC algorithm except the explicit IV size for TLS 1.1 or later.
       
  1125      *
       
  1126      * In non-CBC mode, check that the fragment length is not less than the
       
  1127      * tag size of the MAC algorithm.
       
  1128      *
       
  1129      * @return true if the length of a fragment matches above requirements
       
  1130      */
       
  1131     private boolean sanityCheck(int tagLen, int fragmentLen) {
       
  1132         if (!isCBCMode()) {
       
  1133             return fragmentLen >= tagLen;
       
  1134         }
       
  1135 
       
  1136         int blockSize = cipher.getBlockSize();
       
  1137         if ((fragmentLen % blockSize) == 0) {
       
  1138             int minimal = tagLen + 1;
       
  1139             minimal = (minimal >= blockSize) ? minimal : blockSize;
       
  1140             if (protocolVersion.useTLS11PlusSpec()) {
       
  1141                 minimal += blockSize;   // plus the size of the explicit IV
       
  1142             }
       
  1143 
       
  1144             return (fragmentLen >= minimal);
       
  1145         }
       
  1146 
       
  1147         return false;
       
  1148     }
       
  1149 
       
  1150 }