NAME

Protocol::OTR - Off-the-Record secure messaging protocol

VERSION

version 0.05

SYNOPSIS

    use Protocol::OTR qw( :constants );

    my $otr = Protocol::OTR->new(
        {
            privkeys_file => "otr.private_key",
            contacts_file => "otr.fingerprints",
            instance_tags_file => "otr.instance_tags",
        }
    );

    # find or create account
    my $alice = $otr->account('alice@domain', 'prpl-jabber');

    # find or create contact known by $alice
    my $bob = $alice->contact('bob@domain');

    # create secure channel to Bob
    my $channel = $bob->channel(
        {
            policy => ...,
            max_message_size => ...,
            on_write => sub { ... },
            on_read => sub { ... },
            on_gone_secure => sub { ... },
            on_gone_insecure => sub { ... },
            on_still_secure => sub { ... },
            on_unverified_fingerprint => sub { ... },
            on_symkey => sub { ... },
            on_timer => sub { ... },
            on_smp => sub { ... },
            on_error => sub { ... },
            on_event => sub { ... },
            on_smp_event => sub { ... },
            on_before_encrypt => sub { ... },
            on_after_decrypt => sub { ... },
            on_is_contact_logged_in => sub { ... },
        }
    );

    # establish private chat
    $channel->init();

    # encrypt message
    $channel->write("Hi Bob!");

    # finish all sessions
    $channel->finish();

DESCRIPTION

Protocol::OTR provides bindings to Off-the-Record C library allowing to manage OTR setup and to communicate in secure way.

METHODS

new

    my $otr = Protocol::OTR->new(
        {
            privkeys_file => "otr.private_key",
            contacts_file => "otr.fingerprints",
            instance_tags_file => "otr.instance_tags",
        }
    );

Returns an context object using optionally specified files. If files do not exist, they will be created when needed.

The example above shows the default filenames used.

find_account

    my $account = $otr->find_account( $name, $protocol );

Returns an account object Protocol::OTR::Account if exists, otherwise undef.

account

    my $account = $otr->account( $name, $protocol );

Returns an existing matching account object Protocol::OTR::Account or creates new one.

Note: Generating new private key may take some time.

accounts

    my @accounts = $otr->accounts();

Returns a list of known account objects Protocol::OTR::Account.

ENVIRONMENT VARIABLES

PROTOCOL_OTR_ENABLE_QUICK_RANDOM

    BEGIN { $ENV{PROTOCOL_OTR_ENABLE_QUICK_RANDOM} = 1; }
    use Protocol::OTR;

If exists in environment it will use much faster /dev/urandom, rather then more secure, but slow /dev/random.

EXPORTED CONSTANTS

Constants are grouped in four groups, to import them all use :constants.

:policies

See "policy" in Protocol::OTR::Channel for usage details.

POLICY_OPPORTUNISTIC

Start OTR conversation whenever it detects that the correspondent supports it. Default.

POLICY_ALWAYS

Requires encrypted conversation.

:error_codes

See "on_error" in Protocol::OTR::Channel for usage details.

ERRCODE_NONE

ERRCODE_ENCRYPTION_ERROR

Error occured while encrypting a message.

ERRCODE_MSG_NOT_IN_PRIVATE

Sent encrypted message to somebody who is not in a mutual OTR session.

ERRCODE_MSG_UNREADABLE

Sent an unreadable encrypted message

ERRCODE_MSG_MALFORMED

Message sent is malformed.

:event_codes

See "on_event" in Protocol::OTR::Channel for usage details.

MSGEVENT_NONE

MSGEVENT_ENCRYPTION_REQUIRED

Our policy requires encryption but we are trying to send an unencrypted message out.

MSGEVENT_ENCRYPTION_ERROR

An error occured while encrypting a message and the message was not sent.

MSGEVENT_CONNECTION_ENDED

Message has not been sent because our buddy has ended the private conversation. We should either close the connection, or refresh it.

MSGEVENT_SETUP_ERROR

A private conversation could not be set up. Error message will be passed.

MSGEVENT_MSG_REFLECTED

Received our own OTR messages.

MSGEVENT_MSG_RESENT

The previous message was resent.

MSGEVENT_RCVDMSG_NOT_IN_PRIVATE

Received an encrypted message but cannot read it because no private connection is established yet.

MSGEVENT_RCVDMSG_UNREADABLE

Cannot read the received message.

MSGEVENT_RCVDMSG_MALFORMED

The message received contains malformed data.

MSGEVENT_LOG_HEARTBEAT_RCVD

Received a heartbeat.

MSGEVENT_LOG_HEARTBEAT_SENT

Sent a heartbeat.

MSGEVENT_RCVDMSG_GENERAL_ERR

Received a general OTR error. Error message will be passed.

MSGEVENT_RCVDMSG_UNENCRYPTED

Received an unencrypted message. The unencrypted message will be passed.

MSGEVENT_RCVDMSG_UNRECOGNIZED

Cannot recognize the type of OTR message received.

MSGEVENT_RCVDMSG_FOR_OTHER_INSTANCE

Received and discarded a message intended for another instance.

:smp_event_codes

See "on_smp_event" in Protocol::OTR::Channel for usage details.

SMPEVENT_NONE

SMPEVENT_CHEATED

The current verification has been aborted, use progress percent to update auth progress dialog.

SMPEVENT_IN_PROGRESS

SMPEVENT_SUCCESS

SMPEVENT_FAILURE

SMPEVENT_ABORT

Update the auth progress dialog with progress percent

SMPEVENT_ERROR

Same as "SMPEVENT_CHEATED".

:instags

See "select_session" in Protocol::OTR::Channel for usage details.

INSTAG_BEST

Session that has the best conversation status, then fingerprint status (in the event of a tie), then most recent (similarly in the event of a tie). When calculating how recent an instance has been active, INSTAG_BEST is limited by a one second resolution.

INSTAG_RECENT

The most recent session (either by message sent or received).

INSTAG_RECENT_RECEIVED

The session with the most recent message received.

INSTAG_RECENT_SENT

The session with the most recent message sent.

SEE ALSO

AUTHOR

Alex J. G. Burzyński <ajgb@cpan.org>

COPYRIGHT AND LICENSE

This software is copyright (c) 2014 by Alex J. G. Burzyński <ajgb@cpan.org>.

This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.