001    package org.apache.commons.openpgp;
002    
003    /*
004     * Licensed to the Apache Software Foundation (ASF) under one or more
005     * contributor license agreements.  See the NOTICE file distributed with
006     * this work for additional information regarding copyright ownership.
007     * The ASF licenses this file to You under the Apache License, Version 2.0
008     * (the "License"); you may not use this file except in compliance with
009     * the License.  You may obtain a copy of the License at
010     *
011     *      http://www.apache.org/licenses/LICENSE-2.0
012     *
013     * Unless required by applicable law or agreed to in writing, software
014     * distributed under the License is distributed on an "AS IS" BASIS,
015     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
016     * See the License for the specific language governing permissions and
017     * limitations under the License.
018     */
019    
020    import static org.junit.Assert.assertNotNull;
021    import static org.junit.Assert.assertTrue;
022    
023    import java.io.ByteArrayInputStream;
024    import java.io.IOException;
025    import java.io.InputStream;
026    
027    import org.junit.Before;
028    import org.junit.Test;
029    
030    /**
031     * Test the open pgp signer.
032     *
033     * @author <a href="mailto:brett@apache.org">Brett Porter</a>
034     * @todo test text input as well as binary - apparently it fails cross platform
035     */
036    public class BouncyCastleOpenPgpStreamingSignerTest
037    {
038        private String keyId = "A7D16BD4";
039    
040        private KeyRing keyRing;
041    
042        private static final String PASSWORD = "cop";
043    
044        @Before
045        public void setUp()
046            throws Exception
047        {
048            keyRing = new BouncyCastleKeyRing( getClass().getResourceAsStream( "/secring.gpg" ),
049                                               getClass().getResourceAsStream( "/pubring.gpg" ), PASSWORD.toCharArray() );
050        }
051    
052        @Test
053        public void testSignDataDetachedBinary()
054            throws OpenPgpException, IOException
055        {
056            OpenPgpStreamingSigner signer = new BouncyCastleOpenPgpStreamingSigner( keyId, keyRing, false );
057    
058            InputStream in = getClass().getResourceAsStream( "/test-input" );
059            byte[] buf = new byte[8192];
060            int len;
061            try
062            {
063                do
064                {
065                    len = in.read( buf, 0, 8192 );
066                    if ( len > 0 )
067                    {
068                        signer.update( buf, 0, len );
069                    }
070                }
071                while ( len >= 0 );
072            }
073            finally
074            {
075                in.close();
076            }
077    
078            byte[] signature = signer.finish();
079    
080            OpenPgpSignatureVerifier verifier = new BouncyCastleOpenPgpSignatureVerifier();
081    
082            SignatureStatus status =
083                verifier.verifyDetachedSignature( getClass().getResourceAsStream( "/test-input" ),
084                                                  new ByteArrayInputStream( signature ), keyRing );
085            assertNotNull( "check we got a status", status );
086            assertTrue( "check it was successful", status.isValid() );
087        }
088    
089        @Test
090        public void testVerifySignatureDetachedBinary()
091            throws IOException, OpenPgpException
092        {
093            InputStream signature = getClass().getResourceAsStream( "/test-input.bpg" );
094            OpenPgpStreamingSignatureVerifier verifier =
095                new BouncyCastleOpenPgpStreamingSignatureVerifier( signature, keyRing );
096    
097            InputStream in = getClass().getResourceAsStream( "/test-input" );
098            byte[] buf = new byte[8192];
099            int len;
100            try
101            {
102                do
103                {
104                    len = in.read( buf, 0, 8192 );
105                    if ( len > 0 )
106                    {
107                        verifier.update( buf, 0, len );
108                    }
109                }
110                while ( len >= 0 );
111            }
112            finally
113            {
114                in.close();
115            }
116    
117            SignatureStatus status = verifier.finish();
118    
119            assertNotNull( "check we got a status", status );
120            assertTrue( "check it was successful", status.isValid() );
121        }
122    
123        @Test
124        public void testVerifySignatureDetachedBinaryGpg()
125            throws IOException, OpenPgpException
126        {
127            InputStream signature = getClass().getResourceAsStream( "/test-input.sig" );
128            OpenPgpStreamingSignatureVerifier verifier =
129                new BouncyCastleOpenPgpStreamingSignatureVerifier( signature, keyRing );
130    
131            InputStream in = getClass().getResourceAsStream( "/test-input" );
132            byte[] buf = new byte[8192];
133            int len;
134            try
135            {
136                do
137                {
138                    len = in.read( buf, 0, 8192 );
139                    if ( len > 0 )
140                    {
141                        verifier.update( buf, 0, len );
142                    }
143                }
144                while ( len >= 0 );
145            }
146            finally
147            {
148                in.close();
149            }
150    
151            SignatureStatus status = verifier.finish();
152    
153            assertNotNull( "check we got a status", status );
154            assertTrue( "check it was successful", status.isValid() );
155        }
156    
157        @Test
158        public void testSignDataDetachedAscii()
159            throws OpenPgpException, IOException
160        {
161            OpenPgpStreamingSigner signer = new BouncyCastleOpenPgpStreamingSigner( keyId, keyRing, true );
162    
163            InputStream in = getClass().getResourceAsStream( "/test-input" );
164            byte[] buf = new byte[8192];
165            int len;
166            try
167            {
168                do
169                {
170                    len = in.read( buf, 0, 8192 );
171                    if ( len > 0 )
172                    {
173                        signer.update( buf, 0, len );
174                    }
175                }
176                while ( len >= 0 );
177            }
178            finally
179            {
180                in.close();
181            }
182    
183            byte[] signature = signer.finish();
184    
185            OpenPgpSignatureVerifier verifier = new BouncyCastleOpenPgpSignatureVerifier();
186    
187            SignatureStatus status =
188                verifier.verifyDetachedSignature( getClass().getResourceAsStream( "/test-input" ),
189                                                  new ByteArrayInputStream( signature ), keyRing );
190            assertNotNull( "check we got a status", status );
191            assertTrue( "check it was successful", status.isValid() );
192        }
193    
194        @Test
195        public void testVerifySignatureDetachedAscii()
196            throws IOException, OpenPgpException
197        {
198            InputStream signature = getClass().getResourceAsStream( "/test-input.asc" );
199            OpenPgpStreamingSignatureVerifier verifier =
200                new BouncyCastleOpenPgpStreamingSignatureVerifier( signature, keyRing );
201    
202            InputStream in = getClass().getResourceAsStream( "/test-input" );
203            byte[] buf = new byte[8192];
204            int len;
205            try
206            {
207                do
208                {
209                    len = in.read( buf, 0, 8192 );
210                    if ( len > 0 )
211                    {
212                        verifier.update( buf, 0, len );
213                    }
214                }
215                while ( len >= 0 );
216            }
217            finally
218            {
219                in.close();
220            }
221    
222            SignatureStatus status = verifier.finish();
223    
224            assertNotNull( "check we got a status", status );
225            assertTrue( "check it was successful", status.isValid() );
226        }
227    }