Branch: Tag:

2014-08-24

2014-08-24 21:50:41 by Martin Nilsson <nilsson@opera.com>

Added codec to ASN1 objects.

39:      // Class definitions    + #define CODEC(X) \ +  array _encode() { return ({ cls, tag, value }); } \ +  void _decode(array(X) x) { [ cls, tag, value ] = x; } +    //! Generic, abstract base class for ASN1 data types.   class Object   {
150:    der = build_der(s);    }    -  +     //! Get the DER encoded version of this object.    //!    //! @returns
222:    return t=='O' && sprintf("%O(%*O)", this_program, params, elements);    }    +  array _encode() +  { +  return ({ cls, tag, elements }); +  } +  +  void _decode(array(int|array(Object)) x) +  { +  [ cls, tag, elements ] = x; +  } +     __deprecated__ string debug_string() {    WERROR("asn1_compound[%s]->debug_string(), elements = %O\n",    type_name, elements);
236:       //! value of object    string value; +  CODEC(string);       this_program init(string(0..255) s) {    value = s;
285:   class Boolean   {    inherit Object; +     int tag = 1;    constant type_name = "BOOLEAN";       //! value of object    int value; -  +  CODEC(int);       this_program init(int x) {    value = x;
327:   class Integer   {    inherit Object; +     int tag = 2;    constant type_name = "INTEGER";       //! value of object    Gmp.mpz value; -  +  CODEC(Gmp.mpz);       this_object init(int|object n) {    value = Gmp.mpz(n);
395:   class Real   {    inherit Object; +     int tag = 9;    constant type_name = "REAL";       float value; -  +  CODEC(float);       string(0..255) get_der_content()    {
589:    ->digits(2));    }    +  array _encode() +  { +  return ({ cls, tag, value, unused }); +  } +  +  void _decode(array(int|string(8bit)) x) +  { +  [ cls, tag, value, unused ] = x; +  } +     __deprecated__ string debug_string() {    return sprintf("BIT STRING (%d) %s",    sizeof(value) * 8 - unused,
623:    return !sizeof(contents) && this;    }    +  array _encode() +  { +  return ({ cls, tag }); +  } +  +  void _decode(array(int) x) +  { +  [ cls, tag ] = x; +  } +     __deprecated__ string debug_string() { return "NULL"; }   }   
645:    return this;    }    -  mixed _encode() { return id; } -  void _decode(array(int) data) { id=data; } -  +     //! Returns a new @[Identifier] object with @[args] appended to the    //! ID path.    this_program append(int ... args) {
690:    return sprintf("%O(%s)", this_program, (array(string))id*".");    }    +  array _encode() +  { +  return ({ cls, tag, id }); +  } +  +  void _decode(array(int|array(int)) x) +  { +  if( sizeof(x)!=3 || intp(x[2]) ) +  id = [array(int)]x; // Compat with old codec that didn't save cls/tag. +  else +  [ cls, tag, id ] = x; +  } +     __deprecated__ string debug_string() {    return "IDENTIFIER " + (array(string)) id * ".";    }
1096:    real_tag, contents);    }    +  array _encode() +  { +  return ({ real_cls, real_tag, contents }); +  } +  +  void _decode(array(int|Object) x) +  { +  [ real_cls, real_tag, contents ] = x; +  }    __deprecated__ string debug_string() {    return type_name + "[" + (int) real_tag + "]";    }
1108:    real_tag = tag;    valid_types = types;    } +  +  array _encode() +  { +  return ({ real_cls, real_tag, valid_types });    }    -  +  void _decode(array(int|mapping(int:program(Object))) x) +  { +  [ real_cls, real_tag, valid_types ] = x; +  } + } +    //! Some common explicit tags for convenience.   //!   //! These are typically used to indicate which