/**
   * Constructor from ASN1Sequence.
   *
   * <p>The sequence is of type ProcurationSyntax:
   *
   * <p>
   *
   * <pre>
   *               ProcurationSyntax ::= SEQUENCE {
   *                 country [1] EXPLICIT PrintableString(SIZE(2)) OPTIONAL,
   *                 typeOfSubstitution [2] EXPLICIT DirectoryString (SIZE(1..128)) OPTIONAL,
   *                 signingFor [3] EXPLICIT SigningFor
   *               }
   *
   *               SigningFor ::= CHOICE
   *               {
   *                 thirdPerson GeneralName,
   *                 certRef IssuerSerial
   *               }
   * </pre>
   *
   * @param seq The ASN.1 sequence.
   */
  private ProcurationSyntax(ASN1Sequence seq) {
    if (seq.size() < 1 || seq.size() > 3) {
      throw new IllegalArgumentException("Bad sequence size: " + seq.size());
    }
    Enumeration e = seq.getObjects();

    while (e.hasMoreElements()) {
      ASN1TaggedObject o = ASN1TaggedObject.getInstance(e.nextElement());
      switch (o.getTagNo()) {
        case 1:
          country = DERPrintableString.getInstance(o, true).getString();
          break;
        case 2:
          typeOfSubstitution = DirectoryString.getInstance(o, true);
          break;
        case 3:
          DEREncodable signingFor = o.getObject();
          if (signingFor instanceof ASN1TaggedObject) {
            thirdPerson = GeneralName.getInstance(signingFor);
          } else {
            certRef = IssuerSerial.getInstance(signingFor);
          }
          break;
        default:
          throw new IllegalArgumentException("Bad tag number: " + o.getTagNo());
      }
    }
  }