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) 5cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "crypto/openssl_bio_string.h" 6cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 7cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include <openssl/bio.h> 8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include <string.h> 9cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 10cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace crypto { 11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace { 13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)int bio_string_write(BIO* bio, const char* data, int len) { 15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) reinterpret_cast<std::string*>(bio->ptr)->append(data, len); 16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return len; 17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)int bio_string_puts(BIO* bio, const char* data) { 20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Note: unlike puts(), BIO_puts does not add a newline. 21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return bio_string_write(bio, data, strlen(data)); 22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)long bio_string_ctrl(BIO* bio, int cmd, long num, void* ptr) { 25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::string* str = reinterpret_cast<std::string*>(bio->ptr); 26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) switch (cmd) { 27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case BIO_CTRL_RESET: 28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) str->clear(); 29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return 1; 30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case BIO_C_FILE_SEEK: 31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return -1; 32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case BIO_C_FILE_TELL: 33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return str->size(); 34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case BIO_CTRL_FLUSH: 35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return 1; 36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) default: 37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return 0; 38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)int bio_string_new(BIO* bio) { 42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bio->ptr = NULL; 43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bio->init = 0; 44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return 1; 45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)int bio_string_free(BIO* bio) { 48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // The string is owned by the caller, so there's nothing to do here. 49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return bio != NULL; 50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)BIO_METHOD bio_string_methods = { 53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // TODO(mattm): Should add some type number too? (bio.h uses 1-24) 54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) BIO_TYPE_SOURCE_SINK, 55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "bio_string", 56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bio_string_write, 57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) NULL, /* read */ 58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bio_string_puts, 59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) NULL, /* gets */ 60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bio_string_ctrl, 61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bio_string_new, 62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bio_string_free, 63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) NULL, /* callback_ctrl */ 64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}; 65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} // namespace 67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)BIO* BIO_new_string(std::string* out) { 69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) BIO* bio = BIO_new(&bio_string_methods); 70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!bio) 71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return bio; 72cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bio->ptr = out; 73cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bio->init = 1; 74cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return bio; 75cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 77cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} // namespace crypto 78