Hex Artifact Content
Not logged in

Artifact 590533087cb0c6b637319403b9f3bfcc749b7454:


0000: 70 61 63 6b 61 67 65 20 6f 72 67 2e 69 6e 74 65  package org.inte
0010: 72 6c 65 64 67 65 72 2e 63 72 79 70 74 6f 63 6f  rledger.cryptoco
0020: 6e 64 69 74 69 6f 6e 73 3b 0a 0a 69 6d 70 6f 72  nditions;..impor
0030: 74 20 6a 61 76 61 2e 73 65 63 75 72 69 74 79 2e  t java.security.
0040: 4d 65 73 73 61 67 65 44 69 67 65 73 74 3b 0a 69  MessageDigest;.i
0050: 6d 70 6f 72 74 20 6a 61 76 61 2e 73 65 63 75 72  mport java.secur
0060: 69 74 79 2e 4e 6f 53 75 63 68 41 6c 67 6f 72 69  ity.NoSuchAlgori
0070: 74 68 6d 45 78 63 65 70 74 69 6f 6e 3b 0a 69 6d  thmException;.im
0080: 70 6f 72 74 20 6a 61 76 61 2e 75 74 69 6c 2e 41  port java.util.A
0090: 72 72 61 79 73 3b 0a 69 6d 70 6f 72 74 20 6a 61  rrays;.import ja
00a0: 76 61 2e 75 74 69 6c 2e 42 61 73 65 36 34 3b 0a  va.util.Base64;.
00b0: 69 6d 70 6f 72 74 20 6a 61 76 61 2e 75 74 69 6c  import java.util
00c0: 2e 4f 62 6a 65 63 74 73 3b 0a 0a 2f 2a 2a 0a 20  .Objects;../**. 
00d0: 2a 20 41 62 73 74 72 61 63 74 20 62 61 73 65 20  * Abstract base 
00e0: 63 6c 61 73 73 20 66 6f 72 20 74 68 65 20 2a 2d  class for the *-
00f0: 53 48 41 2d 32 35 36 20 63 6f 6e 64 69 74 69 6f  SHA-256 conditio
0100: 6e 20 72 73 61 2e 0a 20 2a 2f 0a 70 75 62 6c 69  n rsa.. */.publi
0110: 63 20 61 62 73 74 72 61 63 74 20 63 6c 61 73 73  c abstract class
0120: 20 53 68 61 32 35 36 43 6f 6e 64 69 74 69 6f 6e   Sha256Condition
0130: 20 65 78 74 65 6e 64 73 20 43 6f 6e 64 69 74 69   extends Conditi
0140: 6f 6e 42 61 73 65 20 7b 0a 0a 20 20 70 72 69 76  onBase {..  priv
0150: 61 74 65 20 66 69 6e 61 6c 20 62 79 74 65 5b 5d  ate final byte[]
0160: 20 66 69 6e 67 65 72 70 72 69 6e 74 3b 0a 20 20   fingerprint;.  
0170: 70 72 69 76 61 74 65 20 66 69 6e 61 6c 20 53 74  private final St
0180: 72 69 6e 67 20 66 69 6e 67 65 72 70 72 69 6e 74  ring fingerprint
0190: 42 61 73 65 36 34 55 72 6c 3b 0a 0a 20 20 2f 2a  Base64Url;..  /*
01a0: 2a 0a 20 20 20 2a 20 43 6f 6e 73 74 72 75 63 74  *.   * Construct
01b0: 6f 72 20 74 68 61 74 20 61 63 63 65 70 74 73 20  or that accepts 
01c0: 61 20 66 69 6e 67 65 72 70 72 69 6e 74 20 61 6e  a fingerprint an
01d0: 64 20 61 20 63 6f 73 74 20 6e 75 6d 62 65 72 2e  d a cost number.
01e0: 0a 20 20 20 2a 0a 20 20 20 2a 20 40 70 61 72 61  .   *.   * @para
01f0: 6d 20 74 79 70 65 20 20 20 20 20 20 20 20 41 20  m type        A 
0200: 7b 40 6c 69 6e 6b 20 43 72 79 70 74 6f 43 6f 6e  {@link CryptoCon
0210: 64 69 74 69 6f 6e 54 79 70 65 7d 20 74 68 61 74  ditionType} that
0220: 20 72 65 70 72 65 73 65 6e 74 73 20 74 68 65 20   represents the 
0230: 74 79 70 65 20 6f 66 20 74 68 69 73 20 63 6f 6e  type of this con
0240: 64 69 74 69 6f 6e 2e 0a 20 20 20 2a 20 40 70 61  dition..   * @pa
0250: 72 61 6d 20 63 6f 73 74 20 20 20 20 20 20 20 20  ram cost        
0260: 41 20 7b 40 6c 69 6e 6b 20 6c 6f 6e 67 7d 20 72  A {@link long} r
0270: 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20  epresenting the 
0280: 61 6e 74 69 63 69 70 61 74 65 64 20 63 6f 73 74  anticipated cost
0290: 20 6f 66 20 74 68 69 73 20 63 6f 6e 64 69 74 69   of this conditi
02a0: 6f 6e 2c 0a 20 20 20 2a 20 20 20 20 20 20 20 20  on,.   *        
02b0: 20 20 20 20 20 20 20 20 20 20 20 20 63 61 6c 63              calc
02c0: 75 6c 61 74 65 64 20 70 65 72 20 74 68 65 20 72  ulated per the r
02d0: 75 6c 65 73 20 6f 66 20 74 68 65 20 63 72 79 70  ules of the cryp
02e0: 74 6f 2d 63 6f 6e 64 69 74 69 6f 6e 73 20 73 70  to-conditions sp
02f0: 65 63 69 66 69 63 61 74 69 6f 6e 2e 0a 20 20 20  ecification..   
0300: 2a 20 40 70 61 72 61 6d 20 66 69 6e 67 65 72 70  * @param fingerp
0310: 72 69 6e 74 20 54 68 65 20 62 69 6e 61 72 79 20  rint The binary 
0320: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
0330: 66 20 74 68 65 20 66 69 6e 67 65 72 70 72 69 6e  f the fingerprin
0340: 74 20 66 6f 72 20 74 68 69 73 20 63 6f 6e 64 69  t for this condi
0350: 74 69 6f 6e 2e 0a 20 20 20 2a 2f 0a 20 20 70 72  tion..   */.  pr
0360: 6f 74 65 63 74 65 64 20 53 68 61 32 35 36 43 6f  otected Sha256Co
0370: 6e 64 69 74 69 6f 6e 28 0a 20 20 20 20 20 20 66  ndition(.      f
0380: 69 6e 61 6c 20 43 72 79 70 74 6f 43 6f 6e 64 69  inal CryptoCondi
0390: 74 69 6f 6e 54 79 70 65 20 74 79 70 65 2c 20 66  tionType type, f
03a0: 69 6e 61 6c 20 6c 6f 6e 67 20 63 6f 73 74 2c 20  inal long cost, 
03b0: 66 69 6e 61 6c 20 62 79 74 65 5b 5d 20 66 69 6e  final byte[] fin
03c0: 67 65 72 70 72 69 6e 74 0a 20 20 29 20 7b 0a 20  gerprint.  ) {. 
03d0: 20 20 20 73 75 70 65 72 28 74 79 70 65 2c 20 63     super(type, c
03e0: 6f 73 74 29 3b 0a 0a 20 20 20 20 4f 62 6a 65 63  ost);..    Objec
03f0: 74 73 2e 72 65 71 75 69 72 65 4e 6f 6e 4e 75 6c  ts.requireNonNul
0400: 6c 28 66 69 6e 67 65 72 70 72 69 6e 74 29 3b 0a  l(fingerprint);.
0410: 20 20 20 20 69 66 20 28 66 69 6e 67 65 72 70 72      if (fingerpr
0420: 69 6e 74 2e 6c 65 6e 67 74 68 20 21 3d 20 33 32  int.length != 32
0430: 29 20 7b 0a 20 20 20 20 20 20 74 68 72 6f 77 20  ) {.      throw 
0440: 6e 65 77 20 49 6c 6c 65 67 61 6c 41 72 67 75 6d  new IllegalArgum
0450: 65 6e 74 45 78 63 65 70 74 69 6f 6e 28 22 46 69  entException("Fi
0460: 6e 67 65 72 70 72 69 6e 74 20 6d 75 73 74 20 62  ngerprint must b
0470: 65 20 33 32 20 62 79 74 65 73 2e 22 29 3b 0a 20  e 32 bytes.");. 
0480: 20 20 20 7d 0a 0a 20 20 20 20 4f 62 6a 65 63 74     }..    Object
0490: 73 2e 72 65 71 75 69 72 65 4e 6f 6e 4e 75 6c 6c  s.requireNonNull
04a0: 28 66 69 6e 67 65 72 70 72 69 6e 74 29 3b 0a 20  (fingerprint);. 
04b0: 20 20 20 74 68 69 73 2e 66 69 6e 67 65 72 70 72     this.fingerpr
04c0: 69 6e 74 20 3d 20 41 72 72 61 79 73 2e 63 6f 70  int = Arrays.cop
04d0: 79 4f 66 28 66 69 6e 67 65 72 70 72 69 6e 74 2c  yOf(fingerprint,
04e0: 20 33 32 29 3b 0a 20 20 20 20 74 68 69 73 2e 66   32);.    this.f
04f0: 69 6e 67 65 72 70 72 69 6e 74 42 61 73 65 36 34  ingerprintBase64
0500: 55 72 6c 20 3d 20 42 61 73 65 36 34 2e 67 65 74  Url = Base64.get
0510: 55 72 6c 45 6e 63 6f 64 65 72 28 29 2e 77 69 74  UrlEncoder().wit
0520: 68 6f 75 74 50 61 64 64 69 6e 67 28 29 0a 20 20  houtPadding().  
0530: 20 20 20 20 20 20 2e 65 6e 63 6f 64 65 54 6f 53        .encodeToS
0540: 74 72 69 6e 67 28 74 68 69 73 2e 66 69 6e 67 65  tring(this.finge
0550: 72 70 72 69 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20  rprint);.  }..  
0560: 40 4f 76 65 72 72 69 64 65 0a 20 20 70 75 62 6c  @Override.  publ
0570: 69 63 20 66 69 6e 61 6c 20 62 79 74 65 5b 5d 20  ic final byte[] 
0580: 67 65 74 46 69 6e 67 65 72 70 72 69 6e 74 28 29  getFingerprint()
0590: 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 41 72   {.    return Ar
05a0: 72 61 79 73 2e 63 6f 70 79 4f 66 28 66 69 6e 67  rays.copyOf(fing
05b0: 65 72 70 72 69 6e 74 2c 20 33 32 29 3b 0a 20 20  erprint, 32);.  
05c0: 7d 0a 0a 20 20 40 4f 76 65 72 72 69 64 65 0a 20  }..  @Override. 
05d0: 20 70 75 62 6c 69 63 20 66 69 6e 61 6c 20 53 74   public final St
05e0: 72 69 6e 67 20 67 65 74 46 69 6e 67 65 72 70 72  ring getFingerpr
05f0: 69 6e 74 42 61 73 65 36 34 55 72 6c 28 29 20 7b  intBase64Url() {
0600: 0a 20 20 20 20 72 65 74 75 72 6e 20 74 68 69 73  .    return this
0610: 2e 66 69 6e 67 65 72 70 72 69 6e 74 42 61 73 65  .fingerprintBase
0620: 36 34 55 72 6c 3b 0a 20 20 7d 0a 0a 20 20 40 4f  64Url;.  }..  @O
0630: 76 65 72 72 69 64 65 0a 20 20 70 75 62 6c 69 63  verride.  public
0640: 20 62 6f 6f 6c 65 61 6e 20 65 71 75 61 6c 73 28   boolean equals(
0650: 4f 62 6a 65 63 74 20 6f 62 6a 65 63 74 29 20 7b  Object object) {
0660: 0a 20 20 20 20 69 66 20 28 74 68 69 73 20 3d 3d  .    if (this ==
0670: 20 6f 62 6a 65 63 74 29 20 7b 0a 20 20 20 20 20   object) {.     
0680: 20 72 65 74 75 72 6e 20 74 72 75 65 3b 0a 20 20   return true;.  
0690: 20 20 7d 0a 20 20 20 20 69 66 20 28 6f 62 6a 65    }.    if (obje
06a0: 63 74 20 3d 3d 20 6e 75 6c 6c 20 7c 7c 20 67 65  ct == null || ge
06b0: 74 43 6c 61 73 73 28 29 20 21 3d 20 6f 62 6a 65  tClass() != obje
06c0: 63 74 2e 67 65 74 43 6c 61 73 73 28 29 29 20 7b  ct.getClass()) {
06d0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61  .      return fa
06e0: 6c 73 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  lse;.    }.    i
06f0: 66 20 28 21 73 75 70 65 72 2e 65 71 75 61 6c 73  f (!super.equals
0700: 28 6f 62 6a 65 63 74 29 29 20 7b 0a 20 20 20 20  (object)) {.    
0710: 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0a    return false;.
0720: 20 20 20 20 7d 0a 0a 20 20 20 20 53 68 61 32 35      }..    Sha25
0730: 36 43 6f 6e 64 69 74 69 6f 6e 20 74 68 61 74 20  6Condition that 
0740: 3d 20 28 53 68 61 32 35 36 43 6f 6e 64 69 74 69  = (Sha256Conditi
0750: 6f 6e 29 20 6f 62 6a 65 63 74 3b 0a 0a 20 20 20  on) object;..   
0760: 20 72 65 74 75 72 6e 20 66 69 6e 67 65 72 70 72   return fingerpr
0770: 69 6e 74 42 61 73 65 36 34 55 72 6c 2e 65 71 75  intBase64Url.equ
0780: 61 6c 73 28 74 68 61 74 2e 66 69 6e 67 65 72 70  als(that.fingerp
0790: 72 69 6e 74 42 61 73 65 36 34 55 72 6c 29 3b 0a  rintBase64Url);.
07a0: 20 20 7d 0a 0a 20 20 40 4f 76 65 72 72 69 64 65    }..  @Override
07b0: 0a 20 20 70 75 62 6c 69 63 20 69 6e 74 20 68 61  .  public int ha
07c0: 73 68 43 6f 64 65 28 29 20 7b 0a 20 20 20 20 69  shCode() {.    i
07d0: 6e 74 20 72 65 73 75 6c 74 20 3d 20 73 75 70 65  nt result = supe
07e0: 72 2e 68 61 73 68 43 6f 64 65 28 29 3b 0a 20 20  r.hashCode();.  
07f0: 20 20 72 65 73 75 6c 74 20 3d 20 33 31 20 2a 20    result = 31 * 
0800: 72 65 73 75 6c 74 20 2b 20 66 69 6e 67 65 72 70  result + fingerp
0810: 72 69 6e 74 42 61 73 65 36 34 55 72 6c 2e 68 61  rintBase64Url.ha
0820: 73 68 43 6f 64 65 28 29 3b 0a 20 20 20 20 72 65  shCode();.    re
0830: 74 75 72 6e 20 72 65 73 75 6c 74 3b 0a 20 20 7d  turn result;.  }
0840: 0a 0a 20 20 2f 2a 2a 0a 20 20 20 2a 20 43 6f 6e  ..  /**.   * Con
0850: 73 74 72 75 63 74 73 20 74 68 65 20 66 69 6e 67  structs the fing
0860: 65 72 70 72 69 6e 74 20 6f 66 20 74 68 69 73 20  erprint of this 
0870: 63 6f 6e 64 69 74 69 6f 6e 20 62 79 20 74 61 6b  condition by tak
0880: 69 6e 67 20 74 68 65 20 53 48 41 2d 32 35 36 20  ing the SHA-256 
0890: 64 69 67 65 73 74 20 6f 66 20 74 68 65 20 63 6f  digest of the co
08a0: 6e 74 65 6e 74 73 20 6f 66 0a 20 20 20 2a 20 74  ntents of.   * t
08b0: 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 2c 20 70  his condition, p
08c0: 65 72 20 74 68 65 20 63 72 79 70 74 6f 2d 63 6f  er the crypto-co
08d0: 6e 64 69 74 69 6f 6e 73 20 52 46 43 2e 0a 20 20  nditions RFC..  
08e0: 20 2a 0a 20 20 20 2a 20 40 70 61 72 61 6d 20 66   *.   * @param f
08f0: 69 6e 67 65 72 70 72 69 6e 74 43 6f 6e 74 65 6e  ingerprintConten
0900: 74 73 20 41 20 62 79 74 65 20 61 72 72 61 79 20  ts A byte array 
0910: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 75  containing the u
0920: 6e 68 61 73 68 65 64 20 63 6f 6e 74 65 6e 74 73  nhashed contents
0930: 20 6f 66 20 74 68 69 73 20 63 6f 6e 64 69 74 69   of this conditi
0940: 6f 6e 20 61 73 0a 20 20 20 2a 20 20 20 20 20 20  on as.   *      
0950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0960: 20 20 20 20 20 20 61 73 73 65 6d 62 6c 65 64 20        assembled 
0970: 70 65 72 20 74 68 65 20 72 75 6c 65 73 20 6f 66  per the rules of
0980: 20 74 68 65 20 52 46 43 2e 0a 20 20 20 2a 0a 20   the RFC..   *. 
0990: 20 20 2a 20 40 72 65 74 75 72 6e 20 41 20 62 79    * @return A by
09a0: 74 65 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e  te array contain
09b0: 69 6e 67 20 74 68 65 20 68 61 73 68 65 64 20 66  ing the hashed f
09c0: 69 6e 67 65 72 70 72 69 6e 74 2e 0a 20 20 20 2a  ingerprint..   *
09d0: 2f 0a 20 20 70 72 6f 74 65 63 74 65 64 20 73 74  /.  protected st
09e0: 61 74 69 63 20 66 69 6e 61 6c 20 62 79 74 65 5b  atic final byte[
09f0: 5d 20 68 61 73 68 46 69 6e 67 65 72 70 72 69 6e  ] hashFingerprin
0a00: 74 43 6f 6e 74 65 6e 74 73 28 66 69 6e 61 6c 20  tContents(final 
0a10: 62 79 74 65 5b 5d 20 66 69 6e 67 65 72 70 72 69  byte[] fingerpri
0a20: 6e 74 43 6f 6e 74 65 6e 74 73 29 20 7b 0a 20 20  ntContents) {.  
0a30: 20 20 4f 62 6a 65 63 74 73 2e 72 65 71 75 69 72    Objects.requir
0a40: 65 4e 6f 6e 4e 75 6c 6c 28 66 69 6e 67 65 72 70  eNonNull(fingerp
0a50: 72 69 6e 74 43 6f 6e 74 65 6e 74 73 29 3b 0a 20  rintContents);. 
0a60: 20 20 20 74 72 79 20 7b 0a 20 20 20 20 20 20 66     try {.      f
0a70: 69 6e 61 6c 20 4d 65 73 73 61 67 65 44 69 67 65  inal MessageDige
0a80: 73 74 20 6d 65 73 73 61 67 65 44 69 67 65 73 74  st messageDigest
0a90: 20 3d 20 4d 65 73 73 61 67 65 44 69 67 65 73 74   = MessageDigest
0aa0: 2e 67 65 74 49 6e 73 74 61 6e 63 65 28 22 53 48  .getInstance("SH
0ab0: 41 2d 32 35 36 22 29 3b 0a 20 20 20 20 20 20 72  A-256");.      r
0ac0: 65 74 75 72 6e 20 6d 65 73 73 61 67 65 44 69 67  eturn messageDig
0ad0: 65 73 74 2e 64 69 67 65 73 74 28 66 69 6e 67 65  est.digest(finge
0ae0: 72 70 72 69 6e 74 43 6f 6e 74 65 6e 74 73 29 3b  rprintContents);
0af0: 0a 20 20 20 20 7d 20 63 61 74 63 68 20 28 4e 6f  .    } catch (No
0b00: 53 75 63 68 41 6c 67 6f 72 69 74 68 6d 45 78 63  SuchAlgorithmExc
0b10: 65 70 74 69 6f 6e 20 65 29 20 7b 0a 20 20 20 20  eption e) {.    
0b20: 20 20 74 68 72 6f 77 20 6e 65 77 20 52 75 6e 74    throw new Runt
0b30: 69 6d 65 45 78 63 65 70 74 69 6f 6e 28 65 29 3b  imeException(e);
0b40: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a           .    }.  }.}.