internal DSAParameters ParseDSAPublicKey()
{
var parameters = new DSAParameters ();
// Current value
byte[] value = null;
// Current Position
int position = parser.CurrentPosition ();
// Sanity Checks
int length = 0;
// Ignore Sequence - PublicKeyInfo
length = parser.NextSequence ();
if (length != parser.RemainingBytes ())
{
var sb = new StringBuilder("Incorrect Sequence Size. ");
sb.AppendFormat("Specified: {0}, Remaining: {1}",
length.ToString(CultureInfo.InvariantCulture),
parser.RemainingBytes ().ToString(CultureInfo.InvariantCulture));
throw new BerDecodeException(sb.ToString (), position);
}
// Checkpoint
position = parser.CurrentPosition ();
// Ignore Sequence - AlgorithmIdentifier
length = parser.NextSequence ();
if (length > parser.RemainingBytes ())
{
var sb = new StringBuilder("Incorrect AlgorithmIdentifier Size. ");
sb.AppendFormat("Specified: {0}, Remaining: {1}",
length.ToString(CultureInfo.InvariantCulture),
parser.RemainingBytes ().ToString(CultureInfo.InvariantCulture));
throw new BerDecodeException(sb.ToString (), position);
}
// Checkpoint
position = parser.CurrentPosition ();
// Grab the OID
value = parser.NextOID ();
byte[] oid = {0x2a, 0x86, 0x48, 0xce, 0x38, 0x04, 0x01};
if (!EqualOid(value, oid))
{
throw new BerDecodeException("Expected OID 1.2.840.10040.4.1", position);
}
// Checkpoint
position = parser.CurrentPosition ();
// Ignore Sequence - DSS-Params
length = parser.NextSequence ();
if (length > parser.RemainingBytes ())
{
var sb = new StringBuilder("Incorrect DSS-Params Size. ");
sb.AppendFormat("Specified: {0}, Remaining: {1}",
length.ToString(CultureInfo.InvariantCulture),
parser.RemainingBytes ().ToString(CultureInfo.InvariantCulture));
throw new BerDecodeException(sb.ToString (), position);
}
// Next three are curve parameters
parameters.P = TrimLeadingZero(parser.NextInteger ());
parameters.Q = TrimLeadingZero(parser.NextInteger ());
parameters.G = TrimLeadingZero(parser.NextInteger ());
// Ignore BitString - PrivateKey
parser.NextBitString ();
// Public Key
parameters.Y = TrimLeadingZero(parser.NextInteger ());
Debug.Assert(0 == parser.RemainingBytes ());
return parameters;
}