001 // Copyright (C) 2002 IAIK 002 // https://jce.iaik.tugraz.at 003 // 004 // Copyright (C) 2003 - 2025 Stiftung Secure Information and 005 // Communication Technologies SIC 006 // https://sic.tech 007 // 008 // All rights reserved. 009 // 010 // Redistribution and use in source and binary forms, with or without 011 // modification, are permitted provided that the following conditions 012 // are met: 013 // 1. Redistributions of source code must retain the above copyright 014 // notice, this list of conditions and the following disclaimer. 015 // 2. Redistributions in binary form must reproduce the above copyright 016 // notice, this list of conditions and the following disclaimer in the 017 // documentation and/or other materials provided with the distribution. 018 // 019 // THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 020 // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 021 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 022 // ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 023 // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 024 // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 025 // OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 026 // HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 027 // LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 028 // OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 029 // SUCH DAMAGE. 030 031 package demo.smime.ess; 032 033 import iaik.cms.CMSException; 034 import iaik.cms.SignerInfo; 035 import iaik.smime.ess.SigningCertificate; 036 import iaik.smime.ess.SigningCertificateV2; 037 038 import java.io.IOException; 039 import java.security.cert.Certificate; 040 041 import demo.DemoUtil; 042 043 /** 044 * Demonstrates how to add and parse a {@link iaik.smime.ess.SigningCertificateV2 045 * SigningCertificateV2} attribute to the SignerInfo of a {@link iaik.cms.SignedDataStream} or 046 * {@link iaik.cms.SignedData} object. The SigningCertificateV2 attributes maybe used 047 * to include certificate identification information into the signed attributes of a 048 * CMS {@link iaik.cms.SignerInfo SignerInfo} object. It has been introduced by 049 * RFC 5035 to allow to use the {@link iaik.smime.ess.SigningCertificate 050 * SigningCertificate} attribute with other hash algorithms than SHA-1. 051 * 052 * @see iaik.smime.ess.SigningCertificate 053 * @see iaik.smime.ess.SigningCertificateV2 054 * @see iaik.cms.SignerInfo 055 * @see iaik.cms.SignedDataStream 056 * @see iaik.cms.SignedData 057 */ 058 public class SigningCertificateV2Demo extends SigningCertificateDemo { 059 060 /** 061 * Setups the demo certificate chains. 062 * 063 * Keys and certificate are retrieved from the demo KeyStore. 064 * 065 * @throws IOException if an file read error occurs 066 */ 067 public SigningCertificateV2Demo() throws IOException { 068 super(); 069 } 070 071 /** 072 * Creates a SigningCertificateV2 attribute for the given certificates. 073 * 074 * @param certs the certificates for which to create the SigningCertificateV2 075 * attribute 076 * 077 * @return the SigningCertificate attribute just created 078 * 079 * @throws CMSException if an error occurs when creating the 080 * SigningCertificateV2 attribute 081 */ 082 protected SigningCertificate createSigningCertificate(Certificate[] certs) 083 throws CMSException { 084 085 try { 086 // we use the default hash algorithm (SHA-256) 087 return new SigningCertificateV2(certs, true); 088 } catch (Exception ex) { 089 throw new CMSException("Error creating SigningCertificateV2 attribute: " + ex.toString()); 090 } 091 } 092 093 /** 094 * Gets the SigningCertificateV2 attribute from the given SignerInfo. 095 * 096 * @param signerInfo the SignerInfo from which to get the 097 * SigningCertificateV2 attribute 098 * 099 * @return the SigningCertificateV2 attribute, or <code>null</code> 100 * if no SigningCertificate attribute is included 101 * 102 * @throws CMSException if an error occurs when getting the 103 * SigningCertificateV2 attribute 104 */ 105 protected SigningCertificate getSigningCertificate(SignerInfo signerInfo) 106 throws CMSException { 107 108 return signerInfo.getSigningCertificateV2Attribute(); 109 } 110 111 /** 112 * Prints some header lines to System.out. 113 */ 114 protected void printHeader() { 115 System.out.println(); 116 System.out.println("**********************************************************************************"); 117 System.out.println("* SigningCertificateV2Demo demo *"); 118 System.out.println("* (shows the usage of the ESS SigningCertificateV2 attribute) *"); 119 System.out.println("**********************************************************************************"); 120 System.out.println(); 121 } 122 123 /** 124 * The main method. 125 * 126 * @throws IOException 127 * if an I/O error occurs when reading required keys 128 * and certificates from files 129 */ 130 public static void main(String[] args) throws Exception { 131 DemoUtil.initDemos(); 132 (new SigningCertificateV2Demo()).start(); 133 System.out.println("\nReady!"); 134 DemoUtil.waitKey(); 135 136 } 137 138 }