/* * Copyright (C) 2009 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include #include "keystore.h" static const char* responses[] = { NULL, /* [NO_ERROR] = */ "No error", /* [LOCKED] = */ "Locked", /* [UNINITIALIZED] = */ "Uninitialized", /* [SYSTEM_ERROR] = */ "System error", /* [PROTOCOL_ERROR] = */ "Protocol error", /* [PERMISSION_DENIED] = */ "Permission denied", /* [KEY_NOT_FOUND] = */ "Key not found", /* [VALUE_CORRUPTED] = */ "Value corrupted", /* [UNDEFINED_ACTION] = */ "Undefined action", /* [WRONG_PASSWORD] = */ "Wrong password (last chance)", /* [WRONG_PASSWORD + 1] = */ "Wrong password (2 tries left)", /* [WRONG_PASSWORD + 2] = */ "Wrong password (3 tries left)", /* [WRONG_PASSWORD + 3] = */ "Wrong password (4 tries left)", }; int main(int argc, char* argv[]) { if (argc < 2) { printf("Usage: %s action [parameter ...]\n", argv[0]); return 0; } int sock = socket_local_client("keystore", ANDROID_SOCKET_NAMESPACE_RESERVED, SOCK_STREAM); if (sock == -1) { puts("Failed to connect"); return 1; } send(sock, argv[1], 1, 0); uint8_t bytes[65536]; for (int i = 2; i < argc; ++i) { uint16_t length = strlen(argv[i]); bytes[0] = length >> 8; bytes[1] = length; send(sock, &bytes, 2, 0); send(sock, argv[i], length, 0); } shutdown(sock, SHUT_WR); uint8_t code; if (recv(sock, &code, 1, 0) != 1) { puts("Failed to receive"); return 1; } printf("%d %s\n", code , responses[code] ? responses[code] : "Unknown"); int i; while ((i = recv(sock, &bytes[0], 1, 0)) == 1) { int length; int offset; if ((i = recv(sock, &bytes[1], 1, 0)) != 1) { puts("Failed to receive"); return 1; } length = bytes[0] << 8 | bytes[1]; for (offset = 0; offset < length; offset += i) { i = recv(sock, &bytes[offset], length - offset, 0); if (i <= 0) { puts("Failed to receive"); return 1; } } fwrite(bytes, 1, length, stdout); puts(""); } return 0; }