public static PBCertificate SignCertificate(string name, PBKeyPair masterKeyPair, PBKeyPair keyPair) { var dsa = new CryptoEngine().ECLoad(masterKeyPair.PublicKey.PublicKey, masterKeyPair.PrivateKey); var cert = new PBCertificate { Name = name, PublicKey = keyPair.PublicKey.PublicKey }; /* Issue certificate Id */ cert.Id = masterKeyPair.IssuedCerts++; if (cert.Id > masterKeyPair.IssuedCerts) { throw new OverflowException("Ran out of issueable certificates"); } /* Prepare sign buffer */ var pubKey = keyPair.PublicKey.PublicKey.ToByteArray(); byte[] signBuff = new byte[pubKey.Length + sizeof(int)]; pubKey.CopyTo(signBuff, 0); for (int i = 0; i < sizeof(int); ++i) { signBuff[pubKey.Length + i] = (byte)((cert.Id >> (8 * i)) & 0xff); } var byteCert = dsa.SignData(signBuff, HashAlgorithmName.SHA256); cert.Signature = ByteString.CopyFrom(byteCert, 0, byteCert.Length); return(cert); }
public ECDsaCng verifyCertificate(PBCertificate cert) { return(this.verifyCertificate(cert.PublicKey.ToByteArray(), cert.Id, cert.Signature.ToByteArray())); }