Home | History | Annotate | Download | only in pem
      1 package org.bouncycastle.util.io.pem;
      2 
      3 import java.io.BufferedReader;
      4 import java.io.IOException;
      5 import java.io.Reader;
      6 import java.util.ArrayList;
      7 import java.util.List;
      8 
      9 import org.bouncycastle.util.encoders.Base64;
     10 
     11 public class PemReader
     12     extends BufferedReader
     13 {
     14     private static final String BEGIN = "-----BEGIN ";
     15     private static final String END = "-----END ";
     16 
     17     public PemReader(Reader reader)
     18     {
     19         super(reader);
     20     }
     21 
     22     public PemObject readPemObject()
     23         throws IOException
     24     {
     25         String line = readLine();
     26 
     27         while (line != null && !line.startsWith(BEGIN))
     28         {
     29             line = readLine();
     30         }
     31 
     32         if (line != null)
     33         {
     34             line = line.substring(BEGIN.length());
     35             int index = line.indexOf('-');
     36             String type = line.substring(0, index);
     37 
     38             if (index > 0)
     39             {
     40                 return loadObject(type);
     41             }
     42         }
     43 
     44         return null;
     45     }
     46 
     47     private PemObject loadObject(String type)
     48         throws IOException
     49     {
     50         String          line;
     51         String          endMarker = END + type;
     52         StringBuffer    buf = new StringBuffer();
     53         List            headers = new ArrayList();
     54 
     55         while ((line = readLine()) != null)
     56         {
     57             if (line.indexOf(":") >= 0)
     58             {
     59                 int index = line.indexOf(':');
     60                 String hdr = line.substring(0, index);
     61                 String value = line.substring(index + 1).trim();
     62 
     63                 headers.add(new PemHeader(hdr, value));
     64 
     65                 continue;
     66             }
     67 
     68             if (line.indexOf(endMarker) != -1)
     69             {
     70                 break;
     71             }
     72 
     73             buf.append(line.trim());
     74         }
     75 
     76         if (line == null)
     77         {
     78             throw new IOException(endMarker + " not found");
     79         }
     80 
     81         return new PemObject(type, headers, Base64.decode(buf.toString()));
     82     }
     83 
     84 }
     85