Я сам не пробовал ваш код, но думаю, что проблема в дайджесте сообщений, который вы добавляете в качестве атрибута MessageDigest, а не в том, что вы действительно добавляете в SignedData.Я вижу, что вы сначала подписываете данные, используя JCA.
Signature signature = Signature.getInstance("SHA256withRSA", new BouncyCastleProvider());
byte[] test_data = "test".getBytes();
signature.initSign(kp.getPrivate());
signature.update(test_data);
CMSTypedData data = new CMSProcessableByteArray(signature.sign());
...
CMSSignedData signedData = gen.generate(data, true);
Здесь вы помещаете подпись (а не данные, что странно) для генерации CMSSignedData.Таким образом, для contentSigner ваша подпись - это фактические данные , которые должны быть подписаны.Однако в атрибуте MessageDigest вы помещаете дайджест фактических данных.Это, скорее всего, вызывает проблему.
Теперь перейдем к более важному вопросу.Почему вы подписываете данные, используя вышеуказанный код?Это кажется неправильным для меня и, вероятно, не то, что вы хотите.Если ваша цель состоит в том, чтобы сгенерировать подписанные данные CMS для «тестовых» данных, вы должны использовать их непосредственно в signatureDataGenerator, и это позаботится о подписывающей части.
Пожалуйста, просмотрите RFC если вы еще этого не сделали.
Надеюсь, это поможет.