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