1*c2c66affSColin Finck /* 2*c2c66affSColin Finck * Unit test suite for cryptui.dll 3*c2c66affSColin Finck * 4*c2c66affSColin Finck * Copyright 2008 Juan Lang 5*c2c66affSColin Finck * 6*c2c66affSColin Finck * This library is free software; you can redistribute it and/or 7*c2c66affSColin Finck * modify it under the terms of the GNU Lesser General Public 8*c2c66affSColin Finck * License as published by the Free Software Foundation; either 9*c2c66affSColin Finck * version 2.1 of the License, or (at your option) any later version. 10*c2c66affSColin Finck * 11*c2c66affSColin Finck * This library is distributed in the hope that it will be useful, 12*c2c66affSColin Finck * but WITHOUT ANY WARRANTY; without even the implied warranty of 13*c2c66affSColin Finck * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14*c2c66affSColin Finck * Lesser General Public License for more details. 15*c2c66affSColin Finck * 16*c2c66affSColin Finck * You should have received a copy of the GNU Lesser General Public 17*c2c66affSColin Finck * License along with this library; if not, write to the Free Software 18*c2c66affSColin Finck * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA 19*c2c66affSColin Finck */ 20*c2c66affSColin Finck #include <stdarg.h> 21*c2c66affSColin Finck //#include <stdio.h> 22*c2c66affSColin Finck #define NONAMELESSUNION 23*c2c66affSColin Finck #include <windef.h> 24*c2c66affSColin Finck #include <winbase.h> 25*c2c66affSColin Finck //#include <winerror.h> 26*c2c66affSColin Finck #include <winuser.h> 27*c2c66affSColin Finck //#include <wincrypt.h> 28*c2c66affSColin Finck #include <cryptuiapi.h> 29*c2c66affSColin Finck 30*c2c66affSColin Finck #include <wine/test.h> 31*c2c66affSColin Finck 32*c2c66affSColin Finck static BYTE v1CertWithValidPubKey[] = { 33*c2c66affSColin Finck 0x30,0x81,0xcf,0x02,0x01,0x01,0x30,0x02,0x06,0x00,0x30,0x15,0x31,0x13,0x30, 34*c2c66affSColin Finck 0x11,0x06,0x03,0x55,0x04,0x03,0x13,0x0a,0x4a,0x75,0x61,0x6e,0x20,0x4c,0x61, 35*c2c66affSColin Finck 0x6e,0x67,0x00,0x30,0x22,0x18,0x0f,0x31,0x36,0x30,0x31,0x30,0x31,0x30,0x31, 36*c2c66affSColin Finck 0x30,0x30,0x30,0x30,0x30,0x30,0x5a,0x18,0x0f,0x31,0x36,0x30,0x31,0x30,0x31, 37*c2c66affSColin Finck 0x30,0x31,0x30,0x30,0x30,0x30,0x30,0x30,0x5a,0x30,0x15,0x31,0x13,0x30,0x11, 38*c2c66affSColin Finck 0x06,0x03,0x55,0x04,0x03,0x13,0x0a,0x4a,0x75,0x61,0x6e,0x20,0x4c,0x61,0x6e, 39*c2c66affSColin Finck 0x67,0x00,0x30,0x5c,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01, 40*c2c66affSColin Finck 0x01,0x01,0x05,0x00,0x03,0x4b,0x00,0x30,0x48,0x02,0x41,0x00,0xe2,0x54,0x3a, 41*c2c66affSColin Finck 0xa7,0x83,0xb1,0x27,0x14,0x3e,0x59,0xbb,0xb4,0x53,0xe6,0x1f,0xe7,0x5d,0xf1, 42*c2c66affSColin Finck 0x21,0x68,0xad,0x85,0x53,0xdb,0x6b,0x1e,0xeb,0x65,0x97,0x03,0x86,0x60,0xde, 43*c2c66affSColin Finck 0xf3,0x6c,0x38,0x75,0xe0,0x4c,0x61,0xbb,0xbc,0x62,0x17,0xa9,0xcd,0x79,0x3f, 44*c2c66affSColin Finck 0x21,0x4e,0x96,0xcb,0x0e,0xdc,0x61,0x94,0x30,0x18,0x10,0x6b,0xd0,0x1c,0x10, 45*c2c66affSColin Finck 0x79,0x02,0x03,0x01,0x00,0x01,0xa3,0x16,0x30,0x14,0x30,0x12,0x06,0x03,0x55, 46*c2c66affSColin Finck 0x1d,0x13,0x01,0x01,0xff,0x04,0x08,0x30,0x06,0x01,0x01,0xff,0x02,0x01,0x01 }; 47*c2c66affSColin Finck static const BYTE iTunesCert1[] = { 48*c2c66affSColin Finck 0x30,0x82,0x03,0xff,0x30,0x82,0x02,0xe7,0xa0,0x03,0x02,0x01,0x02,0x02,0x10, 49*c2c66affSColin Finck 0x0d,0xe9,0x2b,0xf0,0xd4,0xd8,0x29,0x88,0x18,0x32,0x05,0x09,0x5e,0x9a,0x76, 50*c2c66affSColin Finck 0x88,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05,0x05, 51*c2c66affSColin Finck 0x00,0x30,0x53,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55, 52*c2c66affSColin Finck 0x53,0x31,0x17,0x30,0x15,0x06,0x03,0x55,0x04,0x0a,0x13,0x0e,0x56,0x65,0x72, 53*c2c66affSColin Finck 0x69,0x53,0x69,0x67,0x6e,0x2c,0x20,0x49,0x6e,0x63,0x2e,0x31,0x2b,0x30,0x29, 54*c2c66affSColin Finck 0x06,0x03,0x55,0x04,0x03,0x13,0x22,0x56,0x65,0x72,0x69,0x53,0x69,0x67,0x6e, 55*c2c66affSColin Finck 0x20,0x54,0x69,0x6d,0x65,0x20,0x53,0x74,0x61,0x6d,0x70,0x69,0x6e,0x67,0x20, 56*c2c66affSColin Finck 0x53,0x65,0x72,0x76,0x69,0x63,0x65,0x73,0x20,0x43,0x41,0x30,0x1e,0x17,0x0d, 57*c2c66affSColin Finck 0x30,0x33,0x31,0x32,0x30,0x34,0x30,0x30,0x30,0x30,0x30,0x30,0x5a,0x17,0x0d, 58*c2c66affSColin Finck 0x30,0x38,0x31,0x32,0x30,0x33,0x32,0x33,0x35,0x39,0x35,0x39,0x5a,0x30,0x57, 59*c2c66affSColin Finck 0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x17, 60*c2c66affSColin Finck 0x30,0x15,0x06,0x03,0x55,0x04,0x0a,0x13,0x0e,0x56,0x65,0x72,0x69,0x53,0x69, 61*c2c66affSColin Finck 0x67,0x6e,0x2c,0x20,0x49,0x6e,0x63,0x2e,0x31,0x2f,0x30,0x2d,0x06,0x03,0x55, 62*c2c66affSColin Finck 0x04,0x03,0x13,0x26,0x56,0x65,0x72,0x69,0x53,0x69,0x67,0x6e,0x20,0x54,0x69, 63*c2c66affSColin Finck 0x6d,0x65,0x20,0x53,0x74,0x61,0x6d,0x70,0x69,0x6e,0x67,0x20,0x53,0x65,0x72, 64*c2c66affSColin Finck 0x76,0x69,0x63,0x65,0x73,0x20,0x53,0x69,0x67,0x6e,0x65,0x72,0x30,0x82,0x01, 65*c2c66affSColin Finck 0x22,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x01,0x05, 66*c2c66affSColin Finck 0x00,0x03,0x82,0x01,0x0f,0x00,0x30,0x82,0x01,0x0a,0x02,0x82,0x01,0x01,0x00, 67*c2c66affSColin Finck 0xb2,0x50,0x28,0x48,0xdd,0xd3,0x68,0x7a,0x84,0x18,0x44,0x66,0x75,0x5d,0x7e, 68*c2c66affSColin Finck 0xc4,0xb8,0x9f,0x63,0x26,0xff,0x3d,0x43,0x9c,0x7c,0x11,0x38,0x10,0x25,0x55, 69*c2c66affSColin Finck 0x73,0xd9,0x75,0x27,0x69,0xfd,0x4e,0xb9,0x20,0x5c,0xd3,0x0a,0xf9,0xa0,0x1b, 70*c2c66affSColin Finck 0x2a,0xed,0x55,0x56,0x21,0x61,0xd8,0x1e,0xdb,0xe4,0xbc,0x33,0x6b,0xc7,0xef, 71*c2c66affSColin Finck 0xdd,0xa3,0x37,0x65,0x8e,0x1b,0x93,0x0c,0xb6,0x53,0x1e,0x5c,0x7c,0x66,0x35, 72*c2c66affSColin Finck 0x5f,0x05,0x8a,0x45,0xfe,0x76,0x4e,0xdf,0x53,0x80,0xa2,0x81,0x20,0x9d,0xae, 73*c2c66affSColin Finck 0x88,0x5c,0xa2,0x08,0xf7,0xe5,0x30,0xf9,0xee,0x22,0x37,0x4c,0x42,0x0a,0xce, 74*c2c66affSColin Finck 0xdf,0xc6,0x1f,0xc4,0xd6,0x55,0xe9,0x81,0x3f,0xb5,0x52,0xa3,0x2c,0xaa,0x01, 75*c2c66affSColin Finck 0x7a,0xf2,0xa2,0xaa,0x8d,0x35,0xfe,0x9f,0xe6,0x5d,0x6a,0x05,0x9f,0x3d,0x6b, 76*c2c66affSColin Finck 0xe3,0xbf,0x96,0xc0,0xfe,0xcc,0x60,0xf9,0x40,0xe7,0x07,0xa0,0x44,0xeb,0x81, 77*c2c66affSColin Finck 0x51,0x6e,0xa5,0x2a,0xf2,0xb6,0x8a,0x10,0x28,0xed,0x8f,0xdc,0x06,0xa0,0x86, 78*c2c66affSColin Finck 0x50,0x9a,0x7b,0x4a,0x08,0x0d,0x30,0x1d,0xca,0x10,0x9e,0x6b,0xf7,0xe9,0x58, 79*c2c66affSColin Finck 0xae,0x04,0xa9,0x40,0x99,0xb2,0x28,0xe8,0x8f,0x16,0xac,0x3c,0xe3,0x53,0x6f, 80*c2c66affSColin Finck 0x4b,0xd3,0x35,0x9d,0xb5,0x6f,0x64,0x1d,0xb3,0x96,0x2c,0xbb,0x3d,0xe7,0x79, 81*c2c66affSColin Finck 0xeb,0x6d,0x7a,0xf9,0x16,0xe6,0x26,0xad,0xaf,0xef,0x99,0x53,0xb7,0x40,0x2c, 82*c2c66affSColin Finck 0x95,0xb8,0x79,0xaa,0xfe,0xd4,0x52,0xab,0x29,0x74,0x7e,0x42,0xec,0x39,0x1e, 83*c2c66affSColin Finck 0xa2,0x6a,0x16,0xe6,0x59,0xbb,0x24,0x68,0xd8,0x00,0x80,0x43,0x10,0x87,0x80, 84*c2c66affSColin Finck 0x6b,0x02,0x03,0x01,0x00,0x01,0xa3,0x81,0xca,0x30,0x81,0xc7,0x30,0x34,0x06, 85*c2c66affSColin Finck 0x08,0x2b,0x06,0x01,0x05,0x05,0x07,0x01,0x01,0x04,0x28,0x30,0x26,0x30,0x24, 86*c2c66affSColin Finck 0x06,0x08,0x2b,0x06,0x01,0x05,0x05,0x07,0x30,0x01,0x86,0x18,0x68,0x74,0x74, 87*c2c66affSColin Finck 0x70,0x3a,0x2f,0x2f,0x6f,0x63,0x73,0x70,0x2e,0x76,0x65,0x72,0x69,0x73,0x69, 88*c2c66affSColin Finck 0x67,0x6e,0x2e,0x63,0x6f,0x6d,0x30,0x0c,0x06,0x03,0x55,0x1d,0x13,0x01,0x01, 89*c2c66affSColin Finck 0xff,0x04,0x02,0x30,0x00,0x30,0x33,0x06,0x03,0x55,0x1d,0x1f,0x04,0x2c,0x30, 90*c2c66affSColin Finck 0x2a,0x30,0x28,0xa0,0x26,0xa0,0x24,0x86,0x22,0x68,0x74,0x74,0x70,0x3a,0x2f, 91*c2c66affSColin Finck 0x2f,0x63,0x72,0x6c,0x2e,0x76,0x65,0x72,0x69,0x73,0x69,0x67,0x6e,0x2e,0x63, 92*c2c66affSColin Finck 0x6f,0x6d,0x2f,0x74,0x73,0x73,0x2d,0x63,0x61,0x2e,0x63,0x72,0x6c,0x30,0x16, 93*c2c66affSColin Finck 0x06,0x03,0x55,0x1d,0x25,0x01,0x01,0xff,0x04,0x0c,0x30,0x0a,0x06,0x08,0x2b, 94*c2c66affSColin Finck 0x06,0x01,0x05,0x05,0x07,0x03,0x08,0x30,0x0e,0x06,0x03,0x55,0x1d,0x0f,0x01, 95*c2c66affSColin Finck 0x01,0xff,0x04,0x04,0x03,0x02,0x06,0xc0,0x30,0x24,0x06,0x03,0x55,0x1d,0x11, 96*c2c66affSColin Finck 0x04,0x1d,0x30,0x1b,0xa4,0x19,0x30,0x17,0x31,0x15,0x30,0x13,0x06,0x03,0x55, 97*c2c66affSColin Finck 0x04,0x03,0x13,0x0c,0x54,0x53,0x41,0x32,0x30,0x34,0x38,0x2d,0x31,0x2d,0x35, 98*c2c66affSColin Finck 0x34,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05,0x05, 99*c2c66affSColin Finck 0x00,0x03,0x82,0x01,0x01,0x00,0x87,0x78,0x70,0xda,0x4e,0x52,0x01,0x20,0x5b, 100*c2c66affSColin Finck 0xe0,0x79,0xc9,0x82,0x30,0xc4,0xfd,0xb9,0x19,0x96,0xbd,0x91,0x00,0xc3,0xbd, 101*c2c66affSColin Finck 0xcd,0xcd,0xc6,0xf4,0x0e,0xd8,0xff,0xf9,0x4d,0xc0,0x33,0x62,0x30,0x11,0xc5, 102*c2c66affSColin Finck 0xf5,0x74,0x1b,0xd4,0x92,0xde,0x5f,0x9c,0x20,0x13,0xb1,0x7c,0x45,0xbe,0x50, 103*c2c66affSColin Finck 0xcd,0x83,0xe7,0x80,0x17,0x83,0xa7,0x27,0x93,0x67,0x13,0x46,0xfb,0xca,0xb8, 104*c2c66affSColin Finck 0x98,0x41,0x03,0xcc,0x9b,0x51,0x5b,0x05,0x8b,0x7f,0xa8,0x6f,0xf3,0x1b,0x50, 105*c2c66affSColin Finck 0x1b,0x24,0x2e,0xf2,0x69,0x8d,0x6c,0x22,0xf7,0xbb,0xca,0x16,0x95,0xed,0x0c, 106*c2c66affSColin Finck 0x74,0xc0,0x68,0x77,0xd9,0xeb,0x99,0x62,0x87,0xc1,0x73,0x90,0xf8,0x89,0x74, 107*c2c66affSColin Finck 0x7a,0x23,0xab,0xa3,0x98,0x7b,0x97,0xb1,0xf7,0x8f,0x29,0x71,0x4d,0x2e,0x75, 108*c2c66affSColin Finck 0x1b,0x48,0x41,0xda,0xf0,0xb5,0x0d,0x20,0x54,0xd6,0x77,0xa0,0x97,0x82,0x63, 109*c2c66affSColin Finck 0x69,0xfd,0x09,0xcf,0x8a,0xf0,0x75,0xbb,0x09,0x9b,0xd9,0xf9,0x11,0x55,0x26, 110*c2c66affSColin Finck 0x9a,0x61,0x32,0xbe,0x7a,0x02,0xb0,0x7b,0x86,0xbe,0xa2,0xc3,0x8b,0x22,0x2c, 111*c2c66affSColin Finck 0x78,0xd1,0x35,0x76,0xbc,0x92,0x73,0x5c,0xf9,0xb9,0xe6,0x4c,0x15,0x0a,0x23, 112*c2c66affSColin Finck 0xcc,0xe4,0xd2,0xd4,0x34,0x2e,0x49,0x40,0x15,0x3c,0x0f,0x60,0x7a,0x24,0xc6, 113*c2c66affSColin Finck 0xa5,0x66,0xef,0x96,0xcf,0x70,0xeb,0x3e,0xe7,0xf4,0x0d,0x7e,0xdc,0xd1,0x7c, 114*c2c66affSColin Finck 0xa3,0x76,0x71,0x69,0xc1,0x9c,0x4f,0x47,0x30,0x35,0x21,0xb1,0xa2,0xaf,0x1a, 115*c2c66affSColin Finck 0x62,0x3c,0x2b,0xd9,0x8e,0xaa,0x2a,0x07,0x7b,0xd8,0x18,0xb3,0x5c,0x7b,0xe2, 116*c2c66affSColin Finck 0x9d,0xa5,0x6f,0xfe,0x3c,0x89,0xad }; 117*c2c66affSColin Finck static const BYTE iTunesCert2[] = { 118*c2c66affSColin Finck 0x30,0x82,0x04,0xbf,0x30,0x82,0x04,0x28,0xa0,0x03,0x02,0x01,0x02,0x02,0x10, 119*c2c66affSColin Finck 0x41,0x91,0xa1,0x5a,0x39,0x78,0xdf,0xcf,0x49,0x65,0x66,0x38,0x1d,0x4c,0x75, 120*c2c66affSColin Finck 0xc2,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05,0x05, 121*c2c66affSColin Finck 0x00,0x30,0x5f,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55, 122*c2c66affSColin Finck 0x53,0x31,0x17,0x30,0x15,0x06,0x03,0x55,0x04,0x0a,0x13,0x0e,0x56,0x65,0x72, 123*c2c66affSColin Finck 0x69,0x53,0x69,0x67,0x6e,0x2c,0x20,0x49,0x6e,0x63,0x2e,0x31,0x37,0x30,0x35, 124*c2c66affSColin Finck 0x06,0x03,0x55,0x04,0x0b,0x13,0x2e,0x43,0x6c,0x61,0x73,0x73,0x20,0x33,0x20, 125*c2c66affSColin Finck 0x50,0x75,0x62,0x6c,0x69,0x63,0x20,0x50,0x72,0x69,0x6d,0x61,0x72,0x79,0x20, 126*c2c66affSColin Finck 0x43,0x65,0x72,0x74,0x69,0x66,0x69,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x41, 127*c2c66affSColin Finck 0x75,0x74,0x68,0x6f,0x72,0x69,0x74,0x79,0x30,0x1e,0x17,0x0d,0x30,0x34,0x30, 128*c2c66affSColin Finck 0x37,0x31,0x36,0x30,0x30,0x30,0x30,0x30,0x30,0x5a,0x17,0x0d,0x31,0x34,0x30, 129*c2c66affSColin Finck 0x37,0x31,0x35,0x32,0x33,0x35,0x39,0x35,0x39,0x5a,0x30,0x81,0xb4,0x31,0x0b, 130*c2c66affSColin Finck 0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x17,0x30,0x15, 131*c2c66affSColin Finck 0x06,0x03,0x55,0x04,0x0a,0x13,0x0e,0x56,0x65,0x72,0x69,0x53,0x69,0x67,0x6e, 132*c2c66affSColin Finck 0x2c,0x20,0x49,0x6e,0x63,0x2e,0x31,0x1f,0x30,0x1d,0x06,0x03,0x55,0x04,0x0b, 133*c2c66affSColin Finck 0x13,0x16,0x56,0x65,0x72,0x69,0x53,0x69,0x67,0x6e,0x20,0x54,0x72,0x75,0x73, 134*c2c66affSColin Finck 0x74,0x20,0x4e,0x65,0x74,0x77,0x6f,0x72,0x6b,0x31,0x3b,0x30,0x39,0x06,0x03, 135*c2c66affSColin Finck 0x55,0x04,0x0b,0x13,0x32,0x54,0x65,0x72,0x6d,0x73,0x20,0x6f,0x66,0x20,0x75, 136*c2c66affSColin Finck 0x73,0x65,0x20,0x61,0x74,0x20,0x68,0x74,0x74,0x70,0x73,0x3a,0x2f,0x2f,0x77, 137*c2c66affSColin Finck 0x77,0x77,0x2e,0x76,0x65,0x72,0x69,0x73,0x69,0x67,0x6e,0x2e,0x63,0x6f,0x6d, 138*c2c66affSColin Finck 0x2f,0x72,0x70,0x61,0x20,0x28,0x63,0x29,0x30,0x34,0x31,0x2e,0x30,0x2c,0x06, 139*c2c66affSColin Finck 0x03,0x55,0x04,0x03,0x13,0x25,0x56,0x65,0x72,0x69,0x53,0x69,0x67,0x6e,0x20, 140*c2c66affSColin Finck 0x43,0x6c,0x61,0x73,0x73,0x20,0x33,0x20,0x43,0x6f,0x64,0x65,0x20,0x53,0x69, 141*c2c66affSColin Finck 0x67,0x6e,0x69,0x6e,0x67,0x20,0x32,0x30,0x30,0x34,0x20,0x43,0x41,0x30,0x82, 142*c2c66affSColin Finck 0x01,0x22,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x01, 143*c2c66affSColin Finck 0x05,0x00,0x03,0x82,0x01,0x0f,0x00,0x30,0x82,0x01,0x0a,0x02,0x82,0x01,0x01, 144*c2c66affSColin Finck 0x00,0xbe,0xbc,0xee,0xbc,0x7e,0xef,0x83,0xeb,0xe0,0x37,0x4f,0xfb,0x03,0x10, 145*c2c66affSColin Finck 0x38,0xbe,0x08,0xd2,0x8c,0x7d,0x9d,0xfa,0x92,0x7f,0x19,0x0c,0xc2,0x6b,0xee, 146*c2c66affSColin Finck 0x42,0x52,0x8c,0xde,0xd3,0x1c,0x48,0x13,0x25,0xea,0xc1,0x63,0x7a,0xf9,0x51, 147*c2c66affSColin Finck 0x65,0xee,0xd3,0xaa,0x3b,0xf5,0xf0,0x94,0x9c,0x2b,0xfb,0xf2,0x66,0xd4,0x24, 148*c2c66affSColin Finck 0xda,0xf7,0xf5,0x9f,0x6e,0x19,0x39,0x36,0xbc,0xd0,0xa3,0x76,0x08,0x1e,0x22, 149*c2c66affSColin Finck 0x27,0x24,0x6c,0x38,0x91,0x27,0xe2,0x84,0x49,0xae,0x1b,0x8a,0xa1,0xfd,0x25, 150*c2c66affSColin Finck 0x82,0x2c,0x10,0x30,0xe8,0x71,0xab,0x28,0xe8,0x77,0x4a,0x51,0xf1,0xec,0xcd, 151*c2c66affSColin Finck 0xf8,0xf0,0x54,0xd4,0x6f,0xc0,0xe3,0x6d,0x0a,0x8f,0xd9,0xd8,0x64,0x8d,0x63, 152*c2c66affSColin Finck 0xb2,0x2d,0x4e,0x27,0xf6,0x85,0x0e,0xfe,0x6d,0xe3,0x29,0x99,0xe2,0x85,0x47, 153*c2c66affSColin Finck 0x7c,0x2d,0x86,0x7f,0xe8,0x57,0x8f,0xad,0x67,0xc2,0x33,0x32,0x91,0x13,0x20, 154*c2c66affSColin Finck 0xfc,0xa9,0x23,0x14,0x9a,0x6d,0xc2,0x84,0x4b,0x76,0x68,0x04,0xd5,0x71,0x2c, 155*c2c66affSColin Finck 0x5d,0x21,0xfa,0x88,0x0d,0x26,0xfd,0x1f,0x2d,0x91,0x2b,0xe7,0x01,0x55,0x4d, 156*c2c66affSColin Finck 0xf2,0x6d,0x35,0x28,0x82,0xdf,0xd9,0x6b,0x5c,0xb6,0xd6,0xd9,0xaa,0x81,0xfd, 157*c2c66affSColin Finck 0x5f,0xcd,0x83,0xba,0x63,0x9d,0xd0,0x22,0xfc,0xa9,0x3b,0x42,0x69,0xb2,0x8e, 158*c2c66affSColin Finck 0x3a,0xb5,0xbc,0xb4,0x9e,0x0f,0x5e,0xc4,0xea,0x2c,0x82,0x8b,0x28,0xfd,0x53, 159*c2c66affSColin Finck 0x08,0x96,0xdd,0xb5,0x01,0x20,0xd1,0xf9,0xa5,0x18,0xe7,0xc0,0xee,0x51,0x70, 160*c2c66affSColin Finck 0x37,0xe1,0xb6,0x05,0x48,0x52,0x48,0x6f,0x38,0xea,0xc3,0xe8,0x6c,0x7b,0x44, 161*c2c66affSColin Finck 0x84,0xbb,0x02,0x03,0x01,0x00,0x01,0xa3,0x82,0x01,0xa0,0x30,0x82,0x01,0x9c, 162*c2c66affSColin Finck 0x30,0x12,0x06,0x03,0x55,0x1d,0x13,0x01,0x01,0xff,0x04,0x08,0x30,0x06,0x01, 163*c2c66affSColin Finck 0x01,0xff,0x02,0x01,0x00,0x30,0x44,0x06,0x03,0x55,0x1d,0x20,0x04,0x3d,0x30, 164*c2c66affSColin Finck 0x3b,0x30,0x39,0x06,0x0b,0x60,0x86,0x48,0x01,0x86,0xf8,0x45,0x01,0x07,0x17, 165*c2c66affSColin Finck 0x03,0x30,0x2a,0x30,0x28,0x06,0x08,0x2b,0x06,0x01,0x05,0x05,0x07,0x02,0x01, 166*c2c66affSColin Finck 0x16,0x1c,0x68,0x74,0x74,0x70,0x73,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x76, 167*c2c66affSColin Finck 0x65,0x72,0x69,0x73,0x69,0x67,0x6e,0x2e,0x63,0x6f,0x6d,0x2f,0x72,0x70,0x61, 168*c2c66affSColin Finck 0x30,0x31,0x06,0x03,0x55,0x1d,0x1f,0x04,0x2a,0x30,0x28,0x30,0x26,0xa0,0x24, 169*c2c66affSColin Finck 0xa0,0x22,0x86,0x20,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x63,0x72,0x6c,0x2e, 170*c2c66affSColin Finck 0x76,0x65,0x72,0x69,0x73,0x69,0x67,0x6e,0x2e,0x63,0x6f,0x6d,0x2f,0x70,0x63, 171*c2c66affSColin Finck 0x61,0x33,0x2e,0x63,0x72,0x6c,0x30,0x1d,0x06,0x03,0x55,0x1d,0x25,0x04,0x16, 172*c2c66affSColin Finck 0x30,0x14,0x06,0x08,0x2b,0x06,0x01,0x05,0x05,0x07,0x03,0x02,0x06,0x08,0x2b, 173*c2c66affSColin Finck 0x06,0x01,0x05,0x05,0x07,0x03,0x03,0x30,0x0e,0x06,0x03,0x55,0x1d,0x0f,0x01, 174*c2c66affSColin Finck 0x01,0xff,0x04,0x04,0x03,0x02,0x01,0x06,0x30,0x11,0x06,0x09,0x60,0x86,0x48, 175*c2c66affSColin Finck 0x01,0x86,0xf8,0x42,0x01,0x01,0x04,0x04,0x03,0x02,0x00,0x01,0x30,0x29,0x06, 176*c2c66affSColin Finck 0x03,0x55,0x1d,0x11,0x04,0x22,0x30,0x20,0xa4,0x1e,0x30,0x1c,0x31,0x1a,0x30, 177*c2c66affSColin Finck 0x18,0x06,0x03,0x55,0x04,0x03,0x13,0x11,0x43,0x6c,0x61,0x73,0x73,0x33,0x43, 178*c2c66affSColin Finck 0x41,0x32,0x30,0x34,0x38,0x2d,0x31,0x2d,0x34,0x33,0x30,0x1d,0x06,0x03,0x55, 179*c2c66affSColin Finck 0x1d,0x0e,0x04,0x16,0x04,0x14,0x08,0xf5,0x51,0xe8,0xfb,0xfe,0x3d,0x3d,0x64, 180*c2c66affSColin Finck 0x36,0x7c,0x68,0xcf,0x5b,0x78,0xa8,0xdf,0xb9,0xc5,0x37,0x30,0x81,0x80,0x06, 181*c2c66affSColin Finck 0x03,0x55,0x1d,0x23,0x04,0x79,0x30,0x77,0xa1,0x63,0xa4,0x61,0x30,0x5f,0x31, 182*c2c66affSColin Finck 0x0b,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x17,0x30, 183*c2c66affSColin Finck 0x15,0x06,0x03,0x55,0x04,0x0a,0x13,0x0e,0x56,0x65,0x72,0x69,0x53,0x69,0x67, 184*c2c66affSColin Finck 0x6e,0x2c,0x20,0x49,0x6e,0x63,0x2e,0x31,0x37,0x30,0x35,0x06,0x03,0x55,0x04, 185*c2c66affSColin Finck 0x0b,0x13,0x2e,0x43,0x6c,0x61,0x73,0x73,0x20,0x33,0x20,0x50,0x75,0x62,0x6c, 186*c2c66affSColin Finck 0x69,0x63,0x20,0x50,0x72,0x69,0x6d,0x61,0x72,0x79,0x20,0x43,0x65,0x72,0x74, 187*c2c66affSColin Finck 0x69,0x66,0x69,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x41,0x75,0x74,0x68,0x6f, 188*c2c66affSColin Finck 0x72,0x69,0x74,0x79,0x82,0x10,0x70,0xba,0xe4,0x1d,0x10,0xd9,0x29,0x34,0xb6, 189*c2c66affSColin Finck 0x38,0xca,0x7b,0x03,0xcc,0xba,0xbf,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86, 190*c2c66affSColin Finck 0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x03,0x81,0x81,0x00,0xae,0x3a,0x17,0xb8, 191*c2c66affSColin Finck 0x4a,0x7b,0x55,0xfa,0x64,0x55,0xec,0x40,0xa4,0xed,0x49,0x41,0x90,0x99,0x9c, 192*c2c66affSColin Finck 0x89,0xbc,0xaf,0x2e,0x1d,0xca,0x78,0x23,0xf9,0x1c,0x19,0x0f,0x7f,0xeb,0x68, 193*c2c66affSColin Finck 0xbc,0x32,0xd9,0x88,0x38,0xde,0xdc,0x3f,0xd3,0x89,0xb4,0x3f,0xb1,0x82,0x96, 194*c2c66affSColin Finck 0xf1,0xa4,0x5a,0xba,0xed,0x2e,0x26,0xd3,0xde,0x7c,0x01,0x6e,0x00,0x0a,0x00, 195*c2c66affSColin Finck 0xa4,0x06,0x92,0x11,0x48,0x09,0x40,0xf9,0x1c,0x18,0x79,0x67,0x23,0x24,0xe0, 196*c2c66affSColin Finck 0xbb,0xd5,0xe1,0x50,0xae,0x1b,0xf5,0x0e,0xdd,0xe0,0x2e,0x81,0xcd,0x80,0xa3, 197*c2c66affSColin Finck 0x6c,0x52,0x4f,0x91,0x75,0x55,0x8a,0xba,0x22,0xf2,0xd2,0xea,0x41,0x75,0x88, 198*c2c66affSColin Finck 0x2f,0x63,0x55,0x7d,0x1e,0x54,0x5a,0x95,0x59,0xca,0xd9,0x34,0x81,0xc0,0x5f, 199*c2c66affSColin Finck 0x5e,0xf6,0x7a,0xb5 }; 200*c2c66affSColin Finck static const BYTE iTunesCert3[] = { 201*c2c66affSColin Finck 0x30,0x82,0x04,0xf1,0x30,0x82,0x03,0xd9,0xa0,0x03,0x02,0x01,0x02,0x02,0x10, 202*c2c66affSColin Finck 0x0f,0x1a,0xa0,0xe0,0x9b,0x9b,0x61,0xa6,0xb6,0xfe,0x40,0xd2,0xdf,0x6a,0xf6, 203*c2c66affSColin Finck 0x8d,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05,0x05, 204*c2c66affSColin Finck 0x00,0x30,0x81,0xb4,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02, 205*c2c66affSColin Finck 0x55,0x53,0x31,0x17,0x30,0x15,0x06,0x03,0x55,0x04,0x0a,0x13,0x0e,0x56,0x65, 206*c2c66affSColin Finck 0x72,0x69,0x53,0x69,0x67,0x6e,0x2c,0x20,0x49,0x6e,0x63,0x2e,0x31,0x1f,0x30, 207*c2c66affSColin Finck 0x1d,0x06,0x03,0x55,0x04,0x0b,0x13,0x16,0x56,0x65,0x72,0x69,0x53,0x69,0x67, 208*c2c66affSColin Finck 0x6e,0x20,0x54,0x72,0x75,0x73,0x74,0x20,0x4e,0x65,0x74,0x77,0x6f,0x72,0x6b, 209*c2c66affSColin Finck 0x31,0x3b,0x30,0x39,0x06,0x03,0x55,0x04,0x0b,0x13,0x32,0x54,0x65,0x72,0x6d, 210*c2c66affSColin Finck 0x73,0x20,0x6f,0x66,0x20,0x75,0x73,0x65,0x20,0x61,0x74,0x20,0x68,0x74,0x74, 211*c2c66affSColin Finck 0x70,0x73,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x76,0x65,0x72,0x69,0x73,0x69, 212*c2c66affSColin Finck 0x67,0x6e,0x2e,0x63,0x6f,0x6d,0x2f,0x72,0x70,0x61,0x20,0x28,0x63,0x29,0x30, 213*c2c66affSColin Finck 0x34,0x31,0x2e,0x30,0x2c,0x06,0x03,0x55,0x04,0x03,0x13,0x25,0x56,0x65,0x72, 214*c2c66affSColin Finck 0x69,0x53,0x69,0x67,0x6e,0x20,0x43,0x6c,0x61,0x73,0x73,0x20,0x33,0x20,0x43, 215*c2c66affSColin Finck 0x6f,0x64,0x65,0x20,0x53,0x69,0x67,0x6e,0x69,0x6e,0x67,0x20,0x32,0x30,0x30, 216*c2c66affSColin Finck 0x34,0x20,0x43,0x41,0x30,0x1e,0x17,0x0d,0x30,0x36,0x30,0x31,0x31,0x37,0x30, 217*c2c66affSColin Finck 0x30,0x30,0x30,0x30,0x30,0x5a,0x17,0x0d,0x30,0x38,0x30,0x31,0x32,0x32,0x32, 218*c2c66affSColin Finck 0x33,0x35,0x39,0x35,0x39,0x5a,0x30,0x81,0xb4,0x31,0x0b,0x30,0x09,0x06,0x03, 219*c2c66affSColin Finck 0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x13,0x30,0x11,0x06,0x03,0x55,0x04, 220*c2c66affSColin Finck 0x08,0x13,0x0a,0x43,0x61,0x6c,0x69,0x66,0x6f,0x72,0x6e,0x69,0x61,0x31,0x12, 221*c2c66affSColin Finck 0x30,0x10,0x06,0x03,0x55,0x04,0x07,0x13,0x09,0x43,0x75,0x70,0x65,0x72,0x74, 222*c2c66affSColin Finck 0x69,0x6e,0x6f,0x31,0x1d,0x30,0x1b,0x06,0x03,0x55,0x04,0x0a,0x14,0x14,0x41, 223*c2c66affSColin Finck 0x70,0x70,0x6c,0x65,0x20,0x43,0x6f,0x6d,0x70,0x75,0x74,0x65,0x72,0x2c,0x20, 224*c2c66affSColin Finck 0x49,0x6e,0x63,0x2e,0x31,0x3e,0x30,0x3c,0x06,0x03,0x55,0x04,0x0b,0x13,0x35, 225*c2c66affSColin Finck 0x44,0x69,0x67,0x69,0x74,0x61,0x6c,0x20,0x49,0x44,0x20,0x43,0x6c,0x61,0x73, 226*c2c66affSColin Finck 0x73,0x20,0x33,0x20,0x2d,0x20,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74, 227*c2c66affSColin Finck 0x20,0x53,0x6f,0x66,0x74,0x77,0x61,0x72,0x65,0x20,0x56,0x61,0x6c,0x69,0x64, 228*c2c66affSColin Finck 0x61,0x74,0x69,0x6f,0x6e,0x20,0x76,0x32,0x31,0x1d,0x30,0x1b,0x06,0x03,0x55, 229*c2c66affSColin Finck 0x04,0x03,0x14,0x14,0x41,0x70,0x70,0x6c,0x65,0x20,0x43,0x6f,0x6d,0x70,0x75, 230*c2c66affSColin Finck 0x74,0x65,0x72,0x2c,0x20,0x49,0x6e,0x63,0x2e,0x30,0x81,0x9f,0x30,0x0d,0x06, 231*c2c66affSColin Finck 0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x01,0x05,0x00,0x03,0x81,0x8d, 232*c2c66affSColin Finck 0x00,0x30,0x81,0x89,0x02,0x81,0x81,0x00,0xd3,0xab,0x3b,0x7f,0xec,0x48,0x84, 233*c2c66affSColin Finck 0xce,0xa8,0x1a,0x12,0xf3,0x3c,0x87,0xcb,0x24,0x58,0x96,0x02,0x87,0x66,0x49, 234*c2c66affSColin Finck 0xeb,0x89,0xee,0x79,0x44,0x70,0x8d,0xe7,0xd4,0x1f,0x30,0x92,0xc0,0x9c,0x35, 235*c2c66affSColin Finck 0x78,0xc0,0xaf,0x1c,0xb6,0x28,0xd3,0xe0,0xe0,0x9d,0xd3,0x49,0x76,0x73,0x57, 236*c2c66affSColin Finck 0x19,0x4d,0x8d,0x70,0x85,0x64,0x4d,0x1d,0xc6,0x02,0x3e,0xe5,0x2c,0x66,0x07, 237*c2c66affSColin Finck 0xd2,0x27,0x4b,0xd6,0xc8,0x3c,0x93,0xb6,0x15,0x0c,0xde,0x5b,0xd7,0x93,0xdd, 238*c2c66affSColin Finck 0xbe,0x85,0x62,0x34,0x17,0x8a,0x05,0x60,0xf0,0x8a,0x1c,0x5a,0x40,0x21,0x8d, 239*c2c66affSColin Finck 0x51,0x6c,0xb0,0x62,0xd8,0xb5,0xd4,0xf9,0xb1,0xd0,0x58,0x7a,0x7a,0x82,0x55, 240*c2c66affSColin Finck 0xb3,0xf9,0x53,0x71,0xde,0xd2,0xc9,0x37,0x8c,0xf6,0x5a,0x1f,0x2d,0xcd,0x7c, 241*c2c66affSColin Finck 0x67,0x02,0x03,0x01,0x00,0x01,0xa3,0x82,0x01,0x7f,0x30,0x82,0x01,0x7b,0x30, 242*c2c66affSColin Finck 0x09,0x06,0x03,0x55,0x1d,0x13,0x04,0x02,0x30,0x00,0x30,0x0e,0x06,0x03,0x55, 243*c2c66affSColin Finck 0x1d,0x0f,0x01,0x01,0xff,0x04,0x04,0x03,0x02,0x07,0x80,0x30,0x40,0x06,0x03, 244*c2c66affSColin Finck 0x55,0x1d,0x1f,0x04,0x39,0x30,0x37,0x30,0x35,0xa0,0x33,0xa0,0x31,0x86,0x2f, 245*c2c66affSColin Finck 0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x43,0x53,0x43,0x33,0x2d,0x32,0x30,0x30, 246*c2c66affSColin Finck 0x34,0x2d,0x63,0x72,0x6c,0x2e,0x76,0x65,0x72,0x69,0x73,0x69,0x67,0x6e,0x2e, 247*c2c66affSColin Finck 0x63,0x6f,0x6d,0x2f,0x43,0x53,0x43,0x33,0x2d,0x32,0x30,0x30,0x34,0x2e,0x63, 248*c2c66affSColin Finck 0x72,0x6c,0x30,0x44,0x06,0x03,0x55,0x1d,0x20,0x04,0x3d,0x30,0x3b,0x30,0x39, 249*c2c66affSColin Finck 0x06,0x0b,0x60,0x86,0x48,0x01,0x86,0xf8,0x45,0x01,0x07,0x17,0x03,0x30,0x2a, 250*c2c66affSColin Finck 0x30,0x28,0x06,0x08,0x2b,0x06,0x01,0x05,0x05,0x07,0x02,0x01,0x16,0x1c,0x68, 251*c2c66affSColin Finck 0x74,0x74,0x70,0x73,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x76,0x65,0x72,0x69, 252*c2c66affSColin Finck 0x73,0x69,0x67,0x6e,0x2e,0x63,0x6f,0x6d,0x2f,0x72,0x70,0x61,0x30,0x13,0x06, 253*c2c66affSColin Finck 0x03,0x55,0x1d,0x25,0x04,0x0c,0x30,0x0a,0x06,0x08,0x2b,0x06,0x01,0x05,0x05, 254*c2c66affSColin Finck 0x07,0x03,0x03,0x30,0x75,0x06,0x08,0x2b,0x06,0x01,0x05,0x05,0x07,0x01,0x01, 255*c2c66affSColin Finck 0x04,0x69,0x30,0x67,0x30,0x24,0x06,0x08,0x2b,0x06,0x01,0x05,0x05,0x07,0x30, 256*c2c66affSColin Finck 0x01,0x86,0x18,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x6f,0x63,0x73,0x70,0x2e, 257*c2c66affSColin Finck 0x76,0x65,0x72,0x69,0x73,0x69,0x67,0x6e,0x2e,0x63,0x6f,0x6d,0x30,0x3f,0x06, 258*c2c66affSColin Finck 0x08,0x2b,0x06,0x01,0x05,0x05,0x07,0x30,0x02,0x86,0x33,0x68,0x74,0x74,0x70, 259*c2c66affSColin Finck 0x3a,0x2f,0x2f,0x43,0x53,0x43,0x33,0x2d,0x32,0x30,0x30,0x34,0x2d,0x61,0x69, 260*c2c66affSColin Finck 0x61,0x2e,0x76,0x65,0x72,0x69,0x73,0x69,0x67,0x6e,0x2e,0x63,0x6f,0x6d,0x2f, 261*c2c66affSColin Finck 0x43,0x53,0x43,0x33,0x2d,0x32,0x30,0x30,0x34,0x2d,0x61,0x69,0x61,0x2e,0x63, 262*c2c66affSColin Finck 0x65,0x72,0x30,0x1f,0x06,0x03,0x55,0x1d,0x23,0x04,0x18,0x30,0x16,0x80,0x14, 263*c2c66affSColin Finck 0x08,0xf5,0x51,0xe8,0xfb,0xfe,0x3d,0x3d,0x64,0x36,0x7c,0x68,0xcf,0x5b,0x78, 264*c2c66affSColin Finck 0xa8,0xdf,0xb9,0xc5,0x37,0x30,0x11,0x06,0x09,0x60,0x86,0x48,0x01,0x86,0xf8, 265*c2c66affSColin Finck 0x42,0x01,0x01,0x04,0x04,0x03,0x02,0x04,0x10,0x30,0x16,0x06,0x0a,0x2b,0x06, 266*c2c66affSColin Finck 0x01,0x04,0x01,0x82,0x37,0x02,0x01,0x1b,0x04,0x08,0x30,0x06,0x01,0x01,0x00, 267*c2c66affSColin Finck 0x01,0x01,0xff,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01, 268*c2c66affSColin Finck 0x05,0x05,0x00,0x03,0x82,0x01,0x01,0x00,0x6a,0xa6,0x06,0xd0,0x33,0x18,0x64, 269*c2c66affSColin Finck 0xe2,0x69,0x82,0xee,0x6e,0x36,0x9e,0x9d,0x9a,0x0e,0x18,0xa8,0xac,0x9d,0x10, 270*c2c66affSColin Finck 0xed,0x01,0x3c,0xb9,0x61,0x04,0x62,0xf3,0x85,0x8f,0xcc,0x4f,0x2c,0x66,0x35, 271*c2c66affSColin Finck 0x54,0x25,0x45,0x8d,0x95,0x1c,0xd2,0x33,0xbe,0x2e,0xdd,0x7f,0x74,0xaf,0x03, 272*c2c66affSColin Finck 0x7b,0x86,0x63,0xb0,0xc9,0xe6,0xbd,0xc7,0x8e,0xde,0x03,0x18,0x98,0x82,0xc3, 273*c2c66affSColin Finck 0xbb,0xf8,0x15,0x99,0x1a,0xa9,0xdd,0xb9,0x5d,0xb9,0xbd,0x53,0x95,0x25,0x76, 274*c2c66affSColin Finck 0xfb,0x5c,0x53,0x90,0xea,0x01,0x0a,0xa0,0xb1,0xbf,0x09,0x1b,0x97,0x8f,0x40, 275*c2c66affSColin Finck 0xfa,0x85,0x12,0x74,0x01,0xdb,0xf6,0xdb,0x09,0xd6,0x5f,0x4f,0xd7,0x17,0xb4, 276*c2c66affSColin Finck 0xbf,0x9e,0x2f,0x86,0x52,0x5d,0x70,0x24,0x52,0x32,0x1e,0xa5,0x1d,0x39,0x8b, 277*c2c66affSColin Finck 0x66,0xf6,0xba,0x9b,0x69,0x8e,0x12,0x60,0xdb,0xb6,0xcf,0xe6,0x0d,0xd6,0x1c, 278*c2c66affSColin Finck 0x8f,0xd4,0x5b,0x4b,0x00,0xde,0x21,0x93,0xfb,0x6e,0xc7,0x3d,0xb4,0x66,0x0d, 279*c2c66affSColin Finck 0x29,0x0c,0x4e,0xe9,0x3f,0x94,0xd6,0xd6,0xdc,0xec,0xf8,0x53,0x3b,0x62,0xd5, 280*c2c66affSColin Finck 0x97,0x50,0x53,0x84,0x17,0xfe,0xe2,0xed,0x4c,0x23,0x0a,0x49,0xce,0x5b,0xe9, 281*c2c66affSColin Finck 0x70,0x31,0xc1,0x04,0x02,0x02,0x6c,0xb8,0x52,0xcd,0xc7,0x4e,0x70,0xb4,0x13, 282*c2c66affSColin Finck 0xd7,0xe0,0x92,0xba,0x44,0x1a,0x10,0x4c,0x6e,0x45,0xc6,0x86,0x04,0xc6,0x64, 283*c2c66affSColin Finck 0xd3,0x9c,0x6e,0xc1,0x9c,0xac,0x74,0x3d,0x77,0x06,0x5e,0x28,0x28,0x5c,0xf5, 284*c2c66affSColin Finck 0xe0,0x9c,0x19,0xd8,0xba,0x74,0x81,0x2d,0x67,0x77,0x93,0x8d,0xbf,0xd2,0x52, 285*c2c66affSColin Finck 0x00,0xe6,0xa5,0x38,0x4e,0x2e,0x73,0x66,0x7a }; 286*c2c66affSColin Finck static const BYTE signedCRL[] = { 0x30, 0x45, 0x30, 0x2c, 0x30, 0x02, 0x06, 287*c2c66affSColin Finck 0x00, 0x30, 0x15, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 288*c2c66affSColin Finck 0x0a, 0x4a, 0x75, 0x61, 0x6e, 0x20, 0x4c, 0x61, 0x6e, 0x67, 0x00, 0x18, 0x0f, 289*c2c66affSColin Finck 0x31, 0x36, 0x30, 0x31, 0x30, 0x31, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 290*c2c66affSColin Finck 0x30, 0x5a, 0x30, 0x02, 0x06, 0x00, 0x03, 0x11, 0x00, 0x0f, 0x0e, 0x0d, 0x0c, 291*c2c66affSColin Finck 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00 }; 292*c2c66affSColin Finck 293*c2c66affSColin Finck /* CBT hook to ensure a window (e.g., MessageBox) cannot be created */ 294*c2c66affSColin Finck static HHOOK hook; 295*c2c66affSColin Finck static LRESULT CALLBACK cbt_hook_proc(int code, WPARAM wp, LPARAM lp) 296*c2c66affSColin Finck { 297*c2c66affSColin Finck return code == HCBT_CREATEWND ? 1: CallNextHookEx(hook, code, wp, lp); 298*c2c66affSColin Finck } 299*c2c66affSColin Finck 300*c2c66affSColin Finck static BOOL (WINAPI *pCryptUIWizImport)(DWORD dwFlags, HWND hwndParent, 301*c2c66affSColin Finck LPCWSTR pwszWizardTitle, PCCRYPTUI_WIZ_IMPORT_SRC_INFO pImportSrc, 302*c2c66affSColin Finck HCERTSTORE hDestCertStore); 303*c2c66affSColin Finck 304*c2c66affSColin Finck static BOOL find_and_delete_cert_in_store(HCERTSTORE store, PCCERT_CONTEXT cert) 305*c2c66affSColin Finck { 306*c2c66affSColin Finck CERT_ID id; 307*c2c66affSColin Finck PCCERT_CONTEXT found; 308*c2c66affSColin Finck 309*c2c66affSColin Finck id.dwIdChoice = CERT_ID_ISSUER_SERIAL_NUMBER; 310*c2c66affSColin Finck memcpy(&id.u.IssuerSerialNumber.Issuer, 311*c2c66affSColin Finck &cert->pCertInfo->Issuer, sizeof(CERT_NAME_BLOB)); 312*c2c66affSColin Finck memcpy(&id.u.IssuerSerialNumber.SerialNumber, 313*c2c66affSColin Finck &cert->pCertInfo->SerialNumber, sizeof(CRYPT_INTEGER_BLOB)); 314*c2c66affSColin Finck found = CertFindCertificateInStore(store, X509_ASN_ENCODING, 0, 315*c2c66affSColin Finck CERT_FIND_CERT_ID, &id, NULL); 316*c2c66affSColin Finck if (!found) 317*c2c66affSColin Finck return FALSE; 318*c2c66affSColin Finck 319*c2c66affSColin Finck CertDeleteCertificateFromStore(found); 320*c2c66affSColin Finck 321*c2c66affSColin Finck return TRUE; 322*c2c66affSColin Finck } 323*c2c66affSColin Finck 324*c2c66affSColin Finck static void test_crypt_ui_wiz_import(void) 325*c2c66affSColin Finck { 326*c2c66affSColin Finck BOOL ret; 327*c2c66affSColin Finck CRYPTUI_WIZ_IMPORT_SRC_INFO info; 328*c2c66affSColin Finck HCERTSTORE store; 329*c2c66affSColin Finck PCCERT_CONTEXT cert; 330*c2c66affSColin Finck PCCRL_CONTEXT crl; 331*c2c66affSColin Finck DWORD count; 332*c2c66affSColin Finck 333*c2c66affSColin Finck if (!pCryptUIWizImport) 334*c2c66affSColin Finck { 335*c2c66affSColin Finck skip("No CryptUIWizImport\n"); 336*c2c66affSColin Finck return; 337*c2c66affSColin Finck } 338*c2c66affSColin Finck 339*c2c66affSColin Finck /* Set CBT hook to disallow MessageBox and wizard creation in current 340*c2c66affSColin Finck * thread. 341*c2c66affSColin Finck */ 342*c2c66affSColin Finck hook = SetWindowsHookExA(WH_CBT, cbt_hook_proc, 0, GetCurrentThreadId()); 343*c2c66affSColin Finck 344*c2c66affSColin Finck /* Brings up UI. Cancelling yields ret = 1. */ 345*c2c66affSColin Finck if (0) 346*c2c66affSColin Finck { 347*c2c66affSColin Finck pCryptUIWizImport(0, 0, NULL, NULL, NULL); 348*c2c66affSColin Finck } 349*c2c66affSColin Finck SetLastError(0xdeadbeef); 350*c2c66affSColin Finck ret = pCryptUIWizImport(CRYPTUI_WIZ_NO_UI, 0, NULL, NULL, NULL); 351*c2c66affSColin Finck ok(!ret && GetLastError() == E_INVALIDARG, 352*c2c66affSColin Finck "expected E_INVALIDARG, got %08x\n", GetLastError()); 353*c2c66affSColin Finck memset(&info, 0, sizeof(info)); 354*c2c66affSColin Finck SetLastError(0xdeadbeef); 355*c2c66affSColin Finck ret = pCryptUIWizImport(CRYPTUI_WIZ_NO_UI, 0, NULL, &info, NULL); 356*c2c66affSColin Finck ok(!ret && GetLastError() == E_INVALIDARG, 357*c2c66affSColin Finck "expected E_INVALIDARG, got %08x\n", GetLastError()); 358*c2c66affSColin Finck info.dwSize = sizeof(info); 359*c2c66affSColin Finck SetLastError(0xdeadbeef); 360*c2c66affSColin Finck ret = pCryptUIWizImport(CRYPTUI_WIZ_NO_UI, 0, NULL, &info, NULL); 361*c2c66affSColin Finck ok(!ret && GetLastError() == E_INVALIDARG, 362*c2c66affSColin Finck "expected E_INVALIDARG, got %08x\n", GetLastError()); 363*c2c66affSColin Finck info.dwSubjectChoice = CRYPTUI_WIZ_IMPORT_SUBJECT_CERT_CONTEXT; 364*c2c66affSColin Finck SetLastError(0xdeadbeef); 365*c2c66affSColin Finck ret = pCryptUIWizImport(CRYPTUI_WIZ_NO_UI, 0, NULL, &info, NULL); 366*c2c66affSColin Finck ok(!ret && GetLastError() == E_INVALIDARG, 367*c2c66affSColin Finck "expected E_INVALIDARG, got %08x\n", GetLastError()); 368*c2c66affSColin Finck SetLastError(0xdeadbeef); 369*c2c66affSColin Finck ret = pCryptUIWizImport(CRYPTUI_WIZ_NO_UI | CRYPTUI_WIZ_IMPORT_ALLOW_CERT, 370*c2c66affSColin Finck 0, NULL, &info, NULL); 371*c2c66affSColin Finck ok(!ret && GetLastError() == E_INVALIDARG, 372*c2c66affSColin Finck "expected E_INVALIDARG, got %08x\n", GetLastError()); 373*c2c66affSColin Finck /* Check allowed vs. given type mismatches */ 374*c2c66affSColin Finck info.u.pCertContext = CertCreateCertificateContext(X509_ASN_ENCODING, 375*c2c66affSColin Finck v1CertWithValidPubKey, sizeof(v1CertWithValidPubKey)); 376*c2c66affSColin Finck SetLastError(0xdeadbeef); 377*c2c66affSColin Finck ret = pCryptUIWizImport(CRYPTUI_WIZ_NO_UI | CRYPTUI_WIZ_IMPORT_ALLOW_CRL, 378*c2c66affSColin Finck 0, NULL, &info, NULL); 379*c2c66affSColin Finck ok(!ret && GetLastError() == E_INVALIDARG, 380*c2c66affSColin Finck "expected E_INVALIDARG, got %08x\n", GetLastError()); 381*c2c66affSColin Finck CertFreeCertificateContext(info.u.pCertContext); 382*c2c66affSColin Finck info.dwSubjectChoice = CRYPTUI_WIZ_IMPORT_SUBJECT_CRL_CONTEXT; 383*c2c66affSColin Finck info.u.pCRLContext = CertCreateCRLContext(X509_ASN_ENCODING, 384*c2c66affSColin Finck signedCRL, sizeof(signedCRL)); 385*c2c66affSColin Finck SetLastError(0xdeadbeef); 386*c2c66affSColin Finck ret = pCryptUIWizImport(CRYPTUI_WIZ_NO_UI | CRYPTUI_WIZ_IMPORT_ALLOW_CERT, 387*c2c66affSColin Finck 0, NULL, &info, NULL); 388*c2c66affSColin Finck ok(!ret && GetLastError() == E_INVALIDARG, 389*c2c66affSColin Finck "expected E_INVALIDARG, got %08x\n", GetLastError()); 390*c2c66affSColin Finck CertFreeCRLContext(info.u.pCRLContext); 391*c2c66affSColin Finck /* Imports the following cert--self-signed, with no basic constraints set-- 392*c2c66affSColin Finck * to the CA store. Puts up a dialog at the end if it succeeds or fails. 393*c2c66affSColin Finck */ 394*c2c66affSColin Finck info.dwSubjectChoice = CRYPTUI_WIZ_IMPORT_SUBJECT_CERT_CONTEXT; 395*c2c66affSColin Finck info.u.pCertContext = CertCreateCertificateContext(X509_ASN_ENCODING, 396*c2c66affSColin Finck v1CertWithValidPubKey, sizeof(v1CertWithValidPubKey)); 397*c2c66affSColin Finck ret = pCryptUIWizImport(CRYPTUI_WIZ_NO_UI, 0, NULL, &info, NULL); 398*c2c66affSColin Finck ok(ret, "CryptUIWizImport failed: %08x\n", GetLastError()); 399*c2c66affSColin Finck if (ret) 400*c2c66affSColin Finck { 401*c2c66affSColin Finck static const WCHAR CA[] = { 'C','A',0 }; 402*c2c66affSColin Finck HCERTSTORE ca = CertOpenStore(CERT_STORE_PROV_SYSTEM_W, 0, 0, 403*c2c66affSColin Finck CERT_SYSTEM_STORE_CURRENT_USER, CA); 404*c2c66affSColin Finck 405*c2c66affSColin Finck if (ca) 406*c2c66affSColin Finck { 407*c2c66affSColin Finck ret = find_and_delete_cert_in_store(ca, info.u.pCertContext); 408*c2c66affSColin Finck ok(ret || 409*c2c66affSColin Finck broken(!ret) /* Win9x/NT4 */, 410*c2c66affSColin Finck "expected to find v1CertWithValidPubKey in CA store\n"); 411*c2c66affSColin Finck CertCloseStore(ca, 0); 412*c2c66affSColin Finck } 413*c2c66affSColin Finck } 414*c2c66affSColin Finck CertFreeCertificateContext(info.u.pCertContext); 415*c2c66affSColin Finck /* Imports the following cert--not self-signed, with a basic constraints2 416*c2c66affSColin Finck * extensions--to the "AddressBook" store. Puts up a dialog at the end if 417*c2c66affSColin Finck * it succeeds or fails. 418*c2c66affSColin Finck */ 419*c2c66affSColin Finck info.u.pCertContext = CertCreateCertificateContext(X509_ASN_ENCODING, 420*c2c66affSColin Finck iTunesCert3, sizeof(iTunesCert3)); 421*c2c66affSColin Finck ret = pCryptUIWizImport(CRYPTUI_WIZ_NO_UI, 0, NULL, &info, NULL); 422*c2c66affSColin Finck ok(ret, "CryptUIWizImport failed: %08x\n", GetLastError()); 423*c2c66affSColin Finck if (ret) 424*c2c66affSColin Finck { 425*c2c66affSColin Finck static const WCHAR AddressBook[] = { 'A','d','d','r','e','s','s', 426*c2c66affSColin Finck 'B','o','o','k',0 }; 427*c2c66affSColin Finck HCERTSTORE addressBook = CertOpenStore(CERT_STORE_PROV_SYSTEM_W, 0, 0, 428*c2c66affSColin Finck CERT_SYSTEM_STORE_CURRENT_USER, AddressBook); 429*c2c66affSColin Finck 430*c2c66affSColin Finck if (addressBook) 431*c2c66affSColin Finck { 432*c2c66affSColin Finck ret = find_and_delete_cert_in_store(addressBook, 433*c2c66affSColin Finck info.u.pCertContext); 434*c2c66affSColin Finck ok(ret || 435*c2c66affSColin Finck broken(!ret), /* Windows 2000 and earlier */ 436*c2c66affSColin Finck "expected to find iTunesCert3 in AddressBook store\n"); 437*c2c66affSColin Finck CertCloseStore(addressBook, 0); 438*c2c66affSColin Finck } 439*c2c66affSColin Finck } 440*c2c66affSColin Finck /* Displays the wizard, but disables the "Certificate store" edit and 441*c2c66affSColin Finck * the Browse button. Confusingly, the "Place all certificates in the 442*c2c66affSColin Finck * following store" radio button is not disabled. 443*c2c66affSColin Finck */ 444*c2c66affSColin Finck if (0) 445*c2c66affSColin Finck { 446*c2c66affSColin Finck ret = pCryptUIWizImport(CRYPTUI_WIZ_IMPORT_NO_CHANGE_DEST_STORE, 0, 447*c2c66affSColin Finck NULL, &info, NULL); 448*c2c66affSColin Finck ok(ret, "CryptUIWizImport failed: %08x\n", GetLastError()); 449*c2c66affSColin Finck } 450*c2c66affSColin Finck store = CertOpenStore(CERT_STORE_PROV_MEMORY, X509_ASN_ENCODING, 0, 451*c2c66affSColin Finck CERT_STORE_CREATE_NEW_FLAG, NULL); 452*c2c66affSColin Finck /* Displays the wizard, but sets the "Certificate store" edit to the 453*c2c66affSColin Finck * string "Determined by the program", and disables it and the Browse 454*c2c66affSColin Finck * button, as well as the "Automatically select the certificate store 455*c2c66affSColin Finck * based on the type of certificate" radio button. 456*c2c66affSColin Finck */ 457*c2c66affSColin Finck if (0) 458*c2c66affSColin Finck { 459*c2c66affSColin Finck ret = pCryptUIWizImport(CRYPTUI_WIZ_IMPORT_NO_CHANGE_DEST_STORE, 0, 460*c2c66affSColin Finck NULL, &info, store); 461*c2c66affSColin Finck ok(ret, "CryptUIWizImport failed: %08x\n", GetLastError()); 462*c2c66affSColin Finck } 463*c2c66affSColin Finck ret = pCryptUIWizImport(CRYPTUI_WIZ_NO_UI | 464*c2c66affSColin Finck CRYPTUI_WIZ_IMPORT_NO_CHANGE_DEST_STORE, 0, NULL, &info, store); 465*c2c66affSColin Finck ok(ret, "CryptUIWizImport failed: %08x\n", GetLastError()); 466*c2c66affSColin Finck ret = find_and_delete_cert_in_store(store, info.u.pCertContext); 467*c2c66affSColin Finck ok(ret || 468*c2c66affSColin Finck broken(!ret) /* Win9x/NT4 */, 469*c2c66affSColin Finck "expected to find iTunesCert3 in memory store\n"); 470*c2c66affSColin Finck CertFreeCertificateContext(info.u.pCertContext); 471*c2c66affSColin Finck CertCloseStore(store, 0); 472*c2c66affSColin Finck 473*c2c66affSColin Finck info.u.pCertContext = CertCreateCertificateContext(X509_ASN_ENCODING, 474*c2c66affSColin Finck iTunesCert1, sizeof(iTunesCert1)); 475*c2c66affSColin Finck ret = pCryptUIWizImport(CRYPTUI_WIZ_NO_UI, 0, NULL, &info, NULL); 476*c2c66affSColin Finck ok(ret, "CryptUIWizImport failed: %08x\n", GetLastError()); 477*c2c66affSColin Finck if (ret) 478*c2c66affSColin Finck { 479*c2c66affSColin Finck static const WCHAR AddressBook[] = { 'A','d','d','r','e','s','s', 480*c2c66affSColin Finck 'B','o','o','k',0 }; 481*c2c66affSColin Finck HCERTSTORE addressBook = CertOpenStore(CERT_STORE_PROV_SYSTEM_W, 0, 0, 482*c2c66affSColin Finck CERT_SYSTEM_STORE_CURRENT_USER, AddressBook); 483*c2c66affSColin Finck 484*c2c66affSColin Finck if (addressBook) 485*c2c66affSColin Finck { 486*c2c66affSColin Finck ret = find_and_delete_cert_in_store(addressBook, 487*c2c66affSColin Finck info.u.pCertContext); 488*c2c66affSColin Finck ok(ret || 489*c2c66affSColin Finck broken(!ret), /* Windows 2000 and earlier */ 490*c2c66affSColin Finck "expected to find iTunesCert1 in AddressBook store\n"); 491*c2c66affSColin Finck CertCloseStore(addressBook, 0); 492*c2c66affSColin Finck } 493*c2c66affSColin Finck } 494*c2c66affSColin Finck CertFreeCertificateContext(info.u.pCertContext); 495*c2c66affSColin Finck 496*c2c66affSColin Finck info.u.pCertContext = CertCreateCertificateContext(X509_ASN_ENCODING, 497*c2c66affSColin Finck iTunesCert2, sizeof(iTunesCert2)); 498*c2c66affSColin Finck ret = pCryptUIWizImport(CRYPTUI_WIZ_NO_UI, 0, NULL, &info, NULL); 499*c2c66affSColin Finck ok(ret, "CryptUIWizImport failed: %08x\n", GetLastError()); 500*c2c66affSColin Finck if (ret) 501*c2c66affSColin Finck { 502*c2c66affSColin Finck static const WCHAR CA[] = { 'C','A',0 }; 503*c2c66affSColin Finck HCERTSTORE ca = CertOpenStore(CERT_STORE_PROV_SYSTEM_W, 0, 0, 504*c2c66affSColin Finck CERT_SYSTEM_STORE_CURRENT_USER, CA); 505*c2c66affSColin Finck 506*c2c66affSColin Finck if (ca) 507*c2c66affSColin Finck { 508*c2c66affSColin Finck ret = find_and_delete_cert_in_store(ca, info.u.pCertContext); 509*c2c66affSColin Finck ok(ret || 510*c2c66affSColin Finck broken(!ret) /* Win9x/NT4 */, 511*c2c66affSColin Finck "expected to find iTunesCert2 in CA store\n"); 512*c2c66affSColin Finck CertCloseStore(ca, 0); 513*c2c66affSColin Finck } 514*c2c66affSColin Finck } 515*c2c66affSColin Finck CertFreeCertificateContext(info.u.pCertContext); 516*c2c66affSColin Finck 517*c2c66affSColin Finck info.u.hCertStore = CertOpenStore(CERT_STORE_PROV_MEMORY, 0, 0, 518*c2c66affSColin Finck CERT_STORE_CREATE_NEW_FLAG, NULL); 519*c2c66affSColin Finck CertAddEncodedCertificateToStore(info.u.hCertStore, X509_ASN_ENCODING, 520*c2c66affSColin Finck v1CertWithValidPubKey, sizeof(v1CertWithValidPubKey), 521*c2c66affSColin Finck CERT_STORE_ADD_ALWAYS, NULL); 522*c2c66affSColin Finck CertAddEncodedCRLToStore(info.u.hCertStore, X509_ASN_ENCODING, signedCRL, 523*c2c66affSColin Finck sizeof(signedCRL), CERT_STORE_ADD_ALWAYS, NULL); 524*c2c66affSColin Finck info.dwSubjectChoice = CRYPTUI_WIZ_IMPORT_SUBJECT_CERT_STORE; 525*c2c66affSColin Finck /* The ALLOW flags aren't allowed with a store as the source if the source 526*c2c66affSColin Finck * contains types other than those allowed. 527*c2c66affSColin Finck */ 528*c2c66affSColin Finck store = CertOpenStore(CERT_STORE_PROV_MEMORY, 0, 0, 529*c2c66affSColin Finck CERT_STORE_CREATE_NEW_FLAG, NULL); 530*c2c66affSColin Finck SetLastError(0xdeadbeef); 531*c2c66affSColin Finck ret = pCryptUIWizImport(CRYPTUI_WIZ_NO_UI | CRYPTUI_WIZ_IMPORT_ALLOW_CERT, 532*c2c66affSColin Finck 0, NULL, &info, store); 533*c2c66affSColin Finck ok(!ret && GetLastError() == E_INVALIDARG, 534*c2c66affSColin Finck "expected E_INVALIDARG, got %08x\n", GetLastError()); 535*c2c66affSColin Finck SetLastError(0xdeadbeef); 536*c2c66affSColin Finck ret = pCryptUIWizImport(CRYPTUI_WIZ_NO_UI | CRYPTUI_WIZ_IMPORT_ALLOW_CRL, 537*c2c66affSColin Finck 0, NULL, &info, store); 538*c2c66affSColin Finck ok(!ret && GetLastError() == E_INVALIDARG, 539*c2c66affSColin Finck "expected E_INVALIDARG, got %08x\n", GetLastError()); 540*c2c66affSColin Finck SetLastError(0xdeadbeef); 541*c2c66affSColin Finck ret = pCryptUIWizImport(CRYPTUI_WIZ_NO_UI | 542*c2c66affSColin Finck CRYPTUI_WIZ_IMPORT_NO_CHANGE_DEST_STORE | 543*c2c66affSColin Finck CRYPTUI_WIZ_IMPORT_ALLOW_CERT | CRYPTUI_WIZ_IMPORT_ALLOW_CRL, 0, NULL, 544*c2c66affSColin Finck &info, store); 545*c2c66affSColin Finck ok(ret, "CryptUIWizImport failed: %08x\n", GetLastError()); 546*c2c66affSColin Finck if (ret) 547*c2c66affSColin Finck { 548*c2c66affSColin Finck count = 0; 549*c2c66affSColin Finck cert = NULL; 550*c2c66affSColin Finck do { 551*c2c66affSColin Finck cert = CertEnumCertificatesInStore(store, cert); 552*c2c66affSColin Finck if (cert) 553*c2c66affSColin Finck count++; 554*c2c66affSColin Finck } while (cert); 555*c2c66affSColin Finck ok(count == 1, "expected 1 cert, got %d\n", count); 556*c2c66affSColin Finck count = 0; 557*c2c66affSColin Finck crl = NULL; 558*c2c66affSColin Finck do { 559*c2c66affSColin Finck crl = CertEnumCRLsInStore(store, crl); 560*c2c66affSColin Finck if (crl) 561*c2c66affSColin Finck count++; 562*c2c66affSColin Finck } while (crl); 563*c2c66affSColin Finck ok(count == 1, "expected 1 CRL, got %d\n", count); 564*c2c66affSColin Finck } 565*c2c66affSColin Finck CertCloseStore(store, 0); 566*c2c66affSColin Finck CertCloseStore(info.u.hCertStore, 0); 567*c2c66affSColin Finck 568*c2c66affSColin Finck /* If the ALLOW flags match the content of the store, the store can be 569*c2c66affSColin Finck * imported. 570*c2c66affSColin Finck */ 571*c2c66affSColin Finck info.u.hCertStore = CertOpenStore(CERT_STORE_PROV_MEMORY, 0, 0, 572*c2c66affSColin Finck CERT_STORE_CREATE_NEW_FLAG, NULL); 573*c2c66affSColin Finck CertAddEncodedCertificateToStore(info.u.hCertStore, X509_ASN_ENCODING, 574*c2c66affSColin Finck v1CertWithValidPubKey, sizeof(v1CertWithValidPubKey), 575*c2c66affSColin Finck CERT_STORE_ADD_ALWAYS, NULL); 576*c2c66affSColin Finck store = CertOpenStore(CERT_STORE_PROV_MEMORY, 0, 0, 577*c2c66affSColin Finck CERT_STORE_CREATE_NEW_FLAG, NULL); 578*c2c66affSColin Finck SetLastError(0xdeadbeef); 579*c2c66affSColin Finck ret = pCryptUIWizImport(CRYPTUI_WIZ_NO_UI | CRYPTUI_WIZ_IMPORT_ALLOW_CERT, 580*c2c66affSColin Finck 0, NULL, &info, store); 581*c2c66affSColin Finck ok(ret, "CryptUIWizImport failed: %08x\n", GetLastError()); 582*c2c66affSColin Finck if (ret) 583*c2c66affSColin Finck { 584*c2c66affSColin Finck count = 0; 585*c2c66affSColin Finck cert = NULL; 586*c2c66affSColin Finck do { 587*c2c66affSColin Finck cert = CertEnumCertificatesInStore(store, cert); 588*c2c66affSColin Finck if (cert) 589*c2c66affSColin Finck count++; 590*c2c66affSColin Finck } while (cert); 591*c2c66affSColin Finck ok(count == 1, "expected 1 cert, got %d\n", count); 592*c2c66affSColin Finck count = 0; 593*c2c66affSColin Finck crl = NULL; 594*c2c66affSColin Finck do { 595*c2c66affSColin Finck crl = CertEnumCRLsInStore(store, crl); 596*c2c66affSColin Finck if (crl) 597*c2c66affSColin Finck count++; 598*c2c66affSColin Finck } while (crl); 599*c2c66affSColin Finck ok(count == 0, "expected 0 CRLs, got %d\n", count); 600*c2c66affSColin Finck } 601*c2c66affSColin Finck SetLastError(0xdeadbeef); 602*c2c66affSColin Finck ret = pCryptUIWizImport(CRYPTUI_WIZ_NO_UI | CRYPTUI_WIZ_IMPORT_ALLOW_CRL, 603*c2c66affSColin Finck 0, NULL, &info, store); 604*c2c66affSColin Finck ok(!ret && GetLastError() == E_INVALIDARG, 605*c2c66affSColin Finck "expected E_INVALIDARG, got %08x\n", GetLastError()); 606*c2c66affSColin Finck CertCloseStore(store, 0); 607*c2c66affSColin Finck CertCloseStore(info.u.hCertStore, 0); 608*c2c66affSColin Finck 609*c2c66affSColin Finck /* Again, if the ALLOW flags match the content of the store, the store can 610*c2c66affSColin Finck * be imported. 611*c2c66affSColin Finck */ 612*c2c66affSColin Finck info.u.hCertStore = CertOpenStore(CERT_STORE_PROV_MEMORY, 0, 0, 613*c2c66affSColin Finck CERT_STORE_CREATE_NEW_FLAG, NULL); 614*c2c66affSColin Finck CertAddEncodedCRLToStore(info.u.hCertStore, X509_ASN_ENCODING, signedCRL, 615*c2c66affSColin Finck sizeof(signedCRL), CERT_STORE_ADD_ALWAYS, NULL); 616*c2c66affSColin Finck store = CertOpenStore(CERT_STORE_PROV_MEMORY, 0, 0, 617*c2c66affSColin Finck CERT_STORE_CREATE_NEW_FLAG, NULL); 618*c2c66affSColin Finck SetLastError(0xdeadbeef); 619*c2c66affSColin Finck ret = pCryptUIWizImport(CRYPTUI_WIZ_NO_UI | CRYPTUI_WIZ_IMPORT_ALLOW_CRL, 620*c2c66affSColin Finck 0, NULL, &info, store); 621*c2c66affSColin Finck ok(ret, "CryptUIWizImport failed: %08x\n", GetLastError()); 622*c2c66affSColin Finck if (ret) 623*c2c66affSColin Finck { 624*c2c66affSColin Finck count = 0; 625*c2c66affSColin Finck cert = NULL; 626*c2c66affSColin Finck do { 627*c2c66affSColin Finck cert = CertEnumCertificatesInStore(store, cert); 628*c2c66affSColin Finck if (cert) 629*c2c66affSColin Finck count++; 630*c2c66affSColin Finck } while (cert); 631*c2c66affSColin Finck ok(count == 0, "expected 0 certs, got %d\n", count); 632*c2c66affSColin Finck count = 0; 633*c2c66affSColin Finck crl = NULL; 634*c2c66affSColin Finck do { 635*c2c66affSColin Finck crl = CertEnumCRLsInStore(store, crl); 636*c2c66affSColin Finck if (crl) 637*c2c66affSColin Finck count++; 638*c2c66affSColin Finck } while (crl); 639*c2c66affSColin Finck ok(count == 1, "expected 1 CRL, got %d\n", count); 640*c2c66affSColin Finck } 641*c2c66affSColin Finck SetLastError(0xdeadbeef); 642*c2c66affSColin Finck ret = pCryptUIWizImport(CRYPTUI_WIZ_NO_UI | CRYPTUI_WIZ_IMPORT_ALLOW_CERT, 643*c2c66affSColin Finck 0, NULL, &info, store); 644*c2c66affSColin Finck ok(!ret && GetLastError() == E_INVALIDARG, 645*c2c66affSColin Finck "expected E_INVALIDARG, got %08x\n", GetLastError()); 646*c2c66affSColin Finck CertCloseStore(store, 0); 647*c2c66affSColin Finck CertCloseStore(info.u.hCertStore, 0); 648*c2c66affSColin Finck 649*c2c66affSColin Finck UnhookWindowsHookEx(hook); 650*c2c66affSColin Finck } 651*c2c66affSColin Finck 652*c2c66affSColin Finck START_TEST(cryptui) 653*c2c66affSColin Finck { 654*c2c66affSColin Finck HMODULE lib = LoadLibraryA("cryptui"); 655*c2c66affSColin Finck 656*c2c66affSColin Finck if (lib) 657*c2c66affSColin Finck { 658*c2c66affSColin Finck pCryptUIWizImport = (void *)GetProcAddress(lib, "CryptUIWizImport"); 659*c2c66affSColin Finck 660*c2c66affSColin Finck test_crypt_ui_wiz_import(); 661*c2c66affSColin Finck FreeLibrary(lib); 662*c2c66affSColin Finck } 663*c2c66affSColin Finck } 664