26 |
26 |
27 package sun.security.ssl; |
27 package sun.security.ssl; |
28 |
28 |
29 import java.io.ByteArrayOutputStream; |
29 import java.io.ByteArrayOutputStream; |
30 import java.security.*; |
30 import java.security.*; |
31 import java.util.Arrays; |
|
32 import java.util.LinkedList; |
|
33 import java.util.List; |
|
34 import java.util.Locale; |
31 import java.util.Locale; |
35 import java.util.Set; |
32 import java.util.Set; |
36 |
33 |
37 /** |
34 /** |
38 * Abstraction for the SSL/TLS hash of all handshake messages that is |
35 * Abstraction for the SSL/TLS hash of all handshake messages that is |
389 // if (digests[0] == null) { |
386 // if (digests[0] == null) { |
390 // throw new IllegalStateException("no digests left"); |
387 // throw new IllegalStateException("no digests left"); |
391 // } |
388 // } |
392 } |
389 } |
393 |
390 |
|
391 @Override |
394 protected int engineGetDigestLength() { |
392 protected int engineGetDigestLength() { |
395 checkState(); |
393 checkState(); |
396 return digests[0].getDigestLength(); |
394 return digests[0].getDigestLength(); |
397 } |
395 } |
398 |
396 |
|
397 @Override |
399 protected void engineUpdate(byte b) { |
398 protected void engineUpdate(byte b) { |
400 checkState(); |
399 checkState(); |
401 for (int i = 0; (i < digests.length) && (digests[i] != null); i++) { |
400 for (int i = 0; (i < digests.length) && (digests[i] != null); i++) { |
402 digests[i].update(b); |
401 digests[i].update(b); |
403 } |
402 } |
404 } |
403 } |
405 |
404 |
|
405 @Override |
406 protected void engineUpdate(byte[] b, int offset, int len) { |
406 protected void engineUpdate(byte[] b, int offset, int len) { |
407 checkState(); |
407 checkState(); |
408 for (int i = 0; (i < digests.length) && (digests[i] != null); i++) { |
408 for (int i = 0; (i < digests.length) && (digests[i] != null); i++) { |
409 digests[i].update(b, offset, len); |
409 digests[i].update(b, offset, len); |
410 } |
410 } |
411 } |
411 } |
412 |
412 |
|
413 @Override |
413 protected byte[] engineDigest() { |
414 protected byte[] engineDigest() { |
414 checkState(); |
415 checkState(); |
415 byte[] digest = digests[0].digest(); |
416 byte[] digest = digests[0].digest(); |
416 digestReset(); |
417 digestReset(); |
417 return digest; |
418 return digest; |
418 } |
419 } |
419 |
420 |
|
421 @Override |
420 protected int engineDigest(byte[] buf, int offset, int len) |
422 protected int engineDigest(byte[] buf, int offset, int len) |
421 throws DigestException { |
423 throws DigestException { |
422 checkState(); |
424 checkState(); |
423 int n = digests[0].digest(buf, offset, len); |
425 int n = digests[0].digest(buf, offset, len); |
424 digestReset(); |
426 digestReset(); |
434 for (int i = 1; (i < digests.length) && (digests[i] != null); i++) { |
436 for (int i = 1; (i < digests.length) && (digests[i] != null); i++) { |
435 digests[i].reset(); |
437 digests[i].reset(); |
436 } |
438 } |
437 } |
439 } |
438 |
440 |
|
441 @Override |
439 protected void engineReset() { |
442 protected void engineReset() { |
440 checkState(); |
443 checkState(); |
441 for (int i = 0; (i < digests.length) && (digests[i] != null); i++) { |
444 for (int i = 0; (i < digests.length) && (digests[i] != null); i++) { |
442 digests[i].reset(); |
445 digests[i].reset(); |
443 } |
446 } |
444 } |
447 } |
445 |
448 |
|
449 @Override |
446 public Object clone() { |
450 public Object clone() { |
447 checkState(); |
451 checkState(); |
448 for (int i = digests.length - 1; i >= 0; i--) { |
452 for (int i = digests.length - 1; i >= 0; i--) { |
449 if (digests[i] != null) { |
453 if (digests[i] != null) { |
450 MessageDigest digest = digests[i]; |
454 MessageDigest digest = digests[i]; |