From 85e24abe600bebadc68bce7cf47d087177b4eb83 Mon Sep 17 00:00:00 2001 From: adam Date: Tue, 16 Mar 2004 05:00:05 +0000 Subject: [PATCH] import darcs-hash:20040316050005-5007d-d3b0594e35ba6c6edf7b86abf5a5dcb5b471fa9c.gz --- lib/netscape.jar | Bin 0 -> 395090 bytes src/org/xwt/plat/Win32-dll.cc | 307 ++ src/org/xwt/plat/Win32.def | 5 + src/org/xwt/plat/Win32.inf | 19 + src/org/xwt/shoehorn/ShoeHorn.java | 3 + src/org/xwt/shoehorn/ShoeHorn1.java | 3 + src/org/xwt/shoehorn2/ShoeHorn.java | 3 + src/org/xwt/shoehorn3/Crypto.java |10138 +++++++++++++++++++++++++++++++++++ src/org/xwt/shoehorn3/ShoeHorn.java | 628 +++ 9 files changed, 11106 insertions(+) create mode 100644 lib/netscape.jar create mode 100644 src/org/xwt/plat/Win32-dll.cc create mode 100644 src/org/xwt/plat/Win32.def create mode 100644 src/org/xwt/plat/Win32.inf create mode 100644 src/org/xwt/shoehorn/ShoeHorn.java create mode 100644 src/org/xwt/shoehorn/ShoeHorn1.java create mode 100644 src/org/xwt/shoehorn2/ShoeHorn.java create mode 100644 src/org/xwt/shoehorn3/Crypto.java create mode 100644 src/org/xwt/shoehorn3/ShoeHorn.java diff --git a/lib/netscape.jar b/lib/netscape.jar new file mode 100644 index 0000000000000000000000000000000000000000..b1a72b2edd31c1e8f17c90b6b280d60cfc5b301a GIT binary patch literal 395090 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

q`>_H9`4k=y7k;oK4}I^LTP_xCNy0D8 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≻!n6RZn3w0-#v_?ux->SFXqbO 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

E0B0?Q&P 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 literal 0 HcmV?d00001 diff --git a/src/org/xwt/plat/Win32-dll.cc b/src/org/xwt/plat/Win32-dll.cc new file mode 100644 index 0000000..ff823e5 --- /dev/null +++ b/src/org/xwt/plat/Win32-dll.cc @@ -0,0 +1,307 @@ +// Copyright 2002 Adam Megacz, ALL RIGHTS RESERVED + +// +// A simple DLL to invoke xwt.exe and pass it any arguments found in the tag +// + +#include +#include +#include +#include +#include +#include +#include + + +// Globals //////////////////////////////////////////////////////////////////////// + +using namespace std; + +#define CLSID_STRING_SIZE 39 + +const char XWT_friendlyName[] = "XWT ActiveX Control (build " BUILDID ")"; +const char XWT_versionIndependantProgramID[] = "XWT.ActiveX"; +const char XWT_programID[] = "XWT.ActiveX (build " BUILDID ")"; +extern "C" const CLSID XWT_clsid = CLSID_STRUCT; +static HMODULE g_hModule = NULL; //DLL handle + + + + +// Superclasses //////////////////////////////////////////////////////////////////////// + +// Option bit definitions for IObjectSafety: +#define INTERFACESAFE_FOR_UNTRUSTED_CALLER 0x00000001 // Caller of interface may be untrusted +#define INTERFACESAFE_FOR_UNTRUSTED_DATA 0x00000002 // Data passed into interface may be untrusted + +// {CB5BDC81-93C1-11cf-8F20-00805F2CD064} +//DEFINE_GUID(IID_IObjectSafety, 0xcb5bdc81, 0x93c1, 0x11cf, 0x8f, 0x20, 0x0, 0x80, 0x5f, 0x2c, 0xd0, 0x64); +extern "C" const CLSID IID_IObjectSafety; + +interface IObjectSafety : public IUnknown { + public: + virtual HRESULT __stdcall GetInterfaceSafetyOptions(REFIID riid, DWORD __RPC_FAR *pdwSupportedOptions, DWORD __RPC_FAR *pdwEnabledOptions) = 0; + virtual HRESULT __stdcall SetInterfaceSafetyOptions(REFIID riid, DWORD dwOptionSetMask, DWORD dwEnabledOptions) = 0; +}; + +interface IShoeHorn : IPersistPropertyBag, IObjectSafety { }; + + + +// Entry Points //////////////////////////////////////////////////////////////////////// + +// to get mingw to stop nagging me +int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { } + +// determines whether or not the DLL can be unloaded; always allow this since we don't do too much +STDAPI __declspec(dllexport) DllCanUnloadNow(void) { return S_OK; } + +extern "C" __declspec(dllexport) BOOL WINAPI DllMain(HINSTANCE hModule, DWORD dwReason, LPVOID /*lpReserved*/) { + if (dwReason == DLL_PROCESS_ATTACH) g_hModule = (HINSTANCE)hModule; + return TRUE; +} + + + +// Other /////////////////////////////////////////////////////////////////////////////////// + +// simple assert() replacement that pops open a message box if there are errors +void check(int val, char* message) { + if (!val) { + MessageBox (NULL, message, "XWT Critical Abort", MB_OK | MB_ICONEXCLAMATION | MB_TASKMODAL | MB_SETFOREGROUND); + exit(-1); + } +} + +void clsidToString(const CLSID& clsid, char* str, int length) { + check(length >= CLSID_STRING_SIZE, "clsidToString(): string too short"); + LPOLESTR wide_str = NULL; + HRESULT hr = StringFromCLSID(clsid, &wide_str); + check(SUCCEEDED(hr), "StringFromCLSID() failed in clsidToString()"); + wcstombs(str, wide_str, length); + CoTaskMemFree(wide_str); +} + +void setRegistryKey(const char* key, const char* subkey, const char* value) { + HKEY hKey; + char keyBuf[1024]; + strcpy(keyBuf, key); + if (subkey != NULL) { + strcat(keyBuf, "\\"); + strcat(keyBuf, subkey ); + } + long lResult = RegCreateKeyEx(HKEY_CLASSES_ROOT, keyBuf, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, NULL); + if (value != NULL) + check(RegSetValueEx(hKey, NULL, 0, REG_SZ, (BYTE *)value, strlen(value) + 1) == ERROR_SUCCESS, + "RegSetValueEx() failed in setRegistryKey()"); + RegCloseKey(hKey); +} + +void deleteRegistryKey(HKEY parent, const char* target) { + HKEY hKeyChild; + RegOpenKeyEx(parent, target, 0, KEY_ALL_ACCESS, &hKeyChild); + + // Iterate over children, deleting them + FILETIME time; + char szBuffer[256]; + DWORD dwSize = 256; + while (RegEnumKeyEx(hKeyChild, 0, szBuffer, &dwSize, NULL, NULL, NULL, &time) == S_OK) { + deleteRegistryKey(hKeyChild, szBuffer); + dwSize = 256; + } + + RegCloseKey(hKeyChild); + RegDeleteKey(parent, target); +} + +STDAPI __declspec(dllexport) DllRegisterServer(void) { + char moduleName[512]; + HRESULT result = GetModuleFileName(g_hModule, moduleName, sizeof(moduleName)/sizeof(char)); + check(result, "GetModuleFileName() failed in RegisterServer()"); + + char clsidString[CLSID_STRING_SIZE]; + clsidToString(XWT_clsid, clsidString, sizeof(clsidString)); + + // build the key + char key[64]; + strcpy(key, "CLSID\\"); + strcat(key, clsidString); + + setRegistryKey(key, NULL, XWT_friendlyName); + setRegistryKey(key, "InprocServer32", moduleName); + setRegistryKey(key, "ProgID", XWT_programID); + setRegistryKey(key, "VersionIndependentProgID", XWT_versionIndependantProgramID); + setRegistryKey(XWT_versionIndependantProgramID, NULL, XWT_friendlyName); + setRegistryKey(XWT_versionIndependantProgramID, "CLSID", clsidString); + setRegistryKey(XWT_versionIndependantProgramID, "CurVer", XWT_programID); + setRegistryKey(XWT_programID, NULL, XWT_friendlyName); + setRegistryKey(XWT_programID, "CLSID", clsidString); + return S_OK; +} + +STDAPI __declspec(dllexport) DllUnregisterServer(void) { + char clsidString[CLSID_STRING_SIZE]; + clsidToString(XWT_clsid, clsidString, sizeof(clsidString)); + + // build the key + char key[64]; + strcpy(key, "CLSID\\"); + strcat(key, clsidString); + + deleteRegistryKey(HKEY_CLASSES_ROOT, key); + deleteRegistryKey(HKEY_CLASSES_ROOT, XWT_versionIndependantProgramID); + deleteRegistryKey(HKEY_CLASSES_ROOT, XWT_programID); + return S_OK; +} + + + +// ShoeHorn ////////////////////////////////////////////////////////////////////////////////// + +class ShoeHorn : public IShoeHorn { + public: + virtual HRESULT __stdcall QueryInterface(const IID& iid, void** ppv) { + if(iid == IID_IUnknown) *ppv = static_cast(this); + else if(iid == XWT_clsid) *ppv = static_cast(this); + else if(iid == IID_IPersistPropertyBag) *ppv = static_cast(this); + else if(iid == IID_IObjectSafety) *ppv = static_cast(this); + else { *ppv = NULL; return E_NOINTERFACE; } + reinterpret_cast(*ppv)->AddRef(); + return S_OK; + } + virtual ULONG __stdcall AddRef() { return InterlockedIncrement(&m_cRef); } + virtual ULONG __stdcall Release() { + if(InterlockedDecrement(&m_cRef) == 0) { delete this; return 0; } + return m_cRef; + } + virtual HRESULT __stdcall GetClassID(CLSID*) { return S_OK; } + virtual HRESULT __stdcall InitNew() { return S_OK; } + virtual HRESULT __stdcall Save(IPropertyBag*, int, int) { return S_OK; } + virtual HRESULT __stdcall SetInterfaceSafetyOptions(REFIID riid, DWORD pdwSupportedOptions, DWORD pdwEnabledOptions) { return S_OK; } + virtual HRESULT __stdcall GetInterfaceSafetyOptions(REFIID riid, DWORD* pdwSupportedOptions, DWORD* pdwEnabledOptions) { + if (pdwSupportedOptions != NULL) *pdwSupportedOptions |= INTERFACESAFE_FOR_UNTRUSTED_DATA; + if (pdwEnabledOptions != NULL) *pdwSupportedOptions |= INTERFACESAFE_FOR_UNTRUSTED_DATA; + return S_OK; + } + + virtual HRESULT __stdcall Load(IPropertyBag* pPropBag, IErrorLog* pErrorLog) { + VARIANT v; + v.vt = VT_BSTR; + HRESULT hrRead; + + WCHAR wc[100]; + char url[100]; + + MultiByteToWideChar(CP_ACP, 0, "xwar", -1, wc, 100); + pPropBag->Read(wc, &v, pErrorLog); + check(WideCharToMultiByte(CP_ACP, 0, v.bstrVal, -1, url, 100, NULL, NULL), + "WideCharToMultiByte() failed in ShoeHorn::Load()"); + + HKEY hkey; + LONG result = RegOpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\ActiveX Cache", &hkey); + check(result == ERROR_SUCCESS, "RegOpenKey() failed in ShoeHorn::Load()"); + + // iterate over all the activex cache locations until we find ourselves + for(int i=0; i<9; i++) { + DWORD buflen = 999; + char buf[1000]; + VALENT valents[20]; + DWORD type; + char which[2]; + + which[0] = '0' + i; + which[1] = '\0'; + result = RegQueryValueEx(hkey, which, NULL, &type, (BYTE*)buf, &buflen); + if (result != ERROR_SUCCESS) + if (i == 0) { + check(0, "RegQueryValueEx() failed in ShoeHorn::Load()"); + } else { + break; + } + buf[buflen] = '\0'; + + char cmdline[200]; + for(int i=0; i<200; i++) cmdline[i] = '\0'; + strncpy(cmdline, buf, 200); + strncpy(cmdline + strlen(cmdline), "\\xwt-" BUILDID ".exe", 200 - strlen(cmdline)); + strncpy(cmdline + strlen(cmdline), " ", 200 - strlen(cmdline)); + strncpy(cmdline + strlen(cmdline), url, 200 - strlen(cmdline)); + + PROCESS_INFORMATION pInfo; + STARTUPINFO sInfo; + sInfo.cb = sizeof(STARTUPINFO); + sInfo.lpReserved = NULL; + sInfo.lpReserved2 = NULL; + sInfo.cbReserved2 = 0; + sInfo.lpDesktop = NULL; + sInfo.lpTitle = NULL; + sInfo.dwFlags = 0; + sInfo.dwX = 0; + sInfo.dwY = 0; + sInfo.dwFillAttribute = 0; + sInfo.wShowWindow = SW_SHOW; + BOOL b = CreateProcess(NULL, cmdline, NULL, NULL, FALSE, 0, NULL, NULL, &sInfo, &pInfo); + if (b) return S_OK; + } + + check(0, "unable to locate xwt-" BUILDID ".exe in ActiveX cache folders"); + } + + ShoeHorn() : m_cRef(1) { }; + ~ShoeHorn() { }; + private: long m_cRef; +}; + + + + +// ClassFactory ////////////////////////////////////////////////////////////////////////// + +class ClassFactory : public IClassFactory { + public: + virtual HRESULT __stdcall QueryInterface(const IID& iid, void** ppv) { + if(iid == IID_IUnknown) *ppv = static_cast(this); + else if(iid == IID_IClassFactory) *ppv = static_cast(this); + else { + *ppv = NULL; + return E_NOINTERFACE; + } + reinterpret_cast(*ppv)->AddRef(); + return S_OK; + } + + ClassFactory() : m_cRef(1) { } + ~ClassFactory() { } + virtual HRESULT __stdcall LockServer(BOOL bLock) { return S_OK; } + virtual ULONG __stdcall AddRef() { return InterlockedIncrement(&m_cRef); } + virtual ULONG __stdcall Release() { + if(InterlockedDecrement(&m_cRef) == 0) { + delete this; + return 0; + } + return m_cRef; + } + + virtual HRESULT __stdcall CreateInstance(IUnknown* pUnknownOuter, const IID& iid, void** ppv) { + if(pUnknownOuter != NULL) return CLASS_E_NOAGGREGATION; + ShoeHorn* s = new ShoeHorn; + if(s == NULL) return E_OUTOFMEMORY; + HRESULT hr = s->QueryInterface(iid, ppv); + s->Release(); + return hr; + } + + private: long m_cRef; +}; + + +extern "C" __stdcall HRESULT DllGetClassObject(const CLSID& clsid, const IID& iid, void** ppv) { + if(clsid != XWT_clsid) return CLASS_E_CLASSNOTAVAILABLE; + ClassFactory* pFactory = new ClassFactory; + if(pFactory == NULL) return E_OUTOFMEMORY; + HRESULT hr = pFactory->QueryInterface(iid, ppv); + pFactory->Release(); + return hr; +} + + diff --git a/src/org/xwt/plat/Win32.def b/src/org/xwt/plat/Win32.def new file mode 100644 index 0000000..9a790cb --- /dev/null +++ b/src/org/xwt/plat/Win32.def @@ -0,0 +1,5 @@ +EXPORTS + DllGetClassObject = DllGetClassObject@12 + DllCanUnloadNow = DllCanUnloadNow@0 + DllRegisterServer = DllRegisterServer@0 + DllUnregisterServer = DllUnregisterServer@0 diff --git a/src/org/xwt/plat/Win32.inf b/src/org/xwt/plat/Win32.inf new file mode 100644 index 0000000..ca2eb91 --- /dev/null +++ b/src/org/xwt/plat/Win32.inf @@ -0,0 +1,19 @@ +;; This file will be copied to bin-Win32/cabsrc/xwt-__BUILD__.inf and then packed up +;; into the .cab file for distribution + +[version] + signature="$CHICAGO$" + AdvancedINF=2.0 +[Add.Code] + xwt-__BUILD__.dll=xwt-__BUILD__.dll + xwt-__BUILD__.exe=xwt-__BUILD__.exe +[xwt-__BUILD__.dll] + file-win32-x86=thiscab + clsid={D605__BUILD__-61B3-11d6-82FA-005056CA9250} + FileVersion=7,0,0,0 + RegisterServer=yes +[xwt-__BUILD__.exe] + file-win32-x86=thiscab + clsid={FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFE} + FileVersion=7,0,0,0 + RegisterServer=no diff --git a/src/org/xwt/shoehorn/ShoeHorn.java b/src/org/xwt/shoehorn/ShoeHorn.java new file mode 100644 index 0000000..bf34c2f --- /dev/null +++ b/src/org/xwt/shoehorn/ShoeHorn.java @@ -0,0 +1,3 @@ +// Copyright 2002 Adam Megacz, see the COPYING file for licensing [GPL] +package org.xwt.shoehorn; +public class ShoeHorn extends org.xwt.shoehorn3.ShoeHorn { } diff --git a/src/org/xwt/shoehorn/ShoeHorn1.java b/src/org/xwt/shoehorn/ShoeHorn1.java new file mode 100644 index 0000000..0fdac2e --- /dev/null +++ b/src/org/xwt/shoehorn/ShoeHorn1.java @@ -0,0 +1,3 @@ +// Copyright 2002 Adam Megacz, see the COPYING file for licensing [GPL] +package org.xwt.shoehorn; +public class ShoeHorn1 extends org.xwt.shoehorn3.ShoeHorn { } diff --git a/src/org/xwt/shoehorn2/ShoeHorn.java b/src/org/xwt/shoehorn2/ShoeHorn.java new file mode 100644 index 0000000..4e3edbf --- /dev/null +++ b/src/org/xwt/shoehorn2/ShoeHorn.java @@ -0,0 +1,3 @@ +// Copyright 2002 Adam Megacz, see the COPYING file for licensing [GPL] +package org.xwt.shoehorn2; +public class ShoeHorn extends org.xwt.shoehorn3.ShoeHorn { } diff --git a/src/org/xwt/shoehorn3/Crypto.java b/src/org/xwt/shoehorn3/Crypto.java new file mode 100644 index 0000000..cf90501 --- /dev/null +++ b/src/org/xwt/shoehorn3/Crypto.java @@ -0,0 +1,10138 @@ +// This is just a cut-and-paste of a bunch of files from Bouncycastle +package org.xwt.shoehorn3; + +import java.io.*; +import java.math.BigInteger; +import java.util.*; +import java.text.*; + +abstract class ASN1OctetString + extends DERObject +{ + byte[] string; + + /** + * return an Octet String from a tagged object. + * + * @param obj the tagged object holding the object we want. + * @param explicit true if the object is meant to be explicitly + * tagged false otherwise. + * @exception IllegalArgumentException if the tagged object cannot + * be converted. + */ + public static ASN1OctetString getInstance( + ASN1TaggedObject obj, + boolean explicit) + { + return getInstance(obj.getObject()); + } + + /** + * return an Octet String from the given object. + * + * @param obj the object we want converted. + * @exception IllegalArgumentException if the object cannot be converted. + */ + public static ASN1OctetString getInstance( + Object obj) + { + if (obj == null || obj instanceof ASN1OctetString) + { + return (ASN1OctetString)obj; + } + + if (obj instanceof ASN1TaggedObject) + { + return getInstance(((ASN1TaggedObject)obj).getObject()); + } + + if (obj instanceof ASN1Sequence) + { + Vector v = new Vector(); + Enumeration e = ((ASN1Sequence)obj).getObjects(); + + while (e.hasMoreElements()) + { + v.addElement(e.nextElement()); + } + + return new BERConstructedOctetString(v); + } + + throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName()); + } + + /** + * @param string the octets making up the octet string. + */ + public ASN1OctetString( + byte[] string) + { + this.string = string; + } + + public ASN1OctetString( + DEREncodable obj) + { + try + { + ByteArrayOutputStream bOut = new ByteArrayOutputStream(); + DEROutputStream dOut = new DEROutputStream(bOut); + + dOut.writeObject(obj); + dOut.close(); + + this.string = bOut.toByteArray(); + } + catch (IOException e) + { + throw new IllegalArgumentException("Error processing object : " + e.toString()); + } + } + + public byte[] getOctets() + { + return string; + } + + public int hashCode() + { + byte[] b = this.getOctets(); + int value = 0; + + for (int i = 0; i != b.length; i++) + { + value ^= (b[i] & 0xff) << (i % 4); + } + + return value; + } + + public boolean equals( + Object o) + { + if (o == null || !(o instanceof DEROctetString)) + { + return false; + } + + DEROctetString other = (DEROctetString)o; + + byte[] b1 = other.getOctets(); + byte[] b2 = this.getOctets(); + + if (b1.length != b2.length) + { + return false; + } + + for (int i = 0; i != b1.length; i++) + { + if (b1[i] != b2[i]) + { + return false; + } + } + + return true; + } + + abstract void encode(DEROutputStream out) + throws IOException; +} + + +class ASN1OutputStream + extends DEROutputStream +{ + public ASN1OutputStream( + OutputStream os) + { + super(os); + } + + public void writeObject( + Object obj) + throws IOException + { + if (obj == null) + { + writeNull(); + } + else if (obj instanceof DERObject) + { + ((DERObject)obj).encode(this); + } + else if (obj instanceof DEREncodable) + { + ((DEREncodable)obj).getDERObject().encode(this); + } + else + { + throw new IOException("object not ASN1Encodable"); + } + } +} + + +abstract class ASN1Sequence + extends DERObject +{ + private Vector seq = new Vector(); + + /** + * return an ASN1Sequence from the given object. + * + * @param obj the object we want converted. + * @exception IllegalArgumentException if the object cannot be converted. + */ + public static ASN1Sequence getInstance( + Object obj) + { + if (obj == null || obj instanceof ASN1Sequence) + { + return (ASN1Sequence)obj; + } + + throw new IllegalArgumentException("unknown object in getInstance"); + } + + /** + * Return an ASN1 sequence from a tagged object. There is a special + * case here, if an object appears to have been explicitly tagged on + * reading but we were expecting it to be implictly tagged in the + * normal course of events it indicates that we lost the surrounding + * sequence - so we need to add it back (this will happen if the tagged + * object is a sequence that contains other sequences). If you are + * dealing with implicitly tagged sequences you really should + * be using this method. + * + * @param obj the tagged object. + * @param explicit true if the object is meant to be explicitly tagged, + * false otherwise. + * @exception IllegalArgumentException if the tagged object cannot + * be converted. + */ + public static ASN1Sequence getInstance( + ASN1TaggedObject obj, + boolean explicit) + { + if (explicit) + { + if (!obj.isExplicit()) + { + throw new IllegalArgumentException("object implicit - explicit expected."); + } + + return (ASN1Sequence)obj.getObject(); + } + else + { + // + // constructed object which appears to be explicitly tagged + // when it should be implicit means we have to add the + // surrounding sequence. + // + if (obj.isExplicit()) + { + ASN1Sequence seq; + + if (obj instanceof BERTaggedObject) + { + seq = new BERConstructedSequence(); + } + else + { + seq = new DERConstructedSequence(); + } + + seq.addObject(obj.getObject()); + + return seq; + } + else + { + ASN1Sequence seq; + + if (obj.getObject() instanceof ASN1Sequence) + { + return (ASN1Sequence)obj.getObject(); + } + } + } + + throw new IllegalArgumentException( + "unknown object in getInstanceFromTagged"); + } + + public Enumeration getObjects() + { + return seq.elements(); + } + + /** + * return the object at the sequence postion indicated by index. + * + * @param the sequence number (starting at zero) of the object + * @return the object at the sequence postion indicated by index. + */ + public DEREncodable getObjectAt( + int index) + { + return (DEREncodable)seq.elementAt(index); + } + + /** + * return the number of objects in this sequence. + * + * @return the number of objects in this sequence. + */ + public int size() + { + return seq.size(); + } + + public int hashCode() + { + Enumeration e = this.getObjects(); + int hashCode = 0; + + while (e.hasMoreElements()) + { + hashCode ^= e.nextElement().hashCode(); + } + + return hashCode; + } + + public boolean equals( + Object o) + { + if (o == null || !(o instanceof ASN1Sequence)) + { + return false; + } + + ASN1Sequence other = (ASN1Sequence)o; + + if (this.size() != other.size()) + { + return false; + } + + Enumeration s1 = this.getObjects(); + Enumeration s2 = other.getObjects(); + + while (s1.hasMoreElements()) + { + if (!s1.nextElement().equals(s2.nextElement())) + { + return false; + } + } + + return true; + } + + protected void addObject( + DEREncodable obj) + { + seq.addElement(obj); + } + + abstract void encode(DEROutputStream out) + throws IOException; +} + + +abstract class ASN1Set + extends DERObject +{ + protected Vector set = new Vector(); + + /** + * return an ASN1Set from the given object. + * + * @param obj the object we want converted. + * @exception IllegalArgumentException if the object cannot be converted. + */ + public static ASN1Set getInstance( + Object obj) + { + if (obj == null || obj instanceof ASN1Set) + { + return (ASN1Set)obj; + } + + throw new IllegalArgumentException("unknown object in getInstance"); + } + + /** + * Return an ASN1 set from a tagged object. There is a special + * case here, if an object appears to have been explicitly tagged on + * reading but we were expecting it to be implictly tagged in the + * normal course of events it indicates that we lost the surrounding + * set - so we need to add it back (this will happen if the tagged + * object is a sequence that contains other sequences). If you are + * dealing with implicitly tagged sets you really should + * be using this method. + * + * @param obj the tagged object. + * @param explicit true if the object is meant to be explicitly tagged + * false otherwise. + * @exception IllegalArgumentException if the tagged object cannot + * be converted. + */ + public static ASN1Set getInstance( + ASN1TaggedObject obj, + boolean explicit) + { + if (explicit) + { + if (!obj.isExplicit()) + { + throw new IllegalArgumentException("object implicit - explicit expected."); + } + + return (ASN1Set)obj.getObject(); + } + else + { + // + // constructed object which appears to be explicitly tagged + // and it's really implicit means we have to add the + // surrounding sequence. + // + if (obj.isExplicit()) + { + ASN1Set set = new DERSet(obj.getObject()); + + return set; + } + else + { + // + // in this case the parser returns a sequence, convert it + // into a set. + // + DEREncodableVector v = new DEREncodableVector(); + + if (obj.getObject() instanceof ASN1Sequence) + { + ASN1Sequence s = (ASN1Sequence)obj.getObject(); + Enumeration e = s.getObjects(); + + while (e.hasMoreElements()) + { + v.add((DEREncodable)e.nextElement()); + } + + return new DERSet(v); + } + } + } + + throw new IllegalArgumentException( + "unknown object in getInstanceFromTagged"); + } + + public ASN1Set() + { + } + + public Enumeration getObjects() + { + return set.elements(); + } + + /** + * return the object at the set postion indicated by index. + * + * @param the set number (starting at zero) of the object + * @return the object at the set postion indicated by index. + */ + public DEREncodable getObjectAt( + int index) + { + return (DEREncodable)set.elementAt(index); + } + + /** + * return the number of objects in this set. + * + * @return the number of objects in this set. + */ + public int size() + { + return set.size(); + } + + public int hashCode() + { + Enumeration e = this.getObjects(); + int hashCode = 0; + + while (e.hasMoreElements()) + { + hashCode ^= e.nextElement().hashCode(); + } + + return hashCode; + } + + public boolean equals( + Object o) + { + if (o == null || !(o instanceof ASN1Set)) + { + return false; + } + + ASN1Set other = (ASN1Set)o; + + if (this.size() != other.size()) + { + return false; + } + + Enumeration s1 = this.getObjects(); + Enumeration s2 = other.getObjects(); + + while (s1.hasMoreElements()) + { + if (!s1.nextElement().equals(s2.nextElement())) + { + return false; + } + } + + return true; + } + + protected void addObject( + DEREncodable obj) + { + set.addElement(obj); + } + + abstract void encode(DEROutputStream out) + throws IOException; +} + + +/** + * ASN.1 TaggedObject - in ASN.1 nottation this is any object proceeded by + * a [n] where n is some number - these are assume to follow the construction + * rules (as with sequences). + */ +abstract class ASN1TaggedObject + extends DERObject +{ + int tagNo; + boolean empty = false; + boolean explicit = true; + DEREncodable obj = null; + + /** + * @param tagNo the tag number for this object. + * @param obj the tagged object. + */ + public ASN1TaggedObject( + int tagNo, + DEREncodable obj) + { + this.explicit = true; + this.tagNo = tagNo; + this.obj = obj; + } + + /** + * @param explicit true if the object is explicitly tagged. + * @param tagNo the tag number for this object. + * @param obj the tagged object. + */ + public ASN1TaggedObject( + boolean explicit, + int tagNo, + DEREncodable obj) + { + this.explicit = explicit; + this.tagNo = tagNo; + this.obj = obj; + } + + public boolean equals( + Object o) + { + if (o == null || !(o instanceof ASN1TaggedObject)) + { + return false; + } + + ASN1TaggedObject other = (ASN1TaggedObject)o; + + if(tagNo != other.tagNo || empty != other.empty || explicit != other.explicit) + { + return false; + } + + if(obj == null) + { + if(other.obj != null) + { + return false; + } + } + else + { + if(!(obj.equals(other.obj))) + { + return false; + } + } + + return true; + } + + public int getTagNo() + { + return tagNo; + } + + /** + * return whether or not the object may be explicitly tagged. + *

+ * Note: if the object has been read from an input stream, the only + * time you can be sure if isExplicit is returning the true state of + * affairs is if it returns false. An implicitly tagged object may appear + * to be explicitly tagged, so you need to understand the context under + * which the reading was done as well, see getObject below. + */ + public boolean isExplicit() + { + return explicit; + } + + public boolean isEmpty() + { + return empty; + } + + /** + * return whatever was following the tag. + *

+ * Note: tagged objects are generally context dependent if you're + * trying to extract a tagged object you should be going via the + * appropriate getInstance method. + */ + public DERObject getObject() + { + if (obj != null) + { + return obj.getDERObject(); + } + + return null; + } + + abstract void encode(DEROutputStream out) + throws IOException; +} + + +class BERConstructedOctetString + extends DEROctetString +{ + /** + * convert a vector of octet strings into a single byte string + */ + static private byte[] toBytes( + Vector octs) + { + ByteArrayOutputStream bOut = new ByteArrayOutputStream(); + + for (int i = 0; i != octs.size(); i++) + { + DEROctetString o = (DEROctetString)octs.elementAt(i); + + try + { + bOut.write(o.getOctets()); + } + catch (IOException e) + { + throw new RuntimeException("exception converting octets " + e.toString()); + } + } + + return bOut.toByteArray(); + } + + private Vector octs; + + /** + * @param string the octets making up the octet string. + */ + public BERConstructedOctetString( + byte[] string) + { + super(string); + } + + public BERConstructedOctetString( + Vector octs) + { + super(toBytes(octs)); + + this.octs = octs; + } + + public BERConstructedOctetString( + DERObject obj) + { + super(obj); + } + + public BERConstructedOctetString( + DEREncodable obj) + { + super(obj.getDERObject()); + } + + public byte[] getOctets() + { + return string; + } + + /** + * return the DER octets that make up this string. + */ + public Enumeration getObjects() + { + if (octs == null) + { + octs = generateOcts(); + } + + return octs.elements(); + } + + private Vector generateOcts() + { + int start = 0; + int end = 0; + Vector vec = new Vector(); + + while ((end + 1) < string.length) + { + if (string[end] == 0 && string[end + 1] == 0) + { + byte[] nStr = new byte[end - start + 1]; + + for (int i = 0; i != nStr.length; i++) + { + nStr[i] = string[start + i]; + } + + vec.addElement(new DEROctetString(nStr)); + start = end + 1; + } + end++; + } + + byte[] nStr = new byte[string.length - start]; + for (int i = 0; i != nStr.length; i++) + { + nStr[i] = string[start + i]; + } + + vec.addElement(new DEROctetString(nStr)); + + return vec; + } + + public void encode( + DEROutputStream out) + throws IOException + { + if (out instanceof ASN1OutputStream || out instanceof BEROutputStream) + { + out.write(CONSTRUCTED | OCTET_STRING); + + out.write(0x80); + + if (octs == null) + { + octs = generateOcts(); + } + + for (int i = 0; i != octs.size(); i++) + { + out.writeObject(octs.elementAt(i)); + } + + out.write(0x00); + out.write(0x00); + } + else + { + super.encode(out); + } + } +} + + +class BERConstructedSequence + extends DERConstructedSequence +{ + /* + */ + void encode( + DEROutputStream out) + throws IOException + { + if (out instanceof ASN1OutputStream || out instanceof BEROutputStream) + { + out.write(SEQUENCE | CONSTRUCTED); + out.write(0x80); + + Enumeration e = getObjects(); + while (e.hasMoreElements()) + { + out.writeObject(e.nextElement()); + } + + out.write(0x00); + out.write(0x00); + } + else + { + super.encode(out); + } + } +} + + +class BERInputStream + extends DERInputStream +{ + private DERObject END_OF_STREAM = new DERObject() { + void encode( + DEROutputStream out) + throws IOException + { + throw new IOException("Eeek!"); + } + + }; + public BERInputStream( + InputStream is) + { + super(is); + } + + /** + * read a string of bytes representing an indefinite length object. + */ + private byte[] readIndefiniteLengthFully() + throws IOException + { + ByteArrayOutputStream bOut = new ByteArrayOutputStream(); + int b, b1; + + b1 = read(); + + while ((b = read()) >= 0) + { + if (b1 == 0 && b == 0) + { + break; + } + + bOut.write(b1); + b1 = b; + } + + return bOut.toByteArray(); + } + + private BERConstructedOctetString buildConstructedOctetString() + throws IOException + { + Vector octs = new Vector(); + + for (;;) + { + DERObject o = readObject(); + + if (o == END_OF_STREAM) + { + break; + } + + octs.addElement(o); + } + + return new BERConstructedOctetString(octs); + } + + public DERObject readObject() + throws IOException + { + int tag = read(); + if (tag == -1) + { + throw new EOFException(); + } + + int length = readLength(); + + if (length < 0) // indefinite length method + { + switch (tag) + { + case NULL: + return null; + case SEQUENCE | CONSTRUCTED: + BERConstructedSequence seq = new BERConstructedSequence(); + + for (;;) + { + DERObject obj = readObject(); + + if (obj == END_OF_STREAM) + { + break; + } + + seq.addObject(obj); + } + return seq; + case OCTET_STRING | CONSTRUCTED: + return buildConstructedOctetString(); + case SET | CONSTRUCTED: + DEREncodableVector v = new DEREncodableVector(); + + for (;;) + { + DERObject obj = readObject(); + + if (obj == END_OF_STREAM) + { + break; + } + + v.add(obj); + } + return new BERSet(v); + default: + // + // with tagged object tag number is bottom 5 bits + // + if ((tag & TAGGED) != 0) + { + if ((tag & 0x1f) == 0x1f) + { + throw new IOException("unsupported high tag encountered"); + } + + // + // simple type - implicit... return an octet string + // + if ((tag & CONSTRUCTED) == 0) + { + byte[] bytes = readIndefiniteLengthFully(); + + return new BERTaggedObject(false, tag & 0x1f, new DEROctetString(bytes)); + } + + // + // either constructed or explicitly tagged + // + DERObject dObj = readObject(); + + if (dObj == END_OF_STREAM) // empty tag! + { + return new DERTaggedObject(tag & 0x1f); + } + + DERObject next = readObject(); + + // + // explicitly tagged (probably!) - if it isn't we'd have to + // tell from the context + // + if (next == END_OF_STREAM) + { + return new BERTaggedObject(tag & 0x1f, dObj); + } + + // + // another implicit object, we'll create a sequence... + // + seq = new BERConstructedSequence(); + + seq.addObject(dObj); + + do + { + seq.addObject(next); + next = readObject(); + } + while (next != END_OF_STREAM); + + return new BERTaggedObject(false, tag & 0x1f, seq); + } + + throw new IOException("unknown BER object encountered"); + } + } + else + { + if (tag == 0 && length == 0) // end of contents marker. + { + return END_OF_STREAM; + } + + byte[] bytes = new byte[length]; + + readFully(bytes); + + return buildObject(tag, bytes); + } + } +} + + +class BEROutputStream + extends DEROutputStream +{ + public BEROutputStream( + OutputStream os) + { + super(os); + } + + public void writeObject( + Object obj) + throws IOException + { + if (obj == null) + { + writeNull(); + } + else if (obj instanceof DERObject) + { + ((DERObject)obj).encode(this); + } + else if (obj instanceof DEREncodable) + { + ((DEREncodable)obj).getDERObject().encode(this); + } + else + { + throw new IOException("object not BEREncodable"); + } + } +} + + +class BERSet + extends DERSet +{ + /** + * create an empty sequence + */ + public BERSet() + { + } + + /** + * create a set containing one object + */ + public BERSet( + DEREncodable obj) + { + super(obj); + } + + /** + * create a set containing a vector of objects. + */ + public BERSet( + DEREncodableVector v) + { + super(v); + } + + /* + */ + void encode( + DEROutputStream out) + throws IOException + { + if (out instanceof ASN1OutputStream || out instanceof BEROutputStream) + { + out.write(SET | CONSTRUCTED); + out.write(0x80); + + Enumeration e = getObjects(); + while (e.hasMoreElements()) + { + out.writeObject(e.nextElement()); + } + + out.write(0x00); + out.write(0x00); + } + else + { + super.encode(out); + } + } +} + + +/** + * BER TaggedObject - in ASN.1 nottation this is any object proceeded by + * a [n] where n is some number - these are assume to follow the construction + * rules (as with sequences). + */ +class BERTaggedObject + extends DERTaggedObject +{ + /** + * @param tagNo the tag number for this object. + * @param obj the tagged object. + */ + public BERTaggedObject( + int tagNo, + DEREncodable obj) + { + super(tagNo, obj); + } + + /** + * @param explicit true if an explicitly tagged object. + * @param tagNo the tag number for this object. + * @param obj the tagged object. + */ + public BERTaggedObject( + boolean explicit, + int tagNo, + DEREncodable obj) + { + super(explicit, tagNo, obj); + } + + /** + * create an implicitly tagged object that contains a zero + * length sequence. + */ + public BERTaggedObject( + int tagNo) + { + super(false, tagNo, new BERConstructedSequence()); + } + + void encode( + DEROutputStream out) + throws IOException + { + if (out instanceof ASN1OutputStream || out instanceof BEROutputStream) + { + out.write(CONSTRUCTED | TAGGED | tagNo); + out.write(0x80); + + if (!empty) + { + if (!explicit) + { + if (obj instanceof BERConstructedOctetString) + { + Enumeration e = ((BERConstructedOctetString)obj).getObjects(); + + while (e.hasMoreElements()) + { + out.writeObject(e.nextElement()); + } + } + else if (obj instanceof ASN1Sequence) + { + Enumeration e = ((ASN1Sequence)obj).getObjects(); + + while (e.hasMoreElements()) + { + out.writeObject(e.nextElement()); + } + } + else if (obj instanceof ASN1Set) + { + Enumeration e = ((ASN1Set)obj).getObjects(); + + while (e.hasMoreElements()) + { + out.writeObject(e.nextElement()); + } + } + else + { + throw new RuntimeException("not implemented: " + obj.getClass().getName()); + } + } + else + { + out.writeObject(obj); + } + } + + out.write(0x00); + out.write(0x00); + } + else + { + super.encode(out); + } + } +} + + +class Attribute + implements DEREncodable +{ + private DERObjectIdentifier attrType; + private ASN1Set attrValues; + + /** + * return an Attribute object from the given object. + * + * @param o the object we want converted. + * @exception IllegalArgumentException if the object cannot be converted. + */ + public static Attribute getInstance( + Object o) + { + if (o == null || o instanceof Attribute) + { + return (Attribute)o; + } + + if (o instanceof ASN1Sequence) + { + return new Attribute((ASN1Sequence)o); + } + + throw new IllegalArgumentException("unknown object in factory"); + } + + public Attribute( + ASN1Sequence seq) + { + attrType = (DERObjectIdentifier)seq.getObjectAt(0); + attrValues = (ASN1Set)seq.getObjectAt(1); + } + + public Attribute( + DERObjectIdentifier attrType, + ASN1Set attrValues) + { + this.attrType = attrType; + this.attrValues = attrValues; + } + + public DERObjectIdentifier getAttrType() + { + return attrType; + } + + public ASN1Set getAttrValues() + { + return attrValues; + } + + /** + *

+     * Attribute ::= SEQUENCE {
+     * 	attrType OBJECT IDENTIFIER,
+     * 	attrValues SET OF AttributeValue
+     * }
+     * 
+ */ + public DERObject getDERObject() + { + DEREncodableVector v = new DEREncodableVector(); + + v.add(attrType); + v.add(attrValues); + + return new DERSequence(v); + } +} +// Decompiled by Jad v1.5.7f. Copyright 2000 Pavel Kouznetsov. +// Jad home page: http://www.geocities.com/SiliconValley/Bridge/8617/jad.html +// Decompiler options: packimports(3) +// Source File Name: SignedAttributes.java + + + +// Referenced classes of package org.bouncycastle.asn1.cms: +// Attribute + +class SignedAttributes + implements DEREncodable +{ + + public SignedAttributes(Vector vector) + { + setAttributes(vector); + } + + public SignedAttributes(DERConstructedSet derconstructedset) + { + attributes = derconstructedset; + } + + public SignedAttributes(SignedAttributes signedattributes) + { + attributes = signedattributes.attributes; + } + + public static SignedAttributes getInstance(Object obj) + { + if(obj == null) + return null; + if(obj instanceof SignedAttributes) + return (SignedAttributes)obj; + if(obj instanceof DERConstructedSet) + return new SignedAttributes((DERConstructedSet)obj); + if(obj instanceof DERTaggedObject) + return getInstance(((DERTaggedObject)obj).getObject()); + else + throw new IllegalArgumentException("Invalid SignedAttributes"); + } + + public static SignedAttributes newInstance(Object obj) + { + if(obj == null) + return null; + if(obj instanceof SignedAttributes) + return new SignedAttributes((SignedAttributes)obj); + if(obj instanceof DERConstructedSet) + return new SignedAttributes((DERConstructedSet)obj); + if(obj instanceof DERTaggedObject) + return getInstance(((DERTaggedObject)obj).getObject()); + else + throw new IllegalArgumentException("Invalid SignedAttributes"); + } + + public Vector getAttributes() + { + int i = attributes.getSize(); + Vector vector = new Vector(); + for(int j = 0; j < i; j++) + vector.addElement(Attribute.getInstance(attributes.getObjectAt(j))); + + return vector; + } + + private void setAttributes(Vector vector) + { + int i = vector.size(); + attributes = new DERConstructedSet(); + for(int j = 0; j < i; j++) + attributes.addObject(Attribute.getInstance(vector.elementAt(j))); + + } + + public DERObject getDERObject() + { + return attributes; + } + + private DERConstructedSet attributes; +} + + +class DERBitString + extends DERObject +{ + protected byte[] data; + protected int padBits; + + /** + * return the correct number of pad bits for a bit string defined in + * a 16 bit constant + */ + static protected int getPadBits( + int bitString) + { + int val; + + if (bitString == 0) + { + return 7; + } + + if (bitString > 255) + { + val = ((bitString >> 8) & 0xFF); + } + else + { + val = (bitString & 0xFF); + } + + int bits = 1; + + while (((val <<= 1) & 0xFF) != 0) + { + bits++; + } + + return 8 - bits; + } + + /** + * return the correct number of bytes for a bit string defined in + * a 16 bit constant + */ + static protected byte[] getBytes( + int bitString) + { + if (bitString > 255) + { + byte[] bytes = new byte[2]; + + bytes[0] = (byte)(bitString & 0xFF); + bytes[1] = (byte)((bitString >> 8) & 0xFF); + + return bytes; + } + else + { + byte[] bytes = new byte[1]; + + bytes[0] = (byte)(bitString & 0xFF); + + return bytes; + } + } + + /** + * return a Bit String from the passed in object + * + * @exception IllegalArgumentException if the object cannot be converted. + */ + public static DERBitString getInstance( + Object obj) + { + if (obj == null || obj instanceof DERBitString) + { + return (DERBitString)obj; + } + + if (obj instanceof ASN1OctetString) + { + byte[] bytes = ((ASN1OctetString)obj).getOctets(); + int padBits = bytes[0]; + byte[] data = new byte[bytes.length - 1]; + + System.arraycopy(bytes, 1, data, 0, bytes.length - 1); + + return new DERBitString(data, padBits); + } + + if (obj instanceof ASN1TaggedObject) + { + return getInstance(((ASN1TaggedObject)obj).getObject()); + } + + throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName()); + } + + /** + * return a Bit String from a tagged object. + * + * @param obj the tagged object holding the object we want + * @param explicit true if the object is meant to be explicitly + * tagged false otherwise. + * @exception IllegalArgumentException if the tagged object cannot + * be converted. + */ + public static DERBitString getInstance( + ASN1TaggedObject obj, + boolean explicit) + { + return getInstance(obj.getObject()); + } + + protected DERBitString( + byte data, + int padBits) + { + this.data = new byte[1]; + this.data[0] = data; + this.padBits = padBits; + } + + /** + * @param data the octets making up the bit string. + * @param padBits the number of extra bits at the end of the string. + */ + public DERBitString( + byte[] data, + int padBits) + { + this.data = data; + this.padBits = padBits; + } + + public DERBitString( + byte[] data) + { + this(data, 0); + } + + public DERBitString( + DEREncodable obj) + { + try + { + ByteArrayOutputStream bOut = new ByteArrayOutputStream(); + DEROutputStream dOut = new DEROutputStream(bOut); + + dOut.writeObject(obj); + dOut.close(); + + this.data = bOut.toByteArray(); + this.padBits = 0; + } + catch (IOException e) + { + throw new IllegalArgumentException("Error processing object : " + e.toString()); + } + } + + public byte[] getBytes() + { + return data; + } + + public int getPadBits() + { + return padBits; + } + + void encode( + DEROutputStream out) + throws IOException + { + byte[] bytes = new byte[getBytes().length + 1]; + + bytes[0] = (byte)getPadBits(); + System.arraycopy(getBytes(), 0, bytes, 1, bytes.length - 1); + + out.writeEncoded(BIT_STRING, bytes); + } + + public boolean equals( + Object o) + { + if (o == null || !(o instanceof DERBitString)) + { + return false; + } + + DERBitString other = (DERBitString)o; + + if (data.length != other.data.length) + { + return false; + } + + for (int i = 0; i != data.length; i++) + { + if (data[i] != other.data[i]) + { + return false; + } + } + + return (padBits == other.padBits); + } +} + + +/** + * DER BMPString object. + */ +class DERBMPString + extends DERObject + implements DERString +{ + String string; + + /** + * return a BMP String from the given object. + * + * @param obj the object we want converted. + * @exception IllegalArgumentException if the object cannot be converted. + */ + public static DERBMPString getInstance( + Object obj) + { + if (obj == null || obj instanceof DERBMPString) + { + return (DERBMPString)obj; + } + + if (obj instanceof ASN1OctetString) + { + return new DERBMPString(((ASN1OctetString)obj).getOctets()); + } + + if (obj instanceof ASN1TaggedObject) + { + return getInstance(((ASN1TaggedObject)obj).getObject()); + } + + throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName()); + } + + /** + * return a BMP String from a tagged object. + * + * @param obj the tagged object holding the object we want + * @param explicit true if the object is meant to be explicitly + * tagged false otherwise. + * @exception IllegalArgumentException if the tagged object cannot + * be converted. + */ + public static DERBMPString getInstance( + ASN1TaggedObject obj, + boolean explicit) + { + return getInstance(obj.getObject()); + } + + + /** + * basic constructor - byte encoded string. + */ + public DERBMPString( + byte[] string) + { + char[] cs = new char[string.length / 2]; + + for (int i = 0; i != cs.length; i++) + { + cs[i] = (char)((string[2 * i] << 8) | (string[2 * i + 1] & 0xff)); + } + + this.string = new String(cs); + } + + /** + * basic constructor + */ + public DERBMPString( + String string) + { + this.string = string; + } + + public String getString() + { + return string; + } + + public int hashCode() + { + return this.getString().hashCode(); + } + + public boolean equals( + Object o) + { + if (!(o instanceof DERBMPString)) + { + return false; + } + + DERPrintableString s = (DERPrintableString)o; + + return this.getString().equals(s.getString()); + } + + void encode( + DEROutputStream out) + throws IOException + { + char[] c = string.toCharArray(); + byte[] b = new byte[c.length * 2]; + + for (int i = 0; i != c.length; i++) + { + b[2 * i] = (byte)(c[i] >> 8); + b[2 * i + 1] = (byte)c[i]; + } + + out.writeEncoded(BMP_STRING, b); + } +} + + +class DERBoolean + extends DERObject +{ + byte value; + + public static final DERBoolean FALSE = new DERBoolean(false); + public static final DERBoolean TRUE = new DERBoolean(true); + + /** + * return a boolean from the passed in object. + * + * @exception IllegalArgumentException if the object cannot be converted. + */ + public static DERBoolean getInstance( + Object obj) + { + if (obj == null || obj instanceof DERBoolean) + { + return (DERBoolean)obj; + } + + if (obj instanceof ASN1OctetString) + { + return new DERBoolean(((ASN1OctetString)obj).getOctets()); + } + + if (obj instanceof ASN1TaggedObject) + { + return getInstance(((ASN1TaggedObject)obj).getObject()); + } + + throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName()); + } + + /** + * return a DERBoolean from the passed in boolean. + */ + public static DERBoolean getInstance( + boolean value) + { + return (value ? TRUE : FALSE); + } + + /** + * return a Boolean from a tagged object. + * + * @param obj the tagged object holding the object we want + * @param explicit true if the object is meant to be explicitly + * tagged false otherwise. + * @exception IllegalArgumentException if the tagged object cannot + * be converted. + */ + public static DERBoolean getInstance( + ASN1TaggedObject obj, + boolean explicit) + { + return getInstance(obj.getObject()); + } + + public DERBoolean( + byte[] value) + { + this.value = value[0]; + } + + public DERBoolean( + boolean value) + { + this.value = (value) ? (byte)0xff : (byte)0; + } + + public boolean isTrue() + { + return (value != 0); + } + + void encode( + DEROutputStream out) + throws IOException + { + byte[] bytes = new byte[1]; + + bytes[0] = value; + + out.writeEncoded(BOOLEAN, bytes); + } + + public boolean equals( + Object o) + { + if ((o == null) || !(o instanceof DERBoolean)) + { + return false; + } + + return (value == ((DERBoolean)o).value); + } + +} + + +class DERConstructedSequence + extends ASN1Sequence +{ + public void addObject( + DEREncodable obj) + { + super.addObject(obj); + } + + public int getSize() + { + return size(); + } + + /* + * A note on the implementation: + *

+ * As DER requires the constructed, definite-length model to + * be used for structured types, this varies slightly from the + * ASN.1 descriptions given. Rather than just outputing SEQUENCE, + * we also have to specify CONSTRUCTED, and the objects length. + */ + void encode( + DEROutputStream out) + throws IOException + { + ByteArrayOutputStream bOut = new ByteArrayOutputStream(); + DEROutputStream dOut = new DEROutputStream(bOut); + Enumeration e = this.getObjects(); + + while (e.hasMoreElements()) + { + Object obj = e.nextElement(); + + dOut.writeObject(obj); + } + + dOut.close(); + + byte[] bytes = bOut.toByteArray(); + + out.writeEncoded(SEQUENCE | CONSTRUCTED, bytes); + } +} + + +class DERConstructedSet + extends ASN1Set +{ + public DERConstructedSet() + { + } + + /** + * @param obj - a single object that makes up the set. + */ + public DERConstructedSet( + DEREncodable obj) + { + this.addObject(obj); + } + + /** + * @param v - a vector of objects making up the set. + */ + public DERConstructedSet( + DEREncodableVector v) + { + for (int i = 0; i != v.size(); i++) + { + this.addObject(v.get(i)); + } + } + + public void addObject( + DEREncodable obj) + { + super.addObject(obj); + } + + public int getSize() + { + return size(); + } + + /* + * A note on the implementation: + *

+ * As DER requires the constructed, definite-length model to + * be used for structured types, this varies slightly from the + * ASN.1 descriptions given. Rather than just outputing SET, + * we also have to specify CONSTRUCTED, and the objects length. + */ + void encode( + DEROutputStream out) + throws IOException + { + ByteArrayOutputStream bOut = new ByteArrayOutputStream(); + DEROutputStream dOut = new DEROutputStream(bOut); + Enumeration e = this.getObjects(); + + while (e.hasMoreElements()) + { + Object obj = e.nextElement(); + + dOut.writeObject(obj); + } + + dOut.close(); + + byte[] bytes = bOut.toByteArray(); + + out.writeEncoded(SET | CONSTRUCTED, bytes); + } +} + +interface DEREncodable +{ + public DERObject getDERObject(); +} + + +/** + * a general class for building up a vector of DER encodable objects + */ +class DEREncodableVector +{ + private Vector v = new Vector(); + + public void add( + DEREncodable obj) + { + v.addElement(obj); + } + + public DEREncodable get( + int i) + { + return (DEREncodable)v.elementAt(i); + } + + public int size() + { + return v.size(); + } +} + + +class DEREnumerated + extends DERObject +{ + byte[] bytes; + + /** + * return an integer from the passed in object + * + * @exception IllegalArgumentException if the object cannot be converted. + */ + public static DEREnumerated getInstance( + Object obj) + { + if (obj == null || obj instanceof DEREnumerated) + { + return (DEREnumerated)obj; + } + + if (obj instanceof ASN1OctetString) + { + return new DEREnumerated(((ASN1OctetString)obj).getOctets()); + } + + if (obj instanceof ASN1TaggedObject) + { + return getInstance(((ASN1TaggedObject)obj).getObject()); + } + + throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName()); + } + + /** + * return an Enumerated from a tagged object. + * + * @param obj the tagged object holding the object we want + * @param explicit true if the object is meant to be explicitly + * tagged false otherwise. + * @exception IllegalArgumentException if the tagged object cannot + * be converted. + */ + public static DEREnumerated getInstance( + ASN1TaggedObject obj, + boolean explicit) + { + return getInstance(obj.getObject()); + } + + public DEREnumerated( + int value) + { + bytes = BigInteger.valueOf(value).toByteArray(); + } + + public DEREnumerated( + BigInteger value) + { + bytes = value.toByteArray(); + } + + public DEREnumerated( + byte[] bytes) + { + this.bytes = bytes; + } + + public BigInteger getValue() + { + return new BigInteger(bytes); + } + + void encode( + DEROutputStream out) + throws IOException + { + out.writeEncoded(ENUMERATED, bytes); + } + + public boolean equals( + Object o) + { + if (o == null || !(o instanceof DEREnumerated)) + { + return false; + } + + DEREnumerated other = (DEREnumerated)o; + + if (bytes.length != other.bytes.length) + { + return false; + } + + for (int i = 0; i != bytes.length; i++) + { + if (bytes[i] != other.bytes[i]) + { + return false; + } + } + + return true; + } +} + + +/** + * Generalized time object. + */ +class DERGeneralizedTime + extends DERObject +{ + String time; + + /** + * return a generalized time from the passed in object + * + * @exception IllegalArgumentException if the object cannot be converted. + */ + public static DERGeneralizedTime getInstance( + Object obj) + { + if (obj == null || obj instanceof DERGeneralizedTime) + { + return (DERGeneralizedTime)obj; + } + + if (obj instanceof ASN1OctetString) + { + return new DERGeneralizedTime(((ASN1OctetString)obj).getOctets()); + } + + throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName()); + } + + /** + * return a Generalized Time object from a tagged object. + * + * @param obj the tagged object holding the object we want + * @param explicit true if the object is meant to be explicitly + * tagged false otherwise. + * @exception IllegalArgumentException if the tagged object cannot + * be converted. + */ + public static DERGeneralizedTime getInstance( + ASN1TaggedObject obj, + boolean explicit) + { + return getInstance(obj.getObject()); + } + + /** + * The correct format for this is YYYYMMDDHHMMSSZ, or without the Z + * for local time, or Z+-HHMM on the end, for difference between local + * time and UTC time. + *

+ * + * @param time the time string. + */ + public DERGeneralizedTime( + String time) + { + this.time = time; + } + + /** + * base constructer from a java.util.date object + */ + public DERGeneralizedTime( + Date time) + { + SimpleDateFormat dateF = new SimpleDateFormat("yyyyMMddHHmmss'Z'"); + + dateF.setTimeZone(new SimpleTimeZone(0,"Z")); + + this.time = dateF.format(time); + } + + DERGeneralizedTime( + byte[] bytes) + { + // + // explicitly convert to characters + // + char[] dateC = new char[bytes.length]; + + for (int i = 0; i != dateC.length; i++) + { + dateC[i] = (char)(bytes[i] & 0xff); + } + + this.time = new String(dateC); + } + + /** + * return the time - always in the form of + * YYYYMMDDhhmmssGMT(+hh:mm|-hh:mm). + *

+ * Normally in a certificate we would expect "Z" rather than "GMT", + * however adding the "GMT" means we can just use: + *

+     *     dateF = new SimpleDateFormat("yyyyMMddHHmmssz");
+     * 
+ * To read in the time and get a date which is compatible with our local + * time zone. + */ + public String getTime() + { + // + // standardise the format. + // + if (time.length() == 15) + { + return time.substring(0, 14) + "GMT+00:00"; + } + else if (time.length() == 17) + { + return time.substring(0, 14) + "GMT" + time.substring(15, 17) + ":" + time.substring(17, 19); + } + + return time; + } + + private byte[] getOctets() + { + char[] cs = time.toCharArray(); + byte[] bs = new byte[cs.length]; + + for (int i = 0; i != cs.length; i++) + { + bs[i] = (byte)cs[i]; + } + + return bs; + } + + + void encode( + DEROutputStream out) + throws IOException + { + out.writeEncoded(GENERALIZED_TIME, this.getOctets()); + } + + public boolean equals( + Object o) + { + if ((o == null) || !(o instanceof DERGeneralizedTime)) + { + return false; + } + + return time.equals(((DERGeneralizedTime)o).time); + } +} + + +/** + * DER IA5String object - this is an ascii string. + */ +class DERIA5String + extends DERObject + implements DERString +{ + String string; + + /** + * return a IA5 string from the passed in object + * + * @exception IllegalArgumentException if the object cannot be converted. + */ + public static DERIA5String getInstance( + Object obj) + { + if (obj == null || obj instanceof DERIA5String) + { + return (DERIA5String)obj; + } + + if (obj instanceof ASN1OctetString) + { + return new DERIA5String(((ASN1OctetString)obj).getOctets()); + } + + if (obj instanceof ASN1TaggedObject) + { + return getInstance(((ASN1TaggedObject)obj).getObject()); + } + + throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName()); + } + + /** + * return an IA5 String from a tagged object. + * + * @param obj the tagged object holding the object we want + * @param explicit true if the object is meant to be explicitly + * tagged false otherwise. + * @exception IllegalArgumentException if the tagged object cannot + * be converted. + */ + public static DERIA5String getInstance( + ASN1TaggedObject obj, + boolean explicit) + { + return getInstance(obj.getObject()); + } + + /** + * basic constructor - with bytes. + */ + public DERIA5String( + byte[] string) + { + char[] cs = new char[string.length]; + + for (int i = 0; i != cs.length; i++) + { + cs[i] = (char)(string[i] & 0xff); + } + + this.string = new String(cs); + } + + /** + * basic constructor - with string. + */ + public DERIA5String( + String string) + { + this.string = string; + } + + public String getString() + { + return string; + } + + public byte[] getOctets() + { + char[] cs = string.toCharArray(); + byte[] bs = new byte[cs.length]; + + for (int i = 0; i != cs.length; i++) + { + bs[i] = (byte)cs[i]; + } + + return bs; + } + + void encode( + DEROutputStream out) + throws IOException + { + out.writeEncoded(IA5_STRING, this.getOctets()); + } + + public int hashCode() + { + return this.getString().hashCode(); + } + + public boolean equals( + Object o) + { + if (!(o instanceof DERIA5String)) + { + return false; + } + + DERIA5String s = (DERIA5String)o; + + return this.getString().equals(s.getString()); + } +} + + + + +class DERInputStream + extends FilterInputStream implements DERTags +{ + public DERInputStream( + InputStream is) + { + super(is); + } + + protected int readLength() + throws IOException + { + int length = read(); + if (length < 0) + { + throw new IOException("EOF found when length expected"); + } + + if (length == 0x80) + { + return -1; // indefinite-length encoding + } + + if (length > 127) + { + int size = length & 0x7f; + + length = 0; + for (int i = 0; i < size; i++) + { + int next = read(); + + if (next < 0) + { + throw new IOException("EOF found reading length"); + } + + length = (length << 8) + next; + } + } + + return length; + } + + protected void readFully( + byte[] bytes) + throws IOException + { + int left = bytes.length; + + if (left == 0) + { + return; + } + + while ((left -= read(bytes, bytes.length - left, left)) != 0) + { + ; + } + } + + /** + * build an object given its tag and a byte stream to construct it + * from. + */ + protected DERObject buildObject( + int tag, + byte[] bytes) + throws IOException + { + switch (tag) + { + case NULL: + return null; + case SEQUENCE | CONSTRUCTED: + ByteArrayInputStream bIn = new ByteArrayInputStream(bytes); + BERInputStream dIn = new BERInputStream(bIn); + DERConstructedSequence seq = new DERConstructedSequence(); + + try + { + for (;;) + { + DERObject obj = dIn.readObject(); + + seq.addObject(obj); + } + } + catch (EOFException ex) + { + return seq; + } + case SET | CONSTRUCTED: + bIn = new ByteArrayInputStream(bytes); + dIn = new BERInputStream(bIn); + + DEREncodableVector v = new DEREncodableVector(); + + try + { + for (;;) + { + DERObject obj = dIn.readObject(); + + v.add(obj); + } + } + catch (EOFException ex) + { + return new DERConstructedSet(v); + } + case BOOLEAN: + return new DERBoolean(bytes); + case INTEGER: + return new DERInteger(bytes); + case ENUMERATED: + return new DEREnumerated(bytes); + case OBJECT_IDENTIFIER: + return new DERObjectIdentifier(bytes); + case BIT_STRING: + int padBits = bytes[0]; + byte[] data = new byte[bytes.length - 1]; + + System.arraycopy(bytes, 1, data, 0, bytes.length - 1); + + return new DERBitString(data, padBits); + case UTF8_STRING: + return new DERUTF8String(bytes); + case PRINTABLE_STRING: + return new DERPrintableString(bytes); + case IA5_STRING: + return new DERIA5String(bytes); + case T61_STRING: + return new DERT61String(bytes); + case VISIBLE_STRING: + return new DERVisibleString(bytes); + case UNIVERSAL_STRING: + return new DERUniversalString(bytes); + case BMP_STRING: + return new DERBMPString(bytes); + case OCTET_STRING: + return new DEROctetString(bytes); + case UTC_TIME: + return new DERUTCTime(bytes); + case GENERALIZED_TIME: + return new DERGeneralizedTime(bytes); + default: + // + // with tagged object tag number is bottom 5 bits + // + if ((tag & TAGGED) != 0) + { + if ((tag & 0x1f) == 0x1f) + { + throw new IOException("unsupported high tag encountered"); + } + + if (bytes.length == 0) // empty tag! + { + return new DERTaggedObject(false, tag & 0x1f, new DERConstructedSequence()); + } + + // + // simple type - implicit... return an octet string + // + if ((tag & CONSTRUCTED) == 0) + { + return new DERTaggedObject(false, tag & 0x1f, new DEROctetString(bytes)); + } + + bIn = new ByteArrayInputStream(bytes); + dIn = new BERInputStream(bIn); + + DEREncodable dObj = dIn.readObject(); + + // + // explicitly tagged (probably!) - if it isn't we'd have to + // tell from the context + // + if (dIn.available() == 0) + { + return new DERTaggedObject(tag & 0x1f, dObj); + } + + // + // another implicit object, we'll create a sequence... + // + seq = new DERConstructedSequence(); + + seq.addObject(dObj); + + try + { + for (;;) + { + dObj = dIn.readObject(); + + seq.addObject(dObj); + } + } + catch (EOFException ex) + { + // ignore -- + } + + return new DERTaggedObject(false, tag & 0x1f, seq); + } + + return new DERUnknownTag(tag, bytes); + } + } + + public DERObject readObject() + throws IOException + { + int tag = read(); + if (tag == -1) + { + throw new EOFException(); + } + + int length = readLength(); + byte[] bytes = new byte[length]; + + readFully(bytes); + + return buildObject(tag, bytes); + } +} + + +class DERInteger + extends DERObject +{ + byte[] bytes; + + /** + * return an integer from the passed in object + * + * @exception IllegalArgumentException if the object cannot be converted. + */ + public static DERInteger getInstance( + Object obj) + { + if (obj == null || obj instanceof DERInteger) + { + return (DERInteger)obj; + } + + if (obj instanceof ASN1OctetString) + { + return new DERInteger(((ASN1OctetString)obj).getOctets()); + } + + if (obj instanceof ASN1TaggedObject) + { + return getInstance(((ASN1TaggedObject)obj).getObject()); + } + + throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName()); + } + + /** + * return an Integer from a tagged object. + * + * @param obj the tagged object holding the object we want + * @param explicit true if the object is meant to be explicitly + * tagged false otherwise. + * @exception IllegalArgumentException if the tagged object cannot + * be converted. + */ + public static DERInteger getInstance( + ASN1TaggedObject obj, + boolean explicit) + { + return getInstance(obj.getObject()); + } + + public DERInteger( + int value) + { + bytes = BigInteger.valueOf(value).toByteArray(); + } + + public DERInteger( + BigInteger value) + { + bytes = value.toByteArray(); + } + + public DERInteger( + byte[] bytes) + { + this.bytes = bytes; + } + + public BigInteger getValue() + { + return new BigInteger(bytes); + } + + /** + * in some cases positive values get crammed into a space, + * that's not quite big enough... + */ + public BigInteger getPositiveValue() + { + return new BigInteger(1, bytes); + } + + void encode( + DEROutputStream out) + throws IOException + { + out.writeEncoded(INTEGER, bytes); + } + + public boolean equals( + Object o) + { + if (o == null || !(o instanceof DERInteger)) + { + return false; + } + + DERInteger other = (DERInteger)o; + + if (bytes.length != other.bytes.length) + { + return false; + } + + for (int i = 0; i != bytes.length; i++) + { + if (bytes[i] != other.bytes[i]) + { + return false; + } + } + + return true; + } +} + + +abstract class DERObject + implements DERTags, DEREncodable +{ + public DERObject getDERObject() + { + return this; + } + + abstract void encode(DEROutputStream out) + throws IOException; +} + + +class DERObjectIdentifier + extends DERObject +{ + String identifier; + + /** + * return an OID from the passed in object + * + * @exception IllegalArgumentException if the object cannot be converted. + */ + public static DERObjectIdentifier getInstance( + Object obj) + { + if (obj == null || obj instanceof DERObjectIdentifier) + { + return (DERObjectIdentifier)obj; + } + + if (obj instanceof ASN1OctetString) + { + return new DERObjectIdentifier(((ASN1OctetString)obj).getOctets()); + } + + if (obj instanceof ASN1TaggedObject) + { + return getInstance(((ASN1TaggedObject)obj).getObject()); + } + + throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName()); + } + + /** + * return an Object Identifier from a tagged object. + * + * @param obj the tagged object holding the object we want + * @param explicit true if the object is meant to be explicitly + * tagged false otherwise. + * @exception IllegalArgumentException if the tagged object cannot + * be converted. + */ + public static DERObjectIdentifier getInstance( + ASN1TaggedObject obj, + boolean explicit) + { + return getInstance(obj.getObject()); + } + + + DERObjectIdentifier( + byte[] bytes) + { + int head = bytes[0] & 0xff; + StringBuffer objId = new StringBuffer(); + int value = 0; + boolean first = true; + + for (int i = 0; i != bytes.length; i++) + { + int b = bytes[i] & 0xff; + + value = value * 128 + (b & 0x7f); + if ((b & 0x80) == 0) // end of number reached + { + if (first) + { + switch (value / 40) + { + case 0: + objId.append('0'); + break; + case 1: + objId.append('1'); + value -= 40; + break; + default: + objId.append('2'); + value -= 80; + } + first = false; + } + + objId.append('.'); + objId.append(Integer.toString(value)); + value = 0; + } + } + + this.identifier = objId.toString(); + } + + public DERObjectIdentifier( + String identifier) + { + this.identifier = identifier; + } + + public String getId() + { + return identifier; + } + + private void writeField( + OutputStream out, + int fieldValue) + throws IOException + { + if (fieldValue >= (1 << 7)) + { + if (fieldValue >= (1 << 14)) + { + if (fieldValue >= (1 << 21)) + { + if (fieldValue >= (1 << 28)) + { + out.write((fieldValue >> 28) | 0x80); + } + out.write((fieldValue >> 21) | 0x80); + } + out.write((fieldValue >> 14) | 0x80); + } + out.write((fieldValue >> 7) | 0x80); + } + out.write(fieldValue & 0x7f); + } + + void encode( + DEROutputStream out) + throws IOException + { + OIDTokenizer tok = new OIDTokenizer(identifier); + ByteArrayOutputStream bOut = new ByteArrayOutputStream(); + DEROutputStream dOut = new DEROutputStream(bOut); + + writeField(bOut, + Integer.parseInt(tok.nextToken()) * 40 + + Integer.parseInt(tok.nextToken())); + + while (tok.hasMoreTokens()) + { + writeField(bOut, Integer.parseInt(tok.nextToken())); + } + + dOut.close(); + + byte[] bytes = bOut.toByteArray(); + + out.writeEncoded(OBJECT_IDENTIFIER, bytes); + } + + public int hashCode() + { + return identifier.hashCode(); + } + + public boolean equals( + Object o) + { + if ((o == null) || !(o instanceof DERObjectIdentifier)) + { + return false; + } + + return identifier.equals(((DERObjectIdentifier)o).identifier); + } +} + + +class DEROctetString + extends ASN1OctetString +{ + /** + * @param string the octets making up the octet string. + */ + public DEROctetString( + byte[] string) + { + super(string); + } + + public DEROctetString( + DEREncodable obj) + { + super(obj); + } + + void encode( + DEROutputStream out) + throws IOException + { + out.writeEncoded(OCTET_STRING, string); + } +} + + + +class DEROutputStream + extends FilterOutputStream implements DERTags +{ + public DEROutputStream( + OutputStream os) + { + super(os); + } + + private void writeLength( + int length) + throws IOException + { + if (length > 127) + { + int size = 1; + int val = length; + + while ((val >>>= 8) != 0) + { + size++; + } + + write((byte)(size | 0x80)); + + for (int i = (size - 1) * 8; i >= 0; i -= 8) + { + write((byte)(length >> i)); + } + } + else + { + write((byte)length); + } + } + + void writeEncoded( + int tag, + byte[] bytes) + throws IOException + { + write(tag); + writeLength(bytes.length); + write(bytes); + } + + protected void writeNull() + throws IOException + { + write(NULL); + write(0x00); + } + + public void writeObject( + Object obj) + throws IOException + { + if (obj == null) + { + writeNull(); + } + else if (obj instanceof DERObject) + { + ((DERObject)obj).encode(this); + } + else if (obj instanceof DEREncodable) + { + ((DEREncodable)obj).getDERObject().encode(this); + } + else + { + throw new IOException("object not DEREncodable"); + } + } +} + + +/** + * DER PrintableString object. + */ +class DERPrintableString + extends DERObject + implements DERString +{ + String string; + + /** + * return a printable string from the passed in object. + * + * @exception IllegalArgumentException if the object cannot be converted. + */ + public static DERPrintableString getInstance( + Object obj) + { + if (obj == null || obj instanceof DERPrintableString) + { + return (DERPrintableString)obj; + } + + if (obj instanceof ASN1OctetString) + { + return new DERPrintableString(((ASN1OctetString)obj).getOctets()); + } + + if (obj instanceof ASN1TaggedObject) + { + return getInstance(((ASN1TaggedObject)obj).getObject()); + } + + throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName()); + } + + /** + * return a Printable String from a tagged object. + * + * @param obj the tagged object holding the object we want + * @param explicit true if the object is meant to be explicitly + * tagged false otherwise. + * @exception IllegalArgumentException if the tagged object cannot + * be converted. + */ + public static DERPrintableString getInstance( + ASN1TaggedObject obj, + boolean explicit) + { + return getInstance(obj.getObject()); + } + + /** + * basic constructor - byte encoded string. + */ + public DERPrintableString( + byte[] string) + { + char[] cs = new char[string.length]; + + for (int i = 0; i != cs.length; i++) + { + cs[i] = (char)(string[i] & 0xff); + } + + this.string = new String(cs); + } + + /** + * basic constructor + */ + public DERPrintableString( + String string) + { + this.string = string; + } + + public String getString() + { + return string; + } + + public byte[] getOctets() + { + char[] cs = string.toCharArray(); + byte[] bs = new byte[cs.length]; + + for (int i = 0; i != cs.length; i++) + { + bs[i] = (byte)cs[i]; + } + + return bs; + } + + void encode( + DEROutputStream out) + throws IOException + { + out.writeEncoded(PRINTABLE_STRING, this.getOctets()); + } + + public int hashCode() + { + return this.getString().hashCode(); + } + + public boolean equals( + Object o) + { + if (!(o instanceof DERPrintableString)) + { + return false; + } + + DERPrintableString s = (DERPrintableString)o; + + return this.getString().equals(s.getString()); + } +} + + +class DERSequence + extends ASN1Sequence +{ + /** + * create an empty sequence + */ + public DERSequence() + { + } + + /** + * create a sequence containing one object + */ + public DERSequence( + DEREncodable obj) + { + this.addObject(obj); + } + + /** + * create a sequence containing a vector of objects. + */ + public DERSequence( + DEREncodableVector v) + { + for (int i = 0; i != v.size(); i++) + { + this.addObject(v.get(i)); + } + } + + /* + * A note on the implementation: + *

+ * As DER requires the constructed, definite-length model to + * be used for structured types, this varies slightly from the + * ASN.1 descriptions given. Rather than just outputing SEQUENCE, + * we also have to specify CONSTRUCTED, and the objects length. + */ + void encode( + DEROutputStream out) + throws IOException + { + ByteArrayOutputStream bOut = new ByteArrayOutputStream(); + DEROutputStream dOut = new DEROutputStream(bOut); + Enumeration e = this.getObjects(); + + while (e.hasMoreElements()) + { + Object obj = e.nextElement(); + + dOut.writeObject(obj); + } + + dOut.close(); + + byte[] bytes = bOut.toByteArray(); + + out.writeEncoded(SEQUENCE | CONSTRUCTED, bytes); + } +} + + +/** + * A DER encoded set object + */ +class DERSet + extends ASN1Set +{ + /** + * create an empty set + */ + public DERSet() + { + } + + /** + * @param obj - a single object that makes up the set. + */ + public DERSet( + DEREncodable obj) + { + this.addObject(obj); + } + + /** + * @param v - a vector of objects making up the set. + */ + public DERSet( + DEREncodableVector v) + { + for (int i = 0; i != v.size(); i++) + { + this.addObject(v.get(i)); + } + } + + /* + * A note on the implementation: + *

+ * As DER requires the constructed, definite-length model to + * be used for structured types, this varies slightly from the + * ASN.1 descriptions given. Rather than just outputing SET, + * we also have to specify CONSTRUCTED, and the objects length. + */ + void encode( + DEROutputStream out) + throws IOException + { + ByteArrayOutputStream bOut = new ByteArrayOutputStream(); + DEROutputStream dOut = new DEROutputStream(bOut); + Enumeration e = this.getObjects(); + + while (e.hasMoreElements()) + { + Object obj = e.nextElement(); + + dOut.writeObject(obj); + } + + dOut.close(); + + byte[] bytes = bOut.toByteArray(); + + out.writeEncoded(SET | CONSTRUCTED, bytes); + } +} + +/** + * basic interface for DER string objects. + */ +interface DERString +{ + public String getString(); +} + + +/** + * DER T61String (also the teletex string) + */ +class DERT61String + extends DERObject + implements DERString +{ + String string; + + /** + * return a T61 string from the passed in object. + * + * @exception IllegalArgumentException if the object cannot be converted. + */ + public static DERT61String getInstance( + Object obj) + { + if (obj == null || obj instanceof DERT61String) + { + return (DERT61String)obj; + } + + if (obj instanceof ASN1OctetString) + { + return new DERT61String(((ASN1OctetString)obj).getOctets()); + } + + if (obj instanceof ASN1TaggedObject) + { + return getInstance(((ASN1TaggedObject)obj).getObject()); + } + + throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName()); + } + + /** + * return an T61 String from a tagged object. + * + * @param obj the tagged object holding the object we want + * @param explicit true if the object is meant to be explicitly + * tagged false otherwise. + * @exception IllegalArgumentException if the tagged object cannot + * be converted. + */ + public static DERT61String getInstance( + ASN1TaggedObject obj, + boolean explicit) + { + return getInstance(obj.getObject()); + } + + /** + * basic constructor - with bytes. + */ + public DERT61String( + byte[] string) + { + this.string = new String(string); + } + + /** + * basic constructor - with string. + */ + public DERT61String( + String string) + { + this.string = string; + } + + public String getString() + { + return string; + } + + void encode( + DEROutputStream out) + throws IOException + { + out.writeEncoded(T61_STRING, string.getBytes()); + } + + public boolean equals( + Object o) + { + if ((o == null) || !(o instanceof DERT61String)) + { + return false; + } + + return this.getString().equals(((DERT61String)o).getString()); + } +} + + +/** + * DER TaggedObject - in ASN.1 nottation this is any object proceeded by + * a [n] where n is some number - these are assume to follow the construction + * rules (as with sequences). + */ +class DERTaggedObject + extends ASN1TaggedObject +{ + /** + * @param tagNo the tag number for this object. + * @param obj the tagged object. + */ + public DERTaggedObject( + int tagNo, + DEREncodable obj) + { + super(tagNo, obj); + } + + /** + * @param explicit true if an explicitly tagged object. + * @param tagNo the tag number for this object. + * @param obj the tagged object. + */ + public DERTaggedObject( + boolean explicit, + int tagNo, + DEREncodable obj) + { + super(explicit, tagNo, obj); + } + + /** + * create an implicitly tagged object that contains a zero + * length sequence. + */ + public DERTaggedObject( + int tagNo) + { + super(false, tagNo, new DERSequence()); + } + + void encode( + DEROutputStream out) + throws IOException + { + if (!empty) + { + ByteArrayOutputStream bOut = new ByteArrayOutputStream(); + DEROutputStream dOut = new DEROutputStream(bOut); + + dOut.writeObject(obj); + dOut.close(); + + byte[] bytes = bOut.toByteArray(); + + if (explicit) + { + out.writeEncoded(CONSTRUCTED | TAGGED | tagNo, bytes); + } + else + { + // + // need to mark constructed types... + // + if ((bytes[0] & CONSTRUCTED) != 0) + { + bytes[0] = (byte)(CONSTRUCTED | TAGGED | tagNo); + } + else + { + bytes[0] = (byte)(TAGGED | tagNo); + } + + out.write(bytes); + } + } + else + { + out.writeEncoded(CONSTRUCTED | TAGGED | tagNo, new byte[0]); + } + } +} + +interface DERTags +{ + public static final int BOOLEAN = 0x01; + public static final int INTEGER = 0x02; + public static final int BIT_STRING = 0x03; + public static final int OCTET_STRING = 0x04; + public static final int NULL = 0x05; + public static final int OBJECT_IDENTIFIER = 0x06; + public static final int EXTERNAL = 0x08; + public static final int ENUMERATED = 0x0a; + public static final int SEQUENCE = 0x10; + public static final int SEQUENCE_OF = 0x10; // for completeness + public static final int SET = 0x11; + public static final int SET_OF = 0x11; // for completeness + public static final int CONSTRUCTED = 0x20; + public static final int TAGGED = 0x80; + + public static final int NUMERIC_STRING = 0x12; + public static final int PRINTABLE_STRING = 0x13; + public static final int T61_STRING = 0x14; + public static final int VIDEOTEX_STRING = 0x15; + public static final int IA5_STRING = 0x16; + public static final int UTC_TIME = 0x17; + public static final int GENERALIZED_TIME = 0x18; + public static final int GRAPHIC_STRING = 0x19; + public static final int VISIBLE_STRING = 0x1a; + public static final int GENERAL_STRING = 0x1b; + public static final int UNIVERSAL_STRING = 0x1c; + public static final int BMP_STRING = 0x1e; + public static final int UTF8_STRING = 0x0c; +} + + +/** + * DER UniversalString object. + */ +class DERUniversalString + extends DERObject + implements DERString +{ + byte[] string; + char[] table = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; + + /** + * return a Universal String from the passed in object. + * + * @exception IllegalArgumentException if the object cannot be converted. + */ + public static DERUniversalString getInstance( + Object obj) + { + if (obj == null || obj instanceof DERUniversalString) + { + return (DERUniversalString)obj; + } + + if (obj instanceof ASN1OctetString) + { + return new DERUniversalString(((ASN1OctetString)obj).getOctets()); + } + + throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName()); + } + + /** + * return a Universal String from a tagged object. + * + * @param obj the tagged object holding the object we want + * @param explicit true if the object is meant to be explicitly + * tagged false otherwise. + * @exception IllegalArgumentException if the tagged object cannot + * be converted. + */ + public static DERUniversalString getInstance( + ASN1TaggedObject obj, + boolean explicit) + { + return getInstance(obj.getObject()); + } + + /** + * basic constructor - byte encoded string. + */ + public DERUniversalString( + byte[] string) + { + this.string = string; + } + + /** + * UniversalStrings have characters which are 4 bytes long - for the + * moment we just return them in Hex... + */ + public String getString() + { + StringBuffer buf = new StringBuffer(); + + for (int i = 0; i != string.length; i++) + { + buf.append(table[(string[i] >>> 4) % 0xf]); + buf.append(table[string[i] & 0xf]); + } + + return buf.toString(); + } + + public byte[] getOctets() + { + return string; + } + + void encode( + DEROutputStream out) + throws IOException + { + out.writeEncoded(UNIVERSAL_STRING, this.getOctets()); + } + + public boolean equals( + Object o) + { + if ((o == null) || !(o instanceof DERUniversalString)) + { + return false; + } + + return this.getString().equals(((DERUniversalString)o).getString()); + } +} + + +/** + * We insert one of these when we find a tag we don't recognise. + */ +class DERUnknownTag + extends DERObject +{ + int tag; + byte[] data; + + /** + * @param tag the tag value. + * @param data the octets making up the time. + */ + public DERUnknownTag( + int tag, + byte[] data) + { + this.tag = tag; + this.data = data; + } + + public int getTag() + { + return tag; + } + + public byte[] getData() + { + return data; + } + + void encode( + DEROutputStream out) + throws IOException + { + out.writeEncoded(tag, data); + } + + public boolean equals( + Object o) + { + if ((o == null) || !(o instanceof DERUnknownTag)) + { + return false; + } + + DERUnknownTag other = (DERUnknownTag)o; + + if(tag != other.tag) + { + return false; + } + + if(data.length != other.data.length) + { + return false; + } + + for(int i = 0; i < data.length; i++) + { + if(data[i] != other.data[i]) + { + return false; + } + } + + return true; + } +} + + +/** + * UTC time object. + */ +class DERUTCTime + extends DERObject +{ + String time; + + /** + * return an UTC Time from the passed in object. + * + * @exception IllegalArgumentException if the object cannot be converted. + */ + public static DERUTCTime getInstance( + Object obj) + { + if (obj == null || obj instanceof DERUTCTime) + { + return (DERUTCTime)obj; + } + + if (obj instanceof ASN1OctetString) + { + return new DERUTCTime(((ASN1OctetString)obj).getOctets()); + } + + throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName()); + } + + /** + * return an UTC Time from a tagged object. + * + * @param obj the tagged object holding the object we want + * @param explicit true if the object is meant to be explicitly + * tagged false otherwise. + * @exception IllegalArgumentException if the tagged object cannot + * be converted. + */ + public static DERUTCTime getInstance( + ASN1TaggedObject obj, + boolean explicit) + { + return getInstance(obj.getObject()); + } + + /** + * The correct format for this is YYMMDDHHMMSSZ (it used to be that seconds were + * never encoded. When you're creating one of these objects from scratch, that's + * what you want to use, otherwise we'll try to deal with whatever gets read from + * the input stream... (this is why the input format is different from the getTime() + * method output). + *

+ * + * @param time the time string. + */ + public DERUTCTime( + String time) + { + this.time = time; + } + + /** + * base constructer from a java.util.date object + */ + public DERUTCTime( + Date time) + { + SimpleDateFormat dateF = new SimpleDateFormat("yyMMddHHmmss'Z'"); + + dateF.setTimeZone(new SimpleTimeZone(0,"Z")); + + this.time = dateF.format(time); + } + + DERUTCTime( + byte[] bytes) + { + // + // explicitly convert to characters + // + char[] dateC = new char[bytes.length]; + + for (int i = 0; i != dateC.length; i++) + { + dateC[i] = (char)(bytes[i] & 0xff); + } + + this.time = new String(dateC); + } + + /** + * return the time - always in the form of + * YYMMDDhhmmssGMT(+hh:mm|-hh:mm). + *

+ * Normally in a certificate we would expect "Z" rather than "GMT", + * however adding the "GMT" means we can just use: + *

+     *     dateF = new SimpleDateFormat("yyMMddHHmmssz");
+     * 
+ * To read in the time and get a date which is compatible with our local + * time zone. + *

+ * Note: In some cases, due to the local date processing, this + * may lead to unexpected results. If you want to stick the normal + * convention of 1950 to 2049 use the getAdjustedTime() method. + */ + public String getTime() + { + // + // standardise the format. + // + if (time.length() == 11) + { + return time.substring(0, 10) + "00GMT+00:00"; + } + else if (time.length() == 13) + { + return time.substring(0, 12) + "GMT+00:00"; + } + else if (time.length() == 17) + { + return time.substring(0, 12) + "GMT" + time.substring(12, 15) + ":" + time.substring(15, 17); + } + + return time; + } + + /** + * return the time as an adjusted date with a 4 digit year. This goes + * in the range of 1950 - 2049. + */ + public String getAdjustedTime() + { + String d = this.getTime(); + + if (d.charAt(0) < '5') + { + return "20" + d; + } + else + { + return "19" + d; + } + } + + private byte[] getOctets() + { + char[] cs = time.toCharArray(); + byte[] bs = new byte[cs.length]; + + for (int i = 0; i != cs.length; i++) + { + bs[i] = (byte)cs[i]; + } + + return bs; + } + + void encode( + DEROutputStream out) + throws IOException + { + out.writeEncoded(UTC_TIME, this.getOctets()); + } + + public boolean equals( + Object o) + { + if ((o == null) || !(o instanceof DERUTCTime)) + { + return false; + } + + return time.equals(((DERUTCTime)o).time); + } +} + + +/** + * DER UTF8String object. + */ +class DERUTF8String + extends DERObject + implements DERString +{ + String string; + + /** + * return an UTF8 string from the passed in object. + * + * @exception IllegalArgumentException if the object cannot be converted. + */ + public static DERUTF8String getInstance( + Object obj) + { + if (obj == null || obj instanceof DERUTF8String) + { + return (DERUTF8String)obj; + } + + if (obj instanceof ASN1OctetString) + { + return new DERUTF8String(((ASN1OctetString)obj).getOctets()); + } + + if (obj instanceof ASN1TaggedObject) + { + return getInstance(((ASN1TaggedObject)obj).getObject()); + } + + throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName()); + } + + /** + * return an UTF8 String from a tagged object. + * + * @param obj the tagged object holding the object we want + * @param explicit true if the object is meant to be explicitly + * tagged false otherwise. + * @exception IllegalArgumentException if the tagged object cannot + * be converted. + */ + public static DERUTF8String getInstance( + ASN1TaggedObject obj, + boolean explicit) + { + return getInstance(obj.getObject()); + } + + /** + * basic constructor - byte encoded string. + */ + DERUTF8String( + byte[] string) + { + int i = 0; + int length = 0; + + while (i < string.length) + { + length++; + if ((string[i] & 0xe0) == 0xe0) + { + i += 3; + } + else if ((string[i] & 0xc0) == 0xc0) + { + i += 2; + } + else + { + i += 1; + } + } + + char[] cs = new char[length]; + + i = 0; + length = 0; + + while (i < string.length) + { + char ch; + + if ((string[i] & 0xe0) == 0xe0) + { + ch = (char)(((string[i] & 0x1f) << 12) + | ((string[i + 1] & 0x3f) << 6) | (string[i + 2] & 0x3f)); + i += 3; + } + else if ((string[i] & 0xc0) == 0xc0) + { + ch = (char)(((string[i] & 0x3f) << 6) | (string[i + 1] & 0x3f)); + i += 2; + } + else + { + ch = (char)(string[i] & 0xff); + i += 1; + } + + cs[length++] = ch; + } + + this.string = new String(cs); + } + + /** + * basic constructor + */ + public DERUTF8String( + String string) + { + this.string = string; + } + + public String getString() + { + return string; + } + + public int hashCode() + { + return this.getString().hashCode(); + } + + public boolean equals( + Object o) + { + if (!(o instanceof DERUTF8String)) + { + return false; + } + + DERUTF8String s = (DERUTF8String)o; + + return this.getString().equals(s.getString()); + } + + void encode( + DEROutputStream out) + throws IOException + { + char[] c = string.toCharArray(); + ByteArrayOutputStream bOut = new ByteArrayOutputStream(); + + for (int i = 0; i != c.length; i++) + { + char ch = c[i]; + + if (ch < 0x0080) + { + bOut.write(ch); + } + else if (ch < 0x0800) + { + bOut.write(0xc0 | (ch >> 6)); + bOut.write(0x80 | (ch & 0x3f)); + } + else + { + bOut.write(0xe0 | (ch >> 12)); + bOut.write(0x80 | ((ch >> 6) & 0x3F)); + bOut.write(0x80 | (ch & 0x3F)); + } + } + + out.writeEncoded(UTF8_STRING, bOut.toByteArray()); + } +} + + +/** + * DER VisibleString object. + */ +class DERVisibleString + extends DERObject + implements DERString +{ + String string; + + /** + * return a Visible String from the passed in object. + * + * @exception IllegalArgumentException if the object cannot be converted. + */ + public static DERVisibleString getInstance( + Object obj) + { + if (obj == null || obj instanceof DERVisibleString) + { + return (DERVisibleString)obj; + } + + if (obj instanceof ASN1OctetString) + { + return new DERVisibleString(((ASN1OctetString)obj).getOctets()); + } + + if (obj instanceof ASN1TaggedObject) + { + return getInstance(((ASN1TaggedObject)obj).getObject()); + } + + throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName()); + } + + /** + * return a Visible String from a tagged object. + * + * @param obj the tagged object holding the object we want + * @param explicit true if the object is meant to be explicitly + * tagged false otherwise. + * @exception IllegalArgumentException if the tagged object cannot + * be converted. + */ + public static DERVisibleString getInstance( + ASN1TaggedObject obj, + boolean explicit) + { + return getInstance(obj.getObject()); + } + + /** + * basic constructor - byte encoded string. + */ + public DERVisibleString( + byte[] string) + { + char[] cs = new char[string.length]; + + for (int i = 0; i != cs.length; i++) + { + cs[i] = (char)(string[i] & 0xff); + } + + this.string = new String(cs); + } + + /** + * basic constructor + */ + public DERVisibleString( + String string) + { + this.string = string; + } + + public String getString() + { + return string; + } + + public byte[] getOctets() + { + char[] cs = string.toCharArray(); + byte[] bs = new byte[cs.length]; + + for (int i = 0; i != cs.length; i++) + { + bs[i] = (byte)cs[i]; + } + + return bs; + } + + void encode( + DEROutputStream out) + throws IOException + { + out.writeEncoded(VISIBLE_STRING, this.getOctets()); + } + + public boolean equals( + Object o) + { + if ((o == null) || !(o instanceof DERVisibleString)) + { + return false; + } + + return this.getString().equals(((DERVisibleString)o).getString()); + } +} + +/** + * class for breaking up an OID into it's component tokens, ala + * java.util.StringTokenizer. We need this class as some of the + * lightweight Java environment don't support classes like + * StringTokenizer. + */ +class OIDTokenizer +{ + private String oid; + private int index; + + public OIDTokenizer( + String oid) + { + this.oid = oid; + this.index = 0; + } + + public boolean hasMoreTokens() + { + return (index != -1); + } + + public String nextToken() + { + if (index == -1) + { + return null; + } + + String token; + int end = oid.indexOf('.', index); + + if (end == -1) + { + token = oid.substring(index); + index = -1; + return token; + } + + token = oid.substring(index, end); + + index = end + 1; + return token; + } +} + + +interface PKCSObjectIdentifiers +{ + // + // pkcs-1 OBJECT IDENTIFIER ::= { + // iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) 1 } + // + static final String pkcs_1 = "1.2.840.113549.1.1"; + static final DERObjectIdentifier rsaEncryption = new DERObjectIdentifier(pkcs_1 + ".1"); + static final DERObjectIdentifier md2WithRSAEncryption = new DERObjectIdentifier(pkcs_1 + ".2"); + static final DERObjectIdentifier md4WithRSAEncryption = new DERObjectIdentifier(pkcs_1 + ".3"); + static final DERObjectIdentifier md5WithRSAEncryption = new DERObjectIdentifier(pkcs_1 + ".4"); + static final DERObjectIdentifier sha1WithRSAEncryption = new DERObjectIdentifier(pkcs_1 + ".5"); + static final DERObjectIdentifier srsaOAEPEncryptionSET = new DERObjectIdentifier(pkcs_1 + ".6"); + static final DERObjectIdentifier sha256WithRSAEncryption = new DERObjectIdentifier(pkcs_1 + ".11"); + static final DERObjectIdentifier sha384WithRSAEncryption = new DERObjectIdentifier(pkcs_1 + ".12"); + static final DERObjectIdentifier sha512WithRSAEncryption = new DERObjectIdentifier(pkcs_1 + ".13"); + + // + // pkcs-3 OBJECT IDENTIFIER ::= { + // iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) 3 } + // + static final String pkcs_3 = "1.2.840.113549.1.3"; + static final DERObjectIdentifier dhKeyAgreement = new DERObjectIdentifier(pkcs_3 + ".1"); + + // + // pkcs-5 OBJECT IDENTIFIER ::= { + // iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) 5 } + // + static final String pkcs_5 = "1.2.840.113549.1.5"; + + static final DERObjectIdentifier id_PBES2 = new DERObjectIdentifier(pkcs_5 + ".13"); + + static final DERObjectIdentifier id_PBKDF2 = new DERObjectIdentifier(pkcs_5 + ".12"); + + // + // encryptionAlgorithm OBJECT IDENTIFIER ::= { + // iso(1) member-body(2) us(840) rsadsi(113549) 3 } + // + static final String encryptionAlgorithm = "1.2.840.113549.3"; + + static final DERObjectIdentifier des_EDE3_CBC = new DERObjectIdentifier(encryptionAlgorithm + ".7"); + static final DERObjectIdentifier RC2_CBC = new DERObjectIdentifier(encryptionAlgorithm + ".2"); + + // + // object identifiers for digests + // + + // + // md2 OBJECT IDENTIFIER ::= + // {iso(1) member-body(2) US(840) rsadsi(113549) digestAlgorithm(2) 2} + // + static final DERObjectIdentifier md2 = new DERObjectIdentifier("1.2.840.113549.2.2"); + + // + // md5 OBJECT IDENTIFIER ::= + // {iso(1) member-body(2) US(840) rsadsi(113549) digestAlgorithm(2) 5} + // + static final DERObjectIdentifier md5 = new DERObjectIdentifier("1.2.840.113549.2.5"); + + // + // pkcs-7 OBJECT IDENTIFIER ::= { + // iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) 7 } + // + static final String pkcs_7 = "1.2.840.113549.1.7"; + static final DERObjectIdentifier data = new DERObjectIdentifier(pkcs_7 + ".1"); + static final DERObjectIdentifier signedData = new DERObjectIdentifier(pkcs_7 + ".2"); + static final DERObjectIdentifier envelopedData = new DERObjectIdentifier(pkcs_7 + ".3"); + static final DERObjectIdentifier signedAndEnvelopedData = new DERObjectIdentifier(pkcs_7 + ".4"); + static final DERObjectIdentifier digestedData = new DERObjectIdentifier(pkcs_7 + ".5"); + static final DERObjectIdentifier encryptedData = new DERObjectIdentifier(pkcs_7 + ".6"); + + // + // pkcs-9 OBJECT IDENTIFIER ::= { + // iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) 9 } + // + static final String pkcs_9 = "1.2.840.113549.1.9"; + + static final DERObjectIdentifier pkcs_9_at_emailAddress = new DERObjectIdentifier(pkcs_9 + ".1"); + static final DERObjectIdentifier pkcs_9_at_unstructuredName = new DERObjectIdentifier(pkcs_9 + ".2"); + static final DERObjectIdentifier pkcs_9_at_contentType = new DERObjectIdentifier(pkcs_9 + ".3"); + static final DERObjectIdentifier pkcs_9_at_messageDigest = new DERObjectIdentifier(pkcs_9 + ".4"); + static final DERObjectIdentifier pkcs_9_at_signingTime = new DERObjectIdentifier(pkcs_9 + ".5"); + static final DERObjectIdentifier pkcs_9_at_counterSignature = new DERObjectIdentifier(pkcs_9 + ".6"); + static final DERObjectIdentifier pkcs_9_at_challengePassword = new DERObjectIdentifier(pkcs_9 + ".7"); + static final DERObjectIdentifier pkcs_9_at_unstructuredAddress = new DERObjectIdentifier(pkcs_9 + ".8"); + static final DERObjectIdentifier pkcs_9_at_extendedCertificateAttributes = new DERObjectIdentifier(pkcs_9 + ".9"); + + static final DERObjectIdentifier pkcs_9_at_signingDescription = new DERObjectIdentifier(pkcs_9 + ".13"); + static final DERObjectIdentifier pkcs_9_at_extensionRequest = new DERObjectIdentifier(pkcs_9 + ".14"); + static final DERObjectIdentifier pkcs_9_at_smimeCapabilities = new DERObjectIdentifier(pkcs_9 + ".15"); + + static final DERObjectIdentifier pkcs_9_at_friendlyName = new DERObjectIdentifier(pkcs_9 + ".20"); + static final DERObjectIdentifier pkcs_9_at_localKeyId = new DERObjectIdentifier(pkcs_9 + ".21"); + + static final DERObjectIdentifier x509certType = new DERObjectIdentifier(pkcs_9 + ".22.1"); + + // + // SMIME capability sub oids. + // + static final DERObjectIdentifier preferSignedData = new DERObjectIdentifier(pkcs_9 + ".15.1"); + static final DERObjectIdentifier canNotDecryptAny = new DERObjectIdentifier(pkcs_9 + ".15.2"); + static final DERObjectIdentifier sMIMECapabilitiesVersions = new DERObjectIdentifier(pkcs_9 + ".15.3"); + + // + // other SMIME attributes + // + + // + // id-aa OBJECT IDENTIFIER ::= {iso(1) member-body(2) usa(840) + // rsadsi(113549) pkcs(1) pkcs-9(9) smime(16) attributes(2)} + // + static String id_aa = "1.2.840.113549.1.9.16.2"; + + /* + * id-aa-encrypKeyPref OBJECT IDENTIFIER ::= {id-aa 11} + * + */ + static DERObjectIdentifier id_aa_encrypKeyPref = new DERObjectIdentifier(id_aa + ".11"); + + // + // pkcs-12 OBJECT IDENTIFIER ::= { + // iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) 12 } + // + static final String pkcs_12 = "1.2.840.113549.1.12"; + static final String bagtypes = pkcs_12 + ".10.1"; + + static final DERObjectIdentifier keyBag = new DERObjectIdentifier(bagtypes + ".1"); + static final DERObjectIdentifier pkcs8ShroudedKeyBag = new DERObjectIdentifier(bagtypes + ".2"); + static final DERObjectIdentifier certBag = new DERObjectIdentifier(bagtypes + ".3"); + static final DERObjectIdentifier crlBag = new DERObjectIdentifier(bagtypes + ".4"); + static final DERObjectIdentifier secretBag = new DERObjectIdentifier(bagtypes + ".5"); + static final DERObjectIdentifier safeContentsBag = new DERObjectIdentifier(bagtypes + ".6"); +} + + + + +class AlgorithmIdentifier + implements DEREncodable +{ + private DERObjectIdentifier objectId; + private DEREncodable parameters; + private boolean parametersDefined = false; + + public static AlgorithmIdentifier getInstance( + ASN1TaggedObject obj, + boolean explicit) + { + return getInstance(ASN1Sequence.getInstance(obj, explicit)); + } + + public static AlgorithmIdentifier getInstance( + Object obj) + { + if (obj instanceof AlgorithmIdentifier) + { + return (AlgorithmIdentifier)obj; + } + + if (obj instanceof DERObjectIdentifier) + { + return new AlgorithmIdentifier((DERObjectIdentifier)obj); + } + + if (obj instanceof String) + { + return new AlgorithmIdentifier((String)obj); + } + + if (obj instanceof ASN1Sequence) + { + return new AlgorithmIdentifier((ASN1Sequence)obj); + } + + throw new IllegalArgumentException("unknown object in factory"); + } + + public AlgorithmIdentifier( + DERObjectIdentifier objectId) + { + this.objectId = objectId; + } + + public AlgorithmIdentifier( + String objectId) + { + this.objectId = new DERObjectIdentifier(objectId); + } + + public AlgorithmIdentifier( + DERObjectIdentifier objectId, + DEREncodable parameters) + { + parametersDefined = true; + this.objectId = objectId; + this.parameters = parameters; + } + + public AlgorithmIdentifier( + ASN1Sequence seq) + { + objectId = (DERObjectIdentifier)seq.getObjectAt(0); + + if (seq.size() == 2) + { + parametersDefined = true; + parameters = seq.getObjectAt(1); + } + else + { + parameters = null; + } + } + + public DERObjectIdentifier getObjectId() + { + return objectId; + } + + public DEREncodable getParameters() + { + return parameters; + } + + /** + *

+     *      AlgorithmIdentifier ::= SEQUENCE {
+     *                            algorithm OBJECT IDENTIFIER,
+     *                            parameters ANY DEFINED BY algorithm OPTIONAL }
+     * 
+ */ + public DERObject getDERObject() + { + DERConstructedSequence seq = new DERConstructedSequence(); + + seq.addObject(objectId); + + if (parametersDefined) + { + seq.addObject(parameters); + } + + return seq; + } + + public boolean equals( + Object o) + { + if ((o == null) || !(o instanceof AlgorithmIdentifier)) + { + return false; + } + + AlgorithmIdentifier other = (AlgorithmIdentifier)o; + + if (!this.getObjectId().equals(other.getObjectId())) + { + return false; + } + + if (this.getParameters() == null && other.getParameters() == null) + { + return true; + } + + if (this.getParameters() == null || other.getParameters() == null) + { + return false; + } + + ByteArrayOutputStream b1Out = new ByteArrayOutputStream(); + ByteArrayOutputStream b2Out = new ByteArrayOutputStream(); + DEROutputStream d1Out = new DEROutputStream(b1Out); + DEROutputStream d2Out = new DEROutputStream(b2Out); + + try + { + d1Out.writeObject(this.getParameters()); + d2Out.writeObject(other.getParameters()); + + byte[] b1 = b1Out.toByteArray(); + byte[] b2 = b2Out.toByteArray(); + + if (b1.length != b2.length) + { + return false; + } + + for (int i = 0; i != b1.length; i++) + { + if (b1[i] != b2[i]) + { + return false; + } + } + } + catch (Exception e) + { + return false; + } + + return true; + } +} + + + + +/** + *
+ * id-ce-authorityKeyIdentifier OBJECT IDENTIFIER ::=  { id-ce 35 }
+ *
+ *   AuthorityKeyIdentifier ::= SEQUENCE {
+ *      keyIdentifier             [0] IMPLICIT KeyIdentifier           OPTIONAL,
+ *      authorityCertIssuer       [1] IMPLICIT GeneralNames            OPTIONAL,
+ *      authorityCertSerialNumber [2] IMPLICIT CertificateSerialNumber OPTIONAL  }
+ *
+ *   KeyIdentifier ::= OCTET STRING
+ * 
+ * + */ +class AuthorityKeyIdentifier + implements DEREncodable, DERTags +{ + ASN1OctetString keyidentifier=null; + GeneralNames certissuer=null; + DERInteger certserno=null; + + public static AuthorityKeyIdentifier getInstance( + ASN1TaggedObject obj, + boolean explicit) + { + return getInstance(ASN1Sequence.getInstance(obj, explicit)); + } + + public static AuthorityKeyIdentifier getInstance( + Object obj) + { + if (obj instanceof AuthorityKeyIdentifier) + { + return (AuthorityKeyIdentifier)obj; + } + else if (obj instanceof ASN1Sequence) + { + return new AuthorityKeyIdentifier((ASN1Sequence)obj); + } + + throw new IllegalArgumentException("unknown object in factory"); + } + + public AuthorityKeyIdentifier( + ASN1Sequence seq) + { + Enumeration e = seq.getObjects(); + + while (e.hasMoreElements()) + { + DERTaggedObject o = (DERTaggedObject)e.nextElement(); + + switch (o.getTagNo()) + { + case 0: + this.keyidentifier = ASN1OctetString.getInstance(o, false); + break; + case 1: + this.certissuer = GeneralNames.getInstance(o, false); + break; + case 2: + this.certserno = DERInteger.getInstance(o, false); + break; + default: + throw new IllegalArgumentException("illegal tag"); + } + } + } + + /** + * + * Calulates the keyidentifier using a SHA1 hash over the BIT STRING + * from SubjectPublicKeyInfo as defined in RFC2459. + * + * Example of making a AuthorityKeyIdentifier: + *
+     *   SubjectPublicKeyInfo apki = new SubjectPublicKeyInfo((DERConstructedSequence)new DERInputStream(
+     *       new ByteArrayInputStream(publicKey.getEncoded())).readObject());
+     *   AuthorityKeyIdentifier aki = new AuthorityKeyIdentifier(apki);
+     * 
+ * + **/ + public AuthorityKeyIdentifier( + SubjectPublicKeyInfo spki) + { + Digest digest = new SHA1Digest(); + byte[] resBuf = new byte[digest.getDigestSize()]; + + byte[] bytes = spki.getPublicKeyData().getBytes(); + digest.update(bytes, 0, bytes.length); + digest.doFinal(resBuf, 0); + this.keyidentifier = new DEROctetString(resBuf); + } + + /** + * create an AuthorityKeyIdentifier with the GeneralNames tag and + * the serial number provided as well. + */ + public AuthorityKeyIdentifier( + SubjectPublicKeyInfo spki, + GeneralNames name, + BigInteger serialNumber) + { + Digest digest = new SHA1Digest(); + byte[] resBuf = new byte[digest.getDigestSize()]; + + byte[] bytes = spki.getPublicKeyData().getBytes(); + digest.update(bytes, 0, bytes.length); + digest.doFinal(resBuf, 0); + + this.keyidentifier = new DEROctetString(resBuf); + this.certissuer = name; + this.certserno = new DERInteger(serialNumber); + } + + public byte[] getKeyIdentifier() + { + if (keyidentifier != null) + { + return keyidentifier.getOctets(); + } + + return null; + } + + /** + *
+     *   AuthorityKeyIdentifier ::= SEQUENCE {
+     *      keyIdentifier             [0] IMPLICIT KeyIdentifier           OPTIONAL,
+     *      authorityCertIssuer       [1] IMPLICIT GeneralNames            OPTIONAL,
+     *      authorityCertSerialNumber [2] IMPLICIT CertificateSerialNumber OPTIONAL  }
+     *
+     *   KeyIdentifier ::= OCTET STRING
+     * 
+ */ + public DERObject getDERObject() + { + DERConstructedSequence seq = new DERConstructedSequence(); + + if (keyidentifier != null) + { + seq.addObject(new DERTaggedObject(false, 0, keyidentifier)); + } + + if (certissuer != null) + { + seq.addObject(new DERTaggedObject(false, 1, certissuer)); + } + + if (certserno != null) + { + seq.addObject(new DERTaggedObject(false, 2, certserno)); + } + + + return seq; + } + + public String toString() + { + return ("AuthorityKeyIdentifier: KeyID(" + this.keyidentifier.getOctets() + ")"); + } +} + + + +class BasicConstraints + implements DEREncodable +{ + DERBoolean cA = new DERBoolean(false); + DERInteger pathLenConstraint = null; + + public static BasicConstraints getInstance( + ASN1TaggedObject obj, + boolean explicit) + { + return getInstance(ASN1Sequence.getInstance(obj, explicit)); + } + + public static BasicConstraints getInstance( + Object obj) + { + if (obj instanceof BasicConstraints) + { + return (BasicConstraints)obj; + } + else if (obj instanceof ASN1Sequence) + { + return new BasicConstraints((ASN1Sequence)obj); + } + + throw new IllegalArgumentException("unknown object in factory"); + } + + public BasicConstraints( + ASN1Sequence seq) + { + if (seq.size() != 0) + { + this.cA = (DERBoolean)seq.getObjectAt(0); + this.pathLenConstraint = (DERInteger)seq.getObjectAt(1); + } + } + + public BasicConstraints( + boolean cA, + int pathLenConstraint) + { + this.cA = new DERBoolean(cA); + this.pathLenConstraint = new DERInteger(pathLenConstraint); + } + + public BasicConstraints( + boolean cA) + { + this.cA = new DERBoolean(cA); + this.pathLenConstraint = null; + } + + public boolean isCA() + { + return cA.isTrue(); + } + + public BigInteger getPathLenConstraint() + { + if (pathLenConstraint != null) + { + return pathLenConstraint.getValue(); + } + + return null; + } + + /** + *
+     * BasicConstraints := SEQUENCE {
+     *    cA                  BOOLEAN DEFAULT FALSE,
+     *    pathLenConstraint   INTEGER (0..MAX) OPTIONAL
+     * }
+     * 
+ */ + public DERObject getDERObject() + { + DERConstructedSequence seq = new DERConstructedSequence(); + + seq.addObject(cA); + + if (pathLenConstraint != null) + { + seq.addObject(pathLenConstraint); + } + + return seq; + } + + public String toString() + { + return "BasicConstraints: isCa(" + this.isCA() + "), pathLenConstraint = " + pathLenConstraint.getValue(); + } +} + + + +/** + * PKIX RFC-2459 + * + * The X.509 v2 CRL syntax is as follows. For signature calculation, + * the data that is to be signed is ASN.1 DER encoded. + * + *
+ * CertificateList  ::=  SEQUENCE  {
+ *      tbsCertList          TBSCertList,
+ *      signatureAlgorithm   AlgorithmIdentifier,
+ *      signatureValue       BIT STRING  }
+ * 
+ */ +class CertificateList + implements DEREncodable +{ + TBSCertList tbsCertList; + AlgorithmIdentifier sigAlgId; + DERBitString sig; + + public static CertificateList getInstance( + ASN1TaggedObject obj, + boolean explicit) + { + return getInstance(ASN1Sequence.getInstance(obj, explicit)); + } + + public static CertificateList getInstance( + Object obj) + { + if (obj instanceof CertificateList) + { + return (CertificateList)obj; + } + else if (obj instanceof ASN1Sequence) + { + return new CertificateList((ASN1Sequence)obj); + } + + throw new IllegalArgumentException("unknown object in factory"); + } + + public CertificateList( + ASN1Sequence seq) + { + tbsCertList = TBSCertList.getInstance(seq.getObjectAt(0)); + sigAlgId = AlgorithmIdentifier.getInstance(seq.getObjectAt(1)); + sig = (DERBitString)seq.getObjectAt(2); + } + + public TBSCertList getTBSCertList() + { + return tbsCertList; + } + + public TBSCertList.CRLEntry[] getRevokedCertificates() + { + return tbsCertList.getRevokedCertificates(); + } + + public AlgorithmIdentifier getSignatureAlgorithm() + { + return sigAlgId; + } + + public DERBitString getSignature() + { + return sig; + } + + public int getVersion() + { + return tbsCertList.getVersion(); + } + + public X509Name getIssuer() + { + return tbsCertList.getIssuer(); + } + + public Time getThisUpdate() + { + return tbsCertList.getThisUpdate(); + } + + public Time getNextUpdate() + { + return tbsCertList.getNextUpdate(); + } + + public DERObject getDERObject() + { + DERConstructedSequence seq = new DERConstructedSequence(); + seq.addObject(tbsCertList); + seq.addObject(sigAlgId); + seq.addObject(sig); + return seq; + } +} + + +class CRLDistPoint + implements DEREncodable +{ + ASN1Sequence seq = null; + + public static CRLDistPoint getInstance( + ASN1TaggedObject obj, + boolean explicit) + { + return getInstance(ASN1Sequence.getInstance(obj, explicit)); + } + + public static CRLDistPoint getInstance( + Object obj) + { + if (obj instanceof CRLDistPoint) + { + return (CRLDistPoint)obj; + } + else if (obj instanceof ASN1Sequence) + { + return new CRLDistPoint((ASN1Sequence)obj); + } + + throw new IllegalArgumentException("unknown object in factory"); + } + + public CRLDistPoint( + ASN1Sequence seq) + { + this.seq = seq; + } + + public CRLDistPoint( + DistributionPoint[] points) + { + DEREncodableVector v = new DEREncodableVector(); + + for (int i = 0; i != points.length; i++) + { + v.add(points[i]); + } + + seq = new DERSequence(v); + } + + /** + *
+     * CRLDistPoint ::= SEQUENCE SIZE {1..MAX} OF DistributionPoint
+     * 
+ */ + public DERObject getDERObject() + { + return seq; + } +} + + + +/** + *
+ * CRLNumber::= INTEGER(0..MAX)
+ * 
+ */ +class CRLNumber + extends DERInteger +{ + + public CRLNumber( + BigInteger number) + { + super(number); + } + + public BigInteger getCRLNumber() + { + return getPositiveValue(); + } +} + + +class CRLReason + extends DEREnumerated +{ + public static final int UNSPECIFIED = 0; + public static final int KEY_COMPROMISE = 1; + public static final int CA_COMPROMISE = 2; + public static final int AFFILIATION_CHANGED = 3; + public static final int SUPERSEDED = 4; + public static final int CESSATION_OF_OPERATION = 5; + public static final int CERTIFICATE_HOLD = 6; + public static final int REMOVE_FROM_CRL = 8; + public static final int PRIVILEGE_WITHDRAWN = 9; + public static final int AA_COMPROMISE = 10; + + /** + *
+     * CRLReason ::= ENUMERATED {
+     *  unspecified             (0),
+     *  keyCompromise           (1),
+     *  cACompromise            (2),
+     *  affiliationChanged      (3),
+     *  superseded              (4),
+     *  cessationOfOperation    (5),
+     *  certificateHold         (6),
+     *  removeFromCRL           (8),
+     *  privilegeWithdrawn      (9),
+     *  aACompromise           (10)
+     * }
+     * 
+ */ + public CRLReason( + int reason) + { + super(reason); + } +} + + + +/** + *
+ * DigestInfo::=SEQUENCE{
+ *          digestAlgorithm  AlgorithmIdentifier,
+ *          digest OCTET STRING }
+ * 
+ */ +class DigestInfo + implements DEREncodable +{ + private byte[] digest; + private AlgorithmIdentifier algId; + + public static DigestInfo getInstance( + ASN1TaggedObject obj, + boolean explicit) + { + return getInstance(ASN1Sequence.getInstance(obj, explicit)); + } + + public static DigestInfo getInstance( + Object obj) + { + if (obj instanceof DigestInfo) + { + return (DigestInfo)obj; + } + else if (obj instanceof ASN1Sequence) + { + return new DigestInfo((ASN1Sequence)obj); + } + + throw new IllegalArgumentException("unknown object in factory"); + } + + public DigestInfo( + AlgorithmIdentifier algId, + byte[] digest) + { + this.digest = digest; + this.algId = algId; + } + + public DigestInfo( + ASN1Sequence obj) + { + Enumeration e = obj.getObjects(); + + algId = AlgorithmIdentifier.getInstance(e.nextElement()); + digest = ((ASN1OctetString)e.nextElement()).getOctets(); + } + + public AlgorithmIdentifier getAlgorithmId() + { + return algId; + } + + public byte[] getDigest() + { + return digest; + } + + public DERObject getDERObject() + { + DEREncodableVector v = new DEREncodableVector(); + + v.add(algId); + v.add(new DEROctetString(digest)); + + return new DERSequence(v); + } +} + + +class DistributionPoint + implements DEREncodable +{ + ASN1Sequence seq = null; + + public static DistributionPoint getInstance( + ASN1TaggedObject obj, + boolean explicit) + { + return getInstance(ASN1Sequence.getInstance(obj, explicit)); + } + + public static DistributionPoint getInstance( + Object obj) + { + if(obj == null || obj instanceof DistributionPoint) + { + return (DistributionPoint)obj; + } + + if(obj instanceof ASN1Sequence) + { + return new DistributionPoint((ASN1Sequence)obj); + } + + throw new IllegalArgumentException("Invalid DistributionPoint: " + obj.getClass().getName()); + } + + public DistributionPoint( + ASN1Sequence seq) + { + this.seq = seq; + } + + public DistributionPoint( + DistributionPointName distributionPoint, + ReasonFlags reasons, + GeneralNames cRLIssuer) + { + DEREncodableVector v = new DEREncodableVector(); + + if (distributionPoint != null) + { + v.add(new DERTaggedObject(0, distributionPoint)); + } + + if (reasons != null) + { + v.add(new DERTaggedObject(1, reasons)); + } + + if (cRLIssuer != null) + { + v.add(new DERTaggedObject(2, cRLIssuer)); + } + + seq = new DERSequence(v); + } + + /** + *
+     * DistributionPoint ::= SEQUENCE {
+     *      distributionPoint [0] DistributionPointName OPTIONAL,
+     *      reasons           [1] ReasonFlags OPTIONAL,
+     *      cRLIssuer         [2] GeneralNames OPTIONAL
+     * }
+     * 
+ */ + public DERObject getDERObject() + { + return seq; + } +} + + +class DistributionPointName + implements DEREncodable +{ + DEREncodable name; + int type; + + public static final int FULL_NAME = 0; + public static final int NAME_RELATIVE_TO_CRL_ISSUER = 1; + + public DistributionPointName( + int type, + DEREncodable name) + { + this.type = type; + this.name = name; + } + + /** + *
+     * DistributionPointName ::= CHOICE {
+     *     fullName                 [0] GeneralNames,
+     *     nameRelativeToCRLIssuer  [1] RelativeDistinguishedName
+     * }
+     * 
+ */ + public DERObject getDERObject() + { + return new DERTaggedObject(false, type, name); + } +} + + + +class DSAParameter + implements DEREncodable +{ + DERInteger p, q, g; + + public static DSAParameter getInstance( + ASN1TaggedObject obj, + boolean explicit) + { + return getInstance(ASN1Sequence.getInstance(obj, explicit)); + } + + public static DSAParameter getInstance( + Object obj) + { + if(obj == null || obj instanceof DSAParameter) + { + return (DSAParameter)obj; + } + + if(obj instanceof ASN1Sequence) + { + return new DSAParameter((ASN1Sequence)obj); + } + + throw new IllegalArgumentException("Invalid DSAParameter: " + obj.getClass().getName()); + } + + public DSAParameter( + BigInteger p, + BigInteger q, + BigInteger g) + { + this.p = new DERInteger(p); + this.q = new DERInteger(q); + this.g = new DERInteger(g); + } + + public DSAParameter( + ASN1Sequence seq) + { + Enumeration e = seq.getObjects(); + + p = (DERInteger)e.nextElement(); + q = (DERInteger)e.nextElement(); + g = (DERInteger)e.nextElement(); + } + + public BigInteger getP() + { + return p.getPositiveValue(); + } + + public BigInteger getQ() + { + return q.getPositiveValue(); + } + + public BigInteger getG() + { + return g.getPositiveValue(); + } + + public DERObject getDERObject() + { + DEREncodableVector v = new DEREncodableVector(); + + v.add(p); + v.add(q); + v.add(g); + + return new DERSequence(v); + } +} + + +/** + *
+ * GeneralName ::= CHOICE {
+ *      otherName                       [0]     OtherName,
+ *      rfc822Name                      [1]     IA5String,
+ *      dNSName                         [2]     IA5String,
+ *      x400Address                     [3]     ORAddress,
+ *      directoryName                   [4]     Name,
+ *      ediPartyName                    [5]     EDIPartyName,
+ *      uniformResourceIdentifier       [6]     IA5String,
+ *      iPAddress                       [7]     OCTET STRING,
+ *      registeredID                    [8]     OBJECT IDENTIFIER}
+ *
+ * OtherName ::= SEQUENCE {
+ *      type-id    OBJECT IDENTIFIER,
+ *      value      [0] EXPLICIT ANY DEFINED BY type-id }
+ *
+ * EDIPartyName ::= SEQUENCE {
+ *      nameAssigner            [0]     DirectoryString OPTIONAL,
+ *      partyName               [1]     DirectoryString }
+ * 
+ */ +class GeneralName + implements DEREncodable +{ + DEREncodable obj; + int tag; + boolean isInsideImplicit = false; // if we are in an implicitly tagged object + + public GeneralName( + X509Name directoryName) + { + this.obj = directoryName; + this.tag = 4; + } + + /** + * When the subjectAltName extension contains an Internet mail address, + * the address MUST be included as an rfc822Name. The format of an + * rfc822Name is an "addr-spec" as defined in RFC 822 [RFC 822]. + * + * When the subjectAltName extension contains a domain name service + * label, the domain name MUST be stored in the dNSName (an IA5String). + * The name MUST be in the "preferred name syntax," as specified by RFC + * 1034 [RFC 1034]. + * + * When the subjectAltName extension contains a URI, the name MUST be + * stored in the uniformResourceIdentifier (an IA5String). The name MUST + * be a non-relative URL, and MUST follow the URL syntax and encoding + * rules specified in [RFC 1738]. The name must include both a scheme + * (e.g., "http" or "ftp") and a scheme-specific-part. The scheme- + * specific-part must include a fully qualified domain name or IP + * address as the host. + * + * When the subjectAltName extension contains a iPAddress, the address + * MUST be stored in the octet string in "network byte order," as + * specified in RFC 791 [RFC 791]. The least significant bit (LSB) of + * each octet is the LSB of the corresponding byte in the network + * address. For IP Version 4, as specified in RFC 791, the octet string + * MUST contain exactly four octets. For IP Version 6, as specified in + * RFC 1883, the octet string MUST contain exactly sixteen octets [RFC + * 1883]. + */ + public GeneralName( + DERObject name, int tag) + { + this.obj = name; + this.tag = tag; + } + + /** + * mark whether or not we are contained inside an implicitly tagged + * object. + * @deprecated + */ + public void markInsideImplicit( + boolean isInsideImplicit) + { + this.isInsideImplicit = isInsideImplicit; + } + + public DERObject getDERObject() + { + if (obj.getDERObject() instanceof ASN1Sequence) + { + return new DERTaggedObject(true, tag, obj); + } + else + { + return new DERTaggedObject(false, tag, obj); + } + } +} + + + +class GeneralNames + implements DEREncodable +{ + ASN1Sequence seq; + boolean isInsideImplicit = false; + + public static GeneralNames getInstance( + Object obj) + { + if (obj == null || obj instanceof GeneralNames) + { + return (GeneralNames)obj; + } + + if (obj instanceof ASN1Sequence) + { + return new GeneralNames((ASN1Sequence)obj); + } + + throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName()); + } + + public static GeneralNames getInstance( + ASN1TaggedObject obj, + boolean explicit) + { + return getInstance(ASN1Sequence.getInstance(obj, explicit)); + } + + public GeneralNames( + ASN1Sequence seq) + { + this.seq = seq; + } + + /* + * this is a hack! But it will have to do until the ambiguity rules + * get sorted out for implicit/explicit tagging... + * @deprecated + */ + public void markInsideImplicit( + boolean isInsideImplicit) + { + this.isInsideImplicit = isInsideImplicit; + } + + /** + *
+     * GeneralNames ::= SEQUENCE SIZE {1..MAX} OF GeneralName
+     * 
+ */ + public DERObject getDERObject() + { + return seq; + } +} + + +/** + *
+ *    id-ce-keyUsage OBJECT IDENTIFIER ::=  { id-ce 15 }
+ *
+ *    KeyUsage ::= BIT STRING {
+ *         digitalSignature        (0),
+ *         nonRepudiation          (1),
+ *         keyEncipherment         (2),
+ *         dataEncipherment        (3),
+ *         keyAgreement            (4),
+ *         keyCertSign             (5),
+ *         cRLSign                 (6),
+ *         encipherOnly            (7),
+ *         decipherOnly            (8) }
+ * 
+ */ +class KeyUsage + extends DERBitString +{ + public static final int digitalSignature = (1 << 7); + public static final int nonRepudiation = (1 << 6); + public static final int keyEncipherment = (1 << 5); + public static final int dataEncipherment = (1 << 4); + public static final int keyAgreement = (1 << 3); + public static final int keyCertSign = (1 << 2); + public static final int cRLSign = (1 << 1); + public static final int encipherOnly = (1 << 0); + public static final int decipherOnly = (1 << 15); + + /** + * Basic constructor. + * + * @param usage - the bitwise OR of the Key Usage flags giving the + * allowed uses for the key. + * e.g. (X509KeyUsage.keyEncipherment | X509KeyUsage.dataEncipherment) + */ + public KeyUsage( + int usage) + { + super(getBytes(usage), getPadBits(usage)); + } + + public KeyUsage( + DERBitString usage) + { + super(usage.getBytes(), usage.getPadBits()); + } + + public String toString() + { + return "KeyUsage: 0x" + Integer.toHexString(data[0] & 0xff); + } +} + + +class ReasonFlags + extends DERBitString +{ + public static final int UNUSED = (1 << 7); + public static final int KEY_COMPROMISE = (1 << 6); + public static final int CA_COMPROMISE = (1 << 5); + public static final int AFFILIATION_CHANGED = (1 << 4); + public static final int SUPERSEDED = (1 << 3); + public static final int CESSATION_OF_OPERATION = (1 << 2); + public static final int CERTIFICATE_HOLD = (1 << 1); + public static final int PRIVILEGE_WITHDRAWN = (1 << 0); + public static final int AA_COMPROMISE = (1 << 15); + + /** + *
+     * ReasonFlags ::= BIT STRING {
+     *    unused(0),
+     *    keyCompromise(1),
+     *    cACompromise(2),
+     *    affiliationChanged(3),
+     *    superseded(4),
+     *    cessationOfOperation(5),
+     *    certficateHold(6)
+     * }
+     * 
+ * @param reasons - the bitwise OR of the Key Reason flags giving the + * allowed uses for the key. + */ + public ReasonFlags( + int reasons) + { + super(getBytes(reasons), getPadBits(reasons)); + } + + public ReasonFlags( + DERBitString reasons) + { + super(reasons.getBytes(), reasons.getPadBits()); + } +} + + + +class RSAPublicKeyStructure + implements DEREncodable +{ + private BigInteger modulus; + private BigInteger publicExponent; + + public static RSAPublicKeyStructure getInstance( + ASN1TaggedObject obj, + boolean explicit) + { + return getInstance(ASN1Sequence.getInstance(obj, explicit)); + } + + public static RSAPublicKeyStructure getInstance( + Object obj) + { + if(obj == null || obj instanceof RSAPublicKeyStructure) + { + return (RSAPublicKeyStructure)obj; + } + + if(obj instanceof ASN1Sequence) + { + return new RSAPublicKeyStructure((ASN1Sequence)obj); + } + + throw new IllegalArgumentException("Invalid RSAPublicKeyStructure: " + obj.getClass().getName()); + } + + public RSAPublicKeyStructure( + BigInteger modulus, + BigInteger publicExponent) + { + this.modulus = modulus; + this.publicExponent = publicExponent; + } + + public RSAPublicKeyStructure( + ASN1Sequence seq) + { + Enumeration e = seq.getObjects(); + + modulus = ((DERInteger)e.nextElement()).getValue(); + publicExponent = ((DERInteger)e.nextElement()).getValue(); + } + + public BigInteger getModulus() + { + return modulus; + } + + public BigInteger getPublicExponent() + { + return publicExponent; + } + + /** + * This outputs the key in PKCS1v2 format. + *
+     *      RSAPublicKey ::= SEQUENCE {
+     *                          modulus INTEGER, -- n
+     *                          publicExponent INTEGER, -- e
+     *                      }
+     * 
+ *

+ */ + public DERObject getDERObject() + { + DERConstructedSequence seq = new DERConstructedSequence(); + + seq.addObject(new DERInteger(getModulus())); + seq.addObject(new DERInteger(getPublicExponent())); + + return seq; + } +} + + +/** + *

+ * SubjectKeyIdentifier::= OCTET STRING
+ * 
+ */ +class SubjectKeyIdentifier + implements DEREncodable +{ + private byte[] keyidentifier; + + public static SubjectKeyIdentifier getInstance( + ASN1TaggedObject obj, + boolean explicit) + { + return getInstance(ASN1OctetString.getInstance(obj, explicit)); + } + + public static SubjectKeyIdentifier getInstance( + Object obj) + { + if(obj == null || obj instanceof SubjectKeyIdentifier) + { + return (SubjectKeyIdentifier)obj; + } + + if(obj instanceof SubjectPublicKeyInfo) + { + return new SubjectKeyIdentifier((SubjectPublicKeyInfo)obj); + } + + if(obj instanceof ASN1OctetString) + { + return new SubjectKeyIdentifier((ASN1OctetString)obj); + } + + throw new IllegalArgumentException("Invalid SubjectKeyIdentifier: " + obj.getClass().getName()); + } + + public SubjectKeyIdentifier( + byte[] keyid) + { + this.keyidentifier=keyid; + } + + public SubjectKeyIdentifier( + ASN1OctetString keyid) + { + this.keyidentifier=keyid.getOctets(); + + } + + /** + * + * Calulates the keyidentifier using a SHA1 hash over the BIT STRING + * from SubjectPublicKeyInfo as defined in RFC2459. + * + **/ + public SubjectKeyIdentifier( + SubjectPublicKeyInfo spki) + { + Digest digest = new SHA1Digest(); + byte[] resBuf = new byte[digest.getDigestSize()]; + + byte[] bytes = spki.getPublicKeyData().getBytes(); + digest.update(bytes, 0, bytes.length); + digest.doFinal(resBuf, 0); + this.keyidentifier=resBuf; + } + + public byte[] getKeyIdentifier() + { + return keyidentifier; + } + + /** + *
+     * SubjectKeyIdentifier := OCTET STRING
+     * 
+ */ + public DERObject getDERObject() + { + return new DEROctetString(keyidentifier); + } +} + + + +/** + * The object that contains the public key stored in a certficate. + *

+ * The getEncoded() method in the public keys in the JCE produces a DER + * encoded one of these. + */ +class SubjectPublicKeyInfo + implements DEREncodable +{ + private AlgorithmIdentifier algId; + private DERBitString keyData; + + public static SubjectPublicKeyInfo getInstance( + ASN1TaggedObject obj, + boolean explicit) + { + return getInstance(ASN1Sequence.getInstance(obj, explicit)); + } + + public static SubjectPublicKeyInfo getInstance( + Object obj) + { + if (obj instanceof SubjectPublicKeyInfo) + { + return (SubjectPublicKeyInfo)obj; + } + else if (obj instanceof ASN1Sequence) + { + return new SubjectPublicKeyInfo((ASN1Sequence)obj); + } + + throw new IllegalArgumentException("unknown object in factory"); + } + + public SubjectPublicKeyInfo( + AlgorithmIdentifier algId, + DEREncodable publicKey) + { + this.keyData = new DERBitString(publicKey); + this.algId = algId; + } + + public SubjectPublicKeyInfo( + AlgorithmIdentifier algId, + byte[] publicKey) + { + this.keyData = new DERBitString(publicKey); + this.algId = algId; + } + + public SubjectPublicKeyInfo( + ASN1Sequence seq) + { + Enumeration e = seq.getObjects(); + + this.algId = AlgorithmIdentifier.getInstance(e.nextElement()); + this.keyData = (DERBitString)e.nextElement(); + } + + public AlgorithmIdentifier getAlgorithmId() + { + return algId; + } + + /** + * for when the public key is an encoded object - if the bitstring + * can't be decoded this routine throws an IOException. + * + * @exception IOException - if the bit string doesn't represent a DER + * encoded object. + */ + public DERObject getPublicKey() + throws IOException + { + ByteArrayInputStream bIn = new ByteArrayInputStream(keyData.getBytes()); + DERInputStream dIn = new DERInputStream(bIn); + + return dIn.readObject(); + } + + /** + * for when the public key is raw bits... + */ + public DERBitString getPublicKeyData() + { + return keyData; + } + + /** + *

+     * SubjectPublicKeyInfo ::= SEQUENCE {
+     *                          algorithm AlgorithmIdentifier,
+     *                          publicKey BIT STRING }
+     * 
+ */ + public DERObject getDERObject() + { + DERConstructedSequence seq = new DERConstructedSequence(); + + seq.addObject(algId); + seq.addObject(keyData); + + return seq; + } +} + + +/** + *
+ * TBSCertificate ::= SEQUENCE {
+ *      version          [ 0 ]  Version DEFAULT v1(0),
+ *      serialNumber            CertificateSerialNumber,
+ *      signature               AlgorithmIdentifier,
+ *      issuer                  Name,
+ *      validity                Validity,
+ *      subject                 Name,
+ *      subjectPublicKeyInfo    SubjectPublicKeyInfo,
+ *      issuerUniqueID    [ 1 ] IMPLICIT UniqueIdentifier OPTIONAL,
+ *      subjectUniqueID   [ 2 ] IMPLICIT UniqueIdentifier OPTIONAL,
+ *      extensions        [ 3 ] Extensions OPTIONAL
+ *      }
+ * 
+ *

+ * Note: issuerUniqueID and subjectUniqueID are both deprecated by the IETF. This class + * will parse them, but you really shouldn't be creating new ones. + */ +class TBSCertificateStructure + implements DEREncodable, X509ObjectIdentifiers, PKCSObjectIdentifiers +{ + ASN1Sequence seq; + + DERInteger version; + DERInteger serialNumber; + AlgorithmIdentifier signature; + X509Name issuer; + Time startDate, endDate; + X509Name subject; + SubjectPublicKeyInfo subjectPublicKeyInfo; + DERBitString issuerUniqueId; + DERBitString subjectUniqueId; + X509Extensions extensions; + + public static TBSCertificateStructure getInstance( + ASN1TaggedObject obj, + boolean explicit) + { + return getInstance(ASN1Sequence.getInstance(obj, explicit)); + } + + public static TBSCertificateStructure getInstance( + Object obj) + { + if (obj instanceof TBSCertificateStructure) + { + return (TBSCertificateStructure)obj; + } + else if (obj instanceof ASN1Sequence) + { + return new TBSCertificateStructure((ASN1Sequence)obj); + } + + throw new IllegalArgumentException("unknown object in factory"); + } + + public TBSCertificateStructure( + ASN1Sequence seq) + { + int seqStart = 0; + + this.seq = seq; + + // + // some certficates don't include a version number - we assume v1 + // + if (seq.getObjectAt(0) instanceof DERTaggedObject) + { + version = DERInteger.getInstance(seq.getObjectAt(0)); + } + else + { + seqStart = -1; // field 0 is missing! + version = new DERInteger(0); + } + + serialNumber = DERInteger.getInstance(seq.getObjectAt(seqStart + 1)); + + signature = AlgorithmIdentifier.getInstance(seq.getObjectAt(seqStart + 2)); + issuer = X509Name.getInstance(seq.getObjectAt(seqStart + 3)); + + // + // before and after dates + // + ASN1Sequence dates = (ASN1Sequence)seq.getObjectAt(seqStart + 4); + + startDate = Time.getInstance(dates.getObjectAt(0)); + endDate = Time.getInstance(dates.getObjectAt(1)); + + subject = X509Name.getInstance(seq.getObjectAt(seqStart + 5)); + + // + // public key info. + // + subjectPublicKeyInfo = SubjectPublicKeyInfo.getInstance(seq.getObjectAt(seqStart + 6)); + + for (int extras = seq.size() - (seqStart + 6) - 1; extras > 0; extras--) + { + DERTaggedObject extra = (DERTaggedObject)seq.getObjectAt(seqStart + 6 + extras); + + switch (extra.getTagNo()) + { + case 1: + issuerUniqueId = DERBitString.getInstance(extra); + break; + case 2: + subjectUniqueId = DERBitString.getInstance(extra); + break; + case 3: + extensions = X509Extensions.getInstance(extra); + } + } + } + + public int getVersion() + { + return version.getValue().intValue() + 1; + } + + public DERInteger getVersionNumber() + { + return version; + } + + public DERInteger getSerialNumber() + { + return serialNumber; + } + + public AlgorithmIdentifier getSignature() + { + return signature; + } + + public X509Name getIssuer() + { + return issuer; + } + + public Time getStartDate() + { + return startDate; + } + + public Time getEndDate() + { + return endDate; + } + + public X509Name getSubject() + { + return subject; + } + + public SubjectPublicKeyInfo getSubjectPublicKeyInfo() + { + return subjectPublicKeyInfo; + } + + public DERBitString getIssuerUniqueId() + { + return issuerUniqueId; + } + + public DERBitString getSubjectUniqueId() + { + return subjectUniqueId; + } + + public X509Extensions getExtensions() + { + return extensions; + } + + public DERObject getDERObject() + { + return seq; + } +} + + + +/** + * PKIX RFC-2459 + * + *

+ * TBSCertList  ::=  SEQUENCE  {
+ *      version                 Version OPTIONAL,
+ *                                   -- if present, shall be v2
+ *      signature               AlgorithmIdentifier,
+ *      issuer                  Name,
+ *      thisUpdate              Time,
+ *      nextUpdate              Time OPTIONAL,
+ *      revokedCertificates     SEQUENCE OF SEQUENCE  {
+ *           userCertificate         CertificateSerialNumber,
+ *           revocationDate          Time,
+ *           crlEntryExtensions      Extensions OPTIONAL
+ *                                         -- if present, shall be v2
+ *                                }  OPTIONAL,
+ *      crlExtensions           [0]  EXPLICIT Extensions OPTIONAL
+ *                                         -- if present, shall be v2
+ *                                }
+ * 
+ */ + +class TBSCertList + implements DEREncodable +{ + class CRLEntry + implements DEREncodable + { + DERConstructedSequence seq; + + DERInteger userCertificate; + Time revocationDate; + X509Extensions crlEntryExtensions; + + public CRLEntry( + DERConstructedSequence seq) + { + this.seq = seq; + + userCertificate = (DERInteger)seq.getObjectAt(0); + revocationDate = Time.getInstance(seq.getObjectAt(1)); + if (seq.getSize() == 3) + { + crlEntryExtensions = X509Extensions.getInstance(seq.getObjectAt(2)); + } + } + + public DERInteger getUserCertificate() + { + return userCertificate; + } + + public Time getRevocationDate() + { + return revocationDate; + } + + public X509Extensions getExtensions() + { + return crlEntryExtensions; + } + + public DERObject getDERObject() + { + return seq; + } + } + + ASN1Sequence seq; + + DERInteger version; + AlgorithmIdentifier signature; + X509Name issuer; + Time thisUpdate; + Time nextUpdate; + CRLEntry[] revokedCertificates; + X509Extensions crlExtensions; + + public static TBSCertList getInstance( + ASN1TaggedObject obj, + boolean explicit) + { + return getInstance(ASN1Sequence.getInstance(obj, explicit)); + } + + public static TBSCertList getInstance( + Object obj) + { + if (obj instanceof TBSCertList) + { + return (TBSCertList)obj; + } + else if (obj instanceof ASN1Sequence) + { + return new TBSCertList((ASN1Sequence)obj); + } + + throw new IllegalArgumentException("unknown object in factory"); + } + + public TBSCertList( + ASN1Sequence seq) + { + int seqPos = 0; + + this.seq = seq; + + if (seq.getObjectAt(seqPos) instanceof DERInteger) + { + version = (DERInteger)seq.getObjectAt(seqPos++); + } + else + { + version = new DERInteger(0); + } + + signature = AlgorithmIdentifier.getInstance(seq.getObjectAt(seqPos++)); + issuer = X509Name.getInstance(seq.getObjectAt(seqPos++)); + thisUpdate = Time.getInstance(seq.getObjectAt(seqPos++)); + + if (seqPos < seq.size() + && (seq.getObjectAt(seqPos) instanceof DERUTCTime + || seq.getObjectAt(seqPos) instanceof DERGeneralizedTime + || seq.getObjectAt(seqPos) instanceof Time)) + { + nextUpdate = Time.getInstance(seq.getObjectAt(seqPos++)); + } + + if (seqPos < seq.size() + && !(seq.getObjectAt(seqPos) instanceof DERTaggedObject)) + { + DERConstructedSequence certs = (DERConstructedSequence)seq.getObjectAt(seqPos++); + revokedCertificates = new CRLEntry[certs.getSize()]; + + for ( int i = 0; i < revokedCertificates.length; i++) + { + revokedCertificates[i] = new CRLEntry((DERConstructedSequence)certs.getObjectAt(i)); + } + } + + if (seqPos < seq.size() + && seq.getObjectAt(seqPos) instanceof DERTaggedObject) + { + crlExtensions = X509Extensions.getInstance(seq.getObjectAt(seqPos++)); + } + } + + public int getVersion() + { + return version.getValue().intValue() + 1; + } + + public DERInteger getVersionNumber() + { + return version; + } + + public AlgorithmIdentifier getSignature() + { + return signature; + } + + public X509Name getIssuer() + { + return issuer; + } + + public Time getThisUpdate() + { + return thisUpdate; + } + + public Time getNextUpdate() + { + return nextUpdate; + } + + public CRLEntry[] getRevokedCertificates() + { + return revokedCertificates; + } + + public X509Extensions getExtensions() + { + return crlExtensions; + } + + public DERObject getDERObject() + { + return seq; + } +} + + + +class Time + implements DEREncodable +{ + DERObject time; + + public static Time getInstance( + ASN1TaggedObject obj, + boolean explicit) + { + return getInstance(obj.getObject()); + } + + public Time( + DERObject time) + { + if (!(time instanceof DERUTCTime) + && !(time instanceof DERGeneralizedTime)) + { + throw new IllegalArgumentException("unknown object passed to Time"); + } + + this.time = time; + } + + /** + * creates a time object from a given date - if the date is between 1950 + * and 2049 a UTCTime object is generated, otherwise a GeneralizedTime + * is used. + */ + public Time( + Date date) + { + SimpleTimeZone tz = new SimpleTimeZone(0, "Z"); + SimpleDateFormat dateF = new SimpleDateFormat("yyyyMMddHHmmss"); + + dateF.setTimeZone(tz); + + String d = dateF.format(date) + "Z"; + int year = Integer.parseInt(d.substring(0, 4)); + + if (year < 1950 || year > 2049) + { + time = new DERGeneralizedTime(d); + } + else + { + time = new DERUTCTime(d.substring(2)); + } + } + + public static Time getInstance( + Object obj) + { + if (obj instanceof Time) + { + return (Time)obj; + } + else if (obj instanceof DERUTCTime) + { + return new Time((DERUTCTime)obj); + } + else if (obj instanceof DERGeneralizedTime) + { + return new Time((DERGeneralizedTime)obj); + } + + throw new IllegalArgumentException("unknown object in factory"); + } + + public String getTime() + { + if (time instanceof DERUTCTime) + { + return ((DERUTCTime)time).getAdjustedTime(); + } + else + { + return ((DERGeneralizedTime)time).getTime(); + } + } + + public Date getDate() + { + SimpleDateFormat dateF = new SimpleDateFormat("yyyyMMddHHmmssz"); + + return dateF.parse(this.getTime(), new ParsePosition(0)); + } + + /** + *
+     * Time ::= CHOICE {
+     *             utcTime        UTCTime,
+     *             generalTime    GeneralizedTime }
+     * 
+ */ + public DERObject getDERObject() + { + return time; + } +} + + +/** + * Generator for Version 1 TBSCertificateStructures. + *
+ * TBSCertificate ::= SEQUENCE {
+ *      version          [ 0 ]  Version DEFAULT v1(0),
+ *      serialNumber            CertificateSerialNumber,
+ *      signature               AlgorithmIdentifier,
+ *      issuer                  Name,
+ *      validity                Validity,
+ *      subject                 Name,
+ *      subjectPublicKeyInfo    SubjectPublicKeyInfo,
+ *      }
+ * 
+ * + */ +class V1TBSCertificateGenerator +{ + DERTaggedObject version = new DERTaggedObject(0, new DERInteger(0)); + + DERInteger serialNumber; + AlgorithmIdentifier signature; + X509Name issuer; + Time startDate, endDate; + X509Name subject; + SubjectPublicKeyInfo subjectPublicKeyInfo; + + public V1TBSCertificateGenerator() + { + } + + public void setSerialNumber( + DERInteger serialNumber) + { + this.serialNumber = serialNumber; + } + + public void setSignature( + AlgorithmIdentifier signature) + { + this.signature = signature; + } + + public void setIssuer( + X509Name issuer) + { + this.issuer = issuer; + } + + public void setStartDate( + Time startDate) + { + this.startDate = startDate; + } + + public void setStartDate( + DERUTCTime startDate) + { + this.startDate = new Time(startDate); + } + + public void setEndDate( + Time endDate) + { + this.endDate = endDate; + } + + public void setEndDate( + DERUTCTime endDate) + { + this.endDate = new Time(endDate); + } + + public void setSubject( + X509Name subject) + { + this.subject = subject; + } + + public void setSubjectPublicKeyInfo( + SubjectPublicKeyInfo pubKeyInfo) + { + this.subjectPublicKeyInfo = pubKeyInfo; + } + + public TBSCertificateStructure generateTBSCertificate() + { + if ((serialNumber == null) || (signature == null) + || (issuer == null) || (startDate == null) || (endDate == null) + || (subject == null) || (subjectPublicKeyInfo == null)) + { + throw new IllegalStateException("not all mandatory fields set in V1 TBScertificate generator"); + } + + DERConstructedSequence seq = new DERConstructedSequence(); + + seq.addObject(version); + seq.addObject(serialNumber); + seq.addObject(signature); + seq.addObject(issuer); + + // + // before and after dates + // + DERConstructedSequence validity = new DERConstructedSequence(); + + validity.addObject(startDate); + validity.addObject(endDate); + + seq.addObject(validity); + + seq.addObject(subject); + + seq.addObject(subjectPublicKeyInfo); + + return new TBSCertificateStructure(seq); + } +} + + + +/** + * Generator for Version 2 TBSCertList structures. + *
+ *  TBSCertList  ::=  SEQUENCE  {
+ *       version                 Version OPTIONAL,
+ *                                    -- if present, shall be v2
+ *       signature               AlgorithmIdentifier,
+ *       issuer                  Name,
+ *       thisUpdate              Time,
+ *       nextUpdate              Time OPTIONAL,
+ *       revokedCertificates     SEQUENCE OF SEQUENCE  {
+ *            userCertificate         CertificateSerialNumber,
+ *            revocationDate          Time,
+ *            crlEntryExtensions      Extensions OPTIONAL
+ *                                          -- if present, shall be v2
+ *                                 }  OPTIONAL,
+ *       crlExtensions           [0]  EXPLICIT Extensions OPTIONAL
+ *                                          -- if present, shall be v2
+ *                                 }
+ * 
+ * + * Note: This class may be subject to change + */ +class V2TBSCertListGenerator +{ + DERInteger version = new DERInteger(1); + + AlgorithmIdentifier signature; + X509Name issuer; + Time thisUpdate, nextUpdate=null; + X509Extensions extensions=null; + private Vector crlentries=null; + + public V2TBSCertListGenerator() + { + } + + + public void setSignature( + AlgorithmIdentifier signature) + { + this.signature = signature; + } + + public void setIssuer( + X509Name issuer) + { + this.issuer = issuer; + } + + public void setThisUpdate( + DERUTCTime thisUpdate) + { + this.thisUpdate = new Time(thisUpdate); + } + + public void setNextUpdate( + DERUTCTime nextUpdate) + { + this.nextUpdate = new Time(nextUpdate); + } + + public void setThisUpdate( + Time thisUpdate) + { + this.thisUpdate = thisUpdate; + } + + public void setNextUpdate( + Time nextUpdate) + { + this.nextUpdate = nextUpdate; + } + + public void addCRLEntry( + DERConstructedSequence crlEntry) + { + if (crlentries == null) + crlentries = new Vector(); + crlentries.addElement(crlEntry); + } + + public void addCRLEntry(DERInteger userCertificate, DERUTCTime revocationDate, int reason) + { + addCRLEntry(userCertificate, new Time(revocationDate), reason); + } + + public void addCRLEntry(DERInteger userCertificate, Time revocationDate, int reason) + { + DERConstructedSequence seq = new DERConstructedSequence(); + seq.addObject(userCertificate); + seq.addObject(revocationDate); + + if (reason != 0) + { + CRLReason rf = new CRLReason(reason); + ByteArrayOutputStream bOut = new ByteArrayOutputStream(); + DEROutputStream dOut = new DEROutputStream(bOut); + try + { + dOut.writeObject(rf); + } + catch (IOException e) + { + throw new IllegalArgumentException("error encoding value: " + e); + } + byte[] value = bOut.toByteArray(); + DERConstructedSequence eseq = new DERConstructedSequence(); + DERConstructedSequence eseq1 = new DERConstructedSequence(); + eseq1.addObject(X509Extensions.ReasonCode); + eseq1.addObject(new DEROctetString(value)); + eseq.addObject(eseq1); + X509Extensions ex = new X509Extensions(eseq); + seq.addObject(ex); + } + if (crlentries == null) + crlentries = new Vector(); + crlentries.addElement(seq); + } + + public void setExtensions( + X509Extensions extensions) + { + this.extensions = extensions; + } + + public TBSCertList generateTBSCertList() + { + if ((signature == null) || (issuer == null) || (thisUpdate == null)) + { + throw new IllegalStateException("Not all mandatory fields set in V2 TBSCertList generator."); + } + + DERConstructedSequence seq = new DERConstructedSequence(); + + seq.addObject(version); + seq.addObject(signature); + seq.addObject(issuer); + + seq.addObject(thisUpdate); + if (nextUpdate != null) + seq.addObject(nextUpdate); + + // Add CRLEntries if they exist + if (crlentries != null) { + DERConstructedSequence certseq = new DERConstructedSequence(); + Enumeration it = crlentries.elements(); + while( it.hasMoreElements() ) { + certseq.addObject((DERConstructedSequence)it.nextElement()); + } + seq.addObject(certseq); + } + + if (extensions != null) + { + seq.addObject(new DERTaggedObject(0, extensions)); + } + + return new TBSCertList(seq); + } +} + + +/** + * Generator for Version 3 TBSCertificateStructures. + *
+ * TBSCertificate ::= SEQUENCE {
+ *      version          [ 0 ]  Version DEFAULT v1(0),
+ *      serialNumber            CertificateSerialNumber,
+ *      signature               AlgorithmIdentifier,
+ *      issuer                  Name,
+ *      validity                Validity,
+ *      subject                 Name,
+ *      subjectPublicKeyInfo    SubjectPublicKeyInfo,
+ *      issuerUniqueID    [ 1 ] IMPLICIT UniqueIdentifier OPTIONAL,
+ *      subjectUniqueID   [ 2 ] IMPLICIT UniqueIdentifier OPTIONAL,
+ *      extensions        [ 3 ] Extensions OPTIONAL
+ *      }
+ * 
+ * + */ +class V3TBSCertificateGenerator +{ + DERTaggedObject version = new DERTaggedObject(0, new DERInteger(2)); + + DERInteger serialNumber; + AlgorithmIdentifier signature; + X509Name issuer; + Time startDate, endDate; + X509Name subject; + SubjectPublicKeyInfo subjectPublicKeyInfo; + X509Extensions extensions; + + public V3TBSCertificateGenerator() + { + } + + public void setSerialNumber( + DERInteger serialNumber) + { + this.serialNumber = serialNumber; + } + + public void setSignature( + AlgorithmIdentifier signature) + { + this.signature = signature; + } + + public void setIssuer( + X509Name issuer) + { + this.issuer = issuer; + } + + public void setStartDate( + DERUTCTime startDate) + { + this.startDate = new Time(startDate); + } + + public void setStartDate( + Time startDate) + { + this.startDate = startDate; + } + + public void setEndDate( + DERUTCTime endDate) + { + this.endDate = new Time(endDate); + } + + public void setEndDate( + Time endDate) + { + this.endDate = endDate; + } + + public void setSubject( + X509Name subject) + { + this.subject = subject; + } + + public void setSubjectPublicKeyInfo( + SubjectPublicKeyInfo pubKeyInfo) + { + this.subjectPublicKeyInfo = pubKeyInfo; + } + + public void setExtensions( + X509Extensions extensions) + { + this.extensions = extensions; + } + + public TBSCertificateStructure generateTBSCertificate() + { + if ((serialNumber == null) || (signature == null) + || (issuer == null) || (startDate == null) || (endDate == null) + || (subject == null) || (subjectPublicKeyInfo == null)) + { + throw new IllegalStateException("not all mandatory fields set in V3 TBScertificate generator"); + } + + DERConstructedSequence seq = new DERConstructedSequence(); + + seq.addObject(version); + seq.addObject(serialNumber); + seq.addObject(signature); + seq.addObject(issuer); + + // + // before and after dates + // + DERConstructedSequence validity = new DERConstructedSequence(); + + validity.addObject(startDate); + validity.addObject(endDate); + + seq.addObject(validity); + + seq.addObject(subject); + + seq.addObject(subjectPublicKeyInfo); + + if (extensions != null) + { + seq.addObject(new DERTaggedObject(3, extensions)); + } + + return new TBSCertificateStructure(seq); + } +} + + +/** + * an X509Certificate structure. + *
+ *  Certificate ::= SEQUENCE {
+ *      tbsCertificate          TBSCertificate,
+ *      signatureAlgorithm      AlgorithmIdentifier,
+ *      signature               BIT STRING
+ *  }
+ * 
+ */ +class X509CertificateStructure + implements DEREncodable, X509ObjectIdentifiers, PKCSObjectIdentifiers +{ + ASN1Sequence seq; + TBSCertificateStructure tbsCert; + AlgorithmIdentifier sigAlgId; + DERBitString sig; + + public static X509CertificateStructure getInstance( + ASN1TaggedObject obj, + boolean explicit) + { + return getInstance(ASN1Sequence.getInstance(obj, explicit)); + } + + public static X509CertificateStructure getInstance( + Object obj) + { + if (obj instanceof X509CertificateStructure) + { + return (X509CertificateStructure)obj; + } + else if (obj instanceof ASN1Sequence) + { + return new X509CertificateStructure((ASN1Sequence)obj); + } + + throw new IllegalArgumentException("unknown object in factory"); + } + + public X509CertificateStructure( + ASN1Sequence seq) + { + this.seq = seq; + + // + // correct x509 certficate + // + if (seq.size() == 3) + { + tbsCert = TBSCertificateStructure.getInstance(seq.getObjectAt(0)); + sigAlgId = AlgorithmIdentifier.getInstance(seq.getObjectAt(1)); + + sig = (DERBitString)seq.getObjectAt(2); + } + } + + public TBSCertificateStructure getTBSCertificate() + { + return tbsCert; + } + + public int getVersion() + { + return tbsCert.getVersion(); + } + + public DERInteger getSerialNumber() + { + return tbsCert.getSerialNumber(); + } + + public X509Name getIssuer() + { + return tbsCert.getIssuer(); + } + + public Time getStartDate() + { + return tbsCert.getStartDate(); + } + + public Time getEndDate() + { + return tbsCert.getEndDate(); + } + + public X509Name getSubject() + { + return tbsCert.getSubject(); + } + + public SubjectPublicKeyInfo getSubjectPublicKeyInfo() + { + return tbsCert.getSubjectPublicKeyInfo(); + } + + public AlgorithmIdentifier getSignatureAlgorithm() + { + return sigAlgId; + } + + public DERBitString getSignature() + { + return sig; + } + + public DERObject getDERObject() + { + return seq; + } +} + + +/** + * an object for the elements in the X.509 V3 extension block. + */ +class X509Extension +{ + boolean critical; + DEROctetString value; + + public X509Extension( + DERBoolean critical, + DEROctetString value) + { + this.critical = critical.isTrue(); + this.value = value; + } + + public X509Extension( + boolean critical, + DEROctetString value) + { + this.critical = critical; + this.value = value; + } + + public boolean isCritical() + { + return critical; + } + + public DEROctetString getValue() + { + return value; + } + + public int hashCode() + { + if (this.isCritical()) + { + return this.getValue().hashCode(); + } + + + return ~this.getValue().hashCode(); + } + + public boolean equals( + Object o) + { + if (o == null || !(o instanceof X509Extension)) + { + return false; + } + + X509Extension other = (X509Extension)o; + + return other.getValue().equals(this.getValue()) + && (other.isCritical() == this.isCritical()); + } +} + + + +class X509Extensions + implements DEREncodable +{ + /** + * Subject Key Identifier + */ + public static final DERObjectIdentifier SubjectKeyIdentifier = new DERObjectIdentifier("2.5.29.14"); + + /** + * Key Usage + */ + public static final DERObjectIdentifier KeyUsage = new DERObjectIdentifier("2.5.29.15"); + + /** + * Private Key Usage Period + */ + public static final DERObjectIdentifier PrivateKeyUsagePeriod = new DERObjectIdentifier("2.5.29.16"); + + /** + * Subject Alternative Name + */ + public static final DERObjectIdentifier SubjectAlternativeName = new DERObjectIdentifier("2.5.29.17"); + + /** + * Issuer Alternative Name + */ + public static final DERObjectIdentifier IssuerAlternativeName = new DERObjectIdentifier("2.5.29.18"); + + /** + * Basic Constraints + */ + public static final DERObjectIdentifier BasicConstraints = new DERObjectIdentifier("2.5.29.19"); + + /** + * CRL Number + */ + public static final DERObjectIdentifier CRLNumber = new DERObjectIdentifier("2.5.29.20"); + + /** + * Reason code + */ + public static final DERObjectIdentifier ReasonCode = new DERObjectIdentifier("2.5.29.21"); + + /** + * Hold Instruction Code + */ + public static final DERObjectIdentifier InstructionCode = new DERObjectIdentifier("2.5.29.23"); + + /** + * Invalidity Date + */ + public static final DERObjectIdentifier InvalidityDate = new DERObjectIdentifier("2.5.29.24"); + + /** + * Delta CRL indicator + */ + public static final DERObjectIdentifier DeltaCRLIndicator = new DERObjectIdentifier("2.5.29.27"); + + /** + * Issuing Distribution Point + */ + public static final DERObjectIdentifier IssuingDistributionPoint = new DERObjectIdentifier("2.5.29.28"); + + /** + * Certificate Issuer + */ + public static final DERObjectIdentifier CertificateIssuer = new DERObjectIdentifier("2.5.29.29"); + + /** + * Name Constraints + */ + public static final DERObjectIdentifier NameConstraints = new DERObjectIdentifier("2.5.29.30"); + + /** + * CRL Distribution Points + */ + public static final DERObjectIdentifier CRLDistributionPoints = new DERObjectIdentifier("2.5.29.31"); + + /** + * Certificate Policies + */ + public static final DERObjectIdentifier CertificatePolicies = new DERObjectIdentifier("2.5.29.32"); + + /** + * Policy Mappings + */ + public static final DERObjectIdentifier PolicyMappings = new DERObjectIdentifier("2.5.29.33"); + + /** + * Authority Key Identifier + */ + public static final DERObjectIdentifier AuthorityKeyIdentifier = new DERObjectIdentifier("2.5.29.35"); + + /** + * Policy Constraints + */ + public static final DERObjectIdentifier PolicyConstraints = new DERObjectIdentifier("2.5.29.36"); + + /** + * Extended Key Usage + */ + public static final DERObjectIdentifier ExtendedKeyUsage = new DERObjectIdentifier("2.5.29.37"); + + private Hashtable extensions = new Hashtable(); + private Vector ordering = new Vector(); + + public static X509Extensions getInstance( + ASN1TaggedObject obj, + boolean explicit) + { + return getInstance(ASN1Sequence.getInstance(obj, explicit)); + } + + public static X509Extensions getInstance( + Object obj) + { + if (obj == null || obj instanceof X509Extensions) + { + return (X509Extensions)obj; + } + + if (obj instanceof ASN1Sequence) + { + return new X509Extensions((ASN1Sequence)obj); + } + + if (obj instanceof ASN1TaggedObject) + { + return getInstance(((ASN1TaggedObject)obj).getObject()); + } + + throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName()); + } + + /** + * Constructor from DERConstructedSequence. + * + * the extensions are a list of constructed sequences, either with (OID, OctetString) or (OID, Boolean, OctetString) + */ + public X509Extensions( + ASN1Sequence seq) + { + Enumeration e = seq.getObjects(); + + while (e.hasMoreElements()) + { + ASN1Sequence s = (ASN1Sequence)e.nextElement(); + Enumeration e1 = s.getObjects(); + + if (s.size() == 3) + { + extensions.put(s.getObjectAt(0), new X509Extension((DERBoolean)s.getObjectAt(1), (DEROctetString)s.getObjectAt(2))); + } + else + { + extensions.put(s.getObjectAt(0), new X509Extension(false, (DEROctetString)s.getObjectAt(1))); + } + + ordering.addElement(s.getObjectAt(0)); + } + } + + /** + * constructor from a table of extensions. + *

+ * it's is assumed the table contains OID/String pairs. + */ + public X509Extensions( + Hashtable extensions) + { + this(null, extensions); + } + + /** + * constructor from a table of extensions with ordering + *

+ * it's is assumed the table contains OID/String pairs. + */ + public X509Extensions( + Vector ordering, + Hashtable extensions) + { + Enumeration e; + + if (ordering == null) + { + e = extensions.keys(); + } + else + { + e = ordering.elements(); + } + + while (e.hasMoreElements()) + { + this.ordering.addElement(e.nextElement()); + } + + e = this.ordering.elements(); + + while (e.hasMoreElements()) + { + DERObjectIdentifier oid = (DERObjectIdentifier)e.nextElement(); + X509Extension ext = (X509Extension)extensions.get(oid); + + this.extensions.put(oid, ext); + } + } + + /** + * return an Enumeration of the extension field's object ids. + */ + public Enumeration oids() + { + return ordering.elements(); + } + + /** + * return the extension represented by the object identifier + * passed in. + * + * @return the extension if it's present, null otherwise. + */ + public X509Extension getExtension( + DERObjectIdentifier oid) + { + return (X509Extension)extensions.get(oid); + } + + public DERObject getDERObject() + { + DEREncodableVector vec = new DEREncodableVector(); + Enumeration e = ordering.elements(); + + while (e.hasMoreElements()) + { + DERObjectIdentifier oid = (DERObjectIdentifier)e.nextElement(); + X509Extension ext = (X509Extension)extensions.get(oid); + DEREncodableVector v = new DEREncodableVector(); + + v.add(oid); + + if (ext.isCritical()) + { + v.add(new DERBoolean(true)); + } + + v.add(ext.getValue()); + + vec.add(new DERSequence(v)); + } + + return new DERSequence(vec); + } + + public int hashCode() + { + Enumeration e = extensions.keys(); + int hashCode = 0; + + while (e.hasMoreElements()) + { + Object o = e.nextElement(); + + hashCode ^= o.hashCode(); + hashCode ^= extensions.get(o).hashCode(); + } + + return hashCode; + } + + public boolean equals( + Object o) + { + if (o == null || !(o instanceof X509Extensions)) + { + return false; + } + + X509Extensions other = (X509Extensions)o; + + Enumeration e1 = extensions.keys(); + Enumeration e2 = other.extensions.keys(); + + while (e1.hasMoreElements() && e2.hasMoreElements()) + { + Object o1 = e1.nextElement(); + Object o2 = e2.nextElement(); + + if (!o1.equals(o2)) + { + return false; + } + } + + if (e1.hasMoreElements() || e2.hasMoreElements()) + { + return false; + } + + return true; + } +} + + + +class X509Name + implements DEREncodable +{ + /** + * country code - StringType(SIZE(2)) + */ + public static final DERObjectIdentifier C = new DERObjectIdentifier("2.5.4.6"); + + /** + * organization - StringType(SIZE(1..64)) + */ + public static final DERObjectIdentifier O = new DERObjectIdentifier("2.5.4.10"); + + /** + * organizational unit name - StringType(SIZE(1..64)) + */ + public static final DERObjectIdentifier OU = new DERObjectIdentifier("2.5.4.11"); + + /** + * Title + */ + public static final DERObjectIdentifier T = new DERObjectIdentifier("2.5.4.12"); + + /** + * common name - StringType(SIZE(1..64)) + */ + public static final DERObjectIdentifier CN = new DERObjectIdentifier("2.5.4.3"); + + /** + * device serial number name - StringType(SIZE(1..64)) + */ + public static final DERObjectIdentifier SN = new DERObjectIdentifier("2.5.4.5"); + + /** + * locality name - StringType(SIZE(1..64)) + */ + public static final DERObjectIdentifier L = new DERObjectIdentifier("2.5.4.7"); + + /** + * state, or province name - StringType(SIZE(1..64)) + */ + public static final DERObjectIdentifier ST = new DERObjectIdentifier("2.5.4.8"); + + + /** + * email address (RSA PKCS#9 extension) - IA5String + *

+ * note: if you're trying to be ultra orthodox, don't use this! It shouldn't be in here. + */ + public static final DERObjectIdentifier EmailAddress = new DERObjectIdentifier("1.2.840.113549.1.9.1"); + + /** + * email address in Verisign certificates + */ + public static final DERObjectIdentifier E = EmailAddress; + + /* + * others... + */ + public static final DERObjectIdentifier DC = new DERObjectIdentifier("0.9.2342.19200300.100.1.25"); + + /** + * LDAP User id. + */ + public static final DERObjectIdentifier UID = new DERObjectIdentifier("0.9.2342.19200300.100.1.1"); + + /** + * look up table translating OID values into their common symbols. + */ + public static Hashtable OIDLookUp = new Hashtable(); + + /** + * look up table translating common symbols into their OIDS. + */ + public static Hashtable SymbolLookUp = new Hashtable(); + + static + { + OIDLookUp.put(C, "C"); + OIDLookUp.put(O, "O"); + OIDLookUp.put(T, "T"); + OIDLookUp.put(OU, "OU"); + OIDLookUp.put(CN, "CN"); + OIDLookUp.put(L, "L"); + OIDLookUp.put(ST, "ST"); + OIDLookUp.put(SN, "SN"); + OIDLookUp.put(EmailAddress, "E"); + OIDLookUp.put(DC, "DC"); + OIDLookUp.put(UID, "UID"); + + SymbolLookUp.put("c", C); + SymbolLookUp.put("o", O); + SymbolLookUp.put("t", T); + SymbolLookUp.put("ou", OU); + SymbolLookUp.put("cn", CN); + SymbolLookUp.put("l", L); + SymbolLookUp.put("st", ST); + SymbolLookUp.put("sn", SN); + SymbolLookUp.put("emailaddress", E); + SymbolLookUp.put("dc", DC); + SymbolLookUp.put("e", E); + SymbolLookUp.put("uid", UID); + } + + private Vector ordering = new Vector(); + private Vector values = new Vector(); + private ASN1Sequence seq; + + public static X509Name getInstance( + ASN1TaggedObject obj, + boolean explicit) + { + return getInstance(ASN1Sequence.getInstance(obj, explicit)); + } + + public static X509Name getInstance( + Object obj) + { + if (obj == null || obj instanceof X509Name) + { + return (X509Name)obj; + } + else if (obj instanceof ASN1Sequence) + { + return new X509Name((ASN1Sequence)obj); + } + + throw new IllegalArgumentException("unknown object in factory"); + } + + /** + * Constructor from ASN1Sequence + * + * the principal will be a list of constructed sets, each containing an (OID, String) pair. + */ + public X509Name( + ASN1Sequence seq) + { + this.seq = seq; + + Enumeration e = seq.getObjects(); + + while (e.hasMoreElements()) + { + ASN1Set set = (ASN1Set)e.nextElement(); + ASN1Sequence s = (ASN1Sequence)set.getObjectAt(0); + + ordering.addElement(s.getObjectAt(0)); + values.addElement(((DERString)s.getObjectAt(1)).getString()); + } + } + + /** + * constructor from a table of attributes. + *

+ * it's is assumed the table contains OID/String pairs, and the contents + * of the table are copied into an internal table as part of the + * construction process. + *

+ * Note: if the name you are trying to generate should be + * following a specific ordering, you should use the constructor + * with the ordering specified below. + */ + public X509Name( + Hashtable attributes) + { + this(null, attributes); + } + + /** + * constructor from a table of attributes with ordering. + *

+ * it's is assumed the table contains OID/String pairs, and the contents + * of the table are copied into an internal table as part of the + * construction process. The ordering vector should contain the OIDs + * in the order they are meant to be encoded or printed in toString. + */ + public X509Name( + Vector ordering, + Hashtable attributes) + { + if (ordering != null) + { + for (int i = 0; i != ordering.size(); i++) + { + this.ordering.addElement(ordering.elementAt(i)); + } + } + else + { + Enumeration e = attributes.keys(); + + while (e.hasMoreElements()) + { + this.ordering.addElement(e.nextElement()); + } + } + + for (int i = 0; i != this.ordering.size(); i++) + { + DERObjectIdentifier oid = (DERObjectIdentifier)this.ordering.elementAt(i); + + if (OIDLookUp.get(oid) == null) + { + throw new IllegalArgumentException("Unknown object id - " + oid.getId() + " - passed to distinguished name"); + } + + if (attributes.get(oid) == null) + { + throw new IllegalArgumentException("No attribute for object id - " + oid.getId() + " - passed to distinguished name"); + } + + this.values.addElement(attributes.get(oid)); // copy the hash table + } + } + + /** + * takes two vectors one of the oids and the other of the values. + */ + public X509Name( + Vector ordering, + Vector values) + { + if (ordering.size() != values.size()) + { + throw new IllegalArgumentException("ordering vector must be same length as values."); + } + + for (int i = 0; i < ordering.size(); i++) + { + this.ordering.addElement(ordering.elementAt(i)); + this.values.addElement(values.elementAt(i)); + } + } + + /** + * takes an X509 dir name as a string of the format "C=AU, ST=Victoria", or + * some such, converting it into an ordered set of name attributes. + */ + public X509Name( + String dirName) + { + X509NameTokenizer nTok = new X509NameTokenizer(dirName); + + while (nTok.hasMoreTokens()) + { + String token = nTok.nextToken(); + int index = token.indexOf('='); + + if (index == -1) + { + throw new IllegalArgumentException("badly formated directory string"); + } + + String name = token.substring(0, index); + String value = token.substring(index + 1); + DERObjectIdentifier oid = null; + + if (name.toUpperCase().startsWith("OID.")) + { + oid = new DERObjectIdentifier(name.substring(4)); + } + else if (name.charAt(0) >= '0' && name.charAt(0) <= '9') + { + oid = new DERObjectIdentifier(name); + } + else + { + oid = (DERObjectIdentifier)SymbolLookUp.get(name.toLowerCase()); + if (oid == null) + { + throw new IllegalArgumentException("Unknown object id - " + name + " - passed to distinguished name"); + } + } + + this.ordering.addElement(oid); + this.values.addElement(value); + } + } + + /** + * return false if we have characters out of the range of a printable + * string, true otherwise. + */ + private boolean canBePrintable( + String str) + { + for (int i = str.length() - 1; i >= 0; i--) + { + if (str.charAt(i) > 0x007f) + { + return false; + } + } + + return true; + } + + public DERObject getDERObject() + { + if (seq == null) + { + DEREncodableVector vec = new DEREncodableVector(); + + for (int i = 0; i != ordering.size(); i++) + { + DEREncodableVector v = new DEREncodableVector(); + DERObjectIdentifier oid = (DERObjectIdentifier)ordering.elementAt(i); + + v.add(oid); + + String str = (String)values.elementAt(i); + + if (oid.equals(EmailAddress)) + { + v.add(new DERIA5String(str)); + } + else + { + if (canBePrintable(str)) + { + v.add(new DERPrintableString(str)); + } + else + { + v.add(new DERUTF8String(str)); + } + } + + vec.add(new DERSet(new DERSequence(v))); + } + + seq = new DERSequence(vec); + } + + return seq; + } + + /** + * test for equality - note: case is ignored. + */ + public boolean equals(Object _obj) + { + if (_obj == this) + { + return true; + } + + if (_obj == null || !(_obj instanceof X509Name)) + { + return false; + } + + X509Name _oxn = (X509Name)_obj; + int _orderingSize = ordering.size(); + + if (_orderingSize != _oxn.ordering.size()) + { + return false; + } + + boolean[] _indexes = new boolean[_orderingSize]; + + for(int i = 0; i < _orderingSize; i++) + { + boolean _found = false; + String _oid = ((DERObjectIdentifier)ordering.elementAt(i)).getId(); + String _val = (String)values.elementAt(i); + + for(int j = 0; j < _orderingSize; j++) + { + if(_indexes[j] == true) + { + continue; + } + + String _oOID = ((DERObjectIdentifier)_oxn.ordering.elementAt(j)).getId(); + String _oVal = (String)_oxn.values.elementAt(j); + + // was equalsIgnoreCase but MIDP doesn't like that. + if(_oid.equals(_oOID) && _val.toLowerCase().equals(_oVal.toLowerCase())) + { + _indexes[j] = true; + _found = true; + break; + } + + } + + if(!_found) + { + return false; + } + } + + return true; + } + + public int hashCode() + { + ASN1Sequence seq = (ASN1Sequence)this.getDERObject(); + Enumeration e = seq.getObjects(); + int hashCode = 0; + + while (e.hasMoreElements()) + { + hashCode ^= e.nextElement().hashCode(); + } + + return hashCode; + } + + public String toString() + { + StringBuffer buf = new StringBuffer(); + boolean first = true; + Enumeration e1 = ordering.elements(); + Enumeration e2 = values.elements(); + + while (e1.hasMoreElements()) + { + Object oid = e1.nextElement(); + String sym = (String)OIDLookUp.get(oid); + + if (first) + { + first = false; + } + else + { + buf.append(","); + } + + if (sym != null) + { + buf.append(sym); + } + else + { + buf.append(((DERObjectIdentifier)oid).getId()); + } + + buf.append("="); + + int index = buf.length(); + + buf.append((String)e2.nextElement()); + + int end = buf.length(); + + while (index != end) + { + if ((buf.charAt(index) == ',') + || (buf.charAt(index) == '"') + || (buf.charAt(index) == '\\') + || (buf.charAt(index) == '+') + || (buf.charAt(index) == '<') + || (buf.charAt(index) == '>') + || (buf.charAt(index) == ';')) + { + buf.insert(index, "\\"); + index++; + end++; + } + + index++; + } + } + + return buf.toString(); + } +} + +/** + * class for breaking up an X500 Name into it's component tokens, ala + * java.util.StringTokenizer. We need this class as some of the + * lightweight Java environment don't support classes like + * StringTokenizer. + */ +class X509NameTokenizer +{ + private String oid; + private int index; + private StringBuffer buf = new StringBuffer(); + + public X509NameTokenizer( + String oid) + { + this.oid = oid; + this.index = -1; + } + + public boolean hasMoreTokens() + { + return (index != oid.length()); + } + + public String nextToken() + { + if (index == oid.length()) + { + return null; + } + + int end = index + 1; + boolean quoted = false; + boolean escaped = false; + + buf.setLength(0); + + while (end != oid.length()) + { + char c = oid.charAt(end); + + if (c == '"') + { + if (!escaped) + { + quoted = !quoted; + } + else + { + buf.append(c); + } + escaped = false; + } + else + { + if (escaped || quoted) + { + buf.append(c); + escaped = false; + } + else if (c == '\\') + { + escaped = true; + } + else if (c == ',') + { + break; + } + else + { + buf.append(c); + } + } + end++; + } + + index = end; + return buf.toString().trim(); + } +} + + +interface X509ObjectIdentifiers +{ + // + // base id + // + static final String id = "2.5.4"; + + static final DERObjectIdentifier commonName = new DERObjectIdentifier(id + ".3"); + static final DERObjectIdentifier countryName = new DERObjectIdentifier(id + ".6"); + static final DERObjectIdentifier localityName = new DERObjectIdentifier(id + ".7"); + static final DERObjectIdentifier stateOrProvinceName = new DERObjectIdentifier(id + ".8"); + static final DERObjectIdentifier organization = new DERObjectIdentifier(id + ".10"); + static final DERObjectIdentifier organizationalUnitName = new DERObjectIdentifier(id + ".11"); + + // id-SHA1 OBJECT IDENTIFIER ::= + // {iso(1) identified-organization(3) oiw(14) secsig(3) algorithms(2) 26 } // + static final DERObjectIdentifier id_SHA1 = new DERObjectIdentifier("1.3.14.3.2.26"); + + // + // ripemd160 OBJECT IDENTIFIER ::= + // {iso(1) identified-organization(3) TeleTrust(36) algorithm(3) hashAlgorithm(2) RIPEMD-160(1)} + // + static final DERObjectIdentifier ripemd160 = new DERObjectIdentifier("1.3.36.3.2.1"); + + // + // ripemd160WithRSAEncryption OBJECT IDENTIFIER ::= + // {iso(1) identified-organization(3) TeleTrust(36) algorithm(3) signatureAlgorithm(3) rsaSignature(1) rsaSignatureWithripemd160(2) } + // + static final DERObjectIdentifier ripemd160WithRSAEncryption = new DERObjectIdentifier("1.3.36.3.3.1.2"); + + + static final DERObjectIdentifier id_ea_rsa = new DERObjectIdentifier("2.5.8.1.1"); +} + + + +/** + * base interface that a public/private key block cipher needs + * to conform to. + */ +interface AsymmetricBlockCipher +{ + /** + * initialise the cipher. + * + * @param forEncryption if true the cipher is initialised for + * encryption, if false for decryption. + * @param param the key and other data required by the cipher. + */ + public void init(boolean forEncryption, CipherParameters param); + + /** + * returns the largest size an input block can be. + * + * @return maximum size for an input block. + */ + public int getInputBlockSize(); + + /** + * returns the maximum size of the block produced by this cipher. + * + * @return maximum size of the output block produced by the cipher. + */ + public int getOutputBlockSize(); + + /** + * process the block of len bytes stored in in from offset inOff. + * + * @param in the input data + * @param inOff offset into the in array where the data starts + * @param len the length of the block to be processed. + * @return the resulting byte array of the encryption/decryption process. + * @exception InvalidCipherTextException data decrypts improperly. + * @exception DataLengthException the input data is too large for the cipher. + */ + public byte[] processBlock(byte[] in, int inOff, int len) + throws InvalidCipherTextException; +} + +/** + * a holding class for public/private parameter pairs. + */ +class AsymmetricCipherKeyPair +{ + private CipherParameters publicParam; + private CipherParameters privateParam; + + /** + * basic constructor. + * + * @param publicParam a public key parameters object. + * @param privateParam the corresponding private key parameters. + */ + public AsymmetricCipherKeyPair( + CipherParameters publicParam, + CipherParameters privateParam) + { + this.publicParam = publicParam; + this.privateParam = privateParam; + } + + /** + * return the public key parameters. + * + * @return the public key parameters. + */ + public CipherParameters getPublic() + { + return publicParam; + } + + /** + * return the private key parameters. + * + * @return the private key parameters. + */ + public CipherParameters getPrivate() + { + return privateParam; + } +} + +/** + * interface that a public/private key pair generator should conform to. + */ +interface AsymmetricCipherKeyPairGenerator +{ + /** + * intialise the key pair generator. + * + * @param the parameters the key pair is to be initialised with. + */ + public void init(KeyGenerationParameters param); + + /** + * return an AsymmetricCipherKeyPair containing the generated keys. + * + * @return an AsymmetricCipherKeyPair containing the generated keys. + */ + public AsymmetricCipherKeyPair generateKeyPair(); +} + + + +/** + * Block cipher engines are expected to conform to this interface. + */ +interface BlockCipher +{ + /** + * Initialise the cipher. + * + * @param forEncryption if true the cipher is initialised for + * encryption, if false for decryption. + * @param param the key and other data required by the cipher. + * @exception IllegalArgumentException if the params argument is + * inappropriate. + */ + public void init(boolean forEncryption, CipherParameters params) + throws IllegalArgumentException; + + /** + * Return the name of the algorithm the cipher implements. + * + * @return the name of the algorithm the cipher implements. + */ + public String getAlgorithmName(); + + /** + * Return the block size for this cipher (in bytes). + * + * @return the block size for this cipher in bytes. + */ + public int getBlockSize(); + + /** + * Process one block of input from the array in and write it to + * the out array. + * + * @param in the array containing the input data. + * @param inOff offset into the in array the data starts at. + * @param out the array the output data will be copied into. + * @param outOff the offset into the out array the output will start at. + * @exception DataLengthException if there isn't enough data in in, or + * space in out. + * @exception IllegalStateException if the cipher isn't initialised. + * @return the number of bytes processed and produced. + */ + public int processBlock(byte[] in, int inOff, byte[] out, int outOff) + throws DataLengthException, IllegalStateException; + + /** + * Reset the cipher. After resetting the cipher is in the same state + * as it was after the last init (if there was one). + */ + public void reset(); +} + + +/** + * The base class for symmetric, or secret, cipher key generators. + */ +class CipherKeyGenerator +{ + protected Random random; + protected int strength; + + /** + * initialise the key generator. + * + * @param param the parameters to be used for key generation + */ + public void init( + KeyGenerationParameters param) + { + this.random = param.getRandom(); + this.strength = (param.getStrength() + 7) / 8; + } + + /** + * generate a secret key. + * + * @return a byte array containing the key value. + */ + public byte[] generateKey() + { + byte[] key = new byte[strength]; + + random.nextBytes(key); + + return key; + } +} + +/** + * all parameter classes implement this. + */ +interface CipherParameters +{ +} + +/** + * the foundation class for the hard exceptions thrown by the crypto packages. + */ +class CryptoException + extends Exception +{ + /** + * base constructor. + */ + public CryptoException() + { + } + + /** + * create a CryptoException with the given message. + * + * @param message the message to be carried with the exception. + */ + public CryptoException( + String message) + { + super(message); + } +} + +/** + * this exception is thrown if a buffer that is meant to have output + * copied into it turns out to be too short, or if we've been given + * insufficient input. In general this exception will get thrown rather + * than an ArrayOutOfBounds exception. + */ +class DataLengthException + extends RuntimeCryptoException +{ + /** + * base constructor. + */ + public DataLengthException() + { + } + + /** + * create a DataLengthException with the given message. + * + * @param message the message to be carried with the exception. + */ + public DataLengthException( + String message) + { + super(message); + } +} + +/** + * interface that a message digest conforms to. + */ +interface Digest +{ + /** + * return the algorithm name + * + * @return the algorithm name + */ + public String getAlgorithmName(); + + /** + * return the size, in bytes, of the digest produced by this message digest. + * + * @return the size, in bytes, of the digest produced by this message digest. + */ + public int getDigestSize(); + + /** + * update the message digest with a single byte. + * + * @param in the input byte to be entered. + */ + public void update(byte in); + + /** + * update the message digest with a block of bytes. + * + * @param in the byte array containing the data. + * @param inOff the offset into the byte array where the data starts. + * @param len the length of the data. + */ + public void update(byte[] in, int inOff, int len); + + /** + * close the digest, producing the final digest value. The doFinal + * call leaves the digest reset. + * + * @param out the array the digest is to be copied into. + * @param outOff the offset into the out array the digest is to start at. + */ + public int doFinal(byte[] out, int outOff); + + /** + * reset the digest back to it's initial state. + */ + public void reset(); +} + + +/** + * base implementation of MD4 family style digest as outlined in + * "Handbook of Applied Cryptography", pages 344 - 347. + */ +abstract class GeneralDigest + implements Digest +{ + private byte[] xBuf; + private int xBufOff; + + private long byteCount; + + /** + * Standard constructor + */ + protected GeneralDigest() + { + xBuf = new byte[4]; + xBufOff = 0; + } + + /** + * Copy constructor. We are using copy constructors in place + * of the Object.clone() interface as this interface is not + * supported by J2ME. + */ + protected GeneralDigest(GeneralDigest t) + { + xBuf = new byte[t.xBuf.length]; + System.arraycopy(t.xBuf, 0, xBuf, 0, t.xBuf.length); + + xBufOff = t.xBufOff; + byteCount = t.byteCount; + } + + public void update( + byte in) + { + xBuf[xBufOff++] = in; + + if (xBufOff == xBuf.length) + { + processWord(xBuf, 0); + xBufOff = 0; + } + + byteCount++; + } + + public void update( + byte[] in, + int inOff, + int len) + { + // + // fill the current word + // + while ((xBufOff != 0) && (len > 0)) + { + update(in[inOff]); + + inOff++; + len--; + } + + // + // process whole words. + // + while (len > xBuf.length) + { + processWord(in, inOff); + + inOff += xBuf.length; + len -= xBuf.length; + byteCount += xBuf.length; + } + + // + // load in the remainder. + // + while (len > 0) + { + update(in[inOff]); + + inOff++; + len--; + } + } + + public void finish() + { + long bitLength = (byteCount << 3); + + // + // add the pad bytes. + // + update((byte)128); + + while (xBufOff != 0) + { + update((byte)0); + } + + processLength(bitLength); + + processBlock(); + } + + public void reset() + { + byteCount = 0; + + xBufOff = 0; + for ( int i = 0; i < xBuf.length; i++ ) { + xBuf[i] = 0; + } + } + + protected abstract void processWord(byte[] in, int inOff); + + protected abstract void processLength(long bitLength); + + protected abstract void processBlock(); +} + +/** + * implementation of MD2 + * as outlined in RFC1319 by B.Kaliski from RSA Laboratories April 1992 + */ +class MD2Digest + implements Digest +{ + private static final int DIGEST_LENGTH = 16; + + /* X buffer */ + private byte[] X = new byte[48]; + private int xOff; + /* M buffer */ + private byte[] M = new byte[16]; + private int mOff; + /* check sum */ + private byte[] C = new byte[16]; + private int COff; + + public MD2Digest() + { + reset(); + } + public MD2Digest(MD2Digest t) + { + System.arraycopy(t.X, 0, X, 0, t.X.length); + xOff = t.xOff; + System.arraycopy(t.M, 0, M, 0, t.M.length); + mOff = t.mOff; + System.arraycopy(t.C, 0, C, 0, t.C.length); + COff = t.COff; + } + /** + * return the algorithm name + * + * @return the algorithm name + */ + public String getAlgorithmName() + { + return "MD2"; + } + /** + * return the size, in bytes, of the digest produced by this message digest. + * + * @return the size, in bytes, of the digest produced by this message digest. + */ + public int getDigestSize() + { + return DIGEST_LENGTH; + } + /** + * close the digest, producing the final digest value. The doFinal + * call leaves the digest reset. + * + * @param out the array the digest is to be copied into. + * @param outOff the offset into the out array the digest is to start at. + */ + public int doFinal(byte[] out, int outOff) + { + // add padding + byte paddingByte = (byte)(M.length-mOff); + for (int i=mOff;i 0)) + { + update(in[inOff]); + inOff++; + len--; + } + + // + // process whole words. + // + while (len > 16) + { + System.arraycopy(in,inOff,M,0,16); + processCheckSum(M); + processBlock(M); + len -= 16; + inOff += 16; + } + + // + // load in the remainder. + // + while (len > 0) + { + update(in[inOff]); + inOff++; + len--; + } + } + protected void processCheckSum(byte[] m) + { + int L = C[15]; + for (int i=0;i<16;i++) + { + C[i] ^= S[(m[i] ^ L) & 0xff]; + L = C[i]; + } + } + protected void processBlock(byte[] m) + { + for (int i=0;i<16;i++) + { + X[i+16] = m[i]; + X[i+32] = (byte)(m[i] ^ X[i]); + } + // encrypt block + int t = 0; + + for (int j=0;j<18;j++) + { + for (int k=0;k<48;k++) + { + t = X[k] ^= S[t]; + t = t & 0xff; + } + t = (t + j)%256; + } + } + // 256-byte random permutation constructed from the digits of PI + private static final byte[] S = { + (byte)41,(byte)46,(byte)67,(byte)201,(byte)162,(byte)216,(byte)124, + (byte)1,(byte)61,(byte)54,(byte)84,(byte)161,(byte)236,(byte)240, + (byte)6,(byte)19,(byte)98,(byte)167,(byte)5,(byte)243,(byte)192, + (byte)199,(byte)115,(byte)140,(byte)152,(byte)147,(byte)43,(byte)217, + (byte)188,(byte)76,(byte)130,(byte)202,(byte)30,(byte)155,(byte)87, + (byte)60,(byte)253,(byte)212,(byte)224,(byte)22,(byte)103,(byte)66, + (byte)111,(byte)24,(byte)138,(byte)23,(byte)229,(byte)18,(byte)190, + (byte)78,(byte)196,(byte)214,(byte)218,(byte)158,(byte)222,(byte)73, + (byte)160,(byte)251,(byte)245,(byte)142,(byte)187,(byte)47,(byte)238, + (byte)122,(byte)169,(byte)104,(byte)121,(byte)145,(byte)21,(byte)178, + (byte)7,(byte)63,(byte)148,(byte)194,(byte)16,(byte)137,(byte)11, + (byte)34,(byte)95,(byte)33,(byte)128,(byte)127,(byte)93,(byte)154, + (byte)90,(byte)144,(byte)50,(byte)39,(byte)53,(byte)62,(byte)204, + (byte)231,(byte)191,(byte)247,(byte)151,(byte)3,(byte)255,(byte)25, + (byte)48,(byte)179,(byte)72,(byte)165,(byte)181,(byte)209,(byte)215, + (byte)94,(byte)146,(byte)42,(byte)172,(byte)86,(byte)170,(byte)198, + (byte)79,(byte)184,(byte)56,(byte)210,(byte)150,(byte)164,(byte)125, + (byte)182,(byte)118,(byte)252,(byte)107,(byte)226,(byte)156,(byte)116, + (byte)4,(byte)241,(byte)69,(byte)157,(byte)112,(byte)89,(byte)100, + (byte)113,(byte)135,(byte)32,(byte)134,(byte)91,(byte)207,(byte)101, + (byte)230,(byte)45,(byte)168,(byte)2,(byte)27,(byte)96,(byte)37, + (byte)173,(byte)174,(byte)176,(byte)185,(byte)246,(byte)28,(byte)70, + (byte)97,(byte)105,(byte)52,(byte)64,(byte)126,(byte)15,(byte)85, + (byte)71,(byte)163,(byte)35,(byte)221,(byte)81,(byte)175,(byte)58, + (byte)195,(byte)92,(byte)249,(byte)206,(byte)186,(byte)197,(byte)234, + (byte)38,(byte)44,(byte)83,(byte)13,(byte)110,(byte)133,(byte)40, + (byte)132, 9,(byte)211,(byte)223,(byte)205,(byte)244,(byte)65, + (byte)129,(byte)77,(byte)82,(byte)106,(byte)220,(byte)55,(byte)200, + (byte)108,(byte)193,(byte)171,(byte)250,(byte)36,(byte)225,(byte)123, + (byte)8,(byte)12,(byte)189,(byte)177,(byte)74,(byte)120,(byte)136, + (byte)149,(byte)139,(byte)227,(byte)99,(byte)232,(byte)109,(byte)233, + (byte)203,(byte)213,(byte)254,(byte)59,(byte)0,(byte)29,(byte)57, + (byte)242,(byte)239,(byte)183,(byte)14,(byte)102,(byte)88,(byte)208, + (byte)228,(byte)166,(byte)119,(byte)114,(byte)248,(byte)235,(byte)117, + (byte)75,(byte)10,(byte)49,(byte)68,(byte)80,(byte)180,(byte)143, + (byte)237,(byte)31,(byte)26,(byte)219,(byte)153,(byte)141,(byte)51, + (byte)159,(byte)17,(byte)131,(byte)20 + }; +} + + +/** + * implementation of MD5 as outlined in "Handbook of Applied Cryptography", pages 346 - 347. + */ +class MD5Digest + extends GeneralDigest +{ + private static final int DIGEST_LENGTH = 16; + + private int H1, H2, H3, H4; // IV's + + private int[] X = new int[16]; + private int xOff; + + /** + * Standard constructor + */ + public MD5Digest() + { + reset(); + } + + /** + * Copy constructor. This will copy the state of the provided + * message digest. + */ + public MD5Digest(MD5Digest t) + { + super(t); + + H1 = t.H1; + H2 = t.H2; + H3 = t.H3; + H4 = t.H4; + + System.arraycopy(t.X, 0, X, 0, t.X.length); + xOff = t.xOff; + } + + public String getAlgorithmName() + { + return "MD5"; + } + + public int getDigestSize() + { + return DIGEST_LENGTH; + } + + protected void processWord( + byte[] in, + int inOff) + { + X[xOff++] = (in[inOff] & 0xff) | ((in[inOff + 1] & 0xff) << 8) + | ((in[inOff + 2] & 0xff) << 16) | ((in[inOff + 3] & 0xff) << 24); + + if (xOff == 16) + { + processBlock(); + } + } + + protected void processLength( + long bitLength) + { + if (xOff > 14) + { + processBlock(); + } + + X[14] = (int)(bitLength & 0xffffffff); + X[15] = (int)(bitLength >>> 32); + } + + private void unpackWord( + int word, + byte[] out, + int outOff) + { + out[outOff] = (byte)word; + out[outOff + 1] = (byte)(word >>> 8); + out[outOff + 2] = (byte)(word >>> 16); + out[outOff + 3] = (byte)(word >>> 24); + } + + public int doFinal( + byte[] out, + int outOff) + { + finish(); + + unpackWord(H1, out, outOff); + unpackWord(H2, out, outOff + 4); + unpackWord(H3, out, outOff + 8); + unpackWord(H4, out, outOff + 12); + + reset(); + + return DIGEST_LENGTH; + } + + /** + * reset the chaining variables to the IV values. + */ + public void reset() + { + super.reset(); + + H1 = 0x67452301; + H2 = 0xefcdab89; + H3 = 0x98badcfe; + H4 = 0x10325476; + + xOff = 0; + + for (int i = 0; i != X.length; i++) + { + X[i] = 0; + } + } + + // + // round 1 left rotates + // + private static final int S11 = 7; + private static final int S12 = 12; + private static final int S13 = 17; + private static final int S14 = 22; + + // + // round 2 left rotates + // + private static final int S21 = 5; + private static final int S22 = 9; + private static final int S23 = 14; + private static final int S24 = 20; + + // + // round 3 left rotates + // + private static final int S31 = 4; + private static final int S32 = 11; + private static final int S33 = 16; + private static final int S34 = 23; + + // + // round 4 left rotates + // + private static final int S41 = 6; + private static final int S42 = 10; + private static final int S43 = 15; + private static final int S44 = 21; + + /* + * rotate int x left n bits. + */ + private int rotateLeft( + int x, + int n) + { + return (x << n) | (x >>> (32 - n)); + } + + /* + * F, G, H and I are the basic MD5 functions. + */ + private int F( + int u, + int v, + int w) + { + return (u & v) | (~u & w); + } + + private int G( + int u, + int v, + int w) + { + return (u & w) | (v & ~w); + } + + private int H( + int u, + int v, + int w) + { + return u ^ v ^ w; + } + + private int K( + int u, + int v, + int w) + { + return v ^ (u | ~w); + } + + protected void processBlock() + { + int a = H1; + int b = H2; + int c = H3; + int d = H4; + + // + // Round 1 - F cycle, 16 times. + // + a = rotateLeft((a + F(b, c, d) + X[ 0] + 0xd76aa478), S11) + b; + d = rotateLeft((d + F(a, b, c) + X[ 1] + 0xe8c7b756), S12) + a; + c = rotateLeft((c + F(d, a, b) + X[ 2] + 0x242070db), S13) + d; + b = rotateLeft((b + F(c, d, a) + X[ 3] + 0xc1bdceee), S14) + c; + a = rotateLeft((a + F(b, c, d) + X[ 4] + 0xf57c0faf), S11) + b; + d = rotateLeft((d + F(a, b, c) + X[ 5] + 0x4787c62a), S12) + a; + c = rotateLeft((c + F(d, a, b) + X[ 6] + 0xa8304613), S13) + d; + b = rotateLeft((b + F(c, d, a) + X[ 7] + 0xfd469501), S14) + c; + a = rotateLeft((a + F(b, c, d) + X[ 8] + 0x698098d8), S11) + b; + d = rotateLeft((d + F(a, b, c) + X[ 9] + 0x8b44f7af), S12) + a; + c = rotateLeft((c + F(d, a, b) + X[10] + 0xffff5bb1), S13) + d; + b = rotateLeft((b + F(c, d, a) + X[11] + 0x895cd7be), S14) + c; + a = rotateLeft((a + F(b, c, d) + X[12] + 0x6b901122), S11) + b; + d = rotateLeft((d + F(a, b, c) + X[13] + 0xfd987193), S12) + a; + c = rotateLeft((c + F(d, a, b) + X[14] + 0xa679438e), S13) + d; + b = rotateLeft((b + F(c, d, a) + X[15] + 0x49b40821), S14) + c; + + // + // Round 2 - G cycle, 16 times. + // + a = rotateLeft((a + G(b, c, d) + X[ 1] + 0xf61e2562), S21) + b; + d = rotateLeft((d + G(a, b, c) + X[ 6] + 0xc040b340), S22) + a; + c = rotateLeft((c + G(d, a, b) + X[11] + 0x265e5a51), S23) + d; + b = rotateLeft((b + G(c, d, a) + X[ 0] + 0xe9b6c7aa), S24) + c; + a = rotateLeft((a + G(b, c, d) + X[ 5] + 0xd62f105d), S21) + b; + d = rotateLeft((d + G(a, b, c) + X[10] + 0x02441453), S22) + a; + c = rotateLeft((c + G(d, a, b) + X[15] + 0xd8a1e681), S23) + d; + b = rotateLeft((b + G(c, d, a) + X[ 4] + 0xe7d3fbc8), S24) + c; + a = rotateLeft((a + G(b, c, d) + X[ 9] + 0x21e1cde6), S21) + b; + d = rotateLeft((d + G(a, b, c) + X[14] + 0xc33707d6), S22) + a; + c = rotateLeft((c + G(d, a, b) + X[ 3] + 0xf4d50d87), S23) + d; + b = rotateLeft((b + G(c, d, a) + X[ 8] + 0x455a14ed), S24) + c; + a = rotateLeft((a + G(b, c, d) + X[13] + 0xa9e3e905), S21) + b; + d = rotateLeft((d + G(a, b, c) + X[ 2] + 0xfcefa3f8), S22) + a; + c = rotateLeft((c + G(d, a, b) + X[ 7] + 0x676f02d9), S23) + d; + b = rotateLeft((b + G(c, d, a) + X[12] + 0x8d2a4c8a), S24) + c; + + // + // Round 3 - H cycle, 16 times. + // + a = rotateLeft((a + H(b, c, d) + X[ 5] + 0xfffa3942), S31) + b; + d = rotateLeft((d + H(a, b, c) + X[ 8] + 0x8771f681), S32) + a; + c = rotateLeft((c + H(d, a, b) + X[11] + 0x6d9d6122), S33) + d; + b = rotateLeft((b + H(c, d, a) + X[14] + 0xfde5380c), S34) + c; + a = rotateLeft((a + H(b, c, d) + X[ 1] + 0xa4beea44), S31) + b; + d = rotateLeft((d + H(a, b, c) + X[ 4] + 0x4bdecfa9), S32) + a; + c = rotateLeft((c + H(d, a, b) + X[ 7] + 0xf6bb4b60), S33) + d; + b = rotateLeft((b + H(c, d, a) + X[10] + 0xbebfbc70), S34) + c; + a = rotateLeft((a + H(b, c, d) + X[13] + 0x289b7ec6), S31) + b; + d = rotateLeft((d + H(a, b, c) + X[ 0] + 0xeaa127fa), S32) + a; + c = rotateLeft((c + H(d, a, b) + X[ 3] + 0xd4ef3085), S33) + d; + b = rotateLeft((b + H(c, d, a) + X[ 6] + 0x04881d05), S34) + c; + a = rotateLeft((a + H(b, c, d) + X[ 9] + 0xd9d4d039), S31) + b; + d = rotateLeft((d + H(a, b, c) + X[12] + 0xe6db99e5), S32) + a; + c = rotateLeft((c + H(d, a, b) + X[15] + 0x1fa27cf8), S33) + d; + b = rotateLeft((b + H(c, d, a) + X[ 2] + 0xc4ac5665), S34) + c; + + // + // Round 4 - K cycle, 16 times. + // + a = rotateLeft((a + K(b, c, d) + X[ 0] + 0xf4292244), S41) + b; + d = rotateLeft((d + K(a, b, c) + X[ 7] + 0x432aff97), S42) + a; + c = rotateLeft((c + K(d, a, b) + X[14] + 0xab9423a7), S43) + d; + b = rotateLeft((b + K(c, d, a) + X[ 5] + 0xfc93a039), S44) + c; + a = rotateLeft((a + K(b, c, d) + X[12] + 0x655b59c3), S41) + b; + d = rotateLeft((d + K(a, b, c) + X[ 3] + 0x8f0ccc92), S42) + a; + c = rotateLeft((c + K(d, a, b) + X[10] + 0xffeff47d), S43) + d; + b = rotateLeft((b + K(c, d, a) + X[ 1] + 0x85845dd1), S44) + c; + a = rotateLeft((a + K(b, c, d) + X[ 8] + 0x6fa87e4f), S41) + b; + d = rotateLeft((d + K(a, b, c) + X[15] + 0xfe2ce6e0), S42) + a; + c = rotateLeft((c + K(d, a, b) + X[ 6] + 0xa3014314), S43) + d; + b = rotateLeft((b + K(c, d, a) + X[13] + 0x4e0811a1), S44) + c; + a = rotateLeft((a + K(b, c, d) + X[ 4] + 0xf7537e82), S41) + b; + d = rotateLeft((d + K(a, b, c) + X[11] + 0xbd3af235), S42) + a; + c = rotateLeft((c + K(d, a, b) + X[ 2] + 0x2ad7d2bb), S43) + d; + b = rotateLeft((b + K(c, d, a) + X[ 9] + 0xeb86d391), S44) + c; + + H1 += a; + H2 += b; + H3 += c; + H4 += d; + + // + // reset the offset and clean out the word buffer. + // + xOff = 0; + for (int i = 0; i != X.length; i++) + { + X[i] = 0; + } + } +} + + +/** + * implementation of SHA-1 as outlined in "Handbook of Applied Cryptography", pages 346 - 349. + * + * It is interesting to ponder why the, apart from the extra IV, the other difference here from MD5 + * is the "endienness" of the word processing! + */ +class SHA1Digest + extends GeneralDigest +{ + private static final int DIGEST_LENGTH = 20; + + private int H1, H2, H3, H4, H5; + + private int[] X = new int[80]; + private int xOff; + + /** + * Standard constructor + */ + public SHA1Digest() + { + reset(); + } + + /** + * Copy constructor. This will copy the state of the provided + * message digest. + */ + public SHA1Digest(SHA1Digest t) + { + super(t); + + H1 = t.H1; + H2 = t.H2; + H3 = t.H3; + H4 = t.H4; + H5 = t.H5; + + System.arraycopy(t.X, 0, X, 0, t.X.length); + xOff = t.xOff; + } + + public String getAlgorithmName() + { + return "SHA-1"; + } + + public int getDigestSize() + { + return DIGEST_LENGTH; + } + + protected void processWord( + byte[] in, + int inOff) + { + X[xOff++] = ((in[inOff] & 0xff) << 24) | ((in[inOff + 1] & 0xff) << 16) + | ((in[inOff + 2] & 0xff) << 8) | ((in[inOff + 3] & 0xff)); + + if (xOff == 16) + { + processBlock(); + } + } + + private void unpackWord( + int word, + byte[] out, + int outOff) + { + out[outOff] = (byte)(word >>> 24); + out[outOff + 1] = (byte)(word >>> 16); + out[outOff + 2] = (byte)(word >>> 8); + out[outOff + 3] = (byte)word; + } + + protected void processLength( + long bitLength) + { + if (xOff > 14) + { + processBlock(); + } + + X[14] = (int)(bitLength >>> 32); + X[15] = (int)(bitLength & 0xffffffff); + } + + public int doFinal( + byte[] out, + int outOff) + { + finish(); + + unpackWord(H1, out, outOff); + unpackWord(H2, out, outOff + 4); + unpackWord(H3, out, outOff + 8); + unpackWord(H4, out, outOff + 12); + unpackWord(H5, out, outOff + 16); + + reset(); + + return DIGEST_LENGTH; + } + + /** + * reset the chaining variables + */ + public void reset() + { + super.reset(); + + H1 = 0x67452301; + H2 = 0xefcdab89; + H3 = 0x98badcfe; + H4 = 0x10325476; + H5 = 0xc3d2e1f0; + + xOff = 0; + for (int i = 0; i != X.length; i++) + { + X[i] = 0; + } + } + + // + // Additive constants + // + private static final int Y1 = 0x5a827999; + private static final int Y2 = 0x6ed9eba1; + private static final int Y3 = 0x8f1bbcdc; + private static final int Y4 = 0xca62c1d6; + + private int f( + int u, + int v, + int w) + { + return ((u & v) | ((~u) & w)); + } + + private int h( + int u, + int v, + int w) + { + return (u ^ v ^ w); + } + + private int g( + int u, + int v, + int w) + { + return ((u & v) | (u & w) | (v & w)); + } + + private int rotateLeft( + int x, + int n) + { + return (x << n) | (x >>> (32 - n)); + } + + protected void processBlock() + { + // + // expand 16 word block into 80 word block. + // + for (int i = 16; i <= 79; i++) + { + X[i] = rotateLeft((X[i - 3] ^ X[i - 8] ^ X[i - 14] ^ X[i - 16]), 1); + } + + // + // set up working variables. + // + int A = H1; + int B = H2; + int C = H3; + int D = H4; + int E = H5; + + // + // round 1 + // + for (int j = 0; j <= 19; j++) + { + int t = rotateLeft(A, 5) + f(B, C, D) + E + X[j] + Y1; + + E = D; + D = C; + C = rotateLeft(B, 30); + B = A; + A = t; + } + + // + // round 2 + // + for (int j = 20; j <= 39; j++) + { + int t = rotateLeft(A, 5) + h(B, C, D) + E + X[j] + Y2; + + E = D; + D = C; + C = rotateLeft(B, 30); + B = A; + A = t; + } + + // + // round 3 + // + for (int j = 40; j <= 59; j++) + { + int t = rotateLeft(A, 5) + g(B, C, D) + E + X[j] + Y3; + + E = D; + D = C; + C = rotateLeft(B, 30); + B = A; + A = t; + } + + // + // round 4 + // + for (int j = 60; j <= 79; j++) + { + int t = rotateLeft(A, 5) + h(B, C, D) + E + X[j] + Y4; + + E = D; + D = C; + C = rotateLeft(B, 30); + B = A; + A = t; + } + + H1 += A; + H2 += B; + H3 += C; + H4 += D; + H5 += E; + + // + // reset the offset and clean out the word buffer. + // + xOff = 0; + for (int i = 0; i != X.length; i++) + { + X[i] = 0; + } + } +} + + + +/** + * this does your basic PKCS 1 v1.5 padding - whether or not you should be using this + * depends on your application - see PKCS1 Version 2 for details. + */ +class PKCS1Encoding + implements AsymmetricBlockCipher +{ + private static int HEADER_LENGTH = 10; + + private Random random; + private AsymmetricBlockCipher engine; + private boolean forEncryption; + private boolean forPrivateKey; + + public PKCS1Encoding( + AsymmetricBlockCipher cipher) + { + this.engine = cipher; + } + + public AsymmetricBlockCipher getUnderlyingCipher() + { + return engine; + } + + public void init( + boolean forEncryption, + CipherParameters param) + { + AsymmetricKeyParameter kParam; + + if (param instanceof ParametersWithRandom) + { + ParametersWithRandom rParam = (ParametersWithRandom)param; + + this.random = rParam.getRandom(); + kParam = (AsymmetricKeyParameter)rParam.getParameters(); + } + else + { + this.random = new Random(); + kParam = (AsymmetricKeyParameter)param; + } + + engine.init(forEncryption, kParam); + + this.forPrivateKey = kParam.isPrivate(); + this.forEncryption = forEncryption; + } + + public int getInputBlockSize() + { + int baseBlockSize = engine.getInputBlockSize(); + + if (forEncryption) + { + return baseBlockSize - HEADER_LENGTH; + } + else + { + return baseBlockSize; + } + } + + public int getOutputBlockSize() + { + int baseBlockSize = engine.getOutputBlockSize(); + + if (forEncryption) + { + return baseBlockSize; + } + else + { + return baseBlockSize - HEADER_LENGTH; + } + } + + public byte[] processBlock( + byte[] in, + int inOff, + int inLen) + throws InvalidCipherTextException + { + if (forEncryption) + { + return encodeBlock(in, inOff, inLen); + } + else + { + return decodeBlock(in, inOff, inLen); + } + } + + private byte[] encodeBlock( + byte[] in, + int inOff, + int inLen) + throws InvalidCipherTextException + { + byte[] block = new byte[engine.getInputBlockSize()]; + + if (forPrivateKey) + { + block[0] = 0x01; // type code 1 + + for (int i = 1; i != block.length - inLen - 1; i++) + { + block[i] = (byte)0xFF; + } + } + else + { + random.nextBytes(block); // random fill + + block[0] = 0x02; // type code 2 + + // + // a zero byte marks the end of the padding, so all + // the pad bytes must be non-zero. + // + for (int i = 1; i != block.length - inLen - 1; i++) + { + while (block[i] == 0) + { + block[i] = (byte)random.nextInt(); + } + } + } + + block[block.length - inLen - 1] = 0x00; // mark the end of the padding + System.arraycopy(in, inOff, block, block.length - inLen, inLen); + + return engine.processBlock(block, 0, block.length); + } + + /** + * @exception InvalidCipherTextException if the decrypted block is not in PKCS1 format. + */ + private byte[] decodeBlock( + byte[] in, + int inOff, + int inLen) + throws InvalidCipherTextException + { + byte[] block = engine.processBlock(in, inOff, inLen); + + if (block.length < getOutputBlockSize()) + { + throw new InvalidCipherTextException("block truncated"); + } + + if (block[0] != 1 && block[0] != 2) + { + throw new InvalidCipherTextException("unknown block type"); + } + + // + // find and extract the message block. + // + int start; + + for (start = 1; start != block.length; start++) + { + if (block[start] == 0) + { + break; + } + } + + start++; // data should start at the next byte + + if (start >= block.length || start < HEADER_LENGTH) + { + throw new InvalidCipherTextException("no data in block"); + } + + byte[] result = new byte[block.length - start]; + + System.arraycopy(block, start, result, 0, result.length); + + return result; + } +} + + +class RC4Engine implements StreamCipher +{ + private final static int STATE_LENGTH = 256; + + /* + * variables to hold the state of the RC4 engine + * during encryption and decryption + */ + + private byte[] engineState = null; + private int x = 0; + private int y = 0; + private byte[] workingKey = null; + + /** + * initialise a RC4 cipher. + * + * @param forEncryption whether or not we are for encryption. + * @param params the parameters required to set up the cipher. + * @exception IllegalArgumentException if the params argument is + * inappropriate. + */ + public void init( + boolean forEncryption, + CipherParameters params + ) + { + if (params instanceof KeyParameter) + { + /* + * RC4 encryption and decryption is completely + * symmetrical, so the 'forEncryption' is + * irrelevant. + */ + workingKey = ((KeyParameter)params).getKey(); + setKey(workingKey); + + return; + } + + throw new IllegalArgumentException("invalid parameter passed to RC4 init - " + params.getClass().getName()); + } + + public String getAlgorithmName() + { + return "RC4"; + } + + public byte returnByte(byte in) + { + x = (x + 1) & 0xff; + y = (engineState[x] + y) & 0xff; + + // swap + byte tmp = engineState[x]; + engineState[x] = engineState[y]; + engineState[y] = tmp; + + // xor + return (byte)(in ^ engineState[(engineState[x] + engineState[y]) & 0xff]); + } + + public void processBytes( + byte[] in, + int inOff, + int len, + byte[] out, + int outOff + ) + { + if ((inOff + len) > in.length) + { + throw new DataLengthException("input buffer too short"); + } + + if ((outOff + len) > out.length) + { + throw new DataLengthException("output buffer too short"); + } + + for (int i = 0; i < len ; i++) + { + x = (x + 1) & 0xff; + y = (engineState[x] + y) & 0xff; + + // swap + byte tmp = engineState[x]; + engineState[x] = engineState[y]; + engineState[y] = tmp; + + // xor + out[i+outOff] = (byte)(in[i + inOff] + ^ engineState[(engineState[x] + engineState[y]) & 0xff]); + } + } + + public void reset() + { + setKey(workingKey); + } + + // Private implementation + + private void setKey(byte[] keyBytes) + { + workingKey = keyBytes; + + // System.out.println("the key length is ; "+ workingKey.length); + + x = 0; + y = 0; + + if (engineState == null) + { + engineState = new byte[STATE_LENGTH]; + } + + // reset the state of the engine + for (int i=0; i < STATE_LENGTH; i++) + { + engineState[i] = (byte)i; + } + + int i1 = 0; + int i2 = 0; + + for (int i=0; i < STATE_LENGTH; i++) + { + i2 = ((keyBytes[i1] & 0xff) + engineState[i] + i2) & 0xff; + // do the byte-swap inline + byte tmp = engineState[i]; + engineState[i] = engineState[i2]; + engineState[i2] = tmp; + i1 = (i1+1) % keyBytes.length; + } + } +} + + + +/** + * this does your basic RSA algorithm. + */ +class RSAEngine + implements AsymmetricBlockCipher +{ + private RSAKeyParameters key; + private boolean forEncryption; + + /** + * initialise the RSA engine. + * + * @param forEncryption true if we are encrypting, false otherwise. + * @param param the necessary RSA key parameters. + */ + public void init( + boolean forEncryption, + CipherParameters param) + { + this.key = (RSAKeyParameters)param; + this.forEncryption = forEncryption; + } + + /** + * Return the maximum size for an input block to this engine. + * For RSA this is always one byte less than the key size on + * encryption, and the same length as the key size on decryption. + * + * @return maximum size for an input block. + */ + public int getInputBlockSize() + { + int bitSize = key.getModulus().bitLength(); + + if (forEncryption) + { + return (bitSize + 7) / 8 - 1; + } + else + { + return (bitSize + 7) / 8; + } + } + + /** + * Return the maximum size for an output block to this engine. + * For RSA this is always one byte less than the key size on + * decryption, and the same length as the key size on encryption. + * + * @return maximum size for an output block. + */ + public int getOutputBlockSize() + { + int bitSize = key.getModulus().bitLength(); + + if (forEncryption) + { + return (bitSize + 7) / 8; + } + else + { + return (bitSize + 7) / 8 - 1; + } + } + + /** + * Process a single block using the basic RSA algorithm. + * + * @param in the input array. + * @param inOff the offset into the input buffer where the data starts. + * @param inLen the length of the data to be processed. + * @return the result of the RSA process. + * @exception DataLengthException the input block is too large. + */ + public byte[] processBlock( + byte[] in, + int inOff, + int inLen) + { + if (inLen > (getInputBlockSize() + 1)) + { + throw new DataLengthException("input too large for RSA cipher.\n"); + } + else if (inLen == (getInputBlockSize() + 1) && (in[inOff] & 0x80) != 0) + { + throw new DataLengthException("input too large for RSA cipher.\n"); + } + + byte[] block; + + if (inOff != 0 || inLen != in.length) + { + block = new byte[inLen]; + + System.arraycopy(in, inOff, block, 0, inLen); + } + else + { + block = in; + } + + BigInteger input = new BigInteger(1, block); + byte[] output; + + if (key instanceof RSAPrivateCrtKeyParameters) + { + // + // we have the extra factors, use the Chinese Remainder Theorem - the author + // wishes to express his thanks to Dirk Bonekaemper at rtsffm.com for + // advice regarding the expression of this. + // + RSAPrivateCrtKeyParameters crtKey = (RSAPrivateCrtKeyParameters)key; + + BigInteger d = crtKey.getExponent(); + BigInteger p = crtKey.getP(); + BigInteger q = crtKey.getQ(); + BigInteger dP = crtKey.getDP(); + BigInteger dQ = crtKey.getDQ(); + BigInteger qInv = crtKey.getQInv(); + + BigInteger mP, mQ, h, m; + + // mP = ((input mod p) ^ dP)) mod p + mP = (input.remainder(p)).modPow(dP, p); + + // mQ = ((input mod q) ^ dQ)) mod q + mQ = (input.remainder(q)).modPow(dQ, q); + + // h = qInv * (mP - mQ) mod p + h = mP.subtract(mQ); + h = h.multiply(qInv); + h = h.mod(p); // mod (in Java) returns the positive residual + + // m = h * q + mQ + m = h.multiply(q); + m = m.add(mQ); + + output = m.toByteArray(); + } + else + { + output = input.modPow( + key.getExponent(), key.getModulus()).toByteArray(); + } + + if (forEncryption) + { + if (output[0] == 0 && output.length > getOutputBlockSize()) // have ended up with an extra zero byte, copy down. + { + byte[] tmp = new byte[output.length - 1]; + + System.arraycopy(output, 1, tmp, 0, tmp.length); + + return tmp; + } + + if (output.length < getOutputBlockSize()) // have ended up with less bytes than normal, lengthen + { + byte[] tmp = new byte[getOutputBlockSize()]; + + System.arraycopy(output, 0, tmp, tmp.length - output.length, output.length); + + return tmp; + } + } + else + { + if (output[0] == 0) // have ended up with an extra zero byte, copy down. + { + byte[] tmp = new byte[output.length - 1]; + + System.arraycopy(output, 1, tmp, 0, tmp.length); + + return tmp; + } + } + return output; + } +} + +/** + * this exception is thrown whenever we find something we don't expect in a + * message. + */ +class InvalidCipherTextException + extends CryptoException +{ + /** + * base constructor. + */ + public InvalidCipherTextException() + { + } + + /** + * create a InvalidCipherTextException with the given message. + * + * @param message the message to be carried with the exception. + */ + public InvalidCipherTextException( + String message) + { + super(message); + } +} + + + +class DigestInputStream + extends FilterInputStream +{ + protected Digest digest; + + public DigestInputStream( + InputStream stream, + Digest digest) + { + super(stream); + this.digest = digest; + } + + public int read() + throws IOException + { + int b = in.read(); + + if (b >= 0) + { + digest.update((byte)b); + } + return b; + } + + public int read( + byte[] b, + int off, + int len) + throws IOException + { + int n = in.read(b, off, len); + if (n > 0) + { + digest.update(b, off, n); + } + return n; + } + + public Digest getDigest() + { + return digest; + } +} + + + +class DigestOutputStream + extends FilterOutputStream +{ + protected Digest digest; + + public DigestOutputStream( + OutputStream stream, + Digest digest) + { + super(stream); + this.digest = digest; + } + + public void write(int b) + throws IOException + { + digest.update((byte)b); + out.write(b); + } + + public void write( + byte[] b, + int off, + int len) + throws IOException + { + digest.update(b, off, len); + out.write(b, off, len); + } + + public Digest getDigest() + { + return digest; + } +} + + +/** + * The base class for parameters to key generators. + */ +class KeyGenerationParameters +{ + private Random random; + private int strength; + + /** + * initialise the generator with a source of randomness + * and a strength (in bits). + * + * @param random the random byte source. + * @param strength the size, in bits, of the keys we want to produce. + */ + public KeyGenerationParameters( + Random random, + int strength) + { + this.random = random; + this.strength = strength; + } + + /** + * return the random source associated with this + * generator. + * + * @return the generators random source. + */ + public Random getRandom() + { + return random; + } + + /** + * return the bit strength for keys produced by this generator, + * + * @return the strength of the keys this generator produces (in bits). + */ + public int getStrength() + { + return strength; + } +} + + +class AsymmetricKeyParameter + implements CipherParameters +{ + boolean privateKey; + + public AsymmetricKeyParameter( + boolean privateKey) + { + this.privateKey = privateKey; + } + + public boolean isPrivate() + { + return privateKey; + } +} + + +class KeyParameter + implements CipherParameters +{ + private byte[] key; + + public KeyParameter( + byte[] key) + { + this(key, 0, key.length); + } + + public KeyParameter( + byte[] key, + int keyOff, + int keyLen) + { + this.key = new byte[keyLen]; + + System.arraycopy(key, keyOff, this.key, 0, keyLen); + } + + public byte[] getKey() + { + return key; + } +} + + + +class ParametersWithRandom + implements CipherParameters +{ + private Random random; + private CipherParameters parameters; + + public ParametersWithRandom( + CipherParameters parameters, + Random random) + { + this.random = random; + this.parameters = parameters; + } + + public ParametersWithRandom( + CipherParameters parameters) + { + this.random = null; + this.parameters = parameters; + } + + public Random getRandom() + { + if (random == null) + { + random = new Random(); + } + return random; + } + + public CipherParameters getParameters() + { + return parameters; + } +} + + + +class RSAKeyParameters + extends AsymmetricKeyParameter +{ + private BigInteger modulus; + private BigInteger exponent; + + public RSAKeyParameters( + boolean isPrivate, + BigInteger modulus, + BigInteger exponent) + { + super(isPrivate); + + this.modulus = modulus; + this.exponent = exponent; + } + + public BigInteger getModulus() + { + return modulus; + } + + public BigInteger getExponent() + { + return exponent; + } +} + + +class RSAPrivateCrtKeyParameters + extends RSAKeyParameters +{ + private BigInteger e; + private BigInteger p; + private BigInteger q; + private BigInteger dP; + private BigInteger dQ; + private BigInteger qInv; + + /** + * + */ + public RSAPrivateCrtKeyParameters( + BigInteger modulus, + BigInteger publicExponent, + BigInteger privateExponent, + BigInteger p, + BigInteger q, + BigInteger dP, + BigInteger dQ, + BigInteger qInv) + { + super(true, modulus, privateExponent); + + this.e = publicExponent; + this.p = p; + this.q = q; + this.dP = dP; + this.dQ = dQ; + this.qInv = qInv; + } + + public BigInteger getPublicExponent() + { + return e; + } + + public BigInteger getP() + { + return p; + } + + public BigInteger getQ() + { + return q; + } + + public BigInteger getDP() + { + return dP; + } + + public BigInteger getDQ() + { + return dQ; + } + + public BigInteger getQInv() + { + return qInv; + } +} + +/** + * the foundation class for the exceptions thrown by the crypto packages. + */ +class RuntimeCryptoException + extends RuntimeException +{ + /** + * base constructor. + */ + public RuntimeCryptoException() + { + } + + /** + * create a RuntimeCryptoException with the given message. + * + * @param message the message to be carried with the exception. + */ + public RuntimeCryptoException( + String message) + { + super(message); + } +} + +/** + * a wrapper for block ciphers with a single byte block size, so that they + * can be treated like stream ciphers. + */ +class StreamBlockCipher + implements StreamCipher +{ + private BlockCipher cipher; + + private byte[] oneByte = new byte[1]; + + /** + * basic constructor. + * + * @param cipher the block cipher to be wrapped. + * @exception IllegalArgumentException if the cipher has a block size other than + * one. + */ + public StreamBlockCipher( + BlockCipher cipher) + { + if (cipher.getBlockSize() != 1) + { + throw new IllegalArgumentException("block cipher block size != 1."); + } + + this.cipher = cipher; + } + + /** + * initialise the underlying cipher. + * + * @param forEncryption true if we are setting up for encryption, false otherwise. + * @param param the necessary parameters for the underlying cipher to be initialised. + */ + public void init( + boolean forEncryption, + CipherParameters params) + { + cipher.init(forEncryption, params); + } + + /** + * return the name of the algorithm we are wrapping. + * + * @return the name of the algorithm we are wrapping. + */ + public String getAlgorithmName() + { + return cipher.getAlgorithmName(); + } + + /** + * encrypt/decrypt a single byte returning the result. + * + * @param in the byte to be processed. + * @return the result of processing the input byte. + */ + public byte returnByte( + byte in) + { + oneByte[0] = in; + + cipher.processBlock(oneByte, 0, oneByte, 0); + + return oneByte[0]; + } + + /** + * process a block of bytes from in putting the result into out. + * + * @param in the input byte array. + * @param inOff the offset into the in array where the data to be processed starts. + * @param len the number of bytes to be processed. + * @param out the output buffer the processed bytes go into. + * @param outOff the offset into the output byte array the processed data stars at. + * @exception DataLengthException if the output buffer is too small. + */ + public void processBytes( + byte[] in, + int inOff, + int len, + byte[] out, + int outOff) + throws DataLengthException + { + if (outOff + len > out.length) + { + throw new DataLengthException("output buffer too small in processBytes()"); + } + + for (int i = 0; i != len; i++) + { + cipher.processBlock(in, inOff + i, out, outOff + i); + } + } + + /** + * reset the underlying cipher. This leaves it in the same state + * it was at after the last init (if there was one). + */ + public void reset() + { + cipher.reset(); + } +} + +/** + * the interface stream ciphers conform to. + */ +interface StreamCipher +{ + /** + * Initialise the cipher. + * + * @param forEncryption if true the cipher is initialised for + * encryption, if false for decryption. + * @param param the key and other data required by the cipher. + * @exception IllegalArgumentException if the params argument is + * inappropriate. + */ + public void init(boolean forEncryption, CipherParameters params) + throws IllegalArgumentException; + + /** + * Return the name of the algorithm the cipher implements. + * + * @return the name of the algorithm the cipher implements. + */ + public String getAlgorithmName(); + + /** + * encrypt/decrypt a single byte returning the result. + * + * @param in the byte to be processed. + * @return the result of processing the input byte. + */ + public byte returnByte(byte in); + + /** + * process a block of bytes from in putting the result into out. + * + * @param in the input byte array. + * @param inOff the offset into the in array where the data to be processed starts. + * @param len the number of bytes to be processed. + * @param out the output buffer the processed bytes go into. + * @param outOff the offset into the output byte array the processed data stars at. + * @exception DataLengthException if the output buffer is too small. + */ + public void processBytes(byte[] in, int inOff, int len, byte[] out, int outOff) + throws DataLengthException; + + /** + * reset the cipher. This leaves it in the same state + * it was at after the last init (if there was one). + */ + public void reset(); +} + +class Base64 +{ + private static final byte[] encodingTable = + { + (byte)'A', (byte)'B', (byte)'C', (byte)'D', (byte)'E', (byte)'F', (byte)'G', + (byte)'H', (byte)'I', (byte)'J', (byte)'K', (byte)'L', (byte)'M', (byte)'N', + (byte)'O', (byte)'P', (byte)'Q', (byte)'R', (byte)'S', (byte)'T', (byte)'U', + (byte)'V', (byte)'W', (byte)'X', (byte)'Y', (byte)'Z', + (byte)'a', (byte)'b', (byte)'c', (byte)'d', (byte)'e', (byte)'f', (byte)'g', + (byte)'h', (byte)'i', (byte)'j', (byte)'k', (byte)'l', (byte)'m', (byte)'n', + (byte)'o', (byte)'p', (byte)'q', (byte)'r', (byte)'s', (byte)'t', (byte)'u', + (byte)'v', + (byte)'w', (byte)'x', (byte)'y', (byte)'z', + (byte)'0', (byte)'1', (byte)'2', (byte)'3', (byte)'4', (byte)'5', (byte)'6', + (byte)'7', (byte)'8', (byte)'9', + (byte)'+', (byte)'/' + }; + + /** + * encode the input data producong a base 64 encoded byte array. + * + * @return a byte array containing the base 64 encoded data. + */ + public static byte[] encode( + byte[] data) + { + byte[] bytes; + + int modulus = data.length % 3; + if (modulus == 0) + { + bytes = new byte[4 * data.length / 3]; + } + else + { + bytes = new byte[4 * ((data.length / 3) + 1)]; + } + + int dataLength = (data.length - modulus); + int a1, a2, a3; + for (int i = 0, j = 0; i < dataLength; i += 3, j += 4) + { + a1 = data[i] & 0xff; + a2 = data[i + 1] & 0xff; + a3 = data[i + 2] & 0xff; + + bytes[j] = encodingTable[(a1 >>> 2) & 0x3f]; + bytes[j + 1] = encodingTable[((a1 << 4) | (a2 >>> 4)) & 0x3f]; + bytes[j + 2] = encodingTable[((a2 << 2) | (a3 >>> 6)) & 0x3f]; + bytes[j + 3] = encodingTable[a3 & 0x3f]; + } + + /* + * process the tail end. + */ + int b1, b2, b3; + int d1, d2; + + switch (modulus) + { + case 0: /* nothing left to do */ + break; + case 1: + d1 = data[data.length - 1] & 0xff; + b1 = (d1 >>> 2) & 0x3f; + b2 = (d1 << 4) & 0x3f; + + bytes[bytes.length - 4] = encodingTable[b1]; + bytes[bytes.length - 3] = encodingTable[b2]; + bytes[bytes.length - 2] = (byte)'='; + bytes[bytes.length - 1] = (byte)'='; + break; + case 2: + d1 = data[data.length - 2] & 0xff; + d2 = data[data.length - 1] & 0xff; + + b1 = (d1 >>> 2) & 0x3f; + b2 = ((d1 << 4) | (d2 >>> 4)) & 0x3f; + b3 = (d2 << 2) & 0x3f; + + bytes[bytes.length - 4] = encodingTable[b1]; + bytes[bytes.length - 3] = encodingTable[b2]; + bytes[bytes.length - 2] = encodingTable[b3]; + bytes[bytes.length - 1] = (byte)'='; + break; + } + + return bytes; + } + + /* + * set up the decoding table. + */ + private static final byte[] decodingTable; + + static + { + decodingTable = new byte[128]; + + for (int i = 'A'; i <= 'Z'; i++) + { + decodingTable[i] = (byte)(i - 'A'); + } + + for (int i = 'a'; i <= 'z'; i++) + { + decodingTable[i] = (byte)(i - 'a' + 26); + } + + for (int i = '0'; i <= '9'; i++) + { + decodingTable[i] = (byte)(i - '0' + 52); + } + + decodingTable['+'] = 62; + decodingTable['/'] = 63; + } + + /** + * decode the base 64 encoded input data. + * + * @return a byte array representing the decoded data. + */ + public static byte[] decode( + byte[] data) + { + byte[] bytes; + byte b1, b2, b3, b4; + + if (data[data.length - 2] == '=') + { + bytes = new byte[(((data.length / 4) - 1) * 3) + 1]; + } + else if (data[data.length - 1] == '=') + { + bytes = new byte[(((data.length / 4) - 1) * 3) + 2]; + } + else + { + bytes = new byte[((data.length / 4) * 3)]; + } + + for (int i = 0, j = 0; i < data.length - 4; i += 4, j += 3) + { + b1 = decodingTable[data[i]]; + b2 = decodingTable[data[i + 1]]; + b3 = decodingTable[data[i + 2]]; + b4 = decodingTable[data[i + 3]]; + + bytes[j] = (byte)((b1 << 2) | (b2 >> 4)); + bytes[j + 1] = (byte)((b2 << 4) | (b3 >> 2)); + bytes[j + 2] = (byte)((b3 << 6) | b4); + } + + if (data[data.length - 2] == '=') + { + b1 = decodingTable[data[data.length - 4]]; + b2 = decodingTable[data[data.length - 3]]; + + bytes[bytes.length - 1] = (byte)((b1 << 2) | (b2 >> 4)); + } + else if (data[data.length - 1] == '=') + { + b1 = decodingTable[data[data.length - 4]]; + b2 = decodingTable[data[data.length - 3]]; + b3 = decodingTable[data[data.length - 2]]; + + bytes[bytes.length - 2] = (byte)((b1 << 2) | (b2 >> 4)); + bytes[bytes.length - 1] = (byte)((b2 << 4) | (b3 >> 2)); + } + else + { + b1 = decodingTable[data[data.length - 4]]; + b2 = decodingTable[data[data.length - 3]]; + b3 = decodingTable[data[data.length - 2]]; + b4 = decodingTable[data[data.length - 1]]; + + bytes[bytes.length - 3] = (byte)((b1 << 2) | (b2 >> 4)); + bytes[bytes.length - 2] = (byte)((b2 << 4) | (b3 >> 2)); + bytes[bytes.length - 1] = (byte)((b3 << 6) | b4); + } + + return bytes; + } + + /** + * decode the base 64 encoded String data. + * + * @return a byte array representing the decoded data. + */ + public static byte[] decode( + String data) + { + byte[] bytes; + byte b1, b2, b3, b4; + + if (data.charAt(data.length() - 2) == '=') + { + bytes = new byte[(((data.length() / 4) - 1) * 3) + 1]; + } + else if (data.charAt(data.length() - 1) == '=') + { + bytes = new byte[(((data.length() / 4) - 1) * 3) + 2]; + } + else + { + bytes = new byte[((data.length() / 4) * 3)]; + } + + for (int i = 0, j = 0; i < data.length() - 4; i += 4, j += 3) + { + b1 = decodingTable[data.charAt(i)]; + b2 = decodingTable[data.charAt(i + 1)]; + b3 = decodingTable[data.charAt(i + 2)]; + b4 = decodingTable[data.charAt(i + 3)]; + + bytes[j] = (byte)((b1 << 2) | (b2 >> 4)); + bytes[j + 1] = (byte)((b2 << 4) | (b3 >> 2)); + bytes[j + 2] = (byte)((b3 << 6) | b4); + } + + if (data.charAt(data.length() - 2) == '=') + { + b1 = decodingTable[data.charAt(data.length() - 4)]; + b2 = decodingTable[data.charAt(data.length() - 3)]; + + bytes[bytes.length - 1] = (byte)((b1 << 2) | (b2 >> 4)); + } + else if (data.charAt(data.length() - 1) == '=') + { + b1 = decodingTable[data.charAt(data.length() - 4)]; + b2 = decodingTable[data.charAt(data.length() - 3)]; + b3 = decodingTable[data.charAt(data.length() - 2)]; + + bytes[bytes.length - 2] = (byte)((b1 << 2) | (b2 >> 4)); + bytes[bytes.length - 1] = (byte)((b2 << 4) | (b3 >> 2)); + } + else + { + b1 = decodingTable[data.charAt(data.length() - 4)]; + b2 = decodingTable[data.charAt(data.length() - 3)]; + b3 = decodingTable[data.charAt(data.length() - 2)]; + b4 = decodingTable[data.charAt(data.length() - 1)]; + + bytes[bytes.length - 3] = (byte)((b1 << 2) | (b2 >> 4)); + bytes[bytes.length - 2] = (byte)((b2 << 4) | (b3 >> 2)); + bytes[bytes.length - 1] = (byte)((b3 << 6) | b4); + } + + return bytes; + } +} diff --git a/src/org/xwt/shoehorn3/ShoeHorn.java b/src/org/xwt/shoehorn3/ShoeHorn.java new file mode 100644 index 0000000..f7bc319 --- /dev/null +++ b/src/org/xwt/shoehorn3/ShoeHorn.java @@ -0,0 +1,628 @@ +// Copyright 2002 Adam Megacz, see the COPYING file for licensing [GPL] +package org.xwt.shoehorn3; + +import java.applet.*; +import java.util.*; +import java.lang.reflect.*; +import java.io.*; +import java.net.*; +import java.util.zip.*; +import java.awt.*; +import java.math.*; + +/** This class is XWT's presence on the user's computer; it must be run as trusted code */ +public class ShoeHorn extends Applet { + + // Startup Phase //////////////////////////////////////////////////////////////////// + private String build = null; + public ShoeHorn() { log("*** constructor invoked for " + this.getClass().getName()); } + + public final String getParameter(String arg) { return super.getParameter(arg); } + public final void main(String[] s) { new ShoeHorn().start(); } + private void log(String s) { System.out.println(s); } + + /** this just ensures that we are running with full privileges */ + public final void start() { + build = getParameter("build"); + new Thread() { public void run() { + log("ShoeHorn thread spawned"); + try { + + if (System.getProperty("java.vendor", "").startsWith("Netscape")) { + log("Detected Navigator 4.x"); + Method m = Class.forName("netscape.security.PrivilegeManager").getMethod("enablePrivilege", new Class[] { String.class }); + m.invoke(null, new Object[] { "MarimbaInternalTarget" }); + m.invoke(null, new Object[] { "UniversalExecAccess" }); + m.invoke(null, new Object[] { "UniversalPropertyRead" }); + go(); + + } else if (System.getProperty("java.vendor", "").startsWith("Microsoft")) { + //com.ms.security.PolicyEngine.assertPermission(com.ms.security.PermissionID.SYSTEM); + Class permissionIdClass = Class.forName("com.ms.security.PermissionID"); + Object o = permissionIdClass.getField("SYSTEM").get(null); + Method m = Class.forName("com.ms.security.PolicyEngine").getMethod("assertPermission", new Class[] { permissionIdClass }); + m.invoke(null, new Object[] { o }); + go(); + + } else { + log("Detected non-Navigator JVM"); + Method m = Class.forName("org.xwt.shoehorn3.ShoeHorn$Java12").getMethod("run", new Class[] { Object.class }); + m.invoke(null, new Object[] { ShoeHorn.this }); + } + } catch (Throwable e) { + if (e instanceof InvocationTargetException) e = ((InvocationTargetException)e).getTargetException(); + e.printStackTrace(); + update(-1.0, "Error; please check the Java console"); + } + } }.start(); + } + + /** ask Java Plugin for privs */ + private static class Java12 { + public static void run(final Object a) { + java.security.AccessController.doPrivileged(new java.security.PrivilegedAction() { + public Object run() { + ((ShoeHorn)a).go(); + return null; + } + }); + } + } + + + // Implantation //////////////////////////////////////////////////////////////////// + + /** inserts the required entries into the user's ~/.java.policy */ + private void modifyPolicyFile() throws IOException { + log("Adjusting ~/.java.policy"); + File policy = new File(System.getProperty("user.home") + File.separatorChar + ".java.policy"); + if (policy.exists()) { + BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(policy))); + String s = null; + while((s = br.readLine()) != null) + if (s.startsWith("// XWT_MARKER:")) { + log("Java policy file has already been adjusted"); + return; + } + } + FileOutputStream fos = new FileOutputStream(policy.getAbsolutePath(), true); + PrintWriter pw = new PrintWriter(new OutputStreamWriter(fos)); + pw.println(""); + pw.println("// XWT_MARKER: this line and the following two grant blocks are required for XWT; DO NOT REMOVE THEM."); + pw.println("grant {"); + pw.println(" permission java.io.FilePermission \"${user.home}${/}.xwt${/}shoehorn.jar\", \"read\";"); + pw.println("};"); + pw.println("grant codebase \"file:${user.home}${/}.xwt${/}shoehorn.jar\" {"); + pw.println(" permission java.security.AllPermission;"); + pw.println("};"); + pw.println("// END_XWT_MARKER"); + pw.println(""); + pw.flush(); + pw.close(); + } + + /** read ourselves out of the resources and write a jarfile to some trusted place */ + private void implantSelf() throws IOException { + InputStream manifest = getClass().getClassLoader().getResourceAsStream("META-INF/manifest.mf"); + log("my classloader is " + getClass().getClassLoader().getClass().getName()); + ClassLoader loader = getClass().getClassLoader(); + if (manifest == null || loader == null || + (loader.getClass().getName().indexOf("Applet") == -1 && loader.getClass().getName().indexOf("Plugin") == -1)) + return; + BufferedReader br = new BufferedReader(new InputStreamReader(manifest)); + Vector entries = new Vector(); + String s = null; + while((s = br.readLine()) != null) + if (s.startsWith("Name: ")) + entries.addElement(s.substring(6)); + + String ext_dirs = System.getProperty("java.ext.dirs"); + log("java.ext.dirs = " + ext_dirs); + ext_dirs = ext_dirs + File.pathSeparatorChar + System.getProperty("user.home") + File.separatorChar + ".xwt"; + StringTokenizer st = new StringTokenizer(ext_dirs, File.pathSeparatorChar + ""); + while(st.hasMoreTokens()) { + String dir = st.nextToken(); + new File(dir).mkdirs(); + try { + // we have to modify the policy file BEFORE implanting in ~/.xwt to ensure that the policy mods work + if (!st.hasMoreTokens()) modifyPolicyFile(); + implantInDirectory(dir, entries); + return; + } catch (IOException e) { + log("Failed to implant in " + dir + " due to " + e); + } + } + log("Failed to implant self!"); + } + + private void implantInDirectory(String dir, Vector entries) throws IOException { + File f = new File(dir + File.separatorChar + "shoehorn.tmp"); + ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(f)); + for(int i=0; i -1) { + p = Runtime.getRuntime().exec("command.com /c set"); + } else if ((os.indexOf("nt") > -1) || (os.indexOf("windows 2000") > -1) ) { + p = Runtime.getRuntime().exec("cmd.exe /c set"); + } else { + p = Runtime.getRuntime().exec("env"); + } + BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream())); + String s; + while ((s = br.readLine()) != null) v.addElement(s); + v.addElement(newvar); + String[] ret; + v.copyInto(ret = new String[v.size()]); + return ret; + } + + + + // Applet Painting Functions //////////////////////////////////////////////////////// + + private Image backbuffer = null; + public final void paint(Graphics g) { if (backbuffer != null) g.drawImage(backbuffer, 0, 0, null); } + + public final Graphics getGraphics() { return super.getGraphics(); } + public final Dimension getSize() { return super.getSize(); } + + private void update(double loaded, String text) { + // indicates we should paint ourselves + Graphics g2 = getGraphics(); + String s = text; + if (backbuffer == null || backbuffer.getWidth(null) != getSize().width || backbuffer.getHeight(null) != getSize().height) + backbuffer = createImage(getSize().width, getSize().height); + if (backbuffer == null) return; + Graphics g = backbuffer.getGraphics(); + + g.setColor(loaded < 0 ? Color.red : Color.blue); + loaded = Math.abs(loaded); + + int w = (int)((double)getSize().width * loaded); + g.fillRect(0, 0, w, getSize().height); + g.setColor(Color.darkGray); + g.fillRect(w, 0, getSize().width - w, getSize().height); + + Font f = new Font("Sans-serif", Font.BOLD, 12); + FontMetrics fm = Toolkit.getDefaultToolkit().getFontMetrics(f); + g.setFont(f); + + int x = (getSize().width - fm.stringWidth(s)) / 2; + int y = ((getSize().height - fm.getMaxAscent() - fm.getMaxDescent()) / 2) + fm.getMaxAscent(); + g.setColor(Color.white); + g.drawString(s, x, y); + + if (g2 != null) { + g2.setClip(0, 0, getSize().width, getSize().height); + g2.drawImage(backbuffer, 0, 0, null); + } + } + + + // Misc Constants /////////////////////////////////////////////////////////// + + private static final String XWT_foundation_public_key = + "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCoVweDZ+h3jcN2Qz1YwWJR8gVF0m/IE" + + "BasLIcvey9y1VkyN9jY6b9qm/Z2UoVtvAlgezd4CsJedUCIMe7uURyHGnqI4MLrozxLz3" + + "zqx5EYChsJt+Ju/f44KYnMx7upUQ4irfxOj6RpHy3E5GbW4XO96WwFlOuaR8+HRwKCXGP" + + "QvQIDAQAB"; + + private static final String[] commonJavaLocations = new String[] { + "/usr/bin/java", + "/usr/java/bin/java", + "/usr/local/bin/java", + "/usr/local/java/bin/java", + "/usr/lib/j2sdk1.4/bin/java", + "/usr/lib/j2sdk1.3/bin/java", + "/usr/lib/j2sdk1.2/bin/java" + }; + +} + + + + +/* + +/// NSJVM Notes /////////////////////////////////////////////////////////////////// + + PrivilegeManager.enablePrivilege("MarimbaInternalTarget"); + PrivilegeManager.enablePrivilege("UniversalSystemClipboardAccess"); + netscape.security.PrivilegeManager.enablePrivilege("UniversalConnect"); (sockets) + netscape.security.PrivilegeManager.enablePrivilege("UniversalSystemClipboardAccess"); + netscape.security.PrivilegeManager.enablePrivilege("UniversalTopLevelWindow"); + + - Netscape's ClassLoader.getResource() is broken, see http://developer.netscape.com/docs/technote/java/getresource/getresource.html + - this will fix it: netscape.security.PrivilegeManager.enablePrivilege("UniversalPropertyRead"); + + - If you create a classloader, include + public boolean checkMatchPrincipalAlways(int i) { + return ((AppletClassLoader)this.getClass().getClassLoader()).checkMatchPrincipalAlways(i); + } + + - protected int _modifiersToButtonNumber(int modifiers) { + if ((modifiers & (InputEvent.BUTTON1_MASK & 15)) == (InputEvent.BUTTON1_MASK & 15)) return 1; + if ((modifiers & (InputEvent.BUTTON2_MASK & 15)) == (InputEvent.BUTTON2_MASK & 15)) return 3; + if ((modifiers & (InputEvent.BUTTON3_MASK & 15)) == (InputEvent.BUTTON3_MASK & 15)) return 2; + + +/// MSJVM Notes /////////////////////////////////////////////////////////////////// + +- To sniff the JVM, check if (window.clientInformation.javaEnabled()), or if + (navigator.javaEnabled()). See also http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dndetect/html/detectvm.asp + +- MSJVM note: you have to write to the getGraphics() of a Frame before you can setIconImage() it. + +- How to create trusted classes within an already-running MSJVM: + + class MicrosoftClassLoader extends SecurityClassLoader { + static PermissionSet ps; // a PermissionSet that allows everything + static { + PermissionDataSet pds = new PermissionDataSet(); + IPermission perm = new IPermission() { + public void check(Object request) { } + public IPermission combine(IPermission other) { return this; } + public IPermission copy() { return this; } + public int compareSet(Object o) { return SetComparison.DISJOINT; } + }; + pds.add(PolicyEngine.permissionNameToID("com.ms.security.permissions.ClientStoragePermission"), perm); + pds.add(PolicyEngine.permissionNameToID("com.ms.security.permissions.ExecutionPermission"), perm); + pds.add(PolicyEngine.permissionNameToID("com.ms.security.permissions.FileIOPermission"), perm); + pds.add(PolicyEngine.permissionNameToID("com.ms.security.permissions.MultimediaPermission"), perm); + pds.add(PolicyEngine.permissionNameToID("com.ms.security.permissions.NetIOPermission"), perm); + pds.add(PolicyEngine.permissionNameToID("com.ms.security.permissions.PrintingPermission"), perm); + pds.add(PolicyEngine.permissionNameToID("com.ms.security.permissions.PropertyPermission"), perm); + pds.add(PolicyEngine.permissionNameToID("com.ms.security.permissions.ReflectionPermission"), perm); + pds.add(PolicyEngine.permissionNameToID("com.ms.security.permissions.SecurityPermission"), perm); + pds.add(PolicyEngine.permissionNameToID("com.ms.security.permissions.SystemStreamsPermission"), perm); + pds.add(PolicyEngine.permissionNameToID("com.ms.security.permissions.ThreadPermission"), perm); + pds.add(PolicyEngine.permissionNameToID("com.ms.security.permissions.UIPermission"), perm); + pds.add(PolicyEngine.permissionNameToID("com.ms.security.permissions.UserFileIOPermission"), perm); + ps = new PermissionSet(pds); + } + public Class defineClass(String name, byte[] b) { + Class c = super.defineClass(name, b, 0, b.length, ps, com.ms.security.PolicyEngine.getPrincipalOfClass(Resources.class)); + if (name.startsWith("net")) System.out.println("defineClass " + name + " yielded " + c); + // for some reason, the MSJVM doesn't request resolves properly, so we have to do it manually on every class-load + resolveClass(c); + return c; + } + +- How to inhibit background-clearing on the MSJVM + + // Used to ensure that getPeer() doesn't go off in an infinite loop + boolean ok = false; + + // The MSJVM needs us to occasionally falsify getPeer() in order to thwart unneeded background-clearing + public ComponentPeer getPeer() { + if (Thread.currentThread() == Platform.fastPathThread) return super.getPeer(); + if (ok) return super.getPeer(); + + // to prevent recursive stack-dumping... =) + ok = true; + Dimension d = getSize(); + ok = false; + if (last != null && last.width == d.width && last.height == d.height) + return super.getPeer(); + + String s = com.ms.wfc.util.Debug.getStackTraceText(); + for(int i = s.indexOf('d'); i != -1; i = s.indexOf('d', i + 1)) { + if (s.regionMatches(i, "doClearAndPaint", 0, 15)) { + last = getSize(); + update(null); + return null; + } + } + return super.getPeer(); + } + +*/ -- 1.7.10.4

Mlk|s-94-yMF%9EvJB4DbS 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