16e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrompackage org.bouncycastle.util.io.pem; 26e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom 36e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstromimport java.io.BufferedReader; 46e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstromimport java.io.IOException; 56e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstromimport java.io.Reader; 66e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstromimport java.util.ArrayList; 76e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstromimport java.util.List; 86e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom 96e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstromimport org.bouncycastle.util.encoders.Base64; 106e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom 116e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrompublic class PemReader 126e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom extends BufferedReader 136e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom{ 146e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom private static final String BEGIN = "-----BEGIN "; 156e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom private static final String END = "-----END "; 166e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom 176e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom public PemReader(Reader reader) 186e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom { 196e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom super(reader); 206e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom } 216e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom 226e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom public PemObject readPemObject() 236e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom throws IOException 246e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom { 256e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom String line = readLine(); 266e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom 274c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom while (line != null && !line.startsWith(BEGIN)) 284c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 294c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom line = readLine(); 304c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 314c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 324c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom if (line != null) 336e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom { 346e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom line = line.substring(BEGIN.length()); 356e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom int index = line.indexOf('-'); 366e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom String type = line.substring(0, index); 376e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom 386e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom if (index > 0) 396e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom { 406e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom return loadObject(type); 416e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom } 426e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom } 436e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom 446e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom return null; 456e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom } 466e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom 476e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom private PemObject loadObject(String type) 486e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom throws IOException 496e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom { 506e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom String line; 516e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom String endMarker = END + type; 526e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom StringBuffer buf = new StringBuffer(); 536e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom List headers = new ArrayList(); 546e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom 556e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom while ((line = readLine()) != null) 566e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom { 576e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom if (line.indexOf(":") >= 0) 586e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom { 596e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom int index = line.indexOf(':'); 606e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom String hdr = line.substring(0, index); 616e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom String value = line.substring(index + 1).trim(); 626e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom 636e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom headers.add(new PemHeader(hdr, value)); 646e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom 656e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom continue; 666e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom } 676e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom 686e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom if (line.indexOf(endMarker) != -1) 696e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom { 706e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom break; 716e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom } 726e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom 736e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom buf.append(line.trim()); 746e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom } 756e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom 766e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom if (line == null) 776e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom { 786e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom throw new IOException(endMarker + " not found"); 796e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom } 806e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom 816e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom return new PemObject(type, headers, Base64.decode(buf.toString())); 826e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom } 836e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom 846e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom} 85