public void AddCertificate(X509CertificateCollection certificate, CertificatePrivateKey privateKey) { if (certificate == null) throw new ArgumentNullException("certificate"); if (privateKey == null) throw new ArgumentNullException("privateKey"); if (certificate.Count == 0) throw new ArgumentException("certificate"); _availableCertificates.Add(certificate); _availablePrivateKeys.Add(privateKey); }
protected byte[] GenerateSignature(CertificatePrivateKey privateKey, byte[] data) { // This array contains our results byte[] signedParams = new byte[0]; byte[] temp; // Get the corresponding signer for private key SignatureAlgorithm sigAlg = _pluginManager.GetSignatureAlgorithmByOid(privateKey.Oid); if (sigAlg == null) { throw new AlertException(AlertDescription.IllegalParameter, "Signer for given private key not found"); } // Select hash algorithm, null means SSLv3/TLSv1 hash HashAlgorithm hashAlgorithm = null; if (_version.HasSelectableSighash) { // FIXME: Not checked to be same as negotiated, but SHA-1 should be safe //byte hashAlgorithmType = 2; // SHA-1 byte hashAlgorithmType = 4; // for LMN we use SHA256 byte signAlgorithmType = sigAlg.SignatureAlgorithmType; hashAlgorithm = GetSignatureHashAlgorithm(sigAlg, hashAlgorithmType); // Update signed parameters temp = new byte[signedParams.Length + 2]; Buffer.BlockCopy(signedParams, 0, temp, 0, signedParams.Length); temp[signedParams.Length] = hashAlgorithmType; temp[signedParams.Length + 1] = signAlgorithmType; signedParams = temp; } // Sign the actual data byte[] signature = sigAlg.SignData(_version, data, hashAlgorithm, privateKey); // Add signature to the end of the signedParams temp = new byte[signedParams.Length + 2 + signature.Length]; Buffer.BlockCopy(signedParams, 0, temp, 0, signedParams.Length); temp[signedParams.Length] = (byte)(signature.Length >> 8); temp[signedParams.Length + 1] = (byte)(signature.Length); Buffer.BlockCopy(signature, 0, temp, signedParams.Length + 2, signature.Length); signedParams = temp; return signedParams; }