# ExtractEncryptedContent.cxx

    /*=========================================================================

      Program: GDCM (Grassroots DICOM). A DICOM library
      Module:  $URL$

      Copyright (c) 2006-2010 Mathieu Malaterre
      All rights reserved.
      See Copyright.txt or http://gdcm.sourceforge.net/Copyright.html for details.

         This software is distributed WITHOUT ANY WARRANTY; without even
         the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
         PURPOSE.  See the above copyright notice for more information.

    =========================================================================*/
    #include "gdcmReader.h"

    #include <fstream>

    /*

    openssl smime -encrypt -binary -aes256 -in outputfile.dcm -inform DER -out outputfile.der -outform DER ../trunk/Testing/Source/Data/certificate.pem

    openssl smime -decrypt -binary -in out.der -inform DER -out outputfile.dcm -outform DER -inkey ../trunk/Testing/Source/Data/privatekey.pem ../trunk/Testing/Source/Data/certificate.pem

     */

    int main(int argc, char *argv[])
    {
      if( argc < 3 )
        {
        std::cerr << argv[0] << " input.dcm output.der" << std::endl;
        return 1;
        }
      const char *filename = argv[1];
      const char *outfilename = argv[2];

      gdcm::Reader reader;
      reader.SetFileName( filename );
      if( !reader.Read() )
        {
        return 1;
        }

      gdcm::File &file = reader.GetFile();
      gdcm::DataSet &ds = file.GetDataSet();

      const gdcm::DataElement &EncryptedAttributesSequence = ds.GetDataElement( gdcm::Tag( 0x0400,0x0500 ) );

      gdcm::SequenceOfItems *sqi = EncryptedAttributesSequence.GetValueAsSQ();

      if ( !sqi || sqi->GetNumberOfItems() != 1 ) return 1;

      gdcm::Item &item = sqi->GetItem(1);

      gdcm::DataSet &nestedds = item.GetNestedDataSet();

      if( ! nestedds.FindDataElement( gdcm::Tag( 0x0400,0x0520) ) ) return 1;

      const gdcm::DataElement &EncryptedContent = nestedds.GetDataElement( gdcm::Tag( 0x0400,0x0520) );

      const gdcm::ByteValue *bv = EncryptedContent.GetByteValue();

      std::ofstream of( outfilename );
      of.write( bv->GetPointer(), bv->GetLength() );
      of.close();

      return 0;
    }