Merge branch 'master' of c:/ph/keepass2android
This commit is contained in:
		
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -169,3 +169,4 @@ src/java/Keepass2AndroidPluginSDK2/build/generated/mockable-Google-Inc.-Google-A | ||||
| /src/java/KP2AKdbLibrary/app/build | ||||
| /src/java/KP2ASoftkeyboard_AS/app/.cxx | ||||
| /src/java/KP2ASoftkeyboard_AS/app/src/main/libs | ||||
| /src/java/KP2AKdbLibrary/app/.cxx | ||||
|   | ||||
| @@ -0,0 +1,440 @@ | ||||
| package org.bouncycastle.asn1.util; | ||||
|  | ||||
| import org.bouncycastle.asn1.ASN1OctetString; | ||||
| import org.bouncycastle.asn1.ASN1Sequence; | ||||
| import org.bouncycastle.asn1.ASN1Set; | ||||
| import org.bouncycastle.asn1.BERConstructedOctetString; | ||||
| import org.bouncycastle.asn1.BERConstructedSequence; | ||||
| import org.bouncycastle.asn1.BERSequence; | ||||
| import org.bouncycastle.asn1.BERSet; | ||||
| import org.bouncycastle.asn1.BERTaggedObject; | ||||
| import org.bouncycastle.asn1.DERBMPString; | ||||
| import org.bouncycastle.asn1.DERBitString; | ||||
| import org.bouncycastle.asn1.DERBoolean; | ||||
| import org.bouncycastle.asn1.DERConstructedSequence; | ||||
| import org.bouncycastle.asn1.DERConstructedSet; | ||||
| import org.bouncycastle.asn1.DEREncodable; | ||||
| import org.bouncycastle.asn1.DERGeneralizedTime; | ||||
| import org.bouncycastle.asn1.DERIA5String; | ||||
| import org.bouncycastle.asn1.DERInteger; | ||||
| import org.bouncycastle.asn1.DERNull; | ||||
| import org.bouncycastle.asn1.DERObject; | ||||
| import org.bouncycastle.asn1.DERObjectIdentifier; | ||||
| import org.bouncycastle.asn1.DEROctetString; | ||||
| import org.bouncycastle.asn1.DERPrintableString; | ||||
| import org.bouncycastle.asn1.DERSequence; | ||||
| import org.bouncycastle.asn1.DERSet; | ||||
| import org.bouncycastle.asn1.DERT61String; | ||||
| import org.bouncycastle.asn1.DERTaggedObject; | ||||
| import org.bouncycastle.asn1.DERUTCTime; | ||||
| import org.bouncycastle.asn1.DERUTF8String; | ||||
| import org.bouncycastle.asn1.DERUnknownTag; | ||||
| import org.bouncycastle.asn1.DERVisibleString; | ||||
| import org.bouncycastle.asn1.DERApplicationSpecific; | ||||
| import org.bouncycastle.asn1.DERTags; | ||||
| import org.bouncycastle.asn1.BERApplicationSpecific; | ||||
| import org.bouncycastle.util.encoders.Hex; | ||||
|  | ||||
| import java.util.Enumeration; | ||||
| import java.io.IOException; | ||||
|  | ||||
| public class ASN1Dump | ||||
| { | ||||
|     private static final String  TAB = "    "; | ||||
|     private static final int SAMPLE_SIZE = 32; | ||||
|  | ||||
|     /** | ||||
|      * dump a DER object as a formatted string with indentation | ||||
|      * | ||||
|      * @param obj the DERObject to be dumped out. | ||||
|      */ | ||||
|     static String _dumpAsString( | ||||
|         String      indent, | ||||
|         boolean     verbose, | ||||
|         DERObject   obj) | ||||
|     { | ||||
|         String nl = System.getProperty("line.separator"); | ||||
|         if (obj instanceof ASN1Sequence) | ||||
|         { | ||||
|             StringBuffer    buf = new StringBuffer(); | ||||
|             Enumeration     e = ((ASN1Sequence)obj).getObjects(); | ||||
|             String          tab = indent + TAB; | ||||
|  | ||||
|             buf.append(indent); | ||||
|             if (obj instanceof BERConstructedSequence) | ||||
|             { | ||||
|                 buf.append("BER ConstructedSequence"); | ||||
|             } | ||||
|             else if (obj instanceof DERConstructedSequence) | ||||
|             { | ||||
|                 buf.append("DER ConstructedSequence"); | ||||
|             } | ||||
|             else if (obj instanceof BERSequence) | ||||
|             { | ||||
|                 buf.append("BER Sequence"); | ||||
|             } | ||||
|             else if (obj instanceof DERSequence) | ||||
|             { | ||||
|                 buf.append("DER Sequence"); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 buf.append("Sequence"); | ||||
|             } | ||||
|  | ||||
|             buf.append(nl); | ||||
|  | ||||
|             while (e.hasMoreElements()) | ||||
|             { | ||||
|                 Object  o = e.nextElement(); | ||||
|  | ||||
|                 if (o == null || o.equals(new DERNull())) | ||||
|                 { | ||||
|                     buf.append(tab); | ||||
|                     buf.append("NULL"); | ||||
|                     buf.append(nl); | ||||
|                 } | ||||
|                 else if (o instanceof DERObject) | ||||
|                 { | ||||
|                     buf.append(_dumpAsString(tab, verbose, (DERObject)o)); | ||||
|                 } | ||||
|                 else | ||||
|                 { | ||||
|                     buf.append(_dumpAsString(tab, verbose, ((DEREncodable)o).getDERObject())); | ||||
|                 } | ||||
|             } | ||||
|             return buf.toString(); | ||||
|         } | ||||
|         else if (obj instanceof DERTaggedObject) | ||||
|         { | ||||
|             StringBuffer    buf = new StringBuffer(); | ||||
|             String          tab = indent + TAB; | ||||
|  | ||||
|             buf.append(indent); | ||||
|             if (obj instanceof BERTaggedObject) | ||||
|             { | ||||
|                 buf.append("BER Tagged ["); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 buf.append("Tagged ["); | ||||
|             } | ||||
|  | ||||
|             DERTaggedObject o = (DERTaggedObject)obj; | ||||
|  | ||||
|             buf.append(Integer.toString(o.getTagNo())); | ||||
|             buf.append(']'); | ||||
|  | ||||
|             if (!o.isExplicit()) | ||||
|             { | ||||
|                 buf.append(" IMPLICIT "); | ||||
|             } | ||||
|  | ||||
|             buf.append(nl); | ||||
|  | ||||
|             if (o.isEmpty()) | ||||
|             { | ||||
|                 buf.append(tab); | ||||
|                 buf.append("EMPTY"); | ||||
|                 buf.append(nl); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 buf.append(_dumpAsString(tab, verbose, o.getObject())); | ||||
|             } | ||||
|  | ||||
|             return buf.toString(); | ||||
|         } | ||||
|         else if (obj instanceof DERConstructedSet) | ||||
|         { | ||||
|             StringBuffer    buf = new StringBuffer(); | ||||
|             Enumeration     e = ((ASN1Set)obj).getObjects(); | ||||
|             String          tab = indent + TAB; | ||||
|  | ||||
|             buf.append(indent); | ||||
|             buf.append("ConstructedSet"); | ||||
|             buf.append(nl); | ||||
|  | ||||
|             while (e.hasMoreElements()) | ||||
|             { | ||||
|                 Object  o = e.nextElement(); | ||||
|  | ||||
|                 if (o == null) | ||||
|                 { | ||||
|                     buf.append(tab); | ||||
|                     buf.append("NULL"); | ||||
|                     buf.append(nl); | ||||
|                 } | ||||
|                 else if (o instanceof DERObject) | ||||
|                 { | ||||
|                     buf.append(_dumpAsString(tab, verbose, (DERObject)o)); | ||||
|                 } | ||||
|                 else | ||||
|                 { | ||||
|                     buf.append(_dumpAsString(tab, verbose, ((DEREncodable)o).getDERObject())); | ||||
|                 } | ||||
|             } | ||||
|             return buf.toString(); | ||||
|         } | ||||
|         else if (obj instanceof BERSet) | ||||
|         { | ||||
|             StringBuffer    buf = new StringBuffer(); | ||||
|             Enumeration     e = ((ASN1Set)obj).getObjects(); | ||||
|             String          tab = indent + TAB; | ||||
|  | ||||
|             buf.append(indent); | ||||
|             buf.append("BER Set"); | ||||
|             buf.append(nl); | ||||
|  | ||||
|             while (e.hasMoreElements()) | ||||
|             { | ||||
|                 Object  o = e.nextElement(); | ||||
|  | ||||
|                 if (o == null) | ||||
|                 { | ||||
|                     buf.append(tab); | ||||
|                     buf.append("NULL"); | ||||
|                     buf.append(nl); | ||||
|                 } | ||||
|                 else if (o instanceof DERObject) | ||||
|                 { | ||||
|                     buf.append(_dumpAsString(tab, verbose, (DERObject)o)); | ||||
|                 } | ||||
|                 else | ||||
|                 { | ||||
|                     buf.append(_dumpAsString(tab, verbose, ((DEREncodable)o).getDERObject())); | ||||
|                 } | ||||
|             } | ||||
|             return buf.toString(); | ||||
|         } | ||||
|         else if (obj instanceof DERSet) | ||||
|         { | ||||
|             StringBuffer    buf = new StringBuffer(); | ||||
|             Enumeration     e = ((ASN1Set)obj).getObjects(); | ||||
|             String          tab = indent + TAB; | ||||
|  | ||||
|             buf.append(indent); | ||||
|             buf.append("DER Set"); | ||||
|             buf.append(nl); | ||||
|  | ||||
|             while (e.hasMoreElements()) | ||||
|             { | ||||
|                 Object  o = e.nextElement(); | ||||
|  | ||||
|                 if (o == null) | ||||
|                 { | ||||
|                     buf.append(tab); | ||||
|                     buf.append("NULL"); | ||||
|                     buf.append(nl); | ||||
|                 } | ||||
|                 else if (o instanceof DERObject) | ||||
|                 { | ||||
|                     buf.append(_dumpAsString(tab, verbose, (DERObject)o)); | ||||
|                 } | ||||
|                 else | ||||
|                 { | ||||
|                     buf.append(_dumpAsString(tab, verbose, ((DEREncodable)o).getDERObject())); | ||||
|                 } | ||||
|             } | ||||
|             return buf.toString(); | ||||
|         } | ||||
|         else if (obj instanceof DERObjectIdentifier) | ||||
|         { | ||||
|             return indent + "ObjectIdentifier(" + ((DERObjectIdentifier)obj).getId() + ")" + nl; | ||||
|         } | ||||
|         else if (obj instanceof DERBoolean) | ||||
|         { | ||||
|             return indent + "Boolean(" + ((DERBoolean)obj).isTrue() + ")" + nl; | ||||
|         } | ||||
|         else if (obj instanceof DERInteger) | ||||
|         { | ||||
|             return indent + "Integer(" + ((DERInteger)obj).getValue() + ")" + nl; | ||||
|         } | ||||
|         else if (obj instanceof BERConstructedOctetString) | ||||
|         { | ||||
|             ASN1OctetString oct = (ASN1OctetString)obj; | ||||
|             if (verbose) | ||||
|             { | ||||
|                 return indent + "BER Constructed Octet String" + "[" + oct.getOctets().length + "] " + dumpBinaryDataAsString(indent, oct.getOctets()) + nl; | ||||
|             } | ||||
|             return indent + "BER Constructed Octet String" + "[" + oct.getOctets().length + "] " + nl; | ||||
|         } | ||||
|         else if (obj instanceof DEROctetString) | ||||
|         { | ||||
|             ASN1OctetString oct = (ASN1OctetString)obj; | ||||
|             if (verbose) | ||||
|             { | ||||
|                 return indent + "DER Octet String" + "[" + oct.getOctets().length + "] " + dumpBinaryDataAsString(indent, oct.getOctets()) + nl; | ||||
|             } | ||||
|             return indent + "DER Octet String" + "[" + oct.getOctets().length + "] " + nl; | ||||
|         } | ||||
|         else if (obj instanceof DERBitString) | ||||
|         { | ||||
|             DERBitString bt = (DERBitString)obj; | ||||
|             if (verbose) | ||||
|             { | ||||
|                 return indent + "DER Bit String" + "[" + bt.getBytes().length + ", " + bt.getPadBits() + "] "  + dumpBinaryDataAsString(indent, bt.getBytes()) + nl; | ||||
|             } | ||||
|             return indent + "DER Bit String" + "[" + bt.getBytes().length + ", " + bt.getPadBits() + "] " + nl; | ||||
|         } | ||||
|         else if (obj instanceof DERIA5String) | ||||
|         { | ||||
|             return indent + "IA5String(" + ((DERIA5String)obj).getString() + ") " + nl; | ||||
|         } | ||||
|         else if (obj instanceof DERUTF8String) | ||||
|         { | ||||
|             return indent + "UTF8String(" + ((DERUTF8String)obj).getString() + ") " + nl; | ||||
|         } | ||||
|         else if (obj instanceof DERPrintableString) | ||||
|         { | ||||
|             return indent + "PrintableString(" + ((DERPrintableString)obj).getString() + ") " + nl; | ||||
|         } | ||||
|         else if (obj instanceof DERVisibleString) | ||||
|         { | ||||
|             return indent + "VisibleString(" + ((DERVisibleString)obj).getString() + ") " + nl; | ||||
|         } | ||||
|         else if (obj instanceof DERBMPString) | ||||
|         { | ||||
|             return indent + "BMPString(" + ((DERBMPString)obj).getString() + ") " + nl; | ||||
|         } | ||||
|         else if (obj instanceof DERT61String) | ||||
|         { | ||||
|             return indent + "T61String(" + ((DERT61String)obj).getString() + ") " + nl; | ||||
|         } | ||||
|         else if (obj instanceof DERUTCTime) | ||||
|         { | ||||
|             return indent + "UTCTime(" + ((DERUTCTime)obj).getTime() + ") " + nl; | ||||
|         } | ||||
|         else if (obj instanceof DERGeneralizedTime) | ||||
|         { | ||||
|             return indent + "GeneralizedTime(" + ((DERGeneralizedTime)obj).getTime() + ") " + nl; | ||||
|         } | ||||
|         else if (obj instanceof DERUnknownTag) | ||||
|         { | ||||
|             return indent + "Unknown " + Integer.toString(((DERUnknownTag)obj).getTag(), 16) + " " + new String(Hex.encode(((DERUnknownTag)obj).getData())) + nl; | ||||
|         } | ||||
|         else if (obj instanceof BERApplicationSpecific) | ||||
|         { | ||||
|             return outputApplicationSpecific("BER", indent, verbose, obj, nl); | ||||
|         } | ||||
|         else if (obj instanceof DERApplicationSpecific) | ||||
|         { | ||||
|             return outputApplicationSpecific("DER", indent, verbose, obj, nl); | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             return indent + obj.toString() + nl; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private static String outputApplicationSpecific(String type, String indent, boolean verbose, DERObject obj, String nl) | ||||
|     { | ||||
|         DERApplicationSpecific app = (DERApplicationSpecific)obj; | ||||
|         StringBuffer buf = new StringBuffer(); | ||||
|  | ||||
|         if (app.isConstructed()) | ||||
|         { | ||||
|             try | ||||
|             { | ||||
|                 ASN1Sequence s = ASN1Sequence.getInstance(app.getObject(DERTags.SEQUENCE)); | ||||
|                 buf.append(indent + type + " ApplicationSpecific[" + app.getApplicationTag() + "]" + nl); | ||||
|                 for (Enumeration e = s.getObjects(); e.hasMoreElements();) | ||||
|                 { | ||||
|                     buf.append(_dumpAsString(indent + TAB, verbose, (DERObject)e.nextElement())); | ||||
|                 } | ||||
|             } | ||||
|             catch (IOException e) | ||||
|             { | ||||
|                 buf.append(e); | ||||
|             } | ||||
|             return buf.toString(); | ||||
|         } | ||||
|  | ||||
|         return indent + type + " ApplicationSpecific[" + app.getApplicationTag() + "] (" + new String(Hex.encode(app.getContents())) + ")" + nl; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * dump out a DER object as a formatted string, in non-verbose mode. | ||||
|      * | ||||
|      * @param obj the DERObject to be dumped out. | ||||
|      * @return  the resulting string. | ||||
|      */ | ||||
|     public static String dumpAsString( | ||||
|         Object   obj) | ||||
|     { | ||||
|         return dumpAsString(obj, false); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Dump out the object as a string. | ||||
|      * | ||||
|      * @param obj  the object to be dumped | ||||
|      * @param verbose  if true, dump out the contents of octet and bit strings. | ||||
|      * @return  the resulting string. | ||||
|      */ | ||||
|     public static String dumpAsString( | ||||
|         Object   obj, | ||||
|         boolean  verbose) | ||||
|     { | ||||
|         if (obj instanceof DERObject) | ||||
|         { | ||||
|             return _dumpAsString("", verbose, (DERObject)obj); | ||||
|         } | ||||
|         else if (obj instanceof DEREncodable) | ||||
|         { | ||||
|             return _dumpAsString("", verbose, ((DEREncodable)obj).getDERObject()); | ||||
|         } | ||||
|  | ||||
|         return "unknown object type " + obj.toString(); | ||||
|     } | ||||
|  | ||||
|     private static String dumpBinaryDataAsString(String indent, byte[] bytes) | ||||
|     { | ||||
|         String nl = System.getProperty("line.separator"); | ||||
|         StringBuffer buf = new StringBuffer(); | ||||
|  | ||||
|         indent += TAB; | ||||
|          | ||||
|         buf.append(nl); | ||||
|         for (int i = 0; i < bytes.length; i += SAMPLE_SIZE) | ||||
|         { | ||||
|             if (bytes.length - i > SAMPLE_SIZE) | ||||
|             { | ||||
|                 buf.append(indent); | ||||
|                 buf.append(new String(Hex.encode(bytes, i, SAMPLE_SIZE))); | ||||
|                 buf.append(TAB); | ||||
|                 buf.append(calculateAscString(bytes, i, SAMPLE_SIZE)); | ||||
|                 buf.append(nl); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 buf.append(indent); | ||||
|                 buf.append(new String(Hex.encode(bytes, i, bytes.length - i))); | ||||
|                 for (int j = bytes.length - i; j != SAMPLE_SIZE; j++) | ||||
|                 { | ||||
|                     buf.append("  "); | ||||
|                 } | ||||
|                 buf.append(TAB); | ||||
|                 buf.append(calculateAscString(bytes, i, bytes.length - i)); | ||||
|                 buf.append(nl); | ||||
|             } | ||||
|         } | ||||
|          | ||||
|         return buf.toString(); | ||||
|     } | ||||
|  | ||||
|     private static String calculateAscString(byte[] bytes, int off, int len) | ||||
|     { | ||||
|         StringBuffer buf = new StringBuffer(); | ||||
|  | ||||
|         for (int i = off; i != off + len; i++) | ||||
|         { | ||||
|             if (bytes[i] >= ' ' && bytes[i] <= '~') | ||||
|             { | ||||
|                 buf.append((char)bytes[i]); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         return buf.toString(); | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,11 @@ | ||||
| // | ||||
| // Created by Philipp on 21.09.2019. | ||||
| // | ||||
|  | ||||
| #include <jni.h> | ||||
|  | ||||
| extern "C" | ||||
| JNIEXPORT jstring JNICALL Java_keepass2android_softkeyboard_BinaryDictionary_getNativeString( | ||||
|         JNIEnv *env, jobject obj) { | ||||
|     return env->NewStringUTF("Hello World! From native code!"); | ||||
| } | ||||
		Reference in New Issue
	
	Block a user
	 Philipp Crocoll
					Philipp Crocoll