1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// found in the LICENSE file. 4cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 55f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#ifndef NET_SSL_OPENSSL_SSL_UTIL_H_ 65f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#define NET_SSL_OPENSSL_SSL_UTIL_H_ 7cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "net/base/net_log.h" 91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 10cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace crypto { 11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class OpenSSLErrStackTracer; 12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 14116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace tracked_objects { 15116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass Location; 16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace net { 19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 20116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Puts a net error, |err|, on the error stack in OpenSSL. The file and line are 21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// extracted from |posted_from|. The function code of the error is left as 0. 22116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid OpenSSLPutNetError(const tracked_objects::Location& posted_from, int err); 23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Utility to construct the appropriate set & clear masks for use the OpenSSL 25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// options and mode configuration functions. (SSL_set_options etc) 26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)struct SslSetClearMask { 27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SslSetClearMask(); 28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void ConfigureFlag(long flag, bool state); 29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) long set_mask; 31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) long clear_mask; 32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}; 33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Converts an OpenSSL error code into a net error code, walking the OpenSSL 351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// error stack if needed. 361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// 371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Note that |tracer| is not currently used in the implementation, but is passed 381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// in anyway as this ensures the caller will clear any residual codes left on 391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// the error stack. 40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)int MapOpenSSLError(int err, const crypto::OpenSSLErrStackTracer& tracer); 41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Helper struct to store information about an OpenSSL error stack entry. 431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistruct OpenSSLErrorInfo { 441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci OpenSSLErrorInfo() : error_code(0), file(NULL), line(0) {} 451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci uint32_t error_code; 471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char* file; 481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int line; 491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}; 501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Converts an OpenSSL error code into a net error code, walking the OpenSSL 521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// error stack if needed. If a value on the stack is used, the error code and 531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// associated information are returned in |*out_error_info|. Otherwise its 541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// fields are set to 0 and NULL. 551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// 561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Note that |tracer| is not currently used in the implementation, but is passed 571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// in anyway as this ensures the caller will clear any residual codes left on 581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// the error stack. 591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciint MapOpenSSLErrorWithDetails(int err, 601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const crypto::OpenSSLErrStackTracer& tracer, 611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci OpenSSLErrorInfo* out_error_info); 621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Creates NetLog callback for an OpenSSL error. 641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciNetLog::ParametersCallback CreateNetLogOpenSSLErrorCallback( 651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int net_error, 661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int ssl_error, 671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const OpenSSLErrorInfo& error_info); 681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} // namespace net 70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif // NET_SSL_OPENSSL_SSL_UTIL_H_ 72