/// <summary> /// Read values from BER code. Inherited by /// ASN.1's string types. /// </summary> /// <param name="ulazBER">BER encoded input</param> public override void fromBER(BEREncoding ulazBER) { ulazBER.Decode(); foreach (BEREncoding objBER in ulazBER.Decompose() ) { Byte[] tmpByteArray = objBER.GetContents(); int len = tmpByteArray.Length; // -------------------------------------------------- Char[] tmpCharArray = new Char[len]; for(int i=0; i<len; i++) { tmpCharArray[i]=Convert.ToChar(tmpByteArray[i]); } this.StringValue += new String(tmpCharArray); // -------------------------------------------------- } this.CheckString(); }
/// <summary> /// ovo sam zasrao. Ovo mora ici u ASN1SetOf.fromBER() /// </summary> /// <param name="ulazBER"></param> /// <returns></returns> public override ASN1Object CreateInstance(BEREncoding ulazBER) { ASN1SetOf setOfObject = this.Instance() as ASN1SetOf; ulazBER.Decode(); foreach(BEREncoding ber in ulazBER.Decompose()) { setOfObject.Add(this.type.CreateInstance(ber)); } /// Dolazak ovdje predstavlja gresku! return setOfObject; }
public virtual ASN1SetOf SubCreateInstance(ASN1SetOf setOfObject, BEREncoding ulazBER) { /// ovo treba baciti u .fromBER od setOfObject-a !!!!! ulazBER.Decode(); foreach(BEREncoding ber in ulazBER.Decompose()) { setOfObject.Add(this.type.CreateInstance(ber)); } /// Dolazak ovdje predstavlja gresku! return setOfObject; }
public override void fromBER(BEREncoding ulazBER) { /// OVO TREBA TESTIRATI!!! ulazBER.Decode(); /* FIXME: Dizi exception ako je 'type==null' */ foreach(BEREncoding ber in ulazBER.Decompose()) { this.Add(this.type.CreateInstance(ber)); } }
public override ASN1Object CreateInstance(BEREncoding ulazBER) { ASN1SequenceOf asnseqof = this.Instance() as ASN1SequenceOf; ArrayList BERLista = new ArrayList(ulazBER.Decompose()); /// sad imam listu BERova. /// za svaki BER treba kreirati odgovarajuci objekt. ASN1Object tmpasn; foreach (BEREncoding tmpBER in BERLista) { /// kreiranje odgovarajuceg objekta... tmpasn = type.CreateInstance(tmpBER); /// dodavanje objekta u SequenceOf-ov niz objekata. asnseqof.Add(tmpasn); } return asnseqof; }
public override void fromBER(BEREncoding ulazBER) { object[] tmpObj = ulazBER.Decompose(); for (int i=0 ; i < tmpObj.Length; i++) { BEREncoding ber = (tmpObj[i] as BEREncoding); ASN1Object ob = this.type.CreateInstance(ber); this.Add(ob); } }
public override void fromBER(BEREncoding ulazBER) { /// BER vraca niz BER kodova koji se /// lako dekodiraju. Bitna stvar ovdje je /// provjeriti adekvatnost BER-a i "trenutnog" tipa: /// Ako BER ne odgovara ocekivanom tipu moze biti /// da je tip bio oznacen sa OPTIONAL ili DEFAULT. /// Ako je OPTIONAL, preskocimo tip i pokusamo sa /// sljedecim tipom. Ako je DEFAULT, stavimo na odgovarajuce /// mjesto referencu na DefaultValue i u istoj /// iteraciji petlje pokusamo za sljedeci tip. BEREncoding[] berArray = ulazBER.Decompose(); BEREncoding ber; ASN1ComponentTypeInfo currentTypeInfo; int i=0, /// i je indeks trenutnog BER koda j=0; /// j je indeks trenutne komponente /// Vrijedi: i <= j. /* ___ ___ | 0| | 0| |___| |___| i --> | 1| | 1| |___| |___| | 2| | 2| <-- j |___| |___| | 3| | 3| ... */ // iteriraj po svim dobivenim ber-ovima. #region 1. Petlja po dobivenim ber-ovima for ( ; i < berArray.Length; i++, j++) { ber = berArray[i]; currentTypeInfo = this.ComponentTypes[j]; int tag = BEREncoding.DecodeTagNumber(ber.GetIdOctets()); /// Probaj Match-ati tag i currentTypeInfo.Type.Tag try { while (CheckThisShitUpBitch(tag, j, currentTypeInfo)) { /// ako TAG ne odgovara trenutnoj komponenti, pokusaj povezati /// trenutni BER sa nekom od sljedecih komponenata. /// /// Dok skipas, /// provjeri da li ovaj SEQUENCE tip dozvoljava skipanje /// (tj. da li je komponenta markirana sa /// DEFAULT ili OPTIONAL) if(currentTypeInfo.DefaultValue != null) { this.Components[j] = currentTypeInfo.DefaultValue; } else if (currentTypeInfo.isOptional) { } // else if (currentTypeInfo.DefaultValue != null) // { // this.Components[j] = currentTypeInfo.DefaultValue; // } else { throw new Exception ("A type that was not marked as optional is missing"); } // j++; // currentTypeInfo = this.ComponentTypes[j]; currentTypeInfo = this.ComponentTypes[++j]; } } catch (System.IndexOutOfRangeException) { /* -- to znaci da je puklo pri 'skipanju' optionalnih tipova. * Moglo bi se zakljuciti da nedostaje odgovarajuci tip. */ Console.WriteLine("indeks j je pobjegao van"); throw new Exception("Indeks j u ASN1Sequence.fromBER je pobjegao"); } finally {} this.Components[j] = currentTypeInfo.CreateInstance(ber); } #endregion #region 2. Provjeri da li (ako) fale tipovi markirani sa DEFAULT ili OPTIONAL for ( ; j < this.numOfComponents; j++ ) { /// Vise nemam BER ova, ali ako uopce /// dodje do izvrsavanja ove petlje znaci da /// je ostalo neinicijaliziranih polja ovog tipa. /// Ako su polja optional - to nije problem. No - ako su /// to bila Default polja DER kodiranja, te komponente treba /// inicijalizirati. /// currentTypeInfo = this.ComponentTypes[j]; if (currentTypeInfo.isOptional) { } else { if (currentTypeInfo.DefaultValue != null) { this.Components[j] = currentTypeInfo.DefaultValue; } else { //FIXME throw new Exception("A type is missing (not default, not optional)"); } } } #endregion this.RegisterComponents(); }