1 /* 2 * Copyright (C) 2014 The Android Open Source Project 3 * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. 4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 5 * 6 * This code is free software; you can redistribute it and/or modify it 7 * under the terms of the GNU General Public License version 2 only, as 8 * published by the Free Software Foundation. Oracle designates this 9 * particular file as subject to the "Classpath" exception as provided 10 * by Oracle in the LICENSE file that accompanied this code. 11 * 12 * This code is distributed in the hope that it will be useful, but WITHOUT 13 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 14 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 15 * version 2 for more details (a copy is included in the LICENSE file that 16 * accompanied this code). 17 * 18 * You should have received a copy of the GNU General Public License version 19 * 2 along with this work; if not, write to the Free Software Foundation, 20 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 21 * 22 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 23 * or visit www.oracle.com if you need additional information or have any 24 * questions. 25 */ 26 27 package javax.crypto; 28 29 import java.util.*; 30 import java.util.concurrent.ConcurrentHashMap; 31 import java.util.concurrent.ConcurrentMap; 32 import java.util.regex.*; 33 34 import static java.util.Locale.ENGLISH; 35 36 import java.security.*; 37 import java.security.Provider.Service; 38 import java.security.spec.AlgorithmParameterSpec; 39 import java.security.spec.InvalidParameterSpecException; 40 import java.security.cert.Certificate; 41 import java.security.cert.X509Certificate; 42 43 import javax.crypto.spec.*; 44 45 import java.nio.ByteBuffer; 46 import java.nio.ReadOnlyBufferException; 47 48 import sun.security.util.Debug; 49 import sun.security.jca.*; 50 import sun.security.jca.GetInstance.Instance; 51 52 /** 53 * This class provides the functionality of a cryptographic cipher for 54 * encryption and decryption. It forms the core of the Java Cryptographic 55 * Extension (JCE) framework. 56 * 57 * <p>In order to create a Cipher object, the application calls the 58 * Cipher's <code>getInstance</code> method, and passes the name of the 59 * requested <i>transformation</i> to it. Optionally, the name of a provider 60 * may be specified. 61 * 62 * <p>A <i>transformation</i> is a string that describes the operation (or 63 * set of operations) to be performed on the given input, to produce some 64 * output. A transformation always includes the name of a cryptographic 65 * algorithm (e.g., <i>DES</i>), and may be followed by a feedback mode and 66 * padding scheme. 67 * 68 * <p> A transformation is of the form:<p> 69 * 70 * <ul> 71 * <li>"<i>algorithm/mode/padding</i>" or 72 * <p> 73 * <li>"<i>algorithm</i>" 74 * </ul> 75 * 76 * <P> (in the latter case, 77 * provider-specific default values for the mode and padding scheme are used). 78 * For example, the following is a valid transformation:<p> 79 * 80 * <pre> 81 * Cipher c = Cipher.getInstance("<i>DES/CBC/PKCS5Padding</i>"); 82 * </pre> 83 * 84 * Using modes such as <code>CFB</code> and <code>OFB</code>, block 85 * ciphers can encrypt data in units smaller than the cipher's actual 86 * block size. When requesting such a mode, you may optionally specify 87 * the number of bits to be processed at a time by appending this number 88 * to the mode name as shown in the "<code>DES/CFB8/NoPadding</code>" and 89 * "<code>DES/OFB32/PKCS5Padding</code>" transformations. If no such 90 * number is specified, a provider-specific default is used. (For 91 * example, the SunJCE provider uses a default of 64 bits for DES.) 92 * Thus, block ciphers can be turned into byte-oriented stream ciphers by 93 * using an 8 bit mode such as CFB8 or OFB8. 94 * <p> 95 * Modes such as Authenticated Encryption with Associated Data (AEAD) 96 * provide authenticity assurances for both confidential data and 97 * Additional Associated Data (AAD) that is not encrypted. (Please see 98 * <a href="http://www.ietf.org/rfc/rfc5116.txt"> RFC 5116 </a> for more 99 * information on AEAD and AEAD algorithms such as GCM/CCM.) Both 100 * confidential and AAD data can be used when calculating the 101 * authentication tag (similar to a {@link Mac}). This tag is appended 102 * to the ciphertext during encryption, and is verified on decryption. 103 * <p> 104 * AEAD modes such as GCM/CCM perform all AAD authenticity calculations 105 * before starting the ciphertext authenticity calculations. To avoid 106 * implementations having to internally buffer ciphertext, all AAD data 107 * must be supplied to GCM/CCM implementations (via the {@code 108 * updateAAD} methods) <b>before</b> the ciphertext is processed (via 109 * the {@code update} and {@code doFinal} methods). 110 * 111 * <pre> 112 * GCMParameterSpec s = new GCMParameterSpec(...); 113 * cipher.init(..., s); 114 * 115 * // If the GCMParameterSpec is needed again 116 * cipher.getParameters().getParameterSpec(GCMParameterSpec.class)); 117 * 118 * cipher.updateAAD(...); // AAD 119 * cipher.update(...); // Multi-part update 120 * cipher.doFinal(...); // conclusion of operation 121 * </pre> 122 * <p> Android provides the following <code>Cipher</code> transformations: 123 * <table> 124 * <thead> 125 * <tr> 126 * <th>Name</th> 127 * <th>Supported (API Levels)</th> 128 * </tr> 129 * </thead> 130 * <tr> 131 * <td>AES/CBC/ISO10126Padding</td> 132 * <td>1+</td> 133 * </tr> 134 * <tr> 135 * <td>AES/CBC/NoPadding</td> 136 * <td>1+</td> 137 * </tr> 138 * <tr> 139 * <td>AES/CBC/PKCS5Padding</td> 140 * <td>1+</td> 141 * </tr> 142 * <tr> 143 * <td>AES/CFB/ISO10126Padding</td> 144 * <td>1+</td> 145 * </tr> 146 * <tr> 147 * <td>AES/CFB/NoPadding</td> 148 * <td>1+</td> 149 * </tr> 150 * <tr> 151 * <td>AES/CFB/PKCS5Padding</td> 152 * <td>1+</td> 153 * </tr> 154 * <tr> 155 * <td>AES/CTR/ISO10126Padding</td> 156 * <td>1+</td> 157 * </tr> 158 * <tr> 159 * <td>AES/CTR/NoPadding</td> 160 * <td>1+</td> 161 * </tr> 162 * <tr> 163 * <td>AES/CTR/PKCS5Padding</td> 164 * <td>1+</td> 165 * </tr> 166 * <tr> 167 * <td>AES/CTS/ISO10126Padding</td> 168 * <td>1+</td> 169 * </tr> 170 * <tr> 171 * <td>AES/CTS/NoPadding</td> 172 * <td>1+</td> 173 * </tr> 174 * <tr> 175 * <td>AES/CTS/PKCS5Padding</td> 176 * <td>1+</td> 177 * </tr> 178 * <tr> 179 * <td>AES/ECB/ISO10126Padding</td> 180 * <td>1+</td> 181 * </tr> 182 * <tr> 183 * <td>AES/ECB/NoPadding</td> 184 * <td>1+</td> 185 * </tr> 186 * <tr> 187 * <td>AES/ECB/PKCS5Padding</td> 188 * <td>1+</td> 189 * </tr> 190 * <tr> 191 * <td>AES/OFB/ISO10126Padding</td> 192 * <td>1+</td> 193 * </tr> 194 * <tr> 195 * <td>AES/OFB/NoPadding</td> 196 * <td>1+</td> 197 * </tr> 198 * <tr> 199 * <td>AES/OFB/PKCS5Padding</td> 200 * <td>1+</td> 201 * </tr> 202 * <tr> 203 * <td>ARCFOUR/ECB/NoPadding</td> 204 * <td>10+</td> 205 * </tr> 206 * <tr> 207 * <td>BLOWFISH/CBC/ISO10126Padding</td> 208 * <td>10+</td> 209 * </tr> 210 * <tr> 211 * <td>BLOWFISH/CBC/NoPadding</td> 212 * <td>10+</td> 213 * </tr> 214 * <tr> 215 * <td>BLOWFISH/CBC/PKCS5Padding</td> 216 * <td>10+</td> 217 * </tr> 218 * <tr> 219 * <td>BLOWFISH/CFB/ISO10126Padding</td> 220 * <td>10+</td> 221 * </tr> 222 * <tr> 223 * <td>BLOWFISH/CFB/NoPadding</td> 224 * <td>10+</td> 225 * </tr> 226 * <tr> 227 * <td>BLOWFISH/CFB/PKCS5Padding</td> 228 * <td>10+</td> 229 * </tr> 230 * <tr> 231 * <td>BLOWFISH/CTR/ISO10126Padding</td> 232 * <td>10+</td> 233 * </tr> 234 * <tr> 235 * <td>BLOWFISH/CTR/NoPadding</td> 236 * <td>10+</td> 237 * </tr> 238 * <tr> 239 * <td>BLOWFISH/CTR/PKCS5Padding</td> 240 * <td>10+</td> 241 * </tr> 242 * <tr> 243 * <td>BLOWFISH/CTS/ISO10126Padding</td> 244 * <td>10+</td> 245 * </tr> 246 * <tr> 247 * <td>BLOWFISH/CTS/NoPadding</td> 248 * <td>10+</td> 249 * </tr> 250 * <tr> 251 * <td>BLOWFISH/CTS/PKCS5Padding</td> 252 * <td>10+</td> 253 * </tr> 254 * <tr> 255 * <td>BLOWFISH/ECB/ISO10126Padding</td> 256 * <td>10+</td> 257 * </tr> 258 * <tr> 259 * <td>BLOWFISH/ECB/NoPadding</td> 260 * <td>10+</td> 261 * </tr> 262 * <tr> 263 * <td>BLOWFISH/ECB/PKCS5Padding</td> 264 * <td>10+</td> 265 * </tr> 266 * <tr> 267 * <td>BLOWFISH/OFB/ISO10126Padding</td> 268 * <td>10+</td> 269 * </tr> 270 * <tr> 271 * <td>BLOWFISH/OFB/NoPadding</td> 272 * <td>10+</td> 273 * </tr> 274 * <tr> 275 * <td>BLOWFISH/OFB/PKCS5Padding</td> 276 * <td>10+</td> 277 * </tr> 278 * <tr> 279 * <td>DES/CBC/ISO10126Padding</td> 280 * <td>1+</td> 281 * </tr> 282 * <tr> 283 * <td>DES/CBC/NoPadding</td> 284 * <td>1+</td> 285 * </tr> 286 * <tr> 287 * <td>DES/CBC/PKCS5Padding</td> 288 * <td>1+</td> 289 * </tr> 290 * <tr> 291 * <td>DES/CFB/ISO10126Padding</td> 292 * <td>1+</td> 293 * </tr> 294 * <tr> 295 * <td>DES/CFB/NoPadding</td> 296 * <td>1+</td> 297 * </tr> 298 * <tr> 299 * <td>DES/CFB/PKCS5Padding</td> 300 * <td>1+</td> 301 * </tr> 302 * <tr> 303 * <td>DES/CTR/ISO10126Padding</td> 304 * <td>1+</td> 305 * </tr> 306 * <tr> 307 * <td>DES/CTR/NoPadding</td> 308 * <td>1+</td> 309 * </tr> 310 * <tr> 311 * <td>DES/CTR/PKCS5Padding</td> 312 * <td>1+</td> 313 * </tr> 314 * <tr> 315 * <td>DES/CTS/ISO10126Padding</td> 316 * <td>1+</td> 317 * </tr> 318 * <tr> 319 * <td>DES/CTS/NoPadding</td> 320 * <td>1+</td> 321 * </tr> 322 * <tr> 323 * <td>DES/CTS/PKCS5Padding</td> 324 * <td>1+</td> 325 * </tr> 326 * <tr> 327 * <td>DES/ECB/ISO10126Padding</td> 328 * <td>1+</td> 329 * </tr> 330 * <tr> 331 * <td>DES/ECB/NoPadding</td> 332 * <td>1+</td> 333 * </tr> 334 * <tr> 335 * <td>DES/ECB/PKCS5Padding</td> 336 * <td>1+</td> 337 * </tr> 338 * <tr> 339 * <td>DES/OFB/ISO10126Padding</td> 340 * <td>1+</td> 341 * </tr> 342 * <tr> 343 * <td>DES/OFB/NoPadding</td> 344 * <td>1+</td> 345 * </tr> 346 * <tr> 347 * <td>DES/OFB/PKCS5Padding</td> 348 * <td>1+</td> 349 * </tr> 350 * <tr> 351 * <td>DESede/CBC/ISO10126Padding</td> 352 * <td>1+</td> 353 * </tr> 354 * <tr> 355 * <td>DESede/CBC/NoPadding</td> 356 * <td>1+</td> 357 * </tr> 358 * <tr> 359 * <td>DESede/CBC/PKCS5Padding</td> 360 * <td>1+</td> 361 * </tr> 362 * <tr> 363 * <td>DESede/CFB/ISO10126Padding</td> 364 * <td>1+</td> 365 * </tr> 366 * <tr> 367 * <td>DESede/CFB/NoPadding</td> 368 * <td>1+</td> 369 * </tr> 370 * <tr> 371 * <td>DESede/CFB/PKCS5Padding</td> 372 * <td>1+</td> 373 * </tr> 374 * <tr> 375 * <td>DESede/CTR/ISO10126Padding</td> 376 * <td>1+</td> 377 * </tr> 378 * <tr> 379 * <td>DESede/CTR/NoPadding</td> 380 * <td>1+</td> 381 * </tr> 382 * <tr> 383 * <td>DESede/CTR/PKCS5Padding</td> 384 * <td>1+</td> 385 * </tr> 386 * <tr> 387 * <td>DESede/CTS/ISO10126Padding</td> 388 * <td>1+</td> 389 * </tr> 390 * <tr> 391 * <td>DESede/CTS/NoPadding</td> 392 * <td>1+</td> 393 * </tr> 394 * <tr> 395 * <td>DESede/CTS/PKCS5Padding</td> 396 * <td>1+</td> 397 * </tr> 398 * <tr> 399 * <td>DESede/ECB/ISO10126Padding</td> 400 * <td>1+</td> 401 * </tr> 402 * <tr> 403 * <td>DESede/ECB/NoPadding</td> 404 * <td>1+</td> 405 * </tr> 406 * <tr> 407 * <td>DESede/ECB/PKCS5Padding</td> 408 * <td>1+</td> 409 * </tr> 410 * <tr> 411 * <td>DESede/OFB/ISO10126Padding</td> 412 * <td>1+</td> 413 * </tr> 414 * <tr> 415 * <td>DESede/OFB/NoPadding</td> 416 * <td>1+</td> 417 * </tr> 418 * <tr> 419 * <td>DESede/OFB/PKCS5Padding</td> 420 * <td>1+</td> 421 * </tr> 422 * <tr> 423 * <td>PBEwithMD5andDES/CBC/ISO10126Padding</td> 424 * <td>1+</td> 425 * </tr> 426 * <tr> 427 * <td>PBEwithMD5andDES/CBC/NoPadding</td> 428 * <td>1+</td> 429 * </tr> 430 * <tr> 431 * <td>PBEwithMD5andDES/CBC/PKCS5Padding</td> 432 * <td>1+</td> 433 * </tr> 434 * <tr> 435 * <td>PBEwithMD5andDES/CFB/ISO10126Padding</td> 436 * <td>1+</td> 437 * </tr> 438 * <tr> 439 * <td>PBEwithMD5andDES/CFB/NoPadding</td> 440 * <td>1+</td> 441 * </tr> 442 * <tr> 443 * <td>PBEwithMD5andDES/CFB/PKCS5Padding</td> 444 * <td>1+</td> 445 * </tr> 446 * <tr> 447 * <td>PBEwithMD5andDES/CTR/ISO10126Padding</td> 448 * <td>1+</td> 449 * </tr> 450 * <tr> 451 * <td>PBEwithMD5andDES/CTR/NoPadding</td> 452 * <td>1+</td> 453 * </tr> 454 * <tr> 455 * <td>PBEwithMD5andDES/CTR/PKCS5Padding</td> 456 * <td>1+</td> 457 * </tr> 458 * <tr> 459 * <td>PBEwithMD5andDES/CTS/ISO10126Padding</td> 460 * <td>1+</td> 461 * </tr> 462 * <tr> 463 * <td>PBEwithMD5andDES/CTS/NoPadding</td> 464 * <td>1+</td> 465 * </tr> 466 * <tr> 467 * <td>PBEwithMD5andDES/CTS/PKCS5Padding</td> 468 * <td>1+</td> 469 * </tr> 470 * <tr> 471 * <td>PBEwithMD5andDES/ECB/ISO10126Padding</td> 472 * <td>1+</td> 473 * </tr> 474 * <tr> 475 * <td>PBEwithMD5andDES/ECB/NoPadding</td> 476 * <td>1+</td> 477 * </tr> 478 * <tr> 479 * <td>PBEwithMD5andDES/ECB/PKCS5Padding</td> 480 * <td>1+</td> 481 * </tr> 482 * <tr> 483 * <td>PBEwithMD5andDES/OFB/ISO10126Padding</td> 484 * <td>1+</td> 485 * </tr> 486 * <tr> 487 * <td>PBEwithMD5andDES/OFB/NoPadding</td> 488 * <td>1+</td> 489 * </tr> 490 * <tr> 491 * <td>PBEwithMD5andDES/OFB/PKCS5Padding</td> 492 * <td>1+</td> 493 * </tr> 494 * <tr> 495 * <td>PBEwithSHA1andDESede/CBC/ISO10126Padding</td> 496 * <td>1+</td> 497 * </tr> 498 * <tr> 499 * <td>PBEwithSHA1andDESede/CBC/NoPadding</td> 500 * <td>1+</td> 501 * </tr> 502 * <tr> 503 * <td>PBEwithSHA1andDESede/CBC/PKCS5Padding</td> 504 * <td>1+</td> 505 * </tr> 506 * <tr> 507 * <td>PBEwithSHA1andDESede/CFB/ISO10126Padding</td> 508 * <td>1+</td> 509 * </tr> 510 * <tr> 511 * <td>PBEwithSHA1andDESede/CFB/NoPadding</td> 512 * <td>1+</td> 513 * </tr> 514 * <tr> 515 * <td>PBEwithSHA1andDESede/CFB/PKCS5Padding</td> 516 * <td>1+</td> 517 * </tr> 518 * <tr> 519 * <td>PBEwithSHA1andDESede/CTR/ISO10126Padding</td> 520 * <td>1+</td> 521 * </tr> 522 * <tr> 523 * <td>PBEwithSHA1andDESede/CTR/NoPadding</td> 524 * <td>1+</td> 525 * </tr> 526 * <tr> 527 * <td>PBEwithSHA1andDESede/CTR/PKCS5Padding</td> 528 * <td>1+</td> 529 * </tr> 530 * <tr> 531 * <td>PBEwithSHA1andDESede/CTS/ISO10126Padding</td> 532 * <td>1+</td> 533 * </tr> 534 * <tr> 535 * <td>PBEwithSHA1andDESede/CTS/NoPadding</td> 536 * <td>1+</td> 537 * </tr> 538 * <tr> 539 * <td>PBEwithSHA1andDESede/CTS/PKCS5Padding</td> 540 * <td>1+</td> 541 * </tr> 542 * <tr> 543 * <td>PBEwithSHA1andDESede/ECB/ISO10126Padding</td> 544 * <td>1+</td> 545 * </tr> 546 * <tr> 547 * <td>PBEwithSHA1andDESede/ECB/NoPadding</td> 548 * <td>1+</td> 549 * </tr> 550 * <tr> 551 * <td>PBEwithSHA1andDESede/ECB/PKCS5Padding</td> 552 * <td>1+</td> 553 * </tr> 554 * <tr> 555 * <td>PBEwithSHA1andDESede/OFB/ISO10126Padding</td> 556 * <td>1+</td> 557 * </tr> 558 * <tr> 559 * <td>PBEwithSHA1andDESede/OFB/NoPadding</td> 560 * <td>1+</td> 561 * </tr> 562 * <tr> 563 * <td>PBEwithSHA1andDESede/OFB/PKCS5Padding</td> 564 * <td>1+</td> 565 * </tr> 566 * <tr> 567 * <td>RC4/ECB/NoPadding</td> 568 * <td>10+</td> 569 * </tr> 570 * <tr> 571 * <td>RSA/ECB/NoPadding</td> 572 * <td>1+</td> 573 * </tr> 574 * <tr> 575 * <td>RSA/ECB/OAEPPadding</td> 576 * <td>1+</td> 577 * </tr> 578 * <tr> 579 * <td>RSA/ECB/OAEPwithSHA-1andMGF1Padding</td> 580 * <td>10+</td> 581 * </tr> 582 * <tr> 583 * <td>RSA/ECB/OAEPwithSHA-256andMGF1Padding</td> 584 * <td>10+</td> 585 * </tr> 586 * <tr> 587 * <td>RSA/ECB/PKCS1Padding</td> 588 * <td>1+</td> 589 * </tr> 590 * <tr> 591 * <td>RSA/NONE/NoPadding</td> 592 * <td>1+</td> 593 * </tr> 594 * <tr> 595 * <td>RSA/NONE/OAEPPadding</td> 596 * <td>1+</td> 597 * </tr> 598 * <tr> 599 * <td>RSA/NONE/OAEPwithSHA-1andMGF1Padding</td> 600 * <td>10+</td> 601 * </tr> 602 * <tr> 603 * <td>RSA/NONE/OAEPwithSHA-256andMGF1Padding</td> 604 * <td>10+</td> 605 * </tr> 606 * <tr> 607 * <td>RSA/NONE/PKCS1Padding</td> 608 * <td>1+</td> 609 * </tr> 610 * </tbody> 611 * </tbody> 612 * </table> 613 * 614 * These transformations are described in the 615 * <a href="{@docRoot}openjdk-redirect.html?v=8&path=/technotes/guides/security/StandardNames.html#Cipher"> 616 * Cipher section</a> of the 617 * Java Cryptography Architecture Standard Algorithm Name Documentation. 618 * 619 * @author Jan Luehe 620 * @see KeyGenerator 621 * @see SecretKey 622 * @since 1.4 623 */ 624 625 public class Cipher { 626 627 private static final Debug debug = 628 Debug.getInstance("jca", "Cipher"); 629 630 /** 631 * Constant used to initialize cipher to encryption mode. 632 */ 633 public static final int ENCRYPT_MODE = 1; 634 635 /** 636 * Constant used to initialize cipher to decryption mode. 637 */ 638 public static final int DECRYPT_MODE = 2; 639 640 /** 641 * Constant used to initialize cipher to key-wrapping mode. 642 */ 643 public static final int WRAP_MODE = 3; 644 645 /** 646 * Constant used to initialize cipher to key-unwrapping mode. 647 */ 648 public static final int UNWRAP_MODE = 4; 649 650 /** 651 * Constant used to indicate the to-be-unwrapped key is a "public key". 652 */ 653 public static final int PUBLIC_KEY = 1; 654 655 /** 656 * Constant used to indicate the to-be-unwrapped key is a "private key". 657 */ 658 public static final int PRIVATE_KEY = 2; 659 660 /** 661 * Constant used to indicate the to-be-unwrapped key is a "secret key". 662 */ 663 public static final int SECRET_KEY = 3; 664 665 // The provider 666 private Provider provider; 667 668 // The provider implementation (delegate) 669 private CipherSpi spi; 670 671 // The transformation 672 final private String transformation; 673 674 // The tokenized version of transformation 675 final private String[] tokenizedTransformation; 676 677 // The exemption mechanism that needs to be enforced 678 private ExemptionMechanism exmech; 679 680 // Flag which indicates whether or not this cipher has been initialized 681 private boolean initialized = false; 682 683 // The operation mode - store the operation mode after the 684 // cipher has been initialized. 685 private int opmode = 0; 686 687 // The OID for the KeyUsage extension in an X.509 v3 certificate 688 private static final String KEY_USAGE_EXTENSION_OID = "2.5.29.15"; 689 690 private final SpiAndProviderUpdater spiAndProviderUpdater; 691 692 693 /** 694 * Creates a Cipher object. 695 * 696 * @param cipherSpi the delegate 697 * @param provider the provider 698 * @param transformation the transformation 699 */ 700 protected Cipher(CipherSpi cipherSpi, 701 Provider provider, 702 String transformation) { 703 if (cipherSpi == null) { 704 throw new NullPointerException("cipherSpi == null"); 705 } 706 if (!(cipherSpi instanceof NullCipherSpi) && provider == null) { 707 throw new NullPointerException("provider == null"); 708 } 709 710 this.spi = cipherSpi; 711 this.provider = provider; 712 this.transformation = transformation; 713 this.tokenizedTransformation = null; 714 715 this.spiAndProviderUpdater = 716 new SpiAndProviderUpdater(provider, cipherSpi); 717 } 718 719 private Cipher(CipherSpi cipherSpi, 720 Provider provider, 721 String transformation, 722 String[] tokenizedTransformation) { 723 this.spi = cipherSpi; 724 this.provider = provider; 725 this.transformation = transformation; 726 this.tokenizedTransformation = tokenizedTransformation; 727 728 this.spiAndProviderUpdater = 729 new SpiAndProviderUpdater(provider, cipherSpi); 730 } 731 732 private static String[] tokenizeTransformation(String transformation) 733 throws NoSuchAlgorithmException { 734 if (transformation == null || transformation.isEmpty()) { 735 throw new NoSuchAlgorithmException("No transformation given"); 736 } 737 /* 738 * array containing the components of a Cipher transformation: 739 * 740 * index 0: algorithm component (e.g., DES) 741 * index 1: feedback component (e.g., CFB) 742 * index 2: padding component (e.g., PKCS5Padding) 743 */ 744 String[] parts = new String[3]; 745 int count = 0; 746 StringTokenizer parser = new StringTokenizer(transformation, "/"); 747 try { 748 while (parser.hasMoreTokens() && count < 3) { 749 parts[count++] = parser.nextToken().trim(); 750 } 751 if (count == 0 || count == 2 || parser.hasMoreTokens()) { 752 throw new NoSuchAlgorithmException("Invalid transformation" 753 + " format:" + 754 transformation); 755 } 756 } catch (NoSuchElementException e) { 757 throw new NoSuchAlgorithmException("Invalid transformation " + 758 "format:" + transformation); 759 } 760 if ((parts[0] == null) || (parts[0].length() == 0)) { 761 throw new NoSuchAlgorithmException("Invalid transformation:" + 762 "algorithm not specified-" 763 + transformation); 764 } 765 return parts; 766 } 767 768 /** 769 * Returns a <code>Cipher</code> object that implements the specified 770 * transformation. 771 * 772 * <p> This method traverses the list of registered security Providers, 773 * starting with the most preferred Provider. 774 * A new Cipher object encapsulating the 775 * CipherSpi implementation from the first 776 * Provider that supports the specified algorithm is returned. 777 * 778 * <p> Note that the list of registered providers may be retrieved via 779 * the {@link Security#getProviders() Security.getProviders()} method. 780 * 781 * @param transformation the name of the transformation, e.g., 782 * <i>DES/CBC/PKCS5Padding</i>. 783 * See the Cipher section in the <a href= 784 * "{@docRoot}openjdk-redirect.html?v=8&path=/technotes/guides/security/StandardNames.html#Cipher"> 785 * Java Cryptography Architecture Standard Algorithm Name Documentation</a> 786 * for information about standard transformation names. 787 * 788 * @return a cipher that implements the requested transformation. 789 * 790 * @exception NoSuchAlgorithmException if <code>transformation</code> 791 * is null, empty, in an invalid format, 792 * or if no Provider supports a CipherSpi implementation for the 793 * specified algorithm. 794 * 795 * @exception NoSuchPaddingException if <code>transformation</code> 796 * contains a padding scheme that is not available. 797 * 798 * @see java.security.Provider 799 */ 800 public static final Cipher getInstance(String transformation) 801 throws NoSuchAlgorithmException, NoSuchPaddingException 802 { 803 return createCipher(transformation, null); 804 } 805 806 /** 807 * Returns a <code>Cipher</code> object that implements the specified 808 * transformation. 809 * 810 * <p> A new Cipher object encapsulating the 811 * CipherSpi implementation from the specified provider 812 * is returned. The specified provider must be registered 813 * in the security provider list. 814 * 815 * <p> Note that the list of registered providers may be retrieved via 816 * the {@link Security#getProviders() Security.getProviders()} method. 817 * 818 * @param transformation the name of the transformation, 819 * e.g., <i>DES/CBC/PKCS5Padding</i>. 820 * See the Cipher section in the <a href= 821 * "{@docRoot}openjdk-redirect.html?v=8&path=/technotes/guides/security/StandardNames.html#Cipher"> 822 * Java Cryptography Architecture Standard Algorithm Name Documentation</a> 823 * for information about standard transformation names. 824 * 825 * @param provider the name of the provider. 826 * 827 * @return a cipher that implements the requested transformation. 828 * 829 * @exception NoSuchAlgorithmException if <code>transformation</code> 830 * is null, empty, in an invalid format, 831 * or if a CipherSpi implementation for the specified algorithm 832 * is not available from the specified provider. 833 * 834 * @exception NoSuchProviderException if the specified provider is not 835 * registered in the security provider list. 836 * 837 * @exception NoSuchPaddingException if <code>transformation</code> 838 * contains a padding scheme that is not available. 839 * 840 * @exception IllegalArgumentException if the <code>provider</code> 841 * is null or empty. 842 * 843 * @see java.security.Provider 844 */ 845 public static final Cipher getInstance(String transformation, 846 String provider) 847 throws NoSuchAlgorithmException, NoSuchProviderException, 848 NoSuchPaddingException 849 { 850 if ((provider == null) || (provider.length() == 0)) { 851 throw new IllegalArgumentException("Missing provider"); 852 } 853 Provider p = Security.getProvider(provider); 854 if (p == null) { 855 throw new NoSuchProviderException("No such provider: " + 856 provider); 857 } 858 return createCipher(transformation, p); 859 } 860 861 /** 862 * Returns a <code>Cipher</code> object that implements the specified 863 * transformation. 864 * 865 * <p> A new Cipher object encapsulating the 866 * CipherSpi implementation from the specified Provider 867 * object is returned. Note that the specified Provider object 868 * does not have to be registered in the provider list. 869 * 870 * @param transformation the name of the transformation, 871 * e.g., <i>DES/CBC/PKCS5Padding</i>. 872 * See the Cipher section in the <a href= 873 * "{@docRoot}openjdk-redirect.html?v=8&path=/technotes/guides/security/StandardNames.html#Cipher"> 874 * Java Cryptography Architecture Standard Algorithm Name Documentation</a> 875 * for information about standard transformation names. 876 * 877 * @param provider the provider. 878 * 879 * @return a cipher that implements the requested transformation. 880 * 881 * @exception NoSuchAlgorithmException if <code>transformation</code> 882 * is null, empty, in an invalid format, 883 * or if a CipherSpi implementation for the specified algorithm 884 * is not available from the specified Provider object. 885 * 886 * @exception NoSuchPaddingException if <code>transformation</code> 887 * contains a padding scheme that is not available. 888 * 889 * @exception IllegalArgumentException if the <code>provider</code> 890 * is null. 891 * 892 * @see java.security.Provider 893 */ 894 public static final Cipher getInstance(String transformation, 895 Provider provider) 896 throws NoSuchAlgorithmException, NoSuchPaddingException 897 { 898 if (provider == null) { 899 throw new IllegalArgumentException("Missing provider"); 900 } 901 return createCipher(transformation, provider); 902 } 903 904 static final Cipher createCipher(String transformation, Provider provider) 905 throws NoSuchAlgorithmException, NoSuchPaddingException { 906 String[] tokenizedTransformation = tokenizeTransformation(transformation); 907 908 CipherSpiAndProvider cipherSpiAndProvider = null; 909 try { 910 cipherSpiAndProvider = 911 tryCombinations(null /*params*/, provider, tokenizedTransformation); 912 } catch (InvalidKeyException | InvalidAlgorithmParameterException e) { 913 // Shouldn't happen. 914 throw new IllegalStateException("Key/Algorithm excepton despite not passing one", e); 915 } 916 917 if (cipherSpiAndProvider == null) { 918 if (provider == null) { 919 throw new NoSuchAlgorithmException("No provider found for " + transformation); 920 } else { 921 throw new NoSuchAlgorithmException("Provider " + provider.getName() 922 + " does not provide " + transformation); 923 } 924 } 925 926 // exceptions and stuff 927 return new Cipher(null, provider, transformation, tokenizedTransformation); 928 } 929 930 /** 931 * Choose the Spi from the first provider available. Used if 932 * delayed provider selection is not possible because init() 933 * is not the first method called. 934 */ 935 void updateProviderIfNeeded() { 936 try { 937 spiAndProviderUpdater.updateAndGetSpiAndProvider(null, spi, provider); 938 } catch (Exception lastException) { 939 ProviderException e = new ProviderException 940 ("Could not construct CipherSpi instance"); 941 if (lastException != null) { 942 e.initCause(lastException); 943 } 944 throw e; 945 } 946 } 947 948 private void chooseProvider(InitType initType, int opmode, Key key, 949 AlgorithmParameterSpec paramSpec, 950 AlgorithmParameters params, SecureRandom random) 951 throws InvalidKeyException, InvalidAlgorithmParameterException { 952 953 try { 954 final InitParams initParams = new InitParams(initType, opmode, key, random, 955 paramSpec, params); 956 spiAndProviderUpdater.updateAndGetSpiAndProvider(initParams, spi, provider); 957 } catch (Exception lastException) { 958 // no working provider found, fail 959 if (lastException instanceof InvalidKeyException) { 960 throw (InvalidKeyException)lastException; 961 } 962 if (lastException instanceof InvalidAlgorithmParameterException) { 963 throw (InvalidAlgorithmParameterException)lastException; 964 } 965 if (lastException instanceof RuntimeException) { 966 throw (RuntimeException)lastException; 967 } 968 String kName = (key != null) ? key.getClass().getName() : "(null)"; 969 throw new InvalidKeyException 970 ("No installed provider supports this key: " 971 + kName, lastException); 972 } 973 } 974 975 /** 976 * Returns the provider of this <code>Cipher</code> object. 977 * 978 * @return the provider of this <code>Cipher</code> object 979 */ 980 public final Provider getProvider() { 981 updateProviderIfNeeded(); 982 return this.provider; 983 } 984 985 /** 986 * Returns the algorithm name of this <code>Cipher</code> object. 987 * 988 * <p>This is the same name that was specified in one of the 989 * <code>getInstance</code> calls that created this <code>Cipher</code> 990 * object.. 991 * 992 * @return the algorithm name of this <code>Cipher</code> object. 993 */ 994 public final String getAlgorithm() { 995 return this.transformation; 996 } 997 998 /** 999 * Returns the block size (in bytes). 1000 * 1001 * @return the block size (in bytes), or 0 if the underlying algorithm is 1002 * not a block cipher 1003 */ 1004 public final int getBlockSize() { 1005 updateProviderIfNeeded(); 1006 return spi.engineGetBlockSize(); 1007 } 1008 1009 /** 1010 * Returns the length in bytes that an output buffer would need to be in 1011 * order to hold the result of the next <code>update</code> or 1012 * <code>doFinal</code> operation, given the input length 1013 * <code>inputLen</code> (in bytes). 1014 * 1015 * <p>This call takes into account any unprocessed (buffered) data from a 1016 * previous <code>update</code> call, padding, and AEAD tagging. 1017 * 1018 * <p>The actual output length of the next <code>update</code> or 1019 * <code>doFinal</code> call may be smaller than the length returned by 1020 * this method. 1021 * 1022 * @param inputLen the input length (in bytes) 1023 * 1024 * @return the required output buffer size (in bytes) 1025 * 1026 * @exception IllegalStateException if this cipher is in a wrong state 1027 * (e.g., has not yet been initialized) 1028 */ 1029 public final int getOutputSize(int inputLen) { 1030 1031 if (!initialized && !(this instanceof NullCipher)) { 1032 throw new IllegalStateException("Cipher not initialized"); 1033 } 1034 if (inputLen < 0) { 1035 throw new IllegalArgumentException("Input size must be equal " + 1036 "to or greater than zero"); 1037 } 1038 updateProviderIfNeeded(); 1039 return spi.engineGetOutputSize(inputLen); 1040 } 1041 1042 /** 1043 * Returns the initialization vector (IV) in a new buffer. 1044 * 1045 * <p>This is useful in the case where a random IV was created, 1046 * or in the context of password-based encryption or 1047 * decryption, where the IV is derived from a user-supplied password. 1048 * 1049 * @return the initialization vector in a new buffer, or null if the 1050 * underlying algorithm does not use an IV, or if the IV has not yet 1051 * been set. 1052 */ 1053 public final byte[] getIV() { 1054 updateProviderIfNeeded(); 1055 return spi.engineGetIV(); 1056 } 1057 1058 /** 1059 * Returns the parameters used with this cipher. 1060 * 1061 * <p>The returned parameters may be the same that were used to initialize 1062 * this cipher, or may contain a combination of default and random 1063 * parameter values used by the underlying cipher implementation if this 1064 * cipher requires algorithm parameters but was not initialized with any. 1065 * 1066 * @return the parameters used with this cipher, or null if this cipher 1067 * does not use any parameters. 1068 */ 1069 public final AlgorithmParameters getParameters() { 1070 updateProviderIfNeeded(); 1071 return spi.engineGetParameters(); 1072 } 1073 1074 /** 1075 * Returns the exemption mechanism object used with this cipher. 1076 * 1077 * @return the exemption mechanism object used with this cipher, or 1078 * null if this cipher does not use any exemption mechanism. 1079 */ 1080 public final ExemptionMechanism getExemptionMechanism() { 1081 updateProviderIfNeeded(); 1082 return exmech; 1083 } 1084 1085 // check if opmode is one of the defined constants 1086 // throw InvalidParameterExeption if not 1087 private static void checkOpmode(int opmode) { 1088 if ((opmode < ENCRYPT_MODE) || (opmode > UNWRAP_MODE)) { 1089 throw new InvalidParameterException("Invalid operation mode"); 1090 } 1091 } 1092 1093 /** 1094 * Initializes this cipher with a key. 1095 * 1096 * <p>The cipher is initialized for one of the following four operations: 1097 * encryption, decryption, key wrapping or key unwrapping, depending 1098 * on the value of <code>opmode</code>. 1099 * 1100 * <p>If this cipher requires any algorithm parameters that cannot be 1101 * derived from the given <code>key</code>, the underlying cipher 1102 * implementation is supposed to generate the required parameters itself 1103 * (using provider-specific default or random values) if it is being 1104 * initialized for encryption or key wrapping, and raise an 1105 * <code>InvalidKeyException</code> if it is being 1106 * initialized for decryption or key unwrapping. 1107 * The generated parameters can be retrieved using 1108 * {@link #getParameters() getParameters} or 1109 * {@link #getIV() getIV} (if the parameter is an IV). 1110 * 1111 * <p>If this cipher requires algorithm parameters that cannot be 1112 * derived from the input parameters, and there are no reasonable 1113 * provider-specific default values, initialization will 1114 * necessarily fail. 1115 * 1116 * <p>If this cipher (including its underlying feedback or padding scheme) 1117 * requires any random bytes (e.g., for parameter generation), it will get 1118 * them using the {@link SecureRandom <code>SecureRandom</code>} 1119 * implementation of the highest-priority 1120 * installed provider as the source of randomness. 1121 * (If none of the installed providers supply an implementation of 1122 * SecureRandom, a system-provided source of randomness will be used.) 1123 * 1124 * <p>Note that when a Cipher object is initialized, it loses all 1125 * previously-acquired state. In other words, initializing a Cipher is 1126 * equivalent to creating a new instance of that Cipher and initializing 1127 * it. 1128 * 1129 * @param opmode the operation mode of this cipher (this is one of 1130 * the following: 1131 * <code>ENCRYPT_MODE</code>, <code>DECRYPT_MODE</code>, 1132 * <code>WRAP_MODE</code> or <code>UNWRAP_MODE</code>) 1133 * @param key the key 1134 * 1135 * @exception InvalidKeyException if the given key is inappropriate for 1136 * initializing this cipher, or requires 1137 * algorithm parameters that cannot be 1138 * determined from the given key, or if the given key has a keysize that 1139 * exceeds the maximum allowable keysize (as determined from the 1140 * configured jurisdiction policy files). 1141 */ 1142 public final void init(int opmode, Key key) throws InvalidKeyException { 1143 init(opmode, key, JceSecurity.RANDOM); 1144 } 1145 1146 /** 1147 * Initializes this cipher with a key and a source of randomness. 1148 * 1149 * <p>The cipher is initialized for one of the following four operations: 1150 * encryption, decryption, key wrapping or key unwrapping, depending 1151 * on the value of <code>opmode</code>. 1152 * 1153 * <p>If this cipher requires any algorithm parameters that cannot be 1154 * derived from the given <code>key</code>, the underlying cipher 1155 * implementation is supposed to generate the required parameters itself 1156 * (using provider-specific default or random values) if it is being 1157 * initialized for encryption or key wrapping, and raise an 1158 * <code>InvalidKeyException</code> if it is being 1159 * initialized for decryption or key unwrapping. 1160 * The generated parameters can be retrieved using 1161 * {@link #getParameters() getParameters} or 1162 * {@link #getIV() getIV} (if the parameter is an IV). 1163 * 1164 * <p>If this cipher requires algorithm parameters that cannot be 1165 * derived from the input parameters, and there are no reasonable 1166 * provider-specific default values, initialization will 1167 * necessarily fail. 1168 * 1169 * <p>If this cipher (including its underlying feedback or padding scheme) 1170 * requires any random bytes (e.g., for parameter generation), it will get 1171 * them from <code>random</code>. 1172 * 1173 * <p>Note that when a Cipher object is initialized, it loses all 1174 * previously-acquired state. In other words, initializing a Cipher is 1175 * equivalent to creating a new instance of that Cipher and initializing 1176 * it. 1177 * 1178 * @param opmode the operation mode of this cipher (this is one of the 1179 * following: 1180 * <code>ENCRYPT_MODE</code>, <code>DECRYPT_MODE</code>, 1181 * <code>WRAP_MODE</code> or <code>UNWRAP_MODE</code>) 1182 * @param key the encryption key 1183 * @param random the source of randomness 1184 * 1185 * @exception InvalidKeyException if the given key is inappropriate for 1186 * initializing this cipher, or requires 1187 * algorithm parameters that cannot be 1188 * determined from the given key, or if the given key has a keysize that 1189 * exceeds the maximum allowable keysize (as determined from the 1190 * configured jurisdiction policy files). 1191 */ 1192 public final void init(int opmode, Key key, SecureRandom random) 1193 throws InvalidKeyException 1194 { 1195 initialized = false; 1196 checkOpmode(opmode); 1197 1198 try { 1199 chooseProvider(InitType.KEY, opmode, key, null, null, random); 1200 } catch (InvalidAlgorithmParameterException e) { 1201 // should never occur 1202 throw new InvalidKeyException(e); 1203 } 1204 1205 initialized = true; 1206 this.opmode = opmode; 1207 } 1208 1209 /** 1210 * Initializes this cipher with a key and a set of algorithm 1211 * parameters. 1212 * 1213 * <p>The cipher is initialized for one of the following four operations: 1214 * encryption, decryption, key wrapping or key unwrapping, depending 1215 * on the value of <code>opmode</code>. 1216 * 1217 * <p>If this cipher requires any algorithm parameters and 1218 * <code>params</code> is null, the underlying cipher implementation is 1219 * supposed to generate the required parameters itself (using 1220 * provider-specific default or random values) if it is being 1221 * initialized for encryption or key wrapping, and raise an 1222 * <code>InvalidAlgorithmParameterException</code> if it is being 1223 * initialized for decryption or key unwrapping. 1224 * The generated parameters can be retrieved using 1225 * {@link #getParameters() getParameters} or 1226 * {@link #getIV() getIV} (if the parameter is an IV). 1227 * 1228 * <p>If this cipher requires algorithm parameters that cannot be 1229 * derived from the input parameters, and there are no reasonable 1230 * provider-specific default values, initialization will 1231 * necessarily fail. 1232 * 1233 * <p>If this cipher (including its underlying feedback or padding scheme) 1234 * requires any random bytes (e.g., for parameter generation), it will get 1235 * them using the {@link SecureRandom <code>SecureRandom</code>} 1236 * implementation of the highest-priority 1237 * installed provider as the source of randomness. 1238 * (If none of the installed providers supply an implementation of 1239 * SecureRandom, a system-provided source of randomness will be used.) 1240 * 1241 * <p>Note that when a Cipher object is initialized, it loses all 1242 * previously-acquired state. In other words, initializing a Cipher is 1243 * equivalent to creating a new instance of that Cipher and initializing 1244 * it. 1245 * 1246 * @param opmode the operation mode of this cipher (this is one of the 1247 * following: 1248 * <code>ENCRYPT_MODE</code>, <code>DECRYPT_MODE</code>, 1249 * <code>WRAP_MODE</code> or <code>UNWRAP_MODE</code>) 1250 * @param key the encryption key 1251 * @param params the algorithm parameters 1252 * 1253 * @exception InvalidKeyException if the given key is inappropriate for 1254 * initializing this cipher, or its keysize exceeds the maximum allowable 1255 * keysize (as determined from the configured jurisdiction policy files). 1256 * @exception InvalidAlgorithmParameterException if the given algorithm 1257 * parameters are inappropriate for this cipher, 1258 * or this cipher requires 1259 * algorithm parameters and <code>params</code> is null, or the given 1260 * algorithm parameters imply a cryptographic strength that would exceed 1261 * the legal limits (as determined from the configured jurisdiction 1262 * policy files). 1263 */ 1264 public final void init(int opmode, Key key, AlgorithmParameterSpec params) 1265 throws InvalidKeyException, InvalidAlgorithmParameterException 1266 { 1267 init(opmode, key, params, JceSecurity.RANDOM); 1268 } 1269 1270 /** 1271 * Initializes this cipher with a key, a set of algorithm 1272 * parameters, and a source of randomness. 1273 * 1274 * <p>The cipher is initialized for one of the following four operations: 1275 * encryption, decryption, key wrapping or key unwrapping, depending 1276 * on the value of <code>opmode</code>. 1277 * 1278 * <p>If this cipher requires any algorithm parameters and 1279 * <code>params</code> is null, the underlying cipher implementation is 1280 * supposed to generate the required parameters itself (using 1281 * provider-specific default or random values) if it is being 1282 * initialized for encryption or key wrapping, and raise an 1283 * <code>InvalidAlgorithmParameterException</code> if it is being 1284 * initialized for decryption or key unwrapping. 1285 * The generated parameters can be retrieved using 1286 * {@link #getParameters() getParameters} or 1287 * {@link #getIV() getIV} (if the parameter is an IV). 1288 * 1289 * <p>If this cipher requires algorithm parameters that cannot be 1290 * derived from the input parameters, and there are no reasonable 1291 * provider-specific default values, initialization will 1292 * necessarily fail. 1293 * 1294 * <p>If this cipher (including its underlying feedback or padding scheme) 1295 * requires any random bytes (e.g., for parameter generation), it will get 1296 * them from <code>random</code>. 1297 * 1298 * <p>Note that when a Cipher object is initialized, it loses all 1299 * previously-acquired state. In other words, initializing a Cipher is 1300 * equivalent to creating a new instance of that Cipher and initializing 1301 * it. 1302 * 1303 * @param opmode the operation mode of this cipher (this is one of the 1304 * following: 1305 * <code>ENCRYPT_MODE</code>, <code>DECRYPT_MODE</code>, 1306 * <code>WRAP_MODE</code> or <code>UNWRAP_MODE</code>) 1307 * @param key the encryption key 1308 * @param params the algorithm parameters 1309 * @param random the source of randomness 1310 * 1311 * @exception InvalidKeyException if the given key is inappropriate for 1312 * initializing this cipher, or its keysize exceeds the maximum allowable 1313 * keysize (as determined from the configured jurisdiction policy files). 1314 * @exception InvalidAlgorithmParameterException if the given algorithm 1315 * parameters are inappropriate for this cipher, 1316 * or this cipher requires 1317 * algorithm parameters and <code>params</code> is null, or the given 1318 * algorithm parameters imply a cryptographic strength that would exceed 1319 * the legal limits (as determined from the configured jurisdiction 1320 * policy files). 1321 */ 1322 public final void init(int opmode, Key key, AlgorithmParameterSpec params, 1323 SecureRandom random) 1324 throws InvalidKeyException, InvalidAlgorithmParameterException 1325 { 1326 initialized = false; 1327 checkOpmode(opmode); 1328 1329 chooseProvider(InitType.ALGORITHM_PARAM_SPEC, opmode, key, params, null, random); 1330 1331 initialized = true; 1332 this.opmode = opmode; 1333 } 1334 1335 /** 1336 * Initializes this cipher with a key and a set of algorithm 1337 * parameters. 1338 * 1339 * <p>The cipher is initialized for one of the following four operations: 1340 * encryption, decryption, key wrapping or key unwrapping, depending 1341 * on the value of <code>opmode</code>. 1342 * 1343 * <p>If this cipher requires any algorithm parameters and 1344 * <code>params</code> is null, the underlying cipher implementation is 1345 * supposed to generate the required parameters itself (using 1346 * provider-specific default or random values) if it is being 1347 * initialized for encryption or key wrapping, and raise an 1348 * <code>InvalidAlgorithmParameterException</code> if it is being 1349 * initialized for decryption or key unwrapping. 1350 * The generated parameters can be retrieved using 1351 * {@link #getParameters() getParameters} or 1352 * {@link #getIV() getIV} (if the parameter is an IV). 1353 * 1354 * <p>If this cipher requires algorithm parameters that cannot be 1355 * derived from the input parameters, and there are no reasonable 1356 * provider-specific default values, initialization will 1357 * necessarily fail. 1358 * 1359 * <p>If this cipher (including its underlying feedback or padding scheme) 1360 * requires any random bytes (e.g., for parameter generation), it will get 1361 * them using the {@link SecureRandom <code>SecureRandom</code>} 1362 * implementation of the highest-priority 1363 * installed provider as the source of randomness. 1364 * (If none of the installed providers supply an implementation of 1365 * SecureRandom, a system-provided source of randomness will be used.) 1366 * 1367 * <p>Note that when a Cipher object is initialized, it loses all 1368 * previously-acquired state. In other words, initializing a Cipher is 1369 * equivalent to creating a new instance of that Cipher and initializing 1370 * it. 1371 * 1372 * @param opmode the operation mode of this cipher (this is one of the 1373 * following: <code>ENCRYPT_MODE</code>, 1374 * <code>DECRYPT_MODE</code>, <code>WRAP_MODE</code> 1375 * or <code>UNWRAP_MODE</code>) 1376 * @param key the encryption key 1377 * @param params the algorithm parameters 1378 * 1379 * @exception InvalidKeyException if the given key is inappropriate for 1380 * initializing this cipher, or its keysize exceeds the maximum allowable 1381 * keysize (as determined from the configured jurisdiction policy files). 1382 * @exception InvalidAlgorithmParameterException if the given algorithm 1383 * parameters are inappropriate for this cipher, 1384 * or this cipher requires 1385 * algorithm parameters and <code>params</code> is null, or the given 1386 * algorithm parameters imply a cryptographic strength that would exceed 1387 * the legal limits (as determined from the configured jurisdiction 1388 * policy files). 1389 */ 1390 public final void init(int opmode, Key key, AlgorithmParameters params) 1391 throws InvalidKeyException, InvalidAlgorithmParameterException 1392 { 1393 init(opmode, key, params, JceSecurity.RANDOM); 1394 } 1395 1396 /** 1397 * Initializes this cipher with a key, a set of algorithm 1398 * parameters, and a source of randomness. 1399 * 1400 * <p>The cipher is initialized for one of the following four operations: 1401 * encryption, decryption, key wrapping or key unwrapping, depending 1402 * on the value of <code>opmode</code>. 1403 * 1404 * <p>If this cipher requires any algorithm parameters and 1405 * <code>params</code> is null, the underlying cipher implementation is 1406 * supposed to generate the required parameters itself (using 1407 * provider-specific default or random values) if it is being 1408 * initialized for encryption or key wrapping, and raise an 1409 * <code>InvalidAlgorithmParameterException</code> if it is being 1410 * initialized for decryption or key unwrapping. 1411 * The generated parameters can be retrieved using 1412 * {@link #getParameters() getParameters} or 1413 * {@link #getIV() getIV} (if the parameter is an IV). 1414 * 1415 * <p>If this cipher requires algorithm parameters that cannot be 1416 * derived from the input parameters, and there are no reasonable 1417 * provider-specific default values, initialization will 1418 * necessarily fail. 1419 * 1420 * <p>If this cipher (including its underlying feedback or padding scheme) 1421 * requires any random bytes (e.g., for parameter generation), it will get 1422 * them from <code>random</code>. 1423 * 1424 * <p>Note that when a Cipher object is initialized, it loses all 1425 * previously-acquired state. In other words, initializing a Cipher is 1426 * equivalent to creating a new instance of that Cipher and initializing 1427 * it. 1428 * 1429 * @param opmode the operation mode of this cipher (this is one of the 1430 * following: <code>ENCRYPT_MODE</code>, 1431 * <code>DECRYPT_MODE</code>, <code>WRAP_MODE</code> 1432 * or <code>UNWRAP_MODE</code>) 1433 * @param key the encryption key 1434 * @param params the algorithm parameters 1435 * @param random the source of randomness 1436 * 1437 * @exception InvalidKeyException if the given key is inappropriate for 1438 * initializing this cipher, or its keysize exceeds the maximum allowable 1439 * keysize (as determined from the configured jurisdiction policy files). 1440 * @exception InvalidAlgorithmParameterException if the given algorithm 1441 * parameters are inappropriate for this cipher, 1442 * or this cipher requires 1443 * algorithm parameters and <code>params</code> is null, or the given 1444 * algorithm parameters imply a cryptographic strength that would exceed 1445 * the legal limits (as determined from the configured jurisdiction 1446 * policy files). 1447 */ 1448 public final void init(int opmode, Key key, AlgorithmParameters params, 1449 SecureRandom random) 1450 throws InvalidKeyException, InvalidAlgorithmParameterException 1451 { 1452 initialized = false; 1453 checkOpmode(opmode); 1454 1455 chooseProvider(InitType.ALGORITHM_PARAMS, opmode, key, null, params, random); 1456 1457 initialized = true; 1458 this.opmode = opmode; 1459 } 1460 1461 /** 1462 * Initializes this cipher with the public key from the given certificate. 1463 * <p> The cipher is initialized for one of the following four operations: 1464 * encryption, decryption, key wrapping or key unwrapping, depending 1465 * on the value of <code>opmode</code>. 1466 * 1467 * <p>If the certificate is of type X.509 and has a <i>key usage</i> 1468 * extension field marked as critical, and the value of the <i>key usage</i> 1469 * extension field implies that the public key in 1470 * the certificate and its corresponding private key are not 1471 * supposed to be used for the operation represented by the value 1472 * of <code>opmode</code>, 1473 * an <code>InvalidKeyException</code> 1474 * is thrown. 1475 * 1476 * <p> If this cipher requires any algorithm parameters that cannot be 1477 * derived from the public key in the given certificate, the underlying 1478 * cipher 1479 * implementation is supposed to generate the required parameters itself 1480 * (using provider-specific default or random values) if it is being 1481 * initialized for encryption or key wrapping, and raise an <code> 1482 * InvalidKeyException</code> if it is being initialized for decryption or 1483 * key unwrapping. 1484 * The generated parameters can be retrieved using 1485 * {@link #getParameters() getParameters} or 1486 * {@link #getIV() getIV} (if the parameter is an IV). 1487 * 1488 * <p>If this cipher requires algorithm parameters that cannot be 1489 * derived from the input parameters, and there are no reasonable 1490 * provider-specific default values, initialization will 1491 * necessarily fail. 1492 * 1493 * <p>If this cipher (including its underlying feedback or padding scheme) 1494 * requires any random bytes (e.g., for parameter generation), it will get 1495 * them using the 1496 * <code>SecureRandom</code> 1497 * implementation of the highest-priority 1498 * installed provider as the source of randomness. 1499 * (If none of the installed providers supply an implementation of 1500 * SecureRandom, a system-provided source of randomness will be used.) 1501 * 1502 * <p>Note that when a Cipher object is initialized, it loses all 1503 * previously-acquired state. In other words, initializing a Cipher is 1504 * equivalent to creating a new instance of that Cipher and initializing 1505 * it. 1506 * 1507 * @param opmode the operation mode of this cipher (this is one of the 1508 * following: 1509 * <code>ENCRYPT_MODE</code>, <code>DECRYPT_MODE</code>, 1510 * <code>WRAP_MODE</code> or <code>UNWRAP_MODE</code>) 1511 * @param certificate the certificate 1512 * 1513 * @exception InvalidKeyException if the public key in the given 1514 * certificate is inappropriate for initializing this cipher, or this 1515 * cipher requires algorithm parameters that cannot be determined from the 1516 * public key in the given certificate, or the keysize of the public key 1517 * in the given certificate has a keysize that exceeds the maximum 1518 * allowable keysize (as determined by the configured jurisdiction policy 1519 * files). 1520 */ 1521 public final void init(int opmode, Certificate certificate) 1522 throws InvalidKeyException 1523 { 1524 init(opmode, certificate, JceSecurity.RANDOM); 1525 } 1526 1527 /** 1528 * Initializes this cipher with the public key from the given certificate 1529 * and 1530 * a source of randomness. 1531 * 1532 * <p>The cipher is initialized for one of the following four operations: 1533 * encryption, decryption, key wrapping 1534 * or key unwrapping, depending on 1535 * the value of <code>opmode</code>. 1536 * 1537 * <p>If the certificate is of type X.509 and has a <i>key usage</i> 1538 * extension field marked as critical, and the value of the <i>key usage</i> 1539 * extension field implies that the public key in 1540 * the certificate and its corresponding private key are not 1541 * supposed to be used for the operation represented by the value of 1542 * <code>opmode</code>, 1543 * an <code>InvalidKeyException</code> 1544 * is thrown. 1545 * 1546 * <p>If this cipher requires any algorithm parameters that cannot be 1547 * derived from the public key in the given <code>certificate</code>, 1548 * the underlying cipher 1549 * implementation is supposed to generate the required parameters itself 1550 * (using provider-specific default or random values) if it is being 1551 * initialized for encryption or key wrapping, and raise an 1552 * <code>InvalidKeyException</code> if it is being 1553 * initialized for decryption or key unwrapping. 1554 * The generated parameters can be retrieved using 1555 * {@link #getParameters() getParameters} or 1556 * {@link #getIV() getIV} (if the parameter is an IV). 1557 * 1558 * <p>If this cipher requires algorithm parameters that cannot be 1559 * derived from the input parameters, and there are no reasonable 1560 * provider-specific default values, initialization will 1561 * necessarily fail. 1562 * 1563 * <p>If this cipher (including its underlying feedback or padding scheme) 1564 * requires any random bytes (e.g., for parameter generation), it will get 1565 * them from <code>random</code>. 1566 * 1567 * <p>Note that when a Cipher object is initialized, it loses all 1568 * previously-acquired state. In other words, initializing a Cipher is 1569 * equivalent to creating a new instance of that Cipher and initializing 1570 * it. 1571 * 1572 * @param opmode the operation mode of this cipher (this is one of the 1573 * following: 1574 * <code>ENCRYPT_MODE</code>, <code>DECRYPT_MODE</code>, 1575 * <code>WRAP_MODE</code> or <code>UNWRAP_MODE</code>) 1576 * @param certificate the certificate 1577 * @param random the source of randomness 1578 * 1579 * @exception InvalidKeyException if the public key in the given 1580 * certificate is inappropriate for initializing this cipher, or this 1581 * cipher 1582 * requires algorithm parameters that cannot be determined from the 1583 * public key in the given certificate, or the keysize of the public key 1584 * in the given certificate has a keysize that exceeds the maximum 1585 * allowable keysize (as determined by the configured jurisdiction policy 1586 * files). 1587 */ 1588 public final void init(int opmode, Certificate certificate, 1589 SecureRandom random) 1590 throws InvalidKeyException { 1591 initialized = false; 1592 checkOpmode(opmode); 1593 1594 // Check key usage if the certificate is of 1595 // type X.509. 1596 if (certificate instanceof java.security.cert.X509Certificate) { 1597 // Check whether the cert has a key usage extension 1598 // marked as a critical extension. 1599 X509Certificate cert = (X509Certificate) certificate; 1600 Set critSet = cert.getCriticalExtensionOIDs(); 1601 1602 if (critSet != null && !critSet.isEmpty() 1603 && critSet.contains(KEY_USAGE_EXTENSION_OID)) { 1604 boolean[] keyUsageInfo = cert.getKeyUsage(); 1605 // keyUsageInfo[2] is for keyEncipherment; 1606 // keyUsageInfo[3] is for dataEncipherment. 1607 if ((keyUsageInfo != null) && 1608 (((opmode == Cipher.ENCRYPT_MODE) && 1609 (keyUsageInfo.length > 3) && 1610 (keyUsageInfo[3] == false)) || 1611 ((opmode == Cipher.WRAP_MODE) && 1612 (keyUsageInfo.length > 2) && 1613 (keyUsageInfo[2] == false)))) { 1614 throw new InvalidKeyException("Wrong key usage"); 1615 } 1616 } 1617 } 1618 1619 PublicKey publicKey = 1620 (certificate == null ? null : certificate.getPublicKey()); 1621 1622 try { 1623 chooseProvider(InitType.KEY, opmode, (Key) publicKey, null, null, random); 1624 } catch (InvalidAlgorithmParameterException e) { 1625 // should never occur 1626 throw new InvalidKeyException(e); 1627 } 1628 1629 initialized = true; 1630 this.opmode = opmode; 1631 } 1632 1633 /** 1634 * Ensures that Cipher is in a valid state for update() and doFinal() 1635 * calls - should be initialized and in ENCRYPT_MODE or DECRYPT_MODE. 1636 * @throws IllegalStateException if Cipher object is not in valid state. 1637 */ 1638 private void checkCipherState() { 1639 if (!(this instanceof NullCipher)) { 1640 if (!initialized) { 1641 throw new IllegalStateException("Cipher not initialized"); 1642 } 1643 if ((opmode != Cipher.ENCRYPT_MODE) && 1644 (opmode != Cipher.DECRYPT_MODE)) { 1645 throw new IllegalStateException("Cipher not initialized " + 1646 "for encryption/decryption"); 1647 } 1648 } 1649 } 1650 1651 /** 1652 * Continues a multiple-part encryption or decryption operation 1653 * (depending on how this cipher was initialized), processing another data 1654 * part. 1655 * 1656 * <p>The bytes in the <code>input</code> buffer are processed, and the 1657 * result is stored in a new buffer. 1658 * 1659 * <p>If <code>input</code> has a length of zero, this method returns 1660 * <code>null</code>. 1661 * 1662 * @param input the input buffer 1663 * 1664 * @return the new buffer with the result, or null if the underlying 1665 * cipher is a block cipher and the input data is too short to result in a 1666 * new block. 1667 * 1668 * @exception IllegalStateException if this cipher is in a wrong state 1669 * (e.g., has not been initialized) 1670 */ 1671 public final byte[] update(byte[] input) { 1672 checkCipherState(); 1673 1674 // Input sanity check 1675 if (input == null) { 1676 throw new IllegalArgumentException("Null input buffer"); 1677 } 1678 1679 updateProviderIfNeeded(); 1680 if (input.length == 0) { 1681 return null; 1682 } 1683 return spi.engineUpdate(input, 0, input.length); 1684 } 1685 1686 /** 1687 * Continues a multiple-part encryption or decryption operation 1688 * (depending on how this cipher was initialized), processing another data 1689 * part. 1690 * 1691 * <p>The first <code>inputLen</code> bytes in the <code>input</code> 1692 * buffer, starting at <code>inputOffset</code> inclusive, are processed, 1693 * and the result is stored in a new buffer. 1694 * 1695 * <p>If <code>inputLen</code> is zero, this method returns 1696 * <code>null</code>. 1697 * 1698 * @param input the input buffer 1699 * @param inputOffset the offset in <code>input</code> where the input 1700 * starts 1701 * @param inputLen the input length 1702 * 1703 * @return the new buffer with the result, or null if the underlying 1704 * cipher is a block cipher and the input data is too short to result in a 1705 * new block. 1706 * 1707 * @exception IllegalStateException if this cipher is in a wrong state 1708 * (e.g., has not been initialized) 1709 */ 1710 public final byte[] update(byte[] input, int inputOffset, int inputLen) { 1711 checkCipherState(); 1712 1713 // Input sanity check 1714 if (input == null || inputOffset < 0 1715 || inputLen > (input.length - inputOffset) || inputLen < 0) { 1716 throw new IllegalArgumentException("Bad arguments"); 1717 } 1718 1719 updateProviderIfNeeded(); 1720 if (inputLen == 0) { 1721 return null; 1722 } 1723 return spi.engineUpdate(input, inputOffset, inputLen); 1724 } 1725 1726 /** 1727 * Continues a multiple-part encryption or decryption operation 1728 * (depending on how this cipher was initialized), processing another data 1729 * part. 1730 * 1731 * <p>The first <code>inputLen</code> bytes in the <code>input</code> 1732 * buffer, starting at <code>inputOffset</code> inclusive, are processed, 1733 * and the result is stored in the <code>output</code> buffer. 1734 * 1735 * <p>If the <code>output</code> buffer is too small to hold the result, 1736 * a <code>ShortBufferException</code> is thrown. In this case, repeat this 1737 * call with a larger output buffer. Use 1738 * {@link #getOutputSize(int) getOutputSize} to determine how big 1739 * the output buffer should be. 1740 * 1741 * <p>If <code>inputLen</code> is zero, this method returns 1742 * a length of zero. 1743 * 1744 * <p>Note: this method should be copy-safe, which means the 1745 * <code>input</code> and <code>output</code> buffers can reference 1746 * the same byte array and no unprocessed input data is overwritten 1747 * when the result is copied into the output buffer. 1748 * 1749 * @param input the input buffer 1750 * @param inputOffset the offset in <code>input</code> where the input 1751 * starts 1752 * @param inputLen the input length 1753 * @param output the buffer for the result 1754 * 1755 * @return the number of bytes stored in <code>output</code> 1756 * 1757 * @exception IllegalStateException if this cipher is in a wrong state 1758 * (e.g., has not been initialized) 1759 * @exception ShortBufferException if the given output buffer is too small 1760 * to hold the result 1761 */ 1762 public final int update(byte[] input, int inputOffset, int inputLen, 1763 byte[] output) 1764 throws ShortBufferException { 1765 checkCipherState(); 1766 1767 // Input sanity check 1768 if (input == null || inputOffset < 0 1769 || inputLen > (input.length - inputOffset) || inputLen < 0) { 1770 throw new IllegalArgumentException("Bad arguments"); 1771 } 1772 1773 updateProviderIfNeeded(); 1774 if (inputLen == 0) { 1775 return 0; 1776 } 1777 return spi.engineUpdate(input, inputOffset, inputLen, 1778 output, 0); 1779 } 1780 1781 /** 1782 * Continues a multiple-part encryption or decryption operation 1783 * (depending on how this cipher was initialized), processing another data 1784 * part. 1785 * 1786 * <p>The first <code>inputLen</code> bytes in the <code>input</code> 1787 * buffer, starting at <code>inputOffset</code> inclusive, are processed, 1788 * and the result is stored in the <code>output</code> buffer, starting at 1789 * <code>outputOffset</code> inclusive. 1790 * 1791 * <p>If the <code>output</code> buffer is too small to hold the result, 1792 * a <code>ShortBufferException</code> is thrown. In this case, repeat this 1793 * call with a larger output buffer. Use 1794 * {@link #getOutputSize(int) getOutputSize} to determine how big 1795 * the output buffer should be. 1796 * 1797 * <p>If <code>inputLen</code> is zero, this method returns 1798 * a length of zero. 1799 * 1800 * <p>Note: this method should be copy-safe, which means the 1801 * <code>input</code> and <code>output</code> buffers can reference 1802 * the same byte array and no unprocessed input data is overwritten 1803 * when the result is copied into the output buffer. 1804 * 1805 * @param input the input buffer 1806 * @param inputOffset the offset in <code>input</code> where the input 1807 * starts 1808 * @param inputLen the input length 1809 * @param output the buffer for the result 1810 * @param outputOffset the offset in <code>output</code> where the result 1811 * is stored 1812 * 1813 * @return the number of bytes stored in <code>output</code> 1814 * 1815 * @exception IllegalStateException if this cipher is in a wrong state 1816 * (e.g., has not been initialized) 1817 * @exception ShortBufferException if the given output buffer is too small 1818 * to hold the result 1819 */ 1820 public final int update(byte[] input, int inputOffset, int inputLen, 1821 byte[] output, int outputOffset) 1822 throws ShortBufferException { 1823 checkCipherState(); 1824 1825 // Input sanity check 1826 if (input == null || inputOffset < 0 1827 || inputLen > (input.length - inputOffset) || inputLen < 0 1828 || outputOffset < 0) { 1829 throw new IllegalArgumentException("Bad arguments"); 1830 } 1831 1832 updateProviderIfNeeded(); 1833 if (inputLen == 0) { 1834 return 0; 1835 } 1836 return spi.engineUpdate(input, inputOffset, inputLen, 1837 output, outputOffset); 1838 } 1839 1840 /** 1841 * Continues a multiple-part encryption or decryption operation 1842 * (depending on how this cipher was initialized), processing another data 1843 * part. 1844 * 1845 * <p>All <code>input.remaining()</code> bytes starting at 1846 * <code>input.position()</code> are processed. The result is stored 1847 * in the output buffer. 1848 * Upon return, the input buffer's position will be equal 1849 * to its limit; its limit will not have changed. The output buffer's 1850 * position will have advanced by n, where n is the value returned 1851 * by this method; the output buffer's limit will not have changed. 1852 * 1853 * <p>If <code>output.remaining()</code> bytes are insufficient to 1854 * hold the result, a <code>ShortBufferException</code> is thrown. 1855 * In this case, repeat this call with a larger output buffer. Use 1856 * {@link #getOutputSize(int) getOutputSize} to determine how big 1857 * the output buffer should be. 1858 * 1859 * <p>Note: this method should be copy-safe, which means the 1860 * <code>input</code> and <code>output</code> buffers can reference 1861 * the same block of memory and no unprocessed input data is overwritten 1862 * when the result is copied into the output buffer. 1863 * 1864 * @param input the input ByteBuffer 1865 * @param output the output ByteByffer 1866 * 1867 * @return the number of bytes stored in <code>output</code> 1868 * 1869 * @exception IllegalStateException if this cipher is in a wrong state 1870 * (e.g., has not been initialized) 1871 * @exception IllegalArgumentException if input and output are the 1872 * same object 1873 * @exception ReadOnlyBufferException if the output buffer is read-only 1874 * @exception ShortBufferException if there is insufficient space in the 1875 * output buffer 1876 * @since 1.5 1877 */ 1878 public final int update(ByteBuffer input, ByteBuffer output) 1879 throws ShortBufferException { 1880 checkCipherState(); 1881 1882 if ((input == null) || (output == null)) { 1883 throw new IllegalArgumentException("Buffers must not be null"); 1884 } 1885 if (input == output) { 1886 throw new IllegalArgumentException("Input and output buffers must " 1887 + "not be the same object, consider using buffer.duplicate()"); 1888 } 1889 if (output.isReadOnly()) { 1890 throw new ReadOnlyBufferException(); 1891 } 1892 1893 updateProviderIfNeeded(); 1894 return spi.engineUpdate(input, output); 1895 } 1896 1897 /** 1898 * Finishes a multiple-part encryption or decryption operation, depending 1899 * on how this cipher was initialized. 1900 * 1901 * <p>Input data that may have been buffered during a previous 1902 * <code>update</code> operation is processed, with padding (if requested) 1903 * being applied. 1904 * If an AEAD mode such as GCM/CCM is being used, the authentication 1905 * tag is appended in the case of encryption, or verified in the 1906 * case of decryption. 1907 * The result is stored in a new buffer. 1908 * 1909 * <p>Upon finishing, this method resets this cipher object to the state 1910 * it was in when previously initialized via a call to <code>init</code>. 1911 * That is, the object is reset and available to encrypt or decrypt 1912 * (depending on the operation mode that was specified in the call to 1913 * <code>init</code>) more data. 1914 * 1915 * <p>Note: if any exception is thrown, this cipher object may need to 1916 * be reset before it can be used again. 1917 * 1918 * @return the new buffer with the result 1919 * 1920 * @exception IllegalStateException if this cipher is in a wrong state 1921 * (e.g., has not been initialized) 1922 * @exception IllegalBlockSizeException if this cipher is a block cipher, 1923 * no padding has been requested (only in encryption mode), and the total 1924 * input length of the data processed by this cipher is not a multiple of 1925 * block size; or if this encryption algorithm is unable to 1926 * process the input data provided. 1927 * @exception BadPaddingException if this cipher is in decryption mode, 1928 * and (un)padding has been requested, but the decrypted data is not 1929 * bounded by the appropriate padding bytes 1930 * @exception AEADBadTagException if this cipher is decrypting in an 1931 * AEAD mode (such as GCM/CCM), and the received authentication tag 1932 * does not match the calculated value 1933 */ 1934 public final byte[] doFinal() 1935 throws IllegalBlockSizeException, BadPaddingException { 1936 checkCipherState(); 1937 1938 updateProviderIfNeeded(); 1939 return spi.engineDoFinal(null, 0, 0); 1940 } 1941 1942 /** 1943 * Finishes a multiple-part encryption or decryption operation, depending 1944 * on how this cipher was initialized. 1945 * 1946 * <p>Input data that may have been buffered during a previous 1947 * <code>update</code> operation is processed, with padding (if requested) 1948 * being applied. 1949 * If an AEAD mode such as GCM/CCM is being used, the authentication 1950 * tag is appended in the case of encryption, or verified in the 1951 * case of decryption. 1952 * The result is stored in the <code>output</code> buffer, starting at 1953 * <code>outputOffset</code> inclusive. 1954 * 1955 * <p>If the <code>output</code> buffer is too small to hold the result, 1956 * a <code>ShortBufferException</code> is thrown. In this case, repeat this 1957 * call with a larger output buffer. Use 1958 * {@link #getOutputSize(int) getOutputSize} to determine how big 1959 * the output buffer should be. 1960 * 1961 * <p>Upon finishing, this method resets this cipher object to the state 1962 * it was in when previously initialized via a call to <code>init</code>. 1963 * That is, the object is reset and available to encrypt or decrypt 1964 * (depending on the operation mode that was specified in the call to 1965 * <code>init</code>) more data. 1966 * 1967 * <p>Note: if any exception is thrown, this cipher object may need to 1968 * be reset before it can be used again. 1969 * 1970 * @param output the buffer for the result 1971 * @param outputOffset the offset in <code>output</code> where the result 1972 * is stored 1973 * 1974 * @return the number of bytes stored in <code>output</code> 1975 * 1976 * @exception IllegalStateException if this cipher is in a wrong state 1977 * (e.g., has not been initialized) 1978 * @exception IllegalBlockSizeException if this cipher is a block cipher, 1979 * no padding has been requested (only in encryption mode), and the total 1980 * input length of the data processed by this cipher is not a multiple of 1981 * block size; or if this encryption algorithm is unable to 1982 * process the input data provided. 1983 * @exception ShortBufferException if the given output buffer is too small 1984 * to hold the result 1985 * @exception BadPaddingException if this cipher is in decryption mode, 1986 * and (un)padding has been requested, but the decrypted data is not 1987 * bounded by the appropriate padding bytes 1988 * @exception AEADBadTagException if this cipher is decrypting in an 1989 * AEAD mode (such as GCM/CCM), and the received authentication tag 1990 * does not match the calculated value 1991 */ 1992 public final int doFinal(byte[] output, int outputOffset) 1993 throws IllegalBlockSizeException, ShortBufferException, 1994 BadPaddingException { 1995 checkCipherState(); 1996 1997 // Input sanity check 1998 if ((output == null) || (outputOffset < 0)) { 1999 throw new IllegalArgumentException("Bad arguments"); 2000 } 2001 2002 updateProviderIfNeeded(); 2003 return spi.engineDoFinal(null, 0, 0, output, outputOffset); 2004 } 2005 2006 /** 2007 * Encrypts or decrypts data in a single-part operation, or finishes a 2008 * multiple-part operation. The data is encrypted or decrypted, 2009 * depending on how this cipher was initialized. 2010 * 2011 * <p>The bytes in the <code>input</code> buffer, and any input bytes that 2012 * may have been buffered during a previous <code>update</code> operation, 2013 * are processed, with padding (if requested) being applied. 2014 * If an AEAD mode such as GCM/CCM is being used, the authentication 2015 * tag is appended in the case of encryption, or verified in the 2016 * case of decryption. 2017 * The result is stored in a new buffer. 2018 * 2019 * <p>Upon finishing, this method resets this cipher object to the state 2020 * it was in when previously initialized via a call to <code>init</code>. 2021 * That is, the object is reset and available to encrypt or decrypt 2022 * (depending on the operation mode that was specified in the call to 2023 * <code>init</code>) more data. 2024 * 2025 * <p>Note: if any exception is thrown, this cipher object may need to 2026 * be reset before it can be used again. 2027 * 2028 * @param input the input buffer 2029 * 2030 * @return the new buffer with the result 2031 * 2032 * @exception IllegalStateException if this cipher is in a wrong state 2033 * (e.g., has not been initialized) 2034 * @exception IllegalBlockSizeException if this cipher is a block cipher, 2035 * no padding has been requested (only in encryption mode), and the total 2036 * input length of the data processed by this cipher is not a multiple of 2037 * block size; or if this encryption algorithm is unable to 2038 * process the input data provided. 2039 * @exception BadPaddingException if this cipher is in decryption mode, 2040 * and (un)padding has been requested, but the decrypted data is not 2041 * bounded by the appropriate padding bytes 2042 * @exception AEADBadTagException if this cipher is decrypting in an 2043 * AEAD mode (such as GCM/CCM), and the received authentication tag 2044 * does not match the calculated value 2045 */ 2046 public final byte[] doFinal(byte[] input) 2047 throws IllegalBlockSizeException, BadPaddingException { 2048 checkCipherState(); 2049 2050 // Input sanity check 2051 if (input == null) { 2052 throw new IllegalArgumentException("Null input buffer"); 2053 } 2054 2055 updateProviderIfNeeded(); 2056 return spi.engineDoFinal(input, 0, input.length); 2057 } 2058 2059 /** 2060 * Encrypts or decrypts data in a single-part operation, or finishes a 2061 * multiple-part operation. The data is encrypted or decrypted, 2062 * depending on how this cipher was initialized. 2063 * 2064 * <p>The first <code>inputLen</code> bytes in the <code>input</code> 2065 * buffer, starting at <code>inputOffset</code> inclusive, and any input 2066 * bytes that may have been buffered during a previous <code>update</code> 2067 * operation, are processed, with padding (if requested) being applied. 2068 * If an AEAD mode such as GCM/CCM is being used, the authentication 2069 * tag is appended in the case of encryption, or verified in the 2070 * case of decryption. 2071 * The result is stored in a new buffer. 2072 * 2073 * <p>Upon finishing, this method resets this cipher object to the state 2074 * it was in when previously initialized via a call to <code>init</code>. 2075 * That is, the object is reset and available to encrypt or decrypt 2076 * (depending on the operation mode that was specified in the call to 2077 * <code>init</code>) more data. 2078 * 2079 * <p>Note: if any exception is thrown, this cipher object may need to 2080 * be reset before it can be used again. 2081 * 2082 * @param input the input buffer 2083 * @param inputOffset the offset in <code>input</code> where the input 2084 * starts 2085 * @param inputLen the input length 2086 * 2087 * @return the new buffer with the result 2088 * 2089 * @exception IllegalStateException if this cipher is in a wrong state 2090 * (e.g., has not been initialized) 2091 * @exception IllegalBlockSizeException if this cipher is a block cipher, 2092 * no padding has been requested (only in encryption mode), and the total 2093 * input length of the data processed by this cipher is not a multiple of 2094 * block size; or if this encryption algorithm is unable to 2095 * process the input data provided. 2096 * @exception BadPaddingException if this cipher is in decryption mode, 2097 * and (un)padding has been requested, but the decrypted data is not 2098 * bounded by the appropriate padding bytes 2099 * @exception AEADBadTagException if this cipher is decrypting in an 2100 * AEAD mode (such as GCM/CCM), and the received authentication tag 2101 * does not match the calculated value 2102 */ 2103 public final byte[] doFinal(byte[] input, int inputOffset, int inputLen) 2104 throws IllegalBlockSizeException, BadPaddingException { 2105 checkCipherState(); 2106 2107 // Input sanity check 2108 if (input == null || inputOffset < 0 2109 || inputLen > (input.length - inputOffset) || inputLen < 0) { 2110 throw new IllegalArgumentException("Bad arguments"); 2111 } 2112 2113 updateProviderIfNeeded(); 2114 return spi.engineDoFinal(input, inputOffset, inputLen); 2115 } 2116 2117 /** 2118 * Encrypts or decrypts data in a single-part operation, or finishes a 2119 * multiple-part operation. The data is encrypted or decrypted, 2120 * depending on how this cipher was initialized. 2121 * 2122 * <p>The first <code>inputLen</code> bytes in the <code>input</code> 2123 * buffer, starting at <code>inputOffset</code> inclusive, and any input 2124 * bytes that may have been buffered during a previous <code>update</code> 2125 * operation, are processed, with padding (if requested) being applied. 2126 * If an AEAD mode such as GCM/CCM is being used, the authentication 2127 * tag is appended in the case of encryption, or verified in the 2128 * case of decryption. 2129 * The result is stored in the <code>output</code> buffer. 2130 * 2131 * <p>If the <code>output</code> buffer is too small to hold the result, 2132 * a <code>ShortBufferException</code> is thrown. In this case, repeat this 2133 * call with a larger output buffer. Use 2134 * {@link #getOutputSize(int) getOutputSize} to determine how big 2135 * the output buffer should be. 2136 * 2137 * <p>Upon finishing, this method resets this cipher object to the state 2138 * it was in when previously initialized via a call to <code>init</code>. 2139 * That is, the object is reset and available to encrypt or decrypt 2140 * (depending on the operation mode that was specified in the call to 2141 * <code>init</code>) more data. 2142 * 2143 * <p>Note: if any exception is thrown, this cipher object may need to 2144 * be reset before it can be used again. 2145 * 2146 * <p>Note: this method should be copy-safe, which means the 2147 * <code>input</code> and <code>output</code> buffers can reference 2148 * the same byte array and no unprocessed input data is overwritten 2149 * when the result is copied into the output buffer. 2150 * 2151 * @param input the input buffer 2152 * @param inputOffset the offset in <code>input</code> where the input 2153 * starts 2154 * @param inputLen the input length 2155 * @param output the buffer for the result 2156 * 2157 * @return the number of bytes stored in <code>output</code> 2158 * 2159 * @exception IllegalStateException if this cipher is in a wrong state 2160 * (e.g., has not been initialized) 2161 * @exception IllegalBlockSizeException if this cipher is a block cipher, 2162 * no padding has been requested (only in encryption mode), and the total 2163 * input length of the data processed by this cipher is not a multiple of 2164 * block size; or if this encryption algorithm is unable to 2165 * process the input data provided. 2166 * @exception ShortBufferException if the given output buffer is too small 2167 * to hold the result 2168 * @exception BadPaddingException if this cipher is in decryption mode, 2169 * and (un)padding has been requested, but the decrypted data is not 2170 * bounded by the appropriate padding bytes 2171 * @exception AEADBadTagException if this cipher is decrypting in an 2172 * AEAD mode (such as GCM/CCM), and the received authentication tag 2173 * does not match the calculated value 2174 */ 2175 public final int doFinal(byte[] input, int inputOffset, int inputLen, 2176 byte[] output) 2177 throws ShortBufferException, IllegalBlockSizeException, 2178 BadPaddingException { 2179 checkCipherState(); 2180 2181 // Input sanity check 2182 if (input == null || inputOffset < 0 2183 || inputLen > (input.length - inputOffset) || inputLen < 0) { 2184 throw new IllegalArgumentException("Bad arguments"); 2185 } 2186 2187 updateProviderIfNeeded(); 2188 return spi.engineDoFinal(input, inputOffset, inputLen, 2189 output, 0); 2190 } 2191 2192 /** 2193 * Encrypts or decrypts data in a single-part operation, or finishes a 2194 * multiple-part operation. The data is encrypted or decrypted, 2195 * depending on how this cipher was initialized. 2196 * 2197 * <p>The first <code>inputLen</code> bytes in the <code>input</code> 2198 * buffer, starting at <code>inputOffset</code> inclusive, and any input 2199 * bytes that may have been buffered during a previous 2200 * <code>update</code> operation, are processed, with padding 2201 * (if requested) being applied. 2202 * If an AEAD mode such as GCM/CCM is being used, the authentication 2203 * tag is appended in the case of encryption, or verified in the 2204 * case of decryption. 2205 * The result is stored in the <code>output</code> buffer, starting at 2206 * <code>outputOffset</code> inclusive. 2207 * 2208 * <p>If the <code>output</code> buffer is too small to hold the result, 2209 * a <code>ShortBufferException</code> is thrown. In this case, repeat this 2210 * call with a larger output buffer. Use 2211 * {@link #getOutputSize(int) getOutputSize} to determine how big 2212 * the output buffer should be. 2213 * 2214 * <p>Upon finishing, this method resets this cipher object to the state 2215 * it was in when previously initialized via a call to <code>init</code>. 2216 * That is, the object is reset and available to encrypt or decrypt 2217 * (depending on the operation mode that was specified in the call to 2218 * <code>init</code>) more data. 2219 * 2220 * <p>Note: if any exception is thrown, this cipher object may need to 2221 * be reset before it can be used again. 2222 * 2223 * <p>Note: this method should be copy-safe, which means the 2224 * <code>input</code> and <code>output</code> buffers can reference 2225 * the same byte array and no unprocessed input data is overwritten 2226 * when the result is copied into the output buffer. 2227 * 2228 * @param input the input buffer 2229 * @param inputOffset the offset in <code>input</code> where the input 2230 * starts 2231 * @param inputLen the input length 2232 * @param output the buffer for the result 2233 * @param outputOffset the offset in <code>output</code> where the result 2234 * is stored 2235 * 2236 * @return the number of bytes stored in <code>output</code> 2237 * 2238 * @exception IllegalStateException if this cipher is in a wrong state 2239 * (e.g., has not been initialized) 2240 * @exception IllegalBlockSizeException if this cipher is a block cipher, 2241 * no padding has been requested (only in encryption mode), and the total 2242 * input length of the data processed by this cipher is not a multiple of 2243 * block size; or if this encryption algorithm is unable to 2244 * process the input data provided. 2245 * @exception ShortBufferException if the given output buffer is too small 2246 * to hold the result 2247 * @exception BadPaddingException if this cipher is in decryption mode, 2248 * and (un)padding has been requested, but the decrypted data is not 2249 * bounded by the appropriate padding bytes 2250 * @exception AEADBadTagException if this cipher is decrypting in an 2251 * AEAD mode (such as GCM/CCM), and the received authentication tag 2252 * does not match the calculated value 2253 */ 2254 public final int doFinal(byte[] input, int inputOffset, int inputLen, 2255 byte[] output, int outputOffset) 2256 throws ShortBufferException, IllegalBlockSizeException, 2257 BadPaddingException { 2258 checkCipherState(); 2259 2260 // Input sanity check 2261 if (input == null || inputOffset < 0 2262 || inputLen > (input.length - inputOffset) || inputLen < 0 2263 || outputOffset < 0) { 2264 throw new IllegalArgumentException("Bad arguments"); 2265 } 2266 2267 updateProviderIfNeeded(); 2268 return spi.engineDoFinal(input, inputOffset, inputLen, 2269 output, outputOffset); 2270 } 2271 2272 /** 2273 * Encrypts or decrypts data in a single-part operation, or finishes a 2274 * multiple-part operation. The data is encrypted or decrypted, 2275 * depending on how this cipher was initialized. 2276 * 2277 * <p>All <code>input.remaining()</code> bytes starting at 2278 * <code>input.position()</code> are processed. 2279 * If an AEAD mode such as GCM/CCM is being used, the authentication 2280 * tag is appended in the case of encryption, or verified in the 2281 * case of decryption. 2282 * The result is stored in the output buffer. 2283 * Upon return, the input buffer's position will be equal 2284 * to its limit; its limit will not have changed. The output buffer's 2285 * position will have advanced by n, where n is the value returned 2286 * by this method; the output buffer's limit will not have changed. 2287 * 2288 * <p>If <code>output.remaining()</code> bytes are insufficient to 2289 * hold the result, a <code>ShortBufferException</code> is thrown. 2290 * In this case, repeat this call with a larger output buffer. Use 2291 * {@link #getOutputSize(int) getOutputSize} to determine how big 2292 * the output buffer should be. 2293 * 2294 * <p>Upon finishing, this method resets this cipher object to the state 2295 * it was in when previously initialized via a call to <code>init</code>. 2296 * That is, the object is reset and available to encrypt or decrypt 2297 * (depending on the operation mode that was specified in the call to 2298 * <code>init</code>) more data. 2299 * 2300 * <p>Note: if any exception is thrown, this cipher object may need to 2301 * be reset before it can be used again. 2302 * 2303 * <p>Note: this method should be copy-safe, which means the 2304 * <code>input</code> and <code>output</code> buffers can reference 2305 * the same byte array and no unprocessed input data is overwritten 2306 * when the result is copied into the output buffer. 2307 * 2308 * @param input the input ByteBuffer 2309 * @param output the output ByteBuffer 2310 * 2311 * @return the number of bytes stored in <code>output</code> 2312 * 2313 * @exception IllegalStateException if this cipher is in a wrong state 2314 * (e.g., has not been initialized) 2315 * @exception IllegalArgumentException if input and output are the 2316 * same object 2317 * @exception ReadOnlyBufferException if the output buffer is read-only 2318 * @exception IllegalBlockSizeException if this cipher is a block cipher, 2319 * no padding has been requested (only in encryption mode), and the total 2320 * input length of the data processed by this cipher is not a multiple of 2321 * block size; or if this encryption algorithm is unable to 2322 * process the input data provided. 2323 * @exception ShortBufferException if there is insufficient space in the 2324 * output buffer 2325 * @exception BadPaddingException if this cipher is in decryption mode, 2326 * and (un)padding has been requested, but the decrypted data is not 2327 * bounded by the appropriate padding bytes 2328 * @exception AEADBadTagException if this cipher is decrypting in an 2329 * AEAD mode (such as GCM/CCM), and the received authentication tag 2330 * does not match the calculated value 2331 * 2332 * @since 1.5 2333 */ 2334 public final int doFinal(ByteBuffer input, ByteBuffer output) 2335 throws ShortBufferException, IllegalBlockSizeException, 2336 BadPaddingException { 2337 checkCipherState(); 2338 2339 if ((input == null) || (output == null)) { 2340 throw new IllegalArgumentException("Buffers must not be null"); 2341 } 2342 if (input == output) { 2343 throw new IllegalArgumentException("Input and output buffers must " 2344 + "not be the same object, consider using buffer.duplicate()"); 2345 } 2346 if (output.isReadOnly()) { 2347 throw new ReadOnlyBufferException(); 2348 } 2349 2350 updateProviderIfNeeded(); 2351 return spi.engineDoFinal(input, output); 2352 } 2353 2354 /** 2355 * Wrap a key. 2356 * 2357 * @param key the key to be wrapped. 2358 * 2359 * @return the wrapped key. 2360 * 2361 * @exception IllegalStateException if this cipher is in a wrong 2362 * state (e.g., has not been initialized). 2363 * 2364 * @exception IllegalBlockSizeException if this cipher is a block 2365 * cipher, no padding has been requested, and the length of the 2366 * encoding of the key to be wrapped is not a 2367 * multiple of the block size. 2368 * 2369 * @exception InvalidKeyException if it is impossible or unsafe to 2370 * wrap the key with this cipher (e.g., a hardware protected key is 2371 * being passed to a software-only cipher). 2372 */ 2373 public final byte[] wrap(Key key) 2374 throws IllegalBlockSizeException, InvalidKeyException { 2375 if (!(this instanceof NullCipher)) { 2376 if (!initialized) { 2377 throw new IllegalStateException("Cipher not initialized"); 2378 } 2379 if (opmode != Cipher.WRAP_MODE) { 2380 throw new IllegalStateException("Cipher not initialized " + 2381 "for wrapping keys"); 2382 } 2383 } 2384 2385 updateProviderIfNeeded(); 2386 return spi.engineWrap(key); 2387 } 2388 2389 /** 2390 * Unwrap a previously wrapped key. 2391 * 2392 * @param wrappedKey the key to be unwrapped. 2393 * 2394 * @param wrappedKeyAlgorithm the algorithm associated with the wrapped 2395 * key. 2396 * 2397 * @param wrappedKeyType the type of the wrapped key. This must be one of 2398 * <code>SECRET_KEY</code>, <code>PRIVATE_KEY</code>, or 2399 * <code>PUBLIC_KEY</code>. 2400 * 2401 * @return the unwrapped key. 2402 * 2403 * @exception IllegalStateException if this cipher is in a wrong state 2404 * (e.g., has not been initialized). 2405 * 2406 * @exception NoSuchAlgorithmException if no installed providers 2407 * can create keys of type <code>wrappedKeyType</code> for the 2408 * <code>wrappedKeyAlgorithm</code>. 2409 * 2410 * @exception InvalidKeyException if <code>wrappedKey</code> does not 2411 * represent a wrapped key of type <code>wrappedKeyType</code> for 2412 * the <code>wrappedKeyAlgorithm</code>. 2413 */ 2414 public final Key unwrap(byte[] wrappedKey, 2415 String wrappedKeyAlgorithm, 2416 int wrappedKeyType) 2417 throws InvalidKeyException, NoSuchAlgorithmException { 2418 2419 if (!(this instanceof NullCipher)) { 2420 if (!initialized) { 2421 throw new IllegalStateException("Cipher not initialized"); 2422 } 2423 if (opmode != Cipher.UNWRAP_MODE) { 2424 throw new IllegalStateException("Cipher not initialized " + 2425 "for unwrapping keys"); 2426 } 2427 } 2428 if ((wrappedKeyType != SECRET_KEY) && 2429 (wrappedKeyType != PRIVATE_KEY) && 2430 (wrappedKeyType != PUBLIC_KEY)) { 2431 throw new InvalidParameterException("Invalid key type"); 2432 } 2433 2434 updateProviderIfNeeded(); 2435 return spi.engineUnwrap(wrappedKey, 2436 wrappedKeyAlgorithm, 2437 wrappedKeyType); 2438 } 2439 2440 private AlgorithmParameterSpec getAlgorithmParameterSpec( 2441 AlgorithmParameters params) 2442 throws InvalidParameterSpecException { 2443 if (params == null) { 2444 return null; 2445 } 2446 2447 String alg = params.getAlgorithm().toUpperCase(Locale.ENGLISH); 2448 2449 if (alg.equalsIgnoreCase("RC2")) { 2450 return params.getParameterSpec(RC2ParameterSpec.class); 2451 } 2452 2453 if (alg.equalsIgnoreCase("RC5")) { 2454 return params.getParameterSpec(RC5ParameterSpec.class); 2455 } 2456 2457 if (alg.startsWith("PBE")) { 2458 return params.getParameterSpec(PBEParameterSpec.class); 2459 } 2460 2461 if (alg.startsWith("DES")) { 2462 return params.getParameterSpec(IvParameterSpec.class); 2463 } 2464 return null; 2465 } 2466 2467 /** 2468 * Returns the maximum key length for the specified transformation 2469 * according to the installed JCE jurisdiction policy files. If 2470 * JCE unlimited strength jurisdiction policy files are installed, 2471 * Integer.MAX_VALUE will be returned. 2472 * For more information on default key size in JCE jurisdiction 2473 * policy files, please see Appendix E in the 2474 * <a href= 2475 * "{@docRoot}openjdk-redirect.html?v=8&path=/technotes/guides/security/crypto/CryptoSpec.html#AppC"> 2476 * Java Cryptography Architecture Reference Guide</a>. 2477 * 2478 * @param transformation the cipher transformation. 2479 * @return the maximum key length in bits or Integer.MAX_VALUE. 2480 * @exception NullPointerException if <code>transformation</code> is null. 2481 * @exception NoSuchAlgorithmException if <code>transformation</code> 2482 * is not a valid transformation, i.e. in the form of "algorithm" or 2483 * "algorithm/mode/padding". 2484 * @since 1.5 2485 */ 2486 public static final int getMaxAllowedKeyLength(String transformation) 2487 throws NoSuchAlgorithmException { 2488 // Android-changed: Remove references to CryptoPermission and throw early 2489 // if transformation == null or isn't valid. 2490 // 2491 // CryptoPermission cp = getConfiguredPermission(transformation); 2492 // return cp.getMaxAllowedKeyLength(); 2493 if (transformation == null) { 2494 throw new NullPointerException("transformation == null"); 2495 } 2496 // Throws NoSuchAlgorithmException if necessary. 2497 tokenizeTransformation(transformation); 2498 return Integer.MAX_VALUE; 2499 } 2500 2501 /** 2502 * Returns an AlgorithmParameterSpec object which contains 2503 * the maximum cipher parameter value according to the 2504 * jurisdiction policy file. If JCE unlimited strength jurisdiction 2505 * policy files are installed or there is no maximum limit on the 2506 * parameters for the specified transformation in the policy file, 2507 * null will be returned. 2508 * 2509 * @param transformation the cipher transformation. 2510 * @return an AlgorithmParameterSpec which holds the maximum 2511 * value or null. 2512 * @exception NullPointerException if <code>transformation</code> 2513 * is null. 2514 * @exception NoSuchAlgorithmException if <code>transformation</code> 2515 * is not a valid transformation, i.e. in the form of "algorithm" or 2516 * "algorithm/mode/padding". 2517 * @since 1.5 2518 */ 2519 public static final AlgorithmParameterSpec getMaxAllowedParameterSpec( 2520 String transformation) throws NoSuchAlgorithmException { 2521 // Android-changed: Remove references to CryptoPermission and throw early 2522 // if transformation == null or isn't valid. 2523 // 2524 // CryptoPermission cp = getConfiguredPermission(transformation); 2525 // return cp.getAlgorithmParameterSpec(); 2526 if (transformation == null) { 2527 throw new NullPointerException("transformation == null"); 2528 } 2529 // Throws NoSuchAlgorithmException if necessary. 2530 tokenizeTransformation(transformation); 2531 return null; 2532 } 2533 2534 /** 2535 * Continues a multi-part update of the Additional Authentication 2536 * Data (AAD). 2537 * <p> 2538 * Calls to this method provide AAD to the cipher when operating in 2539 * modes such as AEAD (GCM/CCM). If this cipher is operating in 2540 * either GCM or CCM mode, all AAD must be supplied before beginning 2541 * operations on the ciphertext (via the {@code update} and {@code 2542 * doFinal} methods). 2543 * 2544 * @param src the buffer containing the Additional Authentication Data 2545 * 2546 * @throws IllegalArgumentException if the {@code src} 2547 * byte array is null 2548 * @throws IllegalStateException if this cipher is in a wrong state 2549 * (e.g., has not been initialized), does not accept AAD, or if 2550 * operating in either GCM or CCM mode and one of the {@code update} 2551 * methods has already been called for the active 2552 * encryption/decryption operation 2553 * @throws UnsupportedOperationException if the corresponding method 2554 * in the {@code CipherSpi} has not been overridden by an 2555 * implementation 2556 * 2557 * @since 1.7 2558 */ 2559 public final void updateAAD(byte[] src) { 2560 if (src == null) { 2561 throw new IllegalArgumentException("src buffer is null"); 2562 } 2563 2564 updateAAD(src, 0, src.length); 2565 } 2566 2567 /** 2568 * Continues a multi-part update of the Additional Authentication 2569 * Data (AAD), using a subset of the provided buffer. 2570 * <p> 2571 * Calls to this method provide AAD to the cipher when operating in 2572 * modes such as AEAD (GCM/CCM). If this cipher is operating in 2573 * either GCM or CCM mode, all AAD must be supplied before beginning 2574 * operations on the ciphertext (via the {@code update} and {@code 2575 * doFinal} methods). 2576 * 2577 * @param src the buffer containing the AAD 2578 * @param offset the offset in {@code src} where the AAD input starts 2579 * @param len the number of AAD bytes 2580 * 2581 * @throws IllegalArgumentException if the {@code src} 2582 * byte array is null, or the {@code offset} or {@code length} 2583 * is less than 0, or the sum of the {@code offset} and 2584 * {@code len} is greater than the length of the 2585 * {@code src} byte array 2586 * @throws IllegalStateException if this cipher is in a wrong state 2587 * (e.g., has not been initialized), does not accept AAD, or if 2588 * operating in either GCM or CCM mode and one of the {@code update} 2589 * methods has already been called for the active 2590 * encryption/decryption operation 2591 * @throws UnsupportedOperationException if the corresponding method 2592 * in the {@code CipherSpi} has not been overridden by an 2593 * implementation 2594 * 2595 * @since 1.7 2596 */ 2597 public final void updateAAD(byte[] src, int offset, int len) { 2598 checkCipherState(); 2599 2600 // Input sanity check 2601 if ((src == null) || (offset < 0) || (len < 0) 2602 || ((len + offset) > src.length)) { 2603 throw new IllegalArgumentException("Bad arguments"); 2604 } 2605 2606 updateProviderIfNeeded(); 2607 if (len == 0) { 2608 return; 2609 } 2610 spi.engineUpdateAAD(src, offset, len); 2611 } 2612 2613 /** 2614 * Continues a multi-part update of the Additional Authentication 2615 * Data (AAD). 2616 * <p> 2617 * Calls to this method provide AAD to the cipher when operating in 2618 * modes such as AEAD (GCM/CCM). If this cipher is operating in 2619 * either GCM or CCM mode, all AAD must be supplied before beginning 2620 * operations on the ciphertext (via the {@code update} and {@code 2621 * doFinal} methods). 2622 * <p> 2623 * All {@code src.remaining()} bytes starting at 2624 * {@code src.position()} are processed. 2625 * Upon return, the input buffer's position will be equal 2626 * to its limit; its limit will not have changed. 2627 * 2628 * @param src the buffer containing the AAD 2629 * 2630 * @throws IllegalArgumentException if the {@code src ByteBuffer} 2631 * is null 2632 * @throws IllegalStateException if this cipher is in a wrong state 2633 * (e.g., has not been initialized), does not accept AAD, or if 2634 * operating in either GCM or CCM mode and one of the {@code update} 2635 * methods has already been called for the active 2636 * encryption/decryption operation 2637 * @throws UnsupportedOperationException if the corresponding method 2638 * in the {@code CipherSpi} has not been overridden by an 2639 * implementation 2640 * 2641 * @since 1.7 2642 */ 2643 public final void updateAAD(ByteBuffer src) { 2644 checkCipherState(); 2645 2646 // Input sanity check 2647 if (src == null) { 2648 throw new IllegalArgumentException("src ByteBuffer is null"); 2649 } 2650 2651 updateProviderIfNeeded(); 2652 if (src.remaining() == 0) { 2653 return; 2654 } 2655 spi.engineUpdateAAD(src); 2656 } 2657 2658 /** 2659 * Returns the {@code CipherSpi} backing this {@code Cipher} or {@code null} if no 2660 * {@code CipherSpi} is backing this {@code Cipher}. 2661 * 2662 * @hide 2663 */ 2664 public CipherSpi getCurrentSpi() { 2665 return spi; 2666 } 2667 2668 /** The attribute used for supported paddings. */ 2669 private static final String ATTRIBUTE_PADDINGS = "SupportedPaddings"; 2670 2671 /** The attribute used for supported modes. */ 2672 private static final String ATTRIBUTE_MODES = "SupportedModes"; 2673 2674 /** 2675 * If the attribute listed exists, check that it matches the regular 2676 * expression. 2677 */ 2678 static boolean matchAttribute(Provider.Service service, String attr, String value) { 2679 if (value == null) { 2680 return true; 2681 } 2682 final String pattern = service.getAttribute(attr); 2683 if (pattern == null) { 2684 return true; 2685 } 2686 final String valueUc = value.toUpperCase(Locale.US); 2687 return valueUc.matches(pattern.toUpperCase(Locale.US)); 2688 } 2689 2690 /** Items that need to be set on the Cipher instance. */ 2691 enum NeedToSet { 2692 NONE, MODE, PADDING, BOTH, 2693 } 2694 2695 /** 2696 * Expresses the various types of transforms that may be used during 2697 * initialization. 2698 */ 2699 static class Transform { 2700 private final String name; 2701 private final NeedToSet needToSet; 2702 2703 public Transform(String name, NeedToSet needToSet) { 2704 this.name = name; 2705 this.needToSet = needToSet; 2706 } 2707 } 2708 2709 /** 2710 * Keeps track of the possible arguments to {@code Cipher#init(...)}. 2711 */ 2712 static class InitParams { 2713 final InitType initType; 2714 final int opmode; 2715 final Key key; 2716 final SecureRandom random; 2717 final AlgorithmParameterSpec spec; 2718 final AlgorithmParameters params; 2719 2720 InitParams(InitType initType, int opmode, Key key, SecureRandom random, 2721 AlgorithmParameterSpec spec, AlgorithmParameters params) { 2722 this.initType = initType; 2723 this.opmode = opmode; 2724 this.key = key; 2725 this.random = random; 2726 this.spec = spec; 2727 this.params = params; 2728 } 2729 } 2730 2731 /** 2732 * Used to keep track of which underlying {@code CipherSpi#engineInit(...)} 2733 * variant to call when testing suitability. 2734 */ 2735 static enum InitType { 2736 KEY, ALGORITHM_PARAMS, ALGORITHM_PARAM_SPEC, 2737 } 2738 2739 class SpiAndProviderUpdater { 2740 /** 2741 * Lock held while the SPI is initializing. 2742 */ 2743 private final Object initSpiLock = new Object(); 2744 2745 /** 2746 * The provider specified when instance created. 2747 */ 2748 private final Provider specifiedProvider; 2749 2750 /** 2751 * The SPI implementation. 2752 */ 2753 private final CipherSpi specifiedSpi; 2754 2755 SpiAndProviderUpdater(Provider specifiedProvider, CipherSpi specifiedSpi) { 2756 this.specifiedProvider = specifiedProvider; 2757 this.specifiedSpi = specifiedSpi; 2758 } 2759 2760 void setCipherSpiImplAndProvider(CipherSpi cipherSpi, Provider provider) { 2761 Cipher.this.spi = cipherSpi; 2762 Cipher.this.provider = provider; 2763 } 2764 2765 /** 2766 * Makes sure a CipherSpi that matches this type is selected. If 2767 * {@code key != null} then it assumes that a suitable provider exists for 2768 * this instance (used by {@link Cipher#init}. If the {@code initParams} is passed 2769 * in, then the {@code CipherSpi} returned will be initialized. 2770 * 2771 * @throws InvalidKeyException if the specified key cannot be used to 2772 * initialize this cipher. 2773 */ 2774 CipherSpiAndProvider updateAndGetSpiAndProvider( 2775 InitParams initParams, 2776 CipherSpi spiImpl, 2777 Provider provider) 2778 throws InvalidKeyException, InvalidAlgorithmParameterException { 2779 if (specifiedSpi != null) { 2780 return new CipherSpiAndProvider(specifiedSpi, provider); 2781 } 2782 synchronized (initSpiLock) { 2783 // This is not only a matter of performance. Many methods like update, doFinal, etc. 2784 // call {@code #getSpi()} (ie, {@code #getSpi(null /* params */)}) and without this 2785 // shortcut they would override an spi that was chosen using the key. 2786 if (spiImpl != null && initParams == null) { 2787 return new CipherSpiAndProvider(spiImpl, provider); 2788 } 2789 final CipherSpiAndProvider sap = tryCombinations( 2790 initParams, specifiedProvider, tokenizedTransformation); 2791 if (sap == null) { 2792 throw new ProviderException("No provider found for " 2793 + Arrays.toString(tokenizedTransformation)); 2794 } 2795 setCipherSpiImplAndProvider(sap.cipherSpi, sap.provider); 2796 return new CipherSpiAndProvider(sap.cipherSpi, sap.provider); 2797 } 2798 } 2799 2800 /** 2801 * Convenience call when the Key is not available. 2802 */ 2803 CipherSpiAndProvider updateAndGetSpiAndProvider(CipherSpi spiImpl, Provider provider) { 2804 try { 2805 return updateAndGetSpiAndProvider(null, spiImpl, provider); 2806 } catch (InvalidKeyException | InvalidAlgorithmParameterException e) { 2807 throw new ProviderException("Exception thrown when params == null", e); 2808 } 2809 } 2810 2811 CipherSpi getCurrentSpi(CipherSpi spiImpl) { 2812 if (specifiedSpi != null) { 2813 return specifiedSpi; 2814 } 2815 2816 synchronized (initSpiLock) { 2817 return spiImpl; 2818 } 2819 } 2820 } 2821 2822 /** 2823 * Tries to find the correct {@code Cipher} transform to use. Returns a 2824 * {@link org.apache.harmony.security.fortress.Engine.SpiAndProvider}, throws the first exception that was 2825 * encountered during attempted initialization, or {@code null} if there are 2826 * no providers that support the {@code initParams}. 2827 * <p> 2828 * {@code tokenizedTransformation} must be in the format returned by 2829 * {@link Cipher#checkTransformation(String)}. The combinations of mode strings 2830 * tried are as follows: 2831 * <ul> 2832 * <li><code>[cipher]/[mode]/[padding]</code> 2833 * <li><code>[cipher]/[mode]</code> 2834 * <li><code>[cipher]//[padding]</code> 2835 * <li><code>[cipher]</code> 2836 * </ul> 2837 * {@code services} is a list of cipher services. Needs to be non-null only if 2838 * {@code provider != null} 2839 */ 2840 static CipherSpiAndProvider tryCombinations(InitParams initParams, Provider provider, 2841 String[] tokenizedTransformation) 2842 throws InvalidKeyException, 2843 InvalidAlgorithmParameterException { 2844 // Enumerate all the transforms we need to try 2845 ArrayList<Transform> transforms = new ArrayList<Transform>(); 2846 if (tokenizedTransformation[1] != null && tokenizedTransformation[2] != null) { 2847 transforms.add(new Transform(tokenizedTransformation[0] + "/" + tokenizedTransformation[1] + "/" 2848 + tokenizedTransformation[2], NeedToSet.NONE)); 2849 } 2850 if (tokenizedTransformation[1] != null) { 2851 transforms.add(new Transform(tokenizedTransformation[0] + "/" + tokenizedTransformation[1], 2852 NeedToSet.PADDING)); 2853 } 2854 if (tokenizedTransformation[2] != null) { 2855 transforms.add(new Transform(tokenizedTransformation[0] + "//" + tokenizedTransformation[2], 2856 NeedToSet.MODE)); 2857 } 2858 transforms.add(new Transform(tokenizedTransformation[0], NeedToSet.BOTH)); 2859 2860 // Try each of the transforms and keep track of the first exception 2861 // encountered. 2862 Exception cause = null; 2863 2864 if (provider != null) { 2865 for (Transform transform : transforms) { 2866 Provider.Service service = provider.getService("Cipher", transform.name); 2867 if (service == null) { 2868 continue; 2869 } 2870 return tryTransformWithProvider(initParams, tokenizedTransformation, transform.needToSet, 2871 service); 2872 } 2873 } else { 2874 for (Provider prov : Security.getProviders()) { 2875 for (Transform transform : transforms) { 2876 Provider.Service service = prov.getService("Cipher", transform.name); 2877 if (service == null) { 2878 continue; 2879 } 2880 2881 if (initParams == null || initParams.key == null 2882 || service.supportsParameter(initParams.key)) { 2883 try { 2884 CipherSpiAndProvider sap = tryTransformWithProvider(initParams, 2885 tokenizedTransformation, transform.needToSet, service); 2886 if (sap != null) { 2887 return sap; 2888 } 2889 } catch (Exception e) { 2890 if (cause == null) { 2891 cause = e; 2892 } 2893 } 2894 } 2895 } 2896 } 2897 } 2898 if (cause instanceof InvalidKeyException) { 2899 throw (InvalidKeyException) cause; 2900 } else if (cause instanceof InvalidAlgorithmParameterException) { 2901 throw (InvalidAlgorithmParameterException) cause; 2902 } else if (cause instanceof RuntimeException) { 2903 throw (RuntimeException) cause; 2904 } else if (cause != null) { 2905 throw new InvalidKeyException("No provider can be initialized with given key", cause); 2906 } else if (initParams == null || initParams.key == null) { 2907 return null; 2908 } else { 2909 // Since the key is not null, a suitable provider exists, 2910 // and it is an InvalidKeyException. 2911 throw new InvalidKeyException( 2912 "No provider offers " + Arrays.toString(tokenizedTransformation) + " for " 2913 + initParams.key.getAlgorithm() + " key of class " 2914 + initParams.key.getClass().getName() + " and export format " 2915 + initParams.key.getFormat()); 2916 } 2917 } 2918 2919 static class CipherSpiAndProvider { 2920 CipherSpi cipherSpi; 2921 Provider provider; 2922 2923 CipherSpiAndProvider(CipherSpi cipherSpi, Provider provider) { 2924 this.cipherSpi = cipherSpi; 2925 this.provider = provider; 2926 } 2927 } 2928 2929 /** 2930 * Tries to initialize the {@code Cipher} from a given {@code service}. If 2931 * initialization is successful, the initialized {@code spi} is returned. If 2932 * the {@code service} cannot be initialized with the specified 2933 * {@code initParams}, then it's expected to throw 2934 * {@code InvalidKeyException} or {@code InvalidAlgorithmParameterException} 2935 * as a hint to the caller that it should continue searching for a 2936 * {@code Service} that will work. 2937 */ 2938 static CipherSpiAndProvider tryTransformWithProvider(InitParams initParams, 2939 String[] tokenizedTransformation, NeedToSet type, Provider.Service service) 2940 throws InvalidKeyException, InvalidAlgorithmParameterException { 2941 try { 2942 /* 2943 * Check to see if the Cipher even supports the attributes before 2944 * trying to instantiate it. 2945 */ 2946 if (!matchAttribute(service, ATTRIBUTE_MODES, tokenizedTransformation[1]) 2947 || !matchAttribute(service, ATTRIBUTE_PADDINGS, tokenizedTransformation[2])) { 2948 return null; 2949 } 2950 2951 CipherSpiAndProvider sap = new CipherSpiAndProvider( 2952 (CipherSpi) service.newInstance(null), service.getProvider()); 2953 if (sap.cipherSpi == null || sap.provider == null) { 2954 return null; 2955 } 2956 CipherSpi spi = sap.cipherSpi; 2957 if (((type == NeedToSet.MODE) || (type == NeedToSet.BOTH)) 2958 && (tokenizedTransformation[1] != null)) { 2959 spi.engineSetMode(tokenizedTransformation[1]); 2960 } 2961 if (((type == NeedToSet.PADDING) || (type == NeedToSet.BOTH)) 2962 && (tokenizedTransformation[2] != null)) { 2963 spi.engineSetPadding(tokenizedTransformation[2]); 2964 } 2965 2966 if (initParams != null) { 2967 switch (initParams.initType) { 2968 case ALGORITHM_PARAMS: 2969 spi.engineInit(initParams.opmode, initParams.key, initParams.params, 2970 initParams.random); 2971 break; 2972 case ALGORITHM_PARAM_SPEC: 2973 spi.engineInit(initParams.opmode, initParams.key, initParams.spec, 2974 initParams.random); 2975 break; 2976 case KEY: 2977 spi.engineInit(initParams.opmode, initParams.key, initParams.random); 2978 break; 2979 default: 2980 throw new AssertionError("This should never be reached"); 2981 } 2982 } 2983 return new CipherSpiAndProvider(spi, sap.provider); 2984 } catch (NoSuchAlgorithmException ignored) { 2985 } catch (NoSuchPaddingException ignored) { 2986 } 2987 return null; 2988 } 2989 } 2990