1/*
2 *  Licensed to the Apache Software Foundation (ASF) under one or more
3 *  contributor license agreements.  See the NOTICE file distributed with
4 *  this work for additional information regarding copyright ownership.
5 *  The ASF licenses this file to You under the Apache License, Version 2.0
6 *  (the "License"); you may not use this file except in compliance with
7 *  the License.  You may obtain a copy of the License at
8 *
9 *     http://www.apache.org/licenses/LICENSE-2.0
10 *
11 *  Unless required by applicable law or agreed to in writing, software
12 *  distributed under the License is distributed on an "AS IS" BASIS,
13 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 *  See the License for the specific language governing permissions and
15 *  limitations under the License.
16 */
17/**
18 * @author Vladimir N. Molotkov
19 */
20
21package org.apache.harmony.security.tests.support;
22
23import java.util.HashMap;
24
25/**
26 * Golden data for Message Digest related tests.<br>
27 * Encapsulates the following data:<br>
28 * - reference message<br>
29 * - reference message digests calculated using
30 * BEA JRockit j2sdk1.4.2_04 (http://www.bea.com)
31 * for various MD algorithms:
32 * SHA-1, SHA-256, SHA-384, SHA-512, MD-5.
33 * Standard algorithm names are defined in
34 * "JavaTM Cryptography Architecture API Specification & Reference"
35 */
36public class MDGoldenData {
37    // The length of test message
38    private static final int MY_MESSAGE_LEN = 1024;
39    // Test message for digest computations
40    private static final byte[] myMessage = new byte[MY_MESSAGE_LEN];
41    // Reference digests for various algorithms calculated
42    // for <code>myMessage</code>
43    private static final HashMap goldenData = new HashMap();
44
45    static {
46        // fill myMessage
47        for (int i = 0; i < myMessage.length; i++) {
48            myMessage[i] = (byte) i;
49        }
50        // fill goldenData
51        // digest updated with myMessage bytes
52        goldenData.put("SHA-1", new byte[] {
53                (byte) 0x5b, (byte) 0x00, (byte) 0x66, (byte) 0x9c,
54                (byte) 0x48, (byte) 0x0d, (byte) 0x5c, (byte) 0xff,
55                (byte) 0xbd, (byte) 0xfa, (byte) 0x8b, (byte) 0xdb,
56                (byte) 0xa9, (byte) 0x95, (byte) 0x61, (byte) 0x16,
57                (byte) 0x0f, (byte) 0x2d, (byte) 0x1b, (byte) 0x77
58        });
59        // digest without updates at all;
60        // use MD algorithm name + "_NU" if not updated MD value is needed
61        goldenData.put("SHA-1_NU", new byte[] {
62                (byte) 0xda, (byte) 0x39, (byte) 0xa3, (byte) 0xee,
63                (byte) 0x5e, (byte) 0x6b, (byte) 0x4b, (byte) 0x0d,
64                (byte) 0x32, (byte) 0x55, (byte) 0xbf, (byte) 0xef,
65                (byte) 0x95, (byte) 0x60, (byte) 0x18, (byte) 0x90,
66                (byte) 0xaf, (byte) 0xd8, (byte) 0x07, (byte) 0x09
67        });
68
69        goldenData.put("SHA", goldenData.get("SHA-1"));
70        goldenData.put("SHA_NU", goldenData.get("SHA-1_NU"));
71
72        goldenData.put("SHA1", goldenData.get("SHA-1"));
73        goldenData.put("SHA1_NU", goldenData.get("SHA-1_NU"));
74
75        goldenData.put("SHA-256", new byte[] {
76                (byte) 0x78, (byte) 0x5b, (byte) 0x07, (byte) 0x51,
77                (byte) 0xfc, (byte) 0x2c, (byte) 0x53, (byte) 0xdc,
78                (byte) 0x14, (byte) 0xa4, (byte) 0xce, (byte) 0x3d,
79                (byte) 0x80, (byte) 0x0e, (byte) 0x69, (byte) 0xef,
80                (byte) 0x9c, (byte) 0xe1, (byte) 0x00, (byte) 0x9e,
81                (byte) 0xb3, (byte) 0x27, (byte) 0xcc, (byte) 0xf4,
82                (byte) 0x58, (byte) 0xaf, (byte) 0xe0, (byte) 0x9c,
83                (byte) 0x24, (byte) 0x2c, (byte) 0x26, (byte) 0xc9
84        });
85        goldenData.put("SHA-256_NU", new byte[] {
86                (byte) 0xe3, (byte) 0xb0, (byte) 0xc4, (byte) 0x42,
87                (byte) 0x98, (byte) 0xfc, (byte) 0x1c, (byte) 0x14,
88                (byte) 0x9a, (byte) 0xfb, (byte) 0xf4, (byte) 0xc8,
89                (byte) 0x99, (byte) 0x6f, (byte) 0xb9, (byte) 0x24,
90                (byte) 0x27, (byte) 0xae, (byte) 0x41, (byte) 0xe4,
91                (byte) 0x64, (byte) 0x9b, (byte) 0x93, (byte) 0x4c,
92                (byte) 0xa4, (byte) 0x95, (byte) 0x99, (byte) 0x1b,
93                (byte) 0x78, (byte) 0x52, (byte) 0xb8, (byte) 0x55
94        });
95        goldenData.put("SHA-384", new byte[] {
96                (byte) 0x55, (byte) 0xfd, (byte) 0x17, (byte) 0xee,
97                (byte) 0xb1, (byte) 0x61, (byte) 0x1f, (byte) 0x91,
98                (byte) 0x93, (byte) 0xf6, (byte) 0xac, (byte) 0x60,
99                (byte) 0x02, (byte) 0x38, (byte) 0xce, (byte) 0x63,
100                (byte) 0xaa, (byte) 0x29, (byte) 0x8c, (byte) 0x2e,
101                (byte) 0x33, (byte) 0x2f, (byte) 0x04, (byte) 0x2b,
102                (byte) 0x80, (byte) 0xc8, (byte) 0xf6, (byte) 0x91,
103                (byte) 0xf8, (byte) 0x00, (byte) 0xe4, (byte) 0xc7,
104                (byte) 0x50, (byte) 0x5a, (byte) 0xf2, (byte) 0x0c,
105                (byte) 0x1a, (byte) 0x86, (byte) 0xa3, (byte) 0x1f,
106                (byte) 0x08, (byte) 0x50, (byte) 0x45, (byte) 0x87,
107                (byte) 0x39, (byte) 0x5f, (byte) 0x08, (byte) 0x1f
108        });
109        goldenData.put("SHA-384_NU", new byte[] {
110                (byte) 0x38, (byte) 0xb0, (byte) 0x60, (byte) 0xa7,
111                (byte) 0x51, (byte) 0xac, (byte) 0x96, (byte) 0x38,
112                (byte) 0x4c, (byte) 0xd9, (byte) 0x32, (byte) 0x7e,
113                (byte) 0xb1, (byte) 0xb1, (byte) 0xe3, (byte) 0x6a,
114                (byte) 0x21, (byte) 0xfd, (byte) 0xb7, (byte) 0x11,
115                (byte) 0x14, (byte) 0xbe, (byte) 0x07, (byte) 0x43,
116                (byte) 0x4c, (byte) 0x0c, (byte) 0xc7, (byte) 0xbf,
117                (byte) 0x63, (byte) 0xf6, (byte) 0xe1, (byte) 0xda,
118                (byte) 0x27, (byte) 0x4e, (byte) 0xde, (byte) 0xbf,
119                (byte) 0xe7, (byte) 0x6f, (byte) 0x65, (byte) 0xfb,
120                (byte) 0xd5, (byte) 0x1a, (byte) 0xd2, (byte) 0xf1,
121                (byte) 0x48, (byte) 0x98, (byte) 0xb9, (byte) 0x5b
122        });
123        goldenData.put("SHA-512", new byte[] {
124                (byte) 0x37, (byte) 0xf6, (byte) 0x52, (byte) 0xbe,
125                (byte) 0x86, (byte) 0x7f, (byte) 0x28, (byte) 0xed,
126                (byte) 0x03, (byte) 0x32, (byte) 0x69, (byte) 0xcb,
127                (byte) 0xba, (byte) 0x20, (byte) 0x1a, (byte) 0xf2,
128                (byte) 0x11, (byte) 0x2c, (byte) 0x2b, (byte) 0x3f,
129                (byte) 0xd3, (byte) 0x34, (byte) 0xa8, (byte) 0x9f,
130                (byte) 0xd2, (byte) 0xf7, (byte) 0x57, (byte) 0x93,
131                (byte) 0x8d, (byte) 0xde, (byte) 0xe8, (byte) 0x15,
132                (byte) 0x78, (byte) 0x7c, (byte) 0xc6, (byte) 0x1d,
133                (byte) 0x6e, (byte) 0x24, (byte) 0xa8, (byte) 0xa3,
134                (byte) 0x33, (byte) 0x40, (byte) 0xd0, (byte) 0xf7,
135                (byte) 0xe8, (byte) 0x6f, (byte) 0xfc, (byte) 0x05,
136                (byte) 0x88, (byte) 0x16, (byte) 0xb8, (byte) 0x85,
137                (byte) 0x30, (byte) 0x76, (byte) 0x6b, (byte) 0xa6,
138                (byte) 0xe2, (byte) 0x31, (byte) 0x62, (byte) 0x0a,
139                (byte) 0x13, (byte) 0x0b, (byte) 0x56, (byte) 0x6c
140        });
141        goldenData.put("SHA-512_NU", new byte[] {
142                (byte) 0xcf, (byte) 0x83, (byte) 0xe1, (byte) 0x35,
143                (byte) 0x7e, (byte) 0xef, (byte) 0xb8, (byte) 0xbd,
144                (byte) 0xf1, (byte) 0x54, (byte) 0x28, (byte) 0x50,
145                (byte) 0xd6, (byte) 0x6d, (byte) 0x80, (byte) 0x07,
146                (byte) 0xd6, (byte) 0x20, (byte) 0xe4, (byte) 0x05,
147                (byte) 0x0b, (byte) 0x57, (byte) 0x15, (byte) 0xdc,
148                (byte) 0x83, (byte) 0xf4, (byte) 0xa9, (byte) 0x21,
149                (byte) 0xd3, (byte) 0x6c, (byte) 0xe9, (byte) 0xce,
150                (byte) 0x47, (byte) 0xd0, (byte) 0xd1, (byte) 0x3c,
151                (byte) 0x5d, (byte) 0x85, (byte) 0xf2, (byte) 0xb0,
152                (byte) 0xff, (byte) 0x83, (byte) 0x18, (byte) 0xd2,
153                (byte) 0x87, (byte) 0x7e, (byte) 0xec, (byte) 0x2f,
154                (byte) 0x63, (byte) 0xb9, (byte) 0x31, (byte) 0xbd,
155                (byte) 0x47, (byte) 0x41, (byte) 0x7a, (byte) 0x81,
156                (byte) 0xa5, (byte) 0x38, (byte) 0x32, (byte) 0x7a,
157                (byte) 0xf9, (byte) 0x27, (byte) 0xda, (byte) 0x3e
158        });
159        goldenData.put("MD5", new byte[] {
160                (byte) 0xb2, (byte) 0xea, (byte) 0x9f, (byte) 0x7f,
161                (byte) 0xce, (byte) 0xa8, (byte) 0x31, (byte) 0xa4,
162                (byte) 0xa6, (byte) 0x3b, (byte) 0x21, (byte) 0x3f,
163                (byte) 0x41, (byte) 0xa8, (byte) 0x85, (byte) 0x5b
164        });
165        goldenData.put("MD5_NU", new byte[] {
166                (byte) 0xd4, (byte) 0x1d, (byte) 0x8c, (byte) 0xd9,
167                (byte) 0x8f, (byte) 0x00, (byte) 0xb2, (byte) 0x04,
168                (byte) 0xe9, (byte) 0x80, (byte) 0x09, (byte) 0x98,
169                (byte) 0xec, (byte) 0xf8, (byte) 0x42, (byte) 0x7e
170        });
171    }
172
173    // No need to instantiate
174    private MDGoldenData() {
175    }
176
177    /**
178     * Returns reference message
179     *
180     * @return reference message
181     */
182    public static byte[] getMessage() {
183        return myMessage.clone();
184    }
185
186    /**
187     * Returns digest golden data
188     *
189     * @param key MD algorithm name or MD algorithm name + "_NU" if
190     *            not updated MD value requested
191     * @return reference digest for specified MD algorithm name
192     */
193    public static byte[] getDigest(String key) {
194        return ((byte[]) goldenData.get(key)).clone();
195    }
196
197}
198