Идентификатор алгоритма Bouncycastle для EC_SIGN_P256_SHA256 - PullRequest
0 голосов
/ 02 апреля 2019

Мне нужно подписать сертификат с помощью ключа от KMS Google, а затем проверить, что этот сертификат был подписан этим ключом. Я использую провайдер bouncycastle для большинства вещей, но не могу найти правильный AlgorithmIdentifier для EC_SIGN_P256_SHA256 (алгоритм, который Google использует для подписи контента).

Создание сертификата выглядит так:

X509v3CertificateBuilder certificateBuilder = new X509v3CertificateBuilder(...);
ContentSigner contentSigner = new ContentSigner() {
  ...
  public AlgorithmIdentifier getAlgorithmIdentifier() {
    return new AlgorithmIdentifier(X9ObjectIdentifiers.prime256v1); // wrong
  }

  public byte[] getSignature() {
    byte[] messageHash = MessageDigest.getInstance("SHA-256").digest(this.out.toByteArray());
    return signAsymmetric(getKmsKeyName(), messageHash);
  }
}
X509CertificateHolder certificateHolder = certificateBuilder.build(contentSigner);
Certificate cert = new JcaX509CertificateConverter().getCertificate(certificateHolder);

signAsymmetric - более или менее копирование-вставка из примера Google и, похоже, все в порядке.

проверка выполняется следующим образом:

public void verifyCertificate(Certificate signatureCertificate) {
  PublicKey publicKey = getAsymmetricPublicKey(getKmsKeyName());
  signatureCertificate.verify(publicKey);
}

Если я использую prime256v1 для signatureCertificate.verify (...), это дает «java.security.NoSuchAlgorithmException: 1.2.840.10045.3.1.7 Подпись недоступна», а с некоторыми другими алгоритмами это просто дает исключение проверки подписи. Так какой же правильный путь или идентификатор алгоритма использовать? Или это вообще невозможно?

Ответы [ 2 ]

2 голосов
/ 02 апреля 2019

Полагаю, вы захотите X9ObjectIdentifiers.ecdsa_with_SHA256.

1 голос
/ 02 апреля 2019

Моя собственная ошибка (конечно), она отлично работает с "SHA256withECDSA", но я также сделал MessageDigest.getInstance("SHA-256").digest() и, конечно, я не должен этого делать. При подписании реальных данных, а не хэша, все работает нормально.

...