4 * A class to parse some PEM stuff.
5 * Copyright (c) 2007 Henri Torgemane
7 * See LICENSE.txt for full license information.
9 package com.hurlant.util.der
11 import com.hurlant.crypto.rsa.RSAKey;
12 import com.hurlant.math.BigInteger;
13 import com.hurlant.util.Base64;
15 import flash.utils.ByteArray;
16 import com.hurlant.util.Hex;
20 private static const RSA_PRIVATE_KEY_HEADER:String = "-----BEGIN RSA PRIVATE KEY-----";
21 private static const RSA_PRIVATE_KEY_FOOTER:String = "-----END RSA PRIVATE KEY-----";
22 private static const RSA_PUBLIC_KEY_HEADER:String = "-----BEGIN PUBLIC KEY-----";
23 private static const RSA_PUBLIC_KEY_FOOTER:String = "-----END PUBLIC KEY-----";
24 private static const CERTIFICATE_HEADER:String = "-----BEGIN CERTIFICATE-----";
25 private static const CERTIFICATE_FOOTER:String = "-----END CERTIFICATE-----";
31 * Read a structure encoded according to
32 * ftp://ftp.rsasecurity.com/pub/pkcs/ascii/pkcs-1v2.asc
39 public static function readRSAPrivateKey(str:String):RSAKey {
40 var der:ByteArray = extractBinary(RSA_PRIVATE_KEY_HEADER, RSA_PRIVATE_KEY_FOOTER, str);
41 if (der==null) return null;
42 var obj:* = DER.parse(der);
44 var arr:Array = obj as Array;
45 // arr[0] is Version. should be 0. should be checked. shoulda woulda coulda.
48 arr[2].valueOf(), // E
63 * Read a structure encoded according to some spec somewhere
64 * Also, follows some chunk from
65 * ftp://ftp.rsasecurity.com/pub/pkcs/ascii/pkcs-1v2.asc
72 public static function readRSAPublicKey(str:String):RSAKey {
73 var der:ByteArray = extractBinary(RSA_PUBLIC_KEY_HEADER, RSA_PUBLIC_KEY_FOOTER, str);
74 if (der==null) return null;
75 var obj:* = DER.parse(der);
77 var arr:Array = obj as Array;
78 // arr[0] = [ <some crap that means "rsaEncryption">, null ]; ( apparently, that's an X-509 Algorithm Identifier.
79 if (arr[0][0].toString()!=OID.RSA_ENCRYPTION) {
82 // arr[1] is a ByteArray begging to be parsed as DER
83 arr[1].position = 1; // there's a 0x00 byte up front. find out why later. like, read a spec.
84 obj = DER.parse(arr[1]);
88 // arr[1] = public expt.
89 return new RSAKey(arr[0], arr[1]);
99 public static function readCertIntoArray(str:String):ByteArray {
100 var tmp:ByteArray = extractBinary(CERTIFICATE_HEADER, CERTIFICATE_FOOTER, str);
104 private static function extractBinary(header:String, footer:String, str:String):ByteArray {
105 var i:int = str.indexOf(header);
106 if (i==-1) return null;
108 var j:int = str.indexOf(footer);
109 if (j==-1) return null;
110 var b64:String = str.substring(i, j);
111 // remove whitesapces.
112 b64 = b64.replace(/\s/mg, '');
114 return Base64.decodeToByteArray(b64);