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 }