Index: crypto/rsa_private_key_nss.cc |
diff --git a/crypto/rsa_private_key_nss.cc b/crypto/rsa_private_key_nss.cc |
index 35697abb4e721ed7fe14f0022cab16469b2676f1..353db31c111dcecd4d83a829ab0cda5b62a3ecce 100644 |
--- a/crypto/rsa_private_key_nss.cc |
+++ b/crypto/rsa_private_key_nss.cc |
@@ -195,6 +195,31 @@ bool RSAPrivateKey::ExportPublicKey(std::vector<uint8>* output) const { |
return true; |
} |
+bool RSAPrivateKey::SignDigest(const std::vector<uint8>& digest, |
+ std::vector<uint8>* output) const { |
+ size_t signature_len = PK11_SignatureLen(key_); |
+ |
+ SECItem digest_item; |
+ digest_item.type = siBuffer; |
+ digest_item.data = const_cast<unsigned char*>(&digest[0]); |
+ digest_item.len = digest.size(); |
+ |
+ SECItem signature_item; |
+ signature_item.len = signature_len; |
+ signature_item.data = (unsigned char*) PORT_Alloc(signature_len); |
+ SECStatus rv = PK11_Sign(key_, &signature_item, &digest_item); |
+ if (rv != SECSuccess) { |
+ NOTREACHED(); |
+ SECITEM_FreeItem(&signature_item, PR_FALSE); |
+ return false; |
+ } |
+ |
+ output->assign(signature_item.data, |
+ signature_item.data + signature_item.len); |
+ SECITEM_FreeItem(&signature_item, PR_FALSE); |
+ return true; |
+} |
+ |
RSAPrivateKey::RSAPrivateKey() : key_(NULL), public_key_(NULL) { |
EnsureNSSInit(); |
} |