1 package org.bouncycastle.jcajce.provider.util; 2 3 import java.util.HashMap; 4 import java.util.HashSet; 5 import java.util.Map; 6 import java.util.Set; 7 8 import org.bouncycastle.asn1.ASN1ObjectIdentifier; 9 import org.bouncycastle.asn1.nist.NISTObjectIdentifiers; 10 import org.bouncycastle.asn1.oiw.OIWObjectIdentifiers; 11 import org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers; 12 import org.bouncycastle.crypto.Digest; 13 // BEGIN Android-added: Use Android digests 14 import org.bouncycastle.crypto.digests.AndroidDigestFactory; 15 // END Android-added: Use Android digests 16 import org.bouncycastle.util.Strings; 17 18 public class DigestFactory 19 { 20 private static Set md5 = new HashSet(); 21 private static Set sha1 = new HashSet(); 22 private static Set sha224 = new HashSet(); 23 private static Set sha256 = new HashSet(); 24 private static Set sha384 = new HashSet(); 25 private static Set sha512 = new HashSet(); 26 // BEGIN Android-removed: Unsupported algorithms 27 /* 28 private static Set sha512_224 = new HashSet(); 29 private static Set sha512_256 = new HashSet(); 30 private static Set sha3_224 = new HashSet(); 31 private static Set sha3_256 = new HashSet(); 32 private static Set sha3_384 = new HashSet(); 33 private static Set sha3_512 = new HashSet(); 34 */ 35 // END Android-removed: Unsupported algorithms 36 37 private static Map oids = new HashMap(); 38 39 static 40 { 41 md5.add("MD5"); 42 md5.add(PKCSObjectIdentifiers.md5.getId()); 43 44 sha1.add("SHA1"); 45 sha1.add("SHA-1"); 46 sha1.add(OIWObjectIdentifiers.idSHA1.getId()); 47 48 sha224.add("SHA224"); 49 sha224.add("SHA-224"); 50 sha224.add(NISTObjectIdentifiers.id_sha224.getId()); 51 52 sha256.add("SHA256"); 53 sha256.add("SHA-256"); 54 sha256.add(NISTObjectIdentifiers.id_sha256.getId()); 55 56 sha384.add("SHA384"); 57 sha384.add("SHA-384"); 58 sha384.add(NISTObjectIdentifiers.id_sha384.getId()); 59 60 sha512.add("SHA512"); 61 sha512.add("SHA-512"); 62 sha512.add(NISTObjectIdentifiers.id_sha512.getId()); 63 64 // BEGIN Android-removed: Unsupported algorithms 65 /* 66 sha512_224.add("SHA512(224)"); 67 sha512_224.add("SHA-512(224)"); 68 sha512_224.add(NISTObjectIdentifiers.id_sha512_224.getId()); 69 70 sha512_256.add("SHA512(256)"); 71 sha512_256.add("SHA-512(256)"); 72 sha512_256.add(NISTObjectIdentifiers.id_sha512_256.getId()); 73 74 sha3_224.add("SHA3-224"); 75 sha3_224.add(NISTObjectIdentifiers.id_sha3_224.getId()); 76 77 sha3_256.add("SHA3-256"); 78 sha3_256.add(NISTObjectIdentifiers.id_sha3_256.getId()); 79 80 sha3_384.add("SHA3-384"); 81 sha3_384.add(NISTObjectIdentifiers.id_sha3_384.getId()); 82 83 sha3_512.add("SHA3-512"); 84 sha3_512.add(NISTObjectIdentifiers.id_sha3_512.getId()); 85 */ 86 // END Android-removed: Unsupported algorithms 87 88 89 oids.put("MD5", PKCSObjectIdentifiers.md5); 90 oids.put(PKCSObjectIdentifiers.md5.getId(), PKCSObjectIdentifiers.md5); 91 92 oids.put("SHA1", OIWObjectIdentifiers.idSHA1); 93 oids.put("SHA-1", OIWObjectIdentifiers.idSHA1); 94 oids.put(OIWObjectIdentifiers.idSHA1.getId(), OIWObjectIdentifiers.idSHA1); 95 96 oids.put("SHA224", NISTObjectIdentifiers.id_sha224); 97 oids.put("SHA-224", NISTObjectIdentifiers.id_sha224); 98 oids.put(NISTObjectIdentifiers.id_sha224.getId(), NISTObjectIdentifiers.id_sha224); 99 100 oids.put("SHA256", NISTObjectIdentifiers.id_sha256); 101 oids.put("SHA-256", NISTObjectIdentifiers.id_sha256); 102 oids.put(NISTObjectIdentifiers.id_sha256.getId(), NISTObjectIdentifiers.id_sha256); 103 104 oids.put("SHA384", NISTObjectIdentifiers.id_sha384); 105 oids.put("SHA-384", NISTObjectIdentifiers.id_sha384); 106 oids.put(NISTObjectIdentifiers.id_sha384.getId(), NISTObjectIdentifiers.id_sha384); 107 108 oids.put("SHA512", NISTObjectIdentifiers.id_sha512); 109 oids.put("SHA-512", NISTObjectIdentifiers.id_sha512); 110 oids.put(NISTObjectIdentifiers.id_sha512.getId(), NISTObjectIdentifiers.id_sha512); 111 112 oids.put("SHA512(224)", NISTObjectIdentifiers.id_sha512_224); 113 oids.put("SHA-512(224)", NISTObjectIdentifiers.id_sha512_224); 114 oids.put(NISTObjectIdentifiers.id_sha512_224.getId(), NISTObjectIdentifiers.id_sha512_224); 115 116 oids.put("SHA512(256)", NISTObjectIdentifiers.id_sha512_256); 117 oids.put("SHA-512(256)", NISTObjectIdentifiers.id_sha512_256); 118 oids.put(NISTObjectIdentifiers.id_sha512_256.getId(), NISTObjectIdentifiers.id_sha512_256); 119 120 oids.put("SHA3-224", NISTObjectIdentifiers.id_sha3_224); 121 oids.put(NISTObjectIdentifiers.id_sha3_224.getId(), NISTObjectIdentifiers.id_sha3_224); 122 123 oids.put("SHA3-256", NISTObjectIdentifiers.id_sha3_256); 124 oids.put(NISTObjectIdentifiers.id_sha3_256.getId(), NISTObjectIdentifiers.id_sha3_256); 125 126 oids.put("SHA3-384", NISTObjectIdentifiers.id_sha3_384); 127 oids.put(NISTObjectIdentifiers.id_sha3_384.getId(), NISTObjectIdentifiers.id_sha3_384); 128 129 oids.put("SHA3-512", NISTObjectIdentifiers.id_sha3_512); 130 oids.put(NISTObjectIdentifiers.id_sha3_512.getId(), NISTObjectIdentifiers.id_sha3_512); 131 } 132 133 public static Digest getDigest( 134 String digestName) 135 { 136 digestName = Strings.toUpperCase(digestName); 137 138 if (sha1.contains(digestName)) 139 { 140 // Android-changed: Use Android digests 141 // return org.bouncycastle.crypto.util.DigestFactory.createSHA1(); 142 return AndroidDigestFactory.getSHA1(); 143 } 144 if (md5.contains(digestName)) 145 { 146 // Android-changed: Use Android digests 147 // return org.bouncycastle.crypto.util.DigestFactory.createMD5(); 148 return AndroidDigestFactory.getMD5(); 149 } 150 if (sha224.contains(digestName)) 151 { 152 // Android-changed: Use Android digests 153 // return org.bouncycastle.crypto.util.DigestFactory.createSHA224(); 154 return AndroidDigestFactory.getSHA224(); 155 } 156 if (sha256.contains(digestName)) 157 { 158 // Android-changed: Use Android digests 159 // return org.bouncycastle.crypto.util.DigestFactory.createSHA256(); 160 return AndroidDigestFactory.getSHA256(); 161 } 162 if (sha384.contains(digestName)) 163 { 164 // Android-changed: Use Android digests 165 // return org.bouncycastle.crypto.util.DigestFactory.createSHA384(); 166 return AndroidDigestFactory.getSHA384(); 167 } 168 if (sha512.contains(digestName)) 169 { 170 // Android-changed: Use Android digests 171 // return org.bouncycastle.crypto.util.DigestFactory.createSHA512(); 172 return AndroidDigestFactory.getSHA512(); 173 } 174 // BEGIN Android-removed: Unsupported algorithms 175 /* 176 if (sha512_224.contains(digestName)) 177 { 178 return org.bouncycastle.crypto.util.DigestFactory.createSHA512_224(); 179 } 180 if (sha512_256.contains(digestName)) 181 { 182 return org.bouncycastle.crypto.util.DigestFactory.createSHA512_256(); 183 } 184 185 if (sha3_224.contains(digestName)) 186 { 187 return org.bouncycastle.crypto.util.DigestFactory.createSHA3_224(); 188 } 189 if (sha3_256.contains(digestName)) 190 { 191 return org.bouncycastle.crypto.util.DigestFactory.createSHA3_256(); 192 } 193 if (sha3_384.contains(digestName)) 194 { 195 return org.bouncycastle.crypto.util.DigestFactory.createSHA3_384(); 196 } 197 if (sha3_512.contains(digestName)) 198 { 199 return org.bouncycastle.crypto.util.DigestFactory.createSHA3_512(); 200 } 201 */ 202 // END Android-removed: Unsupported algorithms 203 204 return null; 205 } 206 207 public static boolean isSameDigest( 208 String digest1, 209 String digest2) 210 { 211 return (sha1.contains(digest1) && sha1.contains(digest2)) 212 || (sha224.contains(digest1) && sha224.contains(digest2)) 213 || (sha256.contains(digest1) && sha256.contains(digest2)) 214 || (sha384.contains(digest1) && sha384.contains(digest2)) 215 || (sha512.contains(digest1) && sha512.contains(digest2)) 216 // BEGIN Android-removed: Unsupported algorithms 217 /* 218 || (sha512_224.contains(digest1) && sha512_224.contains(digest2)) 219 || (sha512_256.contains(digest1) && sha512_256.contains(digest2)) 220 || (sha3_224.contains(digest1) && sha3_224.contains(digest2)) 221 || (sha3_256.contains(digest1) && sha3_256.contains(digest2)) 222 || (sha3_384.contains(digest1) && sha3_384.contains(digest2)) 223 || (sha3_512.contains(digest1) && sha3_512.contains(digest2)) 224 */ 225 // END Android-removed: Unsupported algorithms 226 || (md5.contains(digest1) && md5.contains(digest2)); 227 } 228 229 public static ASN1ObjectIdentifier getOID( 230 String digestName) 231 { 232 return (ASN1ObjectIdentifier)oids.get(digestName); 233 } 234 } 235