1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Use of this source code is governed by a BSD-style license that can be 3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// found in the LICENSE file. 4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 5ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "crypto/signature_verifier.h" 6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "testing/gtest/include/gtest/gtest.h" 7c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(SignatureVerifierTest, BasicTest) { 9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // The input data in this test comes from real certificates. 10c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // 11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // tbs_certificate ("to-be-signed certificate", the part of a certificate 12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // that is signed), signature_algorithm, and algorithm come from the 13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // certificate of bugs.webkit.org. 14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // 15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // public_key_info comes from the certificate of the issuer, Go Daddy Secure 16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Certification Authority. 17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // 18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // The bytes in the array initializers are formatted to expose the DER 19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // encoding of the ASN.1 structures. 20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // The data that is signed is the following ASN.1 structure: 22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // TBSCertificate ::= SEQUENCE { 23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // ... -- omitted, not important 24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // } 25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const uint8 tbs_certificate[1017] = { 26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x30, 0x82, 0x03, 0xf5, // a SEQUENCE of length 1013 (0x3f5) 27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x03, 0x43, 0xdd, 0x63, 0x30, 0x0d, 28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x00, 0x30, 0x81, 0xca, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x04, 0x08, 0x13, 0x07, 0x41, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x61, 0x31, 32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x0a, 0x53, 0x63, 33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x6f, 0x74, 0x74, 0x73, 0x64, 0x61, 0x6c, 0x65, 0x31, 0x1a, 0x30, 0x18, 34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x11, 0x47, 0x6f, 0x44, 0x61, 0x64, 35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x64, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x31, 0x33, 0x30, 0x31, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x2a, 0x68, 37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x2e, 0x67, 0x6f, 0x64, 0x61, 0x64, 39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x64, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x72, 0x65, 0x70, 0x6f, 0x73, 40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x69, 0x74, 0x6f, 0x72, 0x79, 0x31, 0x30, 0x30, 0x2e, 0x06, 0x03, 0x55, 41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x04, 0x03, 0x13, 0x27, 0x47, 0x6f, 0x20, 0x44, 0x61, 0x64, 0x64, 0x79, 42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x20, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x20, 0x43, 0x65, 0x72, 0x74, 43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x31, 0x11, 0x30, 0x0f, 0x06, 45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x03, 0x55, 0x04, 0x05, 0x13, 0x08, 0x30, 0x37, 0x39, 0x36, 0x39, 0x32, 46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x38, 0x37, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x38, 0x30, 0x33, 0x31, 0x38, 47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x32, 0x33, 0x33, 0x35, 0x31, 0x39, 0x5a, 0x17, 0x0d, 0x31, 0x31, 0x30, 48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x33, 0x31, 0x38, 0x32, 0x33, 0x33, 0x35, 0x31, 0x39, 0x5a, 0x30, 0x79, 49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x53, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x0a, 51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x43, 0x61, 0x6c, 0x69, 0x66, 0x6f, 0x72, 0x6e, 0x69, 0x61, 0x31, 0x12, 52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x09, 0x43, 0x75, 0x70, 53c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x65, 0x72, 0x74, 0x69, 0x6e, 0x6f, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 54c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x55, 0x04, 0x0a, 0x13, 0x0a, 0x41, 0x70, 0x70, 0x6c, 0x65, 0x20, 0x49, 55c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x6e, 0x63, 0x2e, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x0b, 56c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x13, 0x0c, 0x4d, 0x61, 0x63, 0x20, 0x4f, 0x53, 0x20, 0x46, 0x6f, 0x72, 57c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x67, 0x65, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 58c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x0c, 0x2a, 0x2e, 0x77, 0x65, 0x62, 0x6b, 0x69, 0x74, 0x2e, 0x6f, 0x72, 59c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x67, 0x30, 0x81, 0x9f, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 60c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x81, 0x8d, 0x00, 0x30, 61c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x81, 0x89, 0x02, 0x81, 0x81, 0x00, 0xa7, 0x62, 0x79, 0x41, 0xda, 0x28, 62c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0xf2, 0xc0, 0x4f, 0xe0, 0x25, 0xaa, 0xa1, 0x2e, 0x3b, 0x30, 0x94, 0xb5, 63c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0xc9, 0x26, 0x3a, 0x1b, 0xe2, 0xd0, 0xcc, 0xa2, 0x95, 0xe2, 0x91, 0xc0, 64c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0xf0, 0x40, 0x9e, 0x27, 0x6e, 0xbd, 0x6e, 0xde, 0x7c, 0xb6, 0x30, 0x5c, 65c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0xb8, 0x9b, 0x01, 0x2f, 0x92, 0x04, 0xa1, 0xef, 0x4a, 0xb1, 0x6c, 0xb1, 66c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x7e, 0x8e, 0xcd, 0xa6, 0xf4, 0x40, 0x73, 0x1f, 0x2c, 0x96, 0xad, 0xff, 67c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x2a, 0x6d, 0x0e, 0xba, 0x52, 0x84, 0x83, 0xb0, 0x39, 0xee, 0xc9, 0x39, 68c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0xdc, 0x1e, 0x34, 0xd0, 0xd8, 0x5d, 0x7a, 0x09, 0xac, 0xa9, 0xee, 0xca, 69c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x65, 0xf6, 0x85, 0x3a, 0x6b, 0xee, 0xe4, 0x5c, 0x5e, 0xf8, 0xda, 0xd1, 70c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0xce, 0x88, 0x47, 0xcd, 0x06, 0x21, 0xe0, 0xb9, 0x4b, 0xe4, 0x07, 0xcb, 71c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x57, 0xdc, 0xca, 0x99, 0x54, 0xf7, 0x0e, 0xd5, 0x17, 0x95, 0x05, 0x2e, 72c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0xe9, 0xb1, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x82, 0x01, 0xce, 0x30, 73c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x82, 0x01, 0xca, 0x30, 0x09, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x04, 0x02, 74c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x30, 0x00, 0x30, 0x0b, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x04, 0x04, 0x03, 75c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x02, 0x05, 0xa0, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x25, 0x04, 0x16, 76c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x30, 0x14, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x01, 77c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x02, 0x30, 0x57, 78c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x06, 0x03, 0x55, 0x1d, 0x1f, 0x04, 0x50, 0x30, 0x4e, 0x30, 0x4c, 0xa0, 79c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x4a, 0xa0, 0x48, 0x86, 0x46, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 80c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 81c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x2e, 0x67, 0x6f, 0x64, 0x61, 0x64, 0x64, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 82c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x2f, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x2f, 83c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x67, 0x6f, 0x64, 0x61, 0x64, 0x64, 0x79, 0x65, 0x78, 0x74, 0x65, 0x6e, 84c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x64, 0x65, 0x64, 0x69, 0x73, 0x73, 0x75, 0x69, 0x6e, 0x67, 0x33, 0x2e, 85c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x63, 0x72, 0x6c, 0x30, 0x52, 0x06, 0x03, 0x55, 0x1d, 0x20, 0x04, 0x4b, 86c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x30, 0x49, 0x30, 0x47, 0x06, 0x0b, 0x60, 0x86, 0x48, 0x01, 0x86, 0xfd, 87c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x6d, 0x01, 0x07, 0x17, 0x02, 0x30, 0x38, 0x30, 0x36, 0x06, 0x08, 0x2b, 88c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x06, 0x01, 0x05, 0x05, 0x07, 0x02, 0x01, 0x16, 0x2a, 0x68, 0x74, 0x74, 89c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x70, 0x3a, 0x2f, 0x2f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 90c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x61, 0x74, 0x65, 0x73, 0x2e, 0x67, 0x6f, 0x64, 0x61, 0x64, 0x64, 0x79, 91c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 92c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x6f, 0x72, 0x79, 0x30, 0x7f, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 93c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x07, 0x01, 0x01, 0x04, 0x73, 0x30, 0x71, 0x30, 0x23, 0x06, 0x08, 0x2b, 94c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x06, 0x01, 0x05, 0x05, 0x07, 0x30, 0x01, 0x86, 0x17, 0x68, 0x74, 0x74, 95c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x70, 0x3a, 0x2f, 0x2f, 0x6f, 0x63, 0x73, 0x70, 0x2e, 0x67, 0x6f, 0x64, 96c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x61, 0x64, 0x64, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x30, 0x4a, 0x06, 0x08, 97c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x30, 0x02, 0x86, 0x3e, 0x68, 0x74, 98c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 99c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x63, 0x61, 0x74, 0x65, 0x73, 0x2e, 0x67, 0x6f, 0x64, 0x61, 0x64, 0x64, 100c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 101c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x67, 0x64, 0x5f, 0x69, 0x6e, 0x74, 0x65, 102c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x72, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x2e, 0x63, 0x72, 0x74, 103c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x48, 104c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0xdf, 0x60, 0x32, 0xcc, 0x89, 0x01, 0xb6, 0xdc, 0x2f, 0xe3, 0x73, 0xb5, 105c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x9c, 0x16, 0x58, 0x32, 0x68, 0xa9, 0xc3, 0x30, 0x1f, 0x06, 0x03, 0x55, 106c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0xfd, 0xac, 0x61, 0x32, 107c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x93, 0x6c, 0x45, 0xd6, 0xe2, 0xee, 0x85, 0x5f, 0x9a, 0xba, 0xe7, 0x76, 108c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x99, 0x68, 0xcc, 0xe7, 0x30, 0x23, 0x06, 0x03, 0x55, 0x1d, 0x11, 0x04, 109c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x1c, 0x30, 0x1a, 0x82, 0x0c, 0x2a, 0x2e, 0x77, 0x65, 0x62, 0x6b, 0x69, 110c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x74, 0x2e, 0x6f, 0x72, 0x67, 0x82, 0x0a, 0x77, 0x65, 0x62, 0x6b, 0x69, 111c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x74, 0x2e, 0x6f, 0x72, 0x67 112c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }; 113c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 114c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // The signature algorithm is specified as the following ASN.1 structure: 115c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // AlgorithmIdentifier ::= SEQUENCE { 116c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // algorithm OBJECT IDENTIFIER, 117c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // parameters ANY DEFINED BY algorithm OPTIONAL } 118c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // 119c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const uint8 signature_algorithm[15] = { 120c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x30, 0x0d, // a SEQUENCE of length 13 (0xd) 121c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x06, 0x09, // an OBJECT IDENTIFIER of length 9 122c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // 1.2.840.113549.1.1.5 - sha1WithRSAEncryption 123c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 124c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x05, 0x00, // a NULL of length 0 125c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }; 126c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 127c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // RSA signature, a big integer in the big-endian byte order. 128c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const uint8 signature[256] = { 129c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x1e, 0x6a, 0xe7, 0xe0, 0x4f, 0xe7, 0x4d, 0xd0, 0x69, 0x7c, 0xf8, 0x8f, 130c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x99, 0xb4, 0x18, 0x95, 0x36, 0x24, 0x0f, 0x0e, 0xa3, 0xea, 0x34, 0x37, 131c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0xf4, 0x7d, 0xd5, 0x92, 0x35, 0x53, 0x72, 0x76, 0x3f, 0x69, 0xf0, 0x82, 132c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x56, 0xe3, 0x94, 0x7a, 0x1d, 0x1a, 0x81, 0xaf, 0x9f, 0xc7, 0x43, 0x01, 133c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x64, 0xd3, 0x7c, 0x0d, 0xc8, 0x11, 0x4e, 0x4a, 0xe6, 0x1a, 0xc3, 0x01, 134c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x74, 0xe8, 0x35, 0x87, 0x5c, 0x61, 0xaa, 0x8a, 0x46, 0x06, 0xbe, 0x98, 135c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x95, 0x24, 0x9e, 0x01, 0xe3, 0xe6, 0xa0, 0x98, 0xee, 0x36, 0x44, 0x56, 136c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x8d, 0x23, 0x9c, 0x65, 0xea, 0x55, 0x6a, 0xdf, 0x66, 0xee, 0x45, 0xe8, 137c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0xa0, 0xe9, 0x7d, 0x9a, 0xba, 0x94, 0xc5, 0xc8, 0xc4, 0x4b, 0x98, 0xff, 138c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x9a, 0x01, 0x31, 0x6d, 0xf9, 0x2b, 0x58, 0xe7, 0xe7, 0x2a, 0xc5, 0x4d, 139c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0xbb, 0xbb, 0xcd, 0x0d, 0x70, 0xe1, 0xad, 0x03, 0xf5, 0xfe, 0xf4, 0x84, 140c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x71, 0x08, 0xd2, 0xbc, 0x04, 0x7b, 0x26, 0x1c, 0xa8, 0x0f, 0x9c, 0xd8, 141c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x12, 0x6a, 0x6f, 0x2b, 0x67, 0xa1, 0x03, 0x80, 0x9a, 0x11, 0x0b, 0xe9, 142c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0xe0, 0xb5, 0xb3, 0xb8, 0x19, 0x4e, 0x0c, 0xa4, 0xd9, 0x2b, 0x3b, 0xc2, 143c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0xca, 0x20, 0xd3, 0x0c, 0xa4, 0xff, 0x93, 0x13, 0x1f, 0xfc, 0xba, 0x94, 144c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x93, 0x8c, 0x64, 0x15, 0x2e, 0x28, 0xa9, 0x55, 0x8c, 0x2c, 0x48, 0xd3, 145c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0xd3, 0xc1, 0x50, 0x69, 0x19, 0xe8, 0x34, 0xd3, 0xf1, 0x04, 0x9f, 0x0a, 146c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x7a, 0x21, 0x87, 0xbf, 0xb9, 0x59, 0x37, 0x2e, 0xf4, 0x71, 0xa5, 0x3e, 147c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0xbe, 0xcd, 0x70, 0x83, 0x18, 0xf8, 0x8a, 0x72, 0x85, 0x45, 0x1f, 0x08, 148c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x01, 0x6f, 0x37, 0xf5, 0x2b, 0x7b, 0xea, 0xb9, 0x8b, 0xa3, 0xcc, 0xfd, 149c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x35, 0x52, 0xdd, 0x66, 0xde, 0x4f, 0x30, 0xc5, 0x73, 0x81, 0xb6, 0xe8, 150c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x3c, 0xd8, 0x48, 0x8a 151c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }; 152c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 153c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // The public key is specified as the following ASN.1 structure: 154c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // SubjectPublicKeyInfo ::= SEQUENCE { 155c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // algorithm AlgorithmIdentifier, 156c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // subjectPublicKey BIT STRING } 157c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const uint8 public_key_info[294] = { 158c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x30, 0x82, 0x01, 0x22, // a SEQUENCE of length 290 (0x122) 159c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // algorithm 160c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x30, 0x0d, // a SEQUENCE of length 13 161c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x06, 0x09, // an OBJECT IDENTIFIER of length 9 162c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 163c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x05, 0x00, // a NULL of length 0 164c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // subjectPublicKey 165c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x03, 0x82, 0x01, 0x0f, // a BIT STRING of length 271 (0x10f) 166c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x00, // number of unused bits 167c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x30, 0x82, 0x01, 0x0a, // a SEQUENCE of length 266 (0x10a) 168c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // modulus 169c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x02, 0x82, 0x01, 0x01, // an INTEGER of length 257 (0x101) 170c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x00, 0xc4, 0x2d, 0xd5, 0x15, 0x8c, 0x9c, 0x26, 0x4c, 0xec, 171c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x32, 0x35, 0xeb, 0x5f, 0xb8, 0x59, 0x01, 0x5a, 0xa6, 0x61, 172c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x81, 0x59, 0x3b, 0x70, 0x63, 0xab, 0xe3, 0xdc, 0x3d, 0xc7, 173c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x2a, 0xb8, 0xc9, 0x33, 0xd3, 0x79, 0xe4, 0x3a, 0xed, 0x3c, 174c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x30, 0x23, 0x84, 0x8e, 0xb3, 0x30, 0x14, 0xb6, 0xb2, 0x87, 175c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0xc3, 0x3d, 0x95, 0x54, 0x04, 0x9e, 0xdf, 0x99, 0xdd, 0x0b, 176c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x25, 0x1e, 0x21, 0xde, 0x65, 0x29, 0x7e, 0x35, 0xa8, 0xa9, 177c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x54, 0xeb, 0xf6, 0xf7, 0x32, 0x39, 0xd4, 0x26, 0x55, 0x95, 178c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0xad, 0xef, 0xfb, 0xfe, 0x58, 0x86, 0xd7, 0x9e, 0xf4, 0x00, 179c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x8d, 0x8c, 0x2a, 0x0c, 0xbd, 0x42, 0x04, 0xce, 0xa7, 0x3f, 180c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x04, 0xf6, 0xee, 0x80, 0xf2, 0xaa, 0xef, 0x52, 0xa1, 0x69, 181c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x66, 0xda, 0xbe, 0x1a, 0xad, 0x5d, 0xda, 0x2c, 0x66, 0xea, 182c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x1a, 0x6b, 0xbb, 0xe5, 0x1a, 0x51, 0x4a, 0x00, 0x2f, 0x48, 183c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0xc7, 0x98, 0x75, 0xd8, 0xb9, 0x29, 0xc8, 0xee, 0xf8, 0x66, 184c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x6d, 0x0a, 0x9c, 0xb3, 0xf3, 0xfc, 0x78, 0x7c, 0xa2, 0xf8, 185c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0xa3, 0xf2, 0xb5, 0xc3, 0xf3, 0xb9, 0x7a, 0x91, 0xc1, 0xa7, 186c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0xe6, 0x25, 0x2e, 0x9c, 0xa8, 0xed, 0x12, 0x65, 0x6e, 0x6a, 187c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0xf6, 0x12, 0x44, 0x53, 0x70, 0x30, 0x95, 0xc3, 0x9c, 0x2b, 188c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x58, 0x2b, 0x3d, 0x08, 0x74, 0x4a, 0xf2, 0xbe, 0x51, 0xb0, 189c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0xbf, 0x87, 0xd0, 0x4c, 0x27, 0x58, 0x6b, 0xb5, 0x35, 0xc5, 190c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x9d, 0xaf, 0x17, 0x31, 0xf8, 0x0b, 0x8f, 0xee, 0xad, 0x81, 191c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x36, 0x05, 0x89, 0x08, 0x98, 0xcf, 0x3a, 0xaf, 0x25, 0x87, 192c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0xc0, 0x49, 0xea, 0xa7, 0xfd, 0x67, 0xf7, 0x45, 0x8e, 0x97, 193c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0xcc, 0x14, 0x39, 0xe2, 0x36, 0x85, 0xb5, 0x7e, 0x1a, 0x37, 194c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0xfd, 0x16, 0xf6, 0x71, 0x11, 0x9a, 0x74, 0x30, 0x16, 0xfe, 195c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x13, 0x94, 0xa3, 0x3f, 0x84, 0x0d, 0x4f, 196c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // public exponent 197c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x02, 0x03, // an INTEGER of length 3 198c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 0x01, 0x00, 0x01 199c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }; 200c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 201c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // We use the signature verifier to perform four signature verification 202c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // tests. 203ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen crypto::SignatureVerifier verifier; 204c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bool ok; 205c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 206c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Test 1: feed all of the data to the verifier at once (a single 207c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // VerifyUpdate call). 208c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ok = verifier.VerifyInit(signature_algorithm, 209c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott sizeof(signature_algorithm), 210c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott signature, sizeof(signature), 211c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public_key_info, sizeof(public_key_info)); 212c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(ok); 213c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott verifier.VerifyUpdate(tbs_certificate, sizeof(tbs_certificate)); 214c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ok = verifier.VerifyFinal(); 215c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(ok); 216c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 217c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Test 2: feed the data to the verifier in three parts (three VerifyUpdate 218c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // calls). 219c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ok = verifier.VerifyInit(signature_algorithm, 220c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott sizeof(signature_algorithm), 221c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott signature, sizeof(signature), 222c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public_key_info, sizeof(public_key_info)); 223c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(ok); 224c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott verifier.VerifyUpdate(tbs_certificate, 256); 225c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott verifier.VerifyUpdate(tbs_certificate + 256, 256); 226c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott verifier.VerifyUpdate(tbs_certificate + 512, sizeof(tbs_certificate) - 512); 227c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ok = verifier.VerifyFinal(); 228c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(ok); 229c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 230c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Test 3: verify the signature with incorrect data. 231c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott uint8 bad_tbs_certificate[sizeof(tbs_certificate)]; 232c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott memcpy(bad_tbs_certificate, tbs_certificate, sizeof(tbs_certificate)); 233c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bad_tbs_certificate[10] += 1; // Corrupt one byte of the data. 234c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ok = verifier.VerifyInit(signature_algorithm, 235c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott sizeof(signature_algorithm), 236c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott signature, sizeof(signature), 237c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public_key_info, sizeof(public_key_info)); 238c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(ok); 239c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott verifier.VerifyUpdate(bad_tbs_certificate, sizeof(bad_tbs_certificate)); 240c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ok = verifier.VerifyFinal(); 241c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 242c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Purify disables digital signature verification, causing the Windows 243c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // CryptoAPI function CryptVerifySignature to always succeed. So we can't 244c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // check the signature verification results of the negative tests when 245c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // running inside Purify. See http://crbug.com/10031. 246c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef PURIFY 247c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_FALSE(ok); 248c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 249c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 250c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Test 4: verify a bad signature. 251c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott uint8 bad_signature[sizeof(signature)]; 252c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott memcpy(bad_signature, signature, sizeof(signature)); 253c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bad_signature[10] += 1; // Corrupt one byte of the signature. 254c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ok = verifier.VerifyInit(signature_algorithm, 255c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott sizeof(signature_algorithm), 256c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott bad_signature, sizeof(bad_signature), 257c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public_key_info, sizeof(public_key_info)); 258c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 259c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // A crypto library (e.g., NSS) may detect that the signature is corrupted 260c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // and cause VerifyInit to return false, so it is fine for 'ok' to be false. 261c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (ok) { 262c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott verifier.VerifyUpdate(tbs_certificate, sizeof(tbs_certificate)); 263c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ok = verifier.VerifyFinal(); 264c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef PURIFY 265c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_FALSE(ok); 266c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif 267c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 268c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 269